Belajar Programming Web Mulai Dari Mana?

Pojok Programmer Code Factory Belajar Programming Berbasis Web PHP HTML CSS Mulai Dari Mana

Code Factory | Skill pemrograman sebenarnya adalah sebuah skill yang cukup mudah dipelajari, dengan syarat kita menyukai-nya dalam artian kita harus punya passion, dan tahu arah-nya dalam artian kita harus tahu apa yang lebih dahulu harus kita pelajari dan kemudian sedikit demi sedikit meningkatkan ketrampilan yang kita miliki secara terarah. Passion diperlukan karena belajar pemrograman sering kala membuat kita stress saat kita menemui problem yang sulit diselesaikan. Seorang programmer sejati sangat menyukai tantangan, dan problem yang dia hadapi adalah tantangan yang harus diselesaikan. Untuk itu perlu kita ketahui bersama roadmap untuk belajar web programming harus mulai dari mana?

Syarat kedua adalah arahan atau roadmap, dan roadmap inilah yang biasanya tidak dimiliki oleh programmer yang belajar secara otodidak tanpa mengikuti bangku kuliah formal. Seorang yang mempunya passion yang tinggi namun tanpa arahan cenderung kemajuannya lambat atau tidak maju sama sekali,  Artikel ini mencoba menjawab roadmap yang harus dilalui seseorang yang ingin menjadi programmer tingkat pemula

Pertanyaan yang umumnya muncul adalah, “Saya ingin belajar pemrograman web menggunakan PHP?” Sebenarnya PHP hanyalah bahasa pemrograman saja, yang jauh lebih penting adalah mempelajari konsep-nya. Konsep penting dipahami karena dengan memahami konsep dasar pemrograman ini maka kita akan dengan mudah beradaptasi dengan bahasa pemrograman lainnya, misalkan javascript, java, vb.net dan lain-lain. Jika kita sudah memahami konsep pemrograman, maka berganti bahasa pemrograman lain hanya semudah mempelajari sintaks bahasa bersangkutan saja. Oleh karena itu, ikutilah tahapan-tahapan berikut ini untuk bisa menjadi seorang programmer berbasis web yang handal dengan cepat dan efisien

  1. Belajar Bahasa Inggris
  2. Pelajari Dasar HTML dan CSS
  3. Pelajari Konsep Pemrograman Terstruktur (Imperative)
  4. Pelajari Konsep Pemrograman Berorientasi Obyek (PBO/OOP)
  5. Pelajari Algoritma, Struktur Data
  6. Pelajari Pemanfaatan Framework untuk mempercepat proses pembuatan aplikasi yang kita inginkan

Tahapan pertama adalah belajar bahasa inggris… Menguasai bahasa inggris menjadi point penting saat belajar coding atau programmring, karena bisa dikatakan semua istilah dalam pemrograman yang ada sekarang menggunakan bahasa Inggris. Semua kata kunci (keyword) seperti if else while, adalah bahasa Inggris. Saat belajar algoritma, ketemu lagi dengan linked list, queue, structure, array. Bahasa Inggris juga. Lebih parah lagi kalau code yang kita buat error, maka pesan error (error message) yang muncul semuanya dalam bahasa Inggris… So, English is a must.

Tahapan kedua adalah mempelajari dasar HTML meliputi hal-hal berikut ini

  • Pelajari HTML Tag Dasar, meliputi elemen dasar seperi html, body, header, footer, div, p, table, thead, tbody, tr, th, td, ul, ol, dsb
  • Mampu Membuat Layout HTML dan elemen nya menggunakan div secara manual
  • Pelajari HTML Form, meliputi elemen form seperti form, input, select, textarea, option, button, dsb
  • Mampu Membuat Form HTML secara manual
  • Mempelajari styling dasar menggunakan CSS

Tahapan ketiga adalah memahami Konsep Pemrograman Terstruktur/=, atau biasa juga disebut Pemrograman Imperatif, atau Pemrograman Prosedural. Konsep inilah yang harus benar-benar dipahami sebelum bisa membuat aplikasi serius. Semua bahasa pemrograman terstruktur pasti ada konsep-konsep berikut ini. 

  • variable dan konstanta
  • statement, operator, dan operator precedence
  • logika percabangan, atau disebut juga decision control structure (if-else, dsb.)
  • logika perulangan atau disebut juga repetitin control structure (while loop, dsb.)
  • struktur data sederhana (array, enum, collection)
  • memformat dan menampilkan string
  • prosedur dan fungsi (procedure and function)

Tahapan keempat Kemudian, yang harus kita pelajari adalah pemrograman berorientasi obyek (object oriented programming), karena hampir semua bahasa pemrograman sudah mendukung OOP. Ada beberapa tambahan konsep yang harus dipahami meliputi,

  • Class dan Instance
  • Constructor dan Destructor
  • Abstraction dan Encapsulation
  • Namespace dan Assemblies
  • Inheritance dan Interface
  • Polymorphism

Dengan memahami OOP maka kita bisa dengan mudah membuat aplikasi Hello World menggunakan OOP 🙂

Pada tahapan kelima yang perlu dipelajari adalah algoritma. Algoritma menjadi penting karena algoritma adalah nyawa dari aplikasi kita. Jika kita yang sedang belajar programming memerlukan arahan dan roadmap, maka algoritma yang menentukan arah dari program yang nantinya akan kita buat dan membantu kita proses problem solving dan menemukan solusi terhadap permasalahan programming yang kita hadapi. Perlu diketahui juga, bahwa algoritma tidak terbatas pada algoritma bubble sort, quick sort, depth-first search, breadth-first search, djikstra, atau sebangsanya, tapi secara umum algoritma adalah urutan langkah-langkah yang harus kita lakukan untuk dalam menyelesaikan suatu masalah. Sebagai contoh, berikut ini adalah algoritma minum kopi:

  1. Siapkan bahan
    • Ambil gelas
    • Ambil kopi, masukkan ke dalam gelas
    • Ambil gula, masukkan ke dalam gelas
  2. Siapkan air panas
    • Ambil panci
    • Isi panci dengan air
    • Taruh oanci di atas kompor
    • Nyalakan kompor
    • Tunggu sampai air mendidih
  3. Seduh kopi
    • Tuangkan air panas ke dalam gelas
    • Aduk kopi hingga merata
  4. Hidangkan
    • Letakkan gelas di atas nampan
    • Bawa ke meja
    • Ambil gelas dari nampan taruh ke meja 
    • Tunggu hingga kopi agak dingin
    • Minumlah kopi kita

Dalam mempelajari algoritma, pasti kita akan berkenalan juga dengan pseudocode. Sederhananya, pseudocode adalah urutan aksi yang harus kita lakukan dalam program yang akan kita buat. Dalam pseudocode yang kita masukkan hanyalah aksi yang harus kita lakukan, tidak perlu memasukkan hal-hal teknis seperti deklarasi variable dan inisialisasi varibel. langkah selanjutnya adalah menerjemahkan pseudocode tersebut ke dalam bahasa pemrograman yang kita inginkan.

Dalam membuat sebuah algoritma, biasanya tidak bisa sekali jadi. Kita sebagai programmer harus berpikir detil dalam menyusun langkah-langkah program kita, karena bisa jadi ada langkah yang terlewat atau urutan langkah yang salah, karena kesalah menyusun algoritma ini bisa berujung pada bug di dalam aplikasi yang kita bangun. Sebagai contoh, algoritma di atas akan membuat rumah kita kebakaran…. loh koq! Karena kita melupakan langkah untuk mematikan kompor! Ha… ha… ha…!

Setelah kita memahami seluruh hal dasar di atas (konsep pemrograman terstruktur, konsep pemrograman berorientasi obyek, dan algoritma) barulah kita bisa naik tingkat berikutnya mempelajari hal-hal lain yang lebih rumit, misalkan framework, akses database, pemrograman asinkron, dan lain sebagainya. Misalkan saat kita menggunakan framework Laravel, kita akan bertemu dengan template engine Blade, yang pada dasarnya adalah HTML dan CSS…. kalau tahapan pertama saja kamu belum paham, bagaimana mungkin bisa cepat belajar Laravel

Selamat belajar!

 

Code Fatory Pojok Programmer Belajar Programming Mulai Dari Mana

 

.

Microsoft Meluncurkan Update Visual Studio Code Versi 1.1

Microsoft Meluncurkan Update Visual Studio Code Versi 1.1

Pengguna Visual Studio Code kembali mendapatkan kabar baik karena tim pengembang Visual Studio Code kembali merilis VS Code versi 1.1 (April 2016). Rilis ini merupakan lanjutan dari rilis bulanan yang sudah dilakukan sebelumnya

Visual Studio Code (VS Code) adalah editor teks multi platform buatan Microsoft yang ditujukan untuk para pengembang perangkat lunak (software developers). Microsoft menyatakan bahwa saat ini lebih dari 500.000 pengembang perangkat lunak menggunakannya secara aktif setiap bulannya. Peluncuran VS Code saat Build Developer Conference tahun lalu, cukup mengejutkan banyak orang karena Microsoft belum pernah sekalipun menawarkan code editor untuk platform Linux dan OS X â€” apalagi menggunakan brand Visual Studio.

Berikut ini beberapa highlight update yang ada di dalam versi 1.1 ini:

  • Quickly resize panes by double-clicking editor borders
  • Reopen the last closed file using Ctrl+Shift+T
  • Launch your favorite shell when opening a new Terminal from the Explorer or Command Palette

Pengembang extenseion akan juga mendapatkan tambahan fitur berikut ini:

  • Language Server protocol 2.0 is now consistent with core VS Code API
  • Automated test support for authoring Debug Adapters
  • New APIs for working with folders and JSON files

Downloads: Windows | OS X | Linux 64-bit .zip .deb .rpm | Linux 32-bit .zip .deb .rpm

 

.

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang sangat umum namun cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Implementasi paling sederhana dari aplikasi ini biasanya hanya melibatkan data barang dan transaksinya. Namun bisa kita tambah scope atau rung lingkupnya dengan melibatkan transaksi multi gudang, kategori barang, proses approval, dan sebagainya. Pada tutorial kali ini, kita akan membangun sebuah aplikasi yang sederhana saja, yaitu hanya melibatkan data barang dan transaksi saja, agar cukup mudah dipahami para programmer pemula.

Aplikasi ini akan kita bangun menggunakan framework Yii versi 2.0 dan database MySQL. Yii2 dipilih karena merupakan salah satu framework yang cukup populer, sedangkan MySQL dipilih karena kemudahan penggunaannya. 

Tutorial ini akan kita bagi menjadi 5 (lima) bagian, sehingga lebih mudah bagi teman-teman untuk mempelajari dan memahaminya. 5 (lima) bagian tersebut antara lain,

  1. Bagian #1 akan membahas cara instalalsi Yii2 untuk memulai project ini.
  2. Bagian #2 akan membahas desain database dan penggunaan fitur migration.
  3. Bagian #3 akan membahas CRUD untuk master barang.
  4. Bagian #4 akan membahas CRUD untuk transaksi barang menggunakan form master-detail.
  5. Bagian #5 akan membahas pembuatan Laporan Kartu Stok.

Mudah-mudahan tutorial ini dapat membantu teman-teman yang sedang belajar membuat aplikasi inventory, khususnya yang menggunakan Yii Framework. Source code aplikasi ini dapat dilihat di GitHub, silakan digunakan untuk keperluan pembelajaran saja. Dan jika teman-teman ingin menggunakan source code tersebut untuk keperluan komersil, diwajibkan untuk mendapatkan izin tertulis dari penulis.

 

 

Microsoft Meluncurkan Visual Studio Code for Windows, OS X and Linux Versi 1.0

Microsoft Meluncurkan Visual Studio Code for Windows, OS X and Linux Versi 1.0

Visual Studio Code (VS Code) adalah editor teks multi platform buatan Microsoft yang ditujukan untuk para pengembang perangkat lunak (software developers). Akhirnya hari ini dirilis versi 1.0 setelah kurang lebih selama setahun dalam versi beta. Microsoft menyatakan bahwa saat ini lebih dari 500.000 pengembang perangkat lunak menggunakannya secara aktif setiap bulannya.

Peluncuran VS Code saat Build Developer Conference tahun lalu, cukup mengejutkan banyak orang karena Microsoft belum pernah sekalipun menawarkan code editor untuk platform Linux dan OS X â€” apalagi menggunakan brand Visual Studio.

Pada saat peluncuran pertama kali, VS Code masih tertutup, tidak extensible, dan belum open source, namun seiring berjalannya waktu kekurangan-kekurangan tersebut sudah teratasi.

Microsoft membuka sejumlah API yang memungkin developers mengembangkan extension, dan sampai saat ini telah tersedia lebih dari 1.000 extension. Ini artinya VS Code sekarang mendukung banyak bahasa pemrograman populer seperti Node.js, Go, C++, Python, PHP, dan lain-lain berkat extension yang ada. Awalnya VS Code hanya ditujukan untuk JavaScript dan TypeScript saja. 

Beberapa bulan sesudah peluncuran awal, Microsoft juga menjadikan VS Code sebagai software open source dengan menyediakannya di GitHub.

Ke depannya, tim pengembang VS Code akan terus fokus mengembangkan â€œPerformance, stability, accessibility, and compatibility” untuk semua pengguna.

Microsoft Meluncurkan Visual Studio Code for Windows, OS X and Linux Versi 1.0

.

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #5

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Laporan Kartu Stock Card Report

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel ini merupakan lanjutan dari artikel keempat yang membahas Pembuatan Form Transaksi Barang dan merupakan bagian terakhir dari serial artikel Aplikasi Persediaan Barang Menggunakan Yii2. Artikel ini membahas pembuatan laporan kartu stok yang merupakan laporan yang wajib tersedia dalam sebuah aplikasi inventory, dan kita buat sederhana saja sehingga akan cukup mudah dipahami para programmer pemula.

Modifikasi ItemController

Kartu Stok pada dasarnya adalah daftar transaksi masing-masing barang, dengan mencantumkan jumlah masuk, jumlah keluar, dan saldo barang yang tersedia. dengan begitu kita bisa melihat pergerakan dan perubahan stok dari barang bersangkutan. Untuk mencapai hal ini, kita cukup melakukan join terhadap table barang (items) dan table transaksi (transactions dan transaction_details) untuk mendapatkan laporan yang kita inginkan.

Untuk itu kita bisa melakukan query dan memberikan hasil query tersebut ke view agar dapat ditampilkan dalam bentuk GridView. Untuk itu kita lakukan modifikasi terhadap fungsi actionView yang ada di dalam class ItemController. Dengan mengubah actionView, maka setiap kali kita membuka/melihat detil informasi barang maka di bawahnya akan terlihat history transaksinya. Perubahannya adalah sebagai berikut,

/**
 * Displays a single Items model.
 * @param integer $id
 * @return mixed
 */
public function actionView($id)
{
    // query kartu stok
    $sql_list = "
        SELECT t.id AS trans_id
        , t.trans_code AS trans_code
        , t.trans_date AS trans_date
        , a.id AS detail_id, a.item_id AS item_id
        , trim(concat(t.remarks,' - ',a.remarks)) AS remarks
        , b.code AS item_code, b.name AS item_name
        , CASE 
            WHEN t.type_id=1 THEN a.quantity 
            WHEN t.type_id=2 THEN -a.quantity 
            ELSE 0 END 
          AS quantity
        , @sal := @sal + CASE 
            WHEN t.type_id=1 THEN a.quantity 
            WHEN t.type_id=2 THEN -a.quantity 
            ELSE 0 END 
          AS saldo
        FROM transactions t
        JOIN transaction_details a ON t.id = a.trans_id
        JOIN items b ON a.item_id = b.id
        JOIN ( SELECT @sal:=0 ) v
        WHERE b.id = :id
        ORDER BY t.trans_date, t.id, a.id
    ";
    // query total data di kartu stok
    $sql_count = "
        SELECT count(*) 
        FROM transactions t
        JOIN transaction_details a ON t.id = a.trans_id
        JOIN items b ON a.item_id = b.id
        ORDER BY t.trans_date, t.id, a.id;
    ";
    // count data
    $count = Yii::$app->db->createCommand($sql_count, [':id' => $id])->queryScalar();
    // data provider untuk ditampilkan di view
    $dataProvider = new SqlDataProvider([
        'sql' => $sql_list,
        'params' => [':id' => $id],
        'totalCount' => $count,
        'pagination' => [
            'pageSize' => 20,
        ],
    ]);

    // render view
    return $this->render('view', [
        'model' => $this->findModel($id),
        'dataProvider' => $dataProvider,
    ]);
}

Jika teman-teman perhatikan, dalam query di atas terdapat variable @sal yang kita gunakan untuk men-generate kolom saldo berdasarkan perhitungan penambahan/pengurangan transaksi barang. Dalam query tersebut juga terdapat klausa CASE yang berfungsi sebagai logika percabangan untuk membedakan transaksi barang masuk dan barang keluar, karena barang masuk harus menambah saldo, sedangkan barang keluar harus mengurangi saldo.

Modifikasi View Barang

Dan untuk menampilkannya, caranya cukup mudah, yaitu langsung saja kita tambahkan code GridView di bawah DetailView yang sebelumnya sudah ada di dalam file view.php menjadi seperti di bawah ini

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'code',
        'name',
        'quantity',
        'remarks',
    ],
]) ?>

<h3>Stock Card</h3>
<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'trans_code',
        'trans_date',
        'item_code',
        'item_name',
        'quantity',
        'saldo',
        'remarks',
    ],
]); ?>

Berikut ini salah satu contoh penampakan kartu stok-nya.

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Laporan Kartu Stock Card Report

Simpulan dan Saran

Sesuai dengan judulnya, aplikasi ini masih sangat sederhana. Banyak ide yang bisa dikembangkan dari aplikasi ini, misalkan

  • Dukungan transaksi multi-warehouse.
  • Penambahan laporan-laporan periodik, seperti laporan mutasi stok bulanan, dan sebagainya.
  • Integrasi dengan aplikasi Point of Sales.

Dan masih banyak ide-ide lain yang bisa kita kembangkan.

Mudah-mudahan tutorial ini dapat membantu teman-teman yang sedang belajar membuat aplikasi inventory, khususnya yang menggunakan Yii Framework. Source code aplikasi ini dapat dilihat di GitHub, silakan digunakan untuk keperluan pembelajaran saja. Jika teman-teman ingin menggunakan source code tersebut untuk keperluan komersil, diwajibkan untuk mendapatkan izin tertulis dari penulis.

 

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #4

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Transaksi Master Detail

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel ini merupakan lanjutan dari artikel ketiga yang membahas Pembuatan Form Master Barang. Artikel ini akan melanjutkan pembuatan form transaksi dengan desain master-detail menggunakan bantun extension dynamic-form, dan kita buat sederhana saja sehingga akan cukup mudah dipahami para programmer pemula.

Extension Tambahan

Untuk memudahkan kita membangun user interface yang cukup nyaman maka kita memerlukan dua buah extension tambahan, yaitu datepicker untuk memilih tanggal, dan dynamic-form untuk form CRUD master-detail. Gunakan perintah composer berikut ini untuk instalasi-nya.

composer require kartik-v/yii2-widget-datepicker "*"
composer require wbraganca/yii2-dynamicform "*"

[collapsed title=Instalasi Extension]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Instalasi Extension

Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Instalasi Extension[/collapsed]

Generate CRUD Menggunakan Gii

Silakan generate CRUD untuk Table Transactions dan TransactionDetails dengan cara yang sama seperti saat membuat form master barang.

[collapsed title=Generate CRUD Transactions] Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD Transactions Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD Transactions Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD Transactions [/collapsed] [collapsed title=Generate CRUD TransactionDetails] Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD TransactionDetails Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD TransactionDetails Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP Generate CRUD TransactionDetails [/collapsed]

Modifikasi List Transaksi Barang

Hasil generate CRUD dari Yii sangat membantu kita mempercepat proses pengerjaan aplikasi ini, namun masih perlu beberapa penyesuaian dari code standard Gii yang dihasilkan,

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'id',
    'trans_code',
    'trans_date',
    'type_id',
    'remarks',
    ['class' => 'yii\grid\ActionColumn'],
],

Kita dapat menghapus field id yang hanya field identity sehingga tidak penting untuk ditampilkan. Kita juga dapat mengubah field type_id menjadi type.name agar data yang ditampilkan adalah nama jenis transaksinya dan bukan angka id-nya sehingga hasilnya menjadi seperti di bawah ini

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'trans_code',
    'trans_date',
    'type.name',
    'remarks',
    ['class' => 'yii\grid\ActionColumn'],
],

[collapsed title=GridView Transaksi]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP GridView Transaksi tanpa Filter Dropdown[/collapsed]

Hasilnya cukup user-friendly. Namun sayangnya dengan cara di atas, kita tidak bisa melakukan filter terhadap jenis transaksi. Oleh karena itu kita perlu melakukan perubahan agar filter terhadap jenis transaksi barang kita kita lakukan, filter menggunakan dropdown list. Pertama yang kita lakukan adalah mengambil data semua jenis transaksi yang ada di dalam database menggunakan code berikut,

$typeList = ArrayHelper::map(TransactionTypes::find()->asArray()->all(), 'id', 'name');

Kemudian ubah setting column type.name di GridView dengan menambahkan atribut setting filter dan value barupa Closure yang bentuknya spesifik untuk GridView, sehingga menjadi seperti di bawah ini

'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'trans_code',
    'trans_date',
    [   'attribute' => 'type_id', 
        'filter' => $typeList, 
        'label' => 'Transaction Type', 
        'value' => function ($model, $index, $widget) { return $model->type->name; }
    ],
    'remarks',
    ['class' => 'yii\grid\ActionColumn'],
],

[collapsed title=GridView Transaksi dengan Filter Dropdown]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP GridView Transaksi dengan Filter Dropdown[/collapsed]

Modifikasi Form Transaksi Barang

Form input transaksi barang melibatkan dua buah table yaitu transactions dan transaction_details sehingga kita memerlukan extension dynamic-form untuk membuatnya. Instalasi dengan menggunakan perintah composer di bawah ini.

composer require wbraganca/yii2-dynamicform "*"

Yang perlu kita lakukan kemudian adalah

  • Membuat class Model untuk memudahkan kita membuat beberapa row TransactionDetails dalam satu baris code saja.
  • Modifikasi ActionCreate di TransactionController untuk proses pembuatan transaksi baru
  • Modifikasi ActionUpdate di TransactionController untuk proses pembuatan transaksi yang sudah ada di database
  • Modifikasi ActionDelete di TransactionController untuk proses penghapusan transaksi
  • Modifikasi form untuk Create dan Update.

Class Model

Class Model ini merupakan turunan dari class yii\base\Model namun kita menambahkan sebuah function createMultiple untuk memudahkan kita membuat beberapa row TransactionDetails berdasarkan isi dari variable POST menggunakan satu baris code saja. 

[collapsed title=Class Model]

namespace app\models;

use Yii;
use yii\helpers\ArrayHelper;

class Model extends \yii\base\Model
{
    /**
     * Creates and populates a set of models.
     * @param string $modelClass
     * @param array $multipleModels
     * @return array
     */
    public static function createMultiple($modelClass, $multipleModels = [])
    {
        $model    = new $modelClass;
        $formName = $model->formName();
        $post     = Yii::$app->request->post($formName);
        $models   = [];

        if (! empty($multipleModels)) {
            $keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id'));
            $multipleModels = array_combine($keys, $multipleModels);
        }

        if ($post && is_array($post)) {
            foreach ($post as $i => $item) {
                if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']])) {
                    $models[] = $multipleModels[$item['id']];
                } else {
                    $models[] = new $modelClass;
                }
            }
        }

        unset($model, $formName, $post);
        return $models;
    }
}

[/collapsed]

Modifikasi ActionCreate

Saat melakukan proses penyimpanan data transaksi baru ke database, kita mengikuti algoritma berikut ini,

  • Load master record
  • Load semua detail records
  • Assign foreign key field di detail records
  • Validate master record
  • Validate detail record
  • Jika validasi berhasil
    • Mulai transaksi database
    • Simpan master record
    • Simpan detail record satu-persatu
    • Jika berhasil semua, commit
    • Jika gagal rollback
    • Tampilkan hasilnya

[collapsed title=ActionCreate]

/**
 * Creates a new Transactions model.
 * If creation is successful, the browser will be redirected to the 'view' page.
 * @return mixed
 */
public function actionCreate()
{
    $model = new Transactions();
    $details = [ new TransactionDetails ];

    // proses isi post variable 
    if ($model->load(Yii::$app->request->post())) {
        $details = Model::createMultiple(TransactionDetails::classname());
        Model::loadMultiple($details, Yii::$app->request->post());

        // assign default transaction_id
        foreach ($details as $detail) {
            $detail->trans_id = 0;
        }

        // ajax validation
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ArrayHelper::merge(
                ActiveForm::validateMultiple($details),
                ActiveForm::validate($model)
            );
        }

        // validate all models
        $valid1 = $model->validate();
        $valid2 = Model::validateMultiple($details);
        $valid = $valid1 && $valid2;

        // jika valid, mulai proses penyimpanan
        if ($valid) {
            // mulai database transaction
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                // simpan master record                   
                if ($flag = $model->save(false)) {
                    // kemudian simpan detail records
                    foreach ($details as $detail) {
                        $detail->trans_id = $model->id;
                        if (! ($flag = $detail->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                }
                if ($flag) {
                    // sukses, commit database transaction
                    // kemudian tampilkan hasilnya
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $model->id]);
                } else {
                    return $this->render('create', [
                        'model' => $model,
                        'details' => $details,
                    ]);
                }
            } catch (Exception $e) {
                // penyimpanan galga, rollback database transaction
                $transaction->rollBack();
                throw $e;
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'details' => $details,
                'error' => 'valid1: '.print_r($valid1,true).' - valid2: '.print_r($valid2,true),
            ]);
        }

    } else {
        // inisialisai id 
        // diperlukan untuk form master-detail
        $model->id = 0;
        // render view
        return $this->render('create', [
            'model' => $model,
            'details' => $details,
        ]);
    }
}

[/collapsed]

Modifikasi ActionUpdate

Saat melakukan proses penyimpanan perubahan data transaksi ke database. Agak sedikit berbeda dengan proses pyimpanan transaksi baru, untuk proses edit, kita menghapus semua detail record yang sudah ada sebelumnya di database dan kemudian melakukan insert ulang sebagai record baru. Algoritma-nya adalah seperti berikut ini,

  • Load master record
  • Load semua detail records
  • Assign foreign key field di detail records
  • Validate master record
  • Validate detail record
  • Jika validasi berhasil
    • Mulai transaksi database
    • Simpan master record
    • Delete semua detail record yang sudah ada di database
    • Simpan detail record satu-persatu
    • Jika berhasil semua, commit
    • Jika gagal rollback
    • Tampilkan hasilnya

[collapsed title=ActionUpdate]

/**
 * Updates an existing Transactions model.
 * If update is successful, the browser will be redirected to the 'view' page.
 * @param integer $id
 * @return mixed
 */
public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $details = $model->transactionDetails;

    if ($model->load(Yii::$app->request->post())) {

        $oldIDs = ArrayHelper::map($details, 'id', 'id');
        $details = Model::createMultiple(TransactionDetails::classname(), $details);
        Model::loadMultiple($details, Yii::$app->request->post());
        $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($details, 'id', 'id')));

        // assign default transaction_id
        foreach ($details as $detail) {
            $detail->trans_id = $model->id;
        }

        // ajax validation
        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return ArrayHelper::merge(
                ActiveForm::validateMultiple($details),
                ActiveForm::validate($model)
            );
        }

        // validate all models
        $valid1 = $model->validate();
        $valid2 = Model::validateMultiple($details);
        $valid = $valid1 && $valid2;

        // jika valid, mulai proses penyimpanan
        if ($valid) {
            // mulai database transaction
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                // simpan master record                   
                if ($flag = $model->save(false)) {
                    // delete dahulu semua record yang ada
                    if (! empty($deletedIDs)) {
                        TransactionDetails::deleteAll(['id' => $deletedIDs]);
                    }
                    // kemudian, simpan details record
                    foreach ($details as $detail) {
                        $detail->trans_id = $model->id;
                        if (! ($flag = $detail->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                }
                if ($flag) {
                    // sukses, commit database transaction
                    // kemudian tampilkan hasilnya
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $model->id]);
                }
            } catch (Exception $e) {
                // penyimpanan galga, rollback database transaction
                $transaction->rollBack();
                throw $e;
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'details' => $details,
                'error' => 'valid1: '.print_r($valid1,true).' - valid2: '.print_r($valid2,true),
            ]);
        }
    }

    // render view
    return $this->render('update', [
        'model' => $model,
        'details' => (empty($details)) ? [new TransactionDetails] : $details
    ]);
}

[/collapsed]

Modifikasi ActionDelete

Pada saat menghapus data transaksi maka yang perlu kita lakukan adalah terlebih dahulu menghapus detail record sebelum menghapus master/parent record. Algoritma-nya adalah sebagai berikut

  • Mulai transaksi database
  • Delete semua detail record satu-persatu
  • Delete master record
  • Jika berhasil semua, commit
  • Jika gagal rollback
  • Tampilkan index transaksi barang

[collapsed title=ActionDelete]

/**
 * Deletes an existing Transactions model.
 * If deletion is successful, the browser will be redirected to the 'index' page.
 * @param integer $id
 * @return mixed
 */
public function actionDelete($id)
{
    $model = $this->findModel($id);
    $details = $model->transactionDetails;

    // mulai database transaction
    $transaction = \Yii::$app->db->beginTransaction();
    try {
        // pertama, delete semua detail records
        foreach ($details as $detail) {
            $detail->delete();
        }
        // kemudian, delete master record
        $model->delete();
        // sukses, commit transaction
        $transaction->commit();

    } catch (Exception $e) {
        // gagal, rollback database transaction
        $transaction->rollBack();
    }

    return $this->redirect(['index']);
}

[/collapsed]

Modifikasi create.php

​Kita perlu menambahkan variable $details agar dapat dikenali di dalam _form.php

​    <?= $this->render('_form', [
        'model' => $model,
        'details' => $details,
    ]) ?>

Modifikasi update.php

​Kita juga perlu menambahkan variable $details agar dapat dikenali di dalam _form.php

    <?= $this->render('_form', [
        'model' => $model,
        'details' => $details,
    ]) ?>

Modifikasi _form.php

​Code lengkapnya adalah seperti berikut ini

[collapsed title=Code HTML form transaksi]

<div class="transactions-form">

    <?php $form = ActiveForm::begin(['id' => 'transactions-form']); ?>

    <div class="row">
        <div class="col-sm-4 col-md-6">
		    <?= $form->field($model, 'trans_code')->textInput(['maxlength' => true]) ?>
        </div>
        <div class="col-sm-4 col-md-3">
		    <?php 
				echo '<label class="control-label" for="transactions-trans_date">Transaction Date</label>';
				echo DatePicker::widget([
					'id' => 'transactions-trans_date',
				    'name' => 'Transactions[trans_date]',
				    'type' => DatePicker::TYPE_COMPONENT_APPEND,
				    'value' => date('Y-m-d'),
				    'pluginOptions' => [
				        'autoclose'=>true,
				        'format' => 'yyyy-mm-dd'
				    ]
				]);
		    ?>
        </div>
        <div class="col-sm-4 col-md-3">
		    <?= $form->field($model, 'type_id')->dropDownList(
		        ArrayHelper::map(TransactionTypes::find()->all(), 'id', 'name'),  
		        ['prompt'=>'* Pilih Transaksis *']                          
		    ); ?>
        </div>
        <div class="col-sm-12 col-md-12">
		    <?= $form->field($model, 'remarks')->textInput(['maxlength' => true]) ?>
        </div>
    </div><!-- .row -->

    <div class="panel panel-default">
        <div class="panel-heading"><h4><i class="glyphicon glyphicon-th-list"></i> Transaction Details</h4></div>
        <div class="panel-body">
             <?php DynamicFormWidget::begin([
                'widgetContainer' => 'dynamicform_wrapper',  // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
                'widgetBody' => '.container-items',          // required: css class selector
                'widgetItem' => '.item',                     // required: css class
                'limit' => 999,                                // the maximum times, an element can be cloned (default 999)
                'min' => 1,                                  // 0 or 1 (default 1)
                'insertButton' => '.add-item',               // css class
                'deleteButton' => '.remove-item',            // css class
                'model' => $details[0],
                'formId' => 'transactions-form',
                'formFields' => [
                    'trans_id',
                    'item_id',
                    'quantity',
                    'remarks',
                ],
            ]); ?>

            <div class="container-items"><!-- widgetContainer -->
            <?php foreach ($details as $i => $detail): ?>
                <div class="item row">
                    <?php
                        // necessary for update action.
                        if (! $detail->isNewRecord) {
                            echo Html::activeHiddenInput($detail, "[{$i}]id");
                        }
                    ?>
                    <div class="col-sm-8 col-md-4">
					    <?= $form->field($detail, "[{$i}]item_id")->dropDownList(
					        ArrayHelper::map(Items::find()->all(), 'id', 'name'),  // Flat array ('id'=>'label')
					        ['prompt'=>'* Pilih Barang *']                          // options
					    ); ?>
                    </div>
                    <div class="col-sm-4 col-md-2">
                        <?= $form->field($detail, "[{$i}]quantity")->textInput(['maxlength' => true]) ?>
                    </div>
                    <div class="col-sm-10 col-md-5">
                    	<?= $form->field($detail, "[{$i}]remarks")->textInput(['maxlength' => true]) ?>
                    </div>
                    <div class="col-sm-2 col-md-1 item-action">
                    	<div class="pull-right">
	                        <button type="button" class="add-item btn btn-success btn-xs">
	                        	<i class="glyphicon glyphicon-plus"></i></button> 
	                        <button type="button" class="remove-item btn btn-danger btn-xs">
	                        	<i class="glyphicon glyphicon-minus"></i></button>
                    	</div>
                    </div>
                </div><!-- .row -->

            <?php endforeach; ?>
            </div>

            <?php DynamicFormWidget::end(); ?>
        </div>
    </div>


    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

[/collapsed]

[collapsed title=Form Transaksi Barang]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 Form Transaksi Barang Dynamic-Form[/collapsed]

Membuat View Transaksi Barang

Untuk menampilkan data master-detail, maka kita harus record master dan semua record detail yang berelasi, sehingga kita perlu mengubah ActionView menjadi seperti ini

[collapsed title=Code ActionView]

/**
 * Displays a single Transactions model.
 * @param integer $id
 * @return mixed
 */
public function actionView($id)
{
    return $this->render('view', [
        'model' => $this->findModel($id),
        'details' => $this->findDetails($id),
    ]);
}

/**
 * Finds the Transactions model based on its primary key value.
 * If the model is not found, a 404 HTTP exception will be thrown.
 * @param integer $id
 * @return Transactions the loaded model
 * @throws NotFoundHttpException if the model cannot be found
 */
protected function findModel($id)
{
    if (($model = Transactions::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

/**
 * Finds the TransactionDetails model based on its foreign key value.
 * @param integer $id
 * @return data provider TransactionDetails for GridView 
 */
protected function findDetails($id)
{
    $detailModel = new TransactionDetailsSearch();
    return $detailModel->search(['TransactionDetailsSearch'=>['trans_id'=>$id]]);
}

[/collapsed]

Dan jangan lupa mengubah view.php agar menampilkan data yang didapat dari controller. Kita akan menggunakan DetailView untuk master row, dan menggunakan GridView untuk menampilkan detail row.

[collapsed title=HTML Code View Transaksi]

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'trans_code',
        [
            'attribute' => 'trans_date',
            'format' => [ 'date', 'php: d-M-Y' ],
            'labelColOptions' => [ 'style'=>'width:30%; text-align:right;' ]
        ],
        'type.name',
        'remarks',
    ],
]) ?>

<div class="item panel panel-info">
    <div class="panel-heading">
        <h3 class="panel-title pull-left"><i class="glyphicon glyphicon-barcode"></i> Transaction Line Item</h3>
        <div class="clearfix"></div>
    </div>
    <div class="panel-body">
        <?= GridView::widget([
            'dataProvider' => $details,
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],

                [
                    'attribute' => 'item_id',
                    'value' => 'item.code',
                    'header' => 'Item Code',
                ],
                [
                    'attribute' => 'item_id',
                    'value' => 'item.name',
                    'header' => 'Item Name',
                ],
                'quantity',
                'remarks',
            ],
        ]); ?>
    </div>
</div>

[/collapsed]

[collapsed title=Penampakan View Transaksi Barang]Sistem Inventory atau Aplikasi Persediaan Barang Menggunakan Yii Yii2 PHP View Transaction[/collapsed]

Simpulan

Mudah-mudahan tutorial ini dapat membantu teman-teman yang sedang belajar membuat aplikasi inventory, khususnya yang menggunakan Yii Framework. Source code aplikasi ini dapat dilihat di GitHub, silakan digunakan untuk keperluan pembelajaran saja.

.

 

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #3

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Master Barang (Items)

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Artikel kali ini akan membahas pengembangan CRUD untuk master data barang (items) setelah sebelumnya kita membahas persiapan database yang akan kita gunakan dalam Aplikasi Inventory ini. Kita akan memanfaatkan Gii Code Generator untuk mempercepat proses pengembangannya. Aplikasi yang akan kita bangun sederhana saja sehingga akan cukup mudah dipahami para programmer pemula.

(more…)

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #2

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Part #2

Code Factory | Selama proses pengembangan aplikasi database, struktur database yang digunakan juga ikut berubah dan berkembang seperti halnya kode sumber (source code) aplikasi kita. Misalnya, membuat tabel baru, menambahkan kolom baru, menambahkan indeks untuk meningkatkan kinerja query, dan sebagainya. Karena perubahan struktur database sering membutuhkan beberapa perubahan kode sumber, Yii menyediakan fitur migrasi database yang memungkinkan Anda untuk melacak perubahan database, melakukan upgrade struktur database, atau downgrade struktur database jika diperlukan. Referensi lengkap tentang migrasi database di Yii bisa dilihat di laman ini.

(more…)

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 – Part #1

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Part #1

Code Factory Sistem Inventory atau Aplikasi Persediaan Barang adalah salah satu aplikasi yang umum dan cukup menantang terutama bagi para programmer pemula yang sedang mengasah skill programming-nya. Aplikasi ini bisa kita buat sangat sederhana dengan hanya melibatkan data barang dan transaksinya, atau dibuat lebih rumit dengan melibatkan data gudang, kategori barang, proses approval, dan sebagainya. Artikel ini akan coba membahas aplikasi persediaan barang menggunakan framework Yii2. Aplikasi yang akan kita bangun sederhana saja agar mudah dipahami para programmer pemula.

Instalasi Apache, PHP, dan MySQL (atau MariaDB)

Yii2 membutuhkan minimal PHP versi 5.4 jadi sebelumnya kita harus pastikan bahwa sudah tersedia PHP 5.4 terinstall di laptop atau komputer kita. Dan karena kita akan membuat aplikasi database, maka pastikan juga laptop kita sudah terinstall database MySQL atau MariaDB. Untuk para pengguna Windows, disarankan menggunakan XAMPP minimal versi 1.8 untuk bisa menjalankan Yii2 ini, sedangkan pengguna Linux bisa menggunakan LAMP bawaan distro masing-masing. 

Instalasi Yii2 Menggunakan Composer

Instalasi Yii2 bisa dilakukan dengan 2 (dua) cara, yaitu menggunakan composer atau zip archive. Kedua cara instalasi tersebut sama mudahnya, namun composer memerlukan koneksi internet untuk berjalan. Untuk aplikasi ini kita akan menggunakan template basic yang lebih sederhana dan simple dibandingkan template advance. Perbedaan template basic dengan advance terletak pada struktur pengelolaan file saja, dan template advance ditujukan untuk project yang lebih kompleks. Dokumentasi Yii2 juga menerangkan langkah demi langkah instalasi template basic di laman ini

Jika composer belum terpasang di laptop silakan kunjungi laman getcomposer.org untuk mendapatkan petunjuk instalasi lengkapnya. Untuk pengguna Linux dan MacOS dapat menggunakan perintah command-line berikut ini:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Sedangkan pengguna Windows dapat mengunduh (download) dan menjalankan Composer-Setup.exe. Silakan pelajari Dokumentasi Composer jika kamu mengalami masalah saat proses instalasi, atau mungkin sekedar ingin tahu lebih jauh tentang composer. 

Jika Composer sudah terpasang, maka jalankan perintah berikut ini untuk measang Yii2 di laptop kita.Pastikan menjalankan perintah ini di dalam folder yang bisa diakses via browser, misalkan di dalam folder htdocs instalasi xampp kamu.

composer global require "fxp/composer-asset-plugin:~1.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic inventory

Perintah pertama tujuannya untuk memasang composer asset plugin yang memudahkan kita mengelola package yang tersedia di Composer. Perimtah ini cukup dilakukan sekali saja saat pertama kali memasang Yii. Sedangkan perintah kedua tujuannya untuk memasang Yii ke dalam folder inventory. Kita bisa mengganti nama folder tujuan menjadi apapun yang kita inginkan.

Note: During the installation Composer may ask for your Github login credentials. This is normal because Composer needs to get enough API rate-limit to retrieve the dependent package information from Github. For more details, please refer to the Composer documentation.

Instalasi Yii2 Menggunakan Zip Archive

Lakukan 3 (tiga) langkah berikut ini jika ingin memasang Yii Framework menggunakan arsip zip:

  1. Unduh (download) file arsip zip dari yiiframework.com.
  2. Extract file arsip yang berhasil diunduh ke dalam folder yang bisa diakses via browser, misalkan ke dalam folder htdocs instalasi xampp kamu..
  3. Buka dan ubah file config/web.php dengan mengubah setting cookieValidationKey, isilah dengan string apapun kesukaanmu (cookieValidationKey secara otomatis terisi jika kita melakukan instalsi menggunakan Composer):

    // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
    'cookieValidationKey' => 'enter your secret key here',

Memastikan Yii sudah terpasang

Untuk memastikan apakan Yii Framework sudah terpasang (installed) maka yang perlu kita lakukan adalah membuka browser. Dengan asumsi bahwa kita menginstall yii ke dalam folder inventory dan mengetikkan alamat berikut ini
http://localhost/inventory/web/

dan seharusnya halaman berikut akan muncul di browser.

Aplikasi Persediaan Barang (Sistem Inventory) Menggunakan Yii2 - Part #1

 

.

Aplikasi Inventory Sederhana – Form Transaksi Barang Masuk

Aplikasi Inventory Sederhana - Form Transaksi Barang Masuk Inventory In

Form Transaksi Barang Masuk | Setelah sebelumnya kita berhasil membuat form entri master barang, berikutnya kita akan membuat form untuk mengelola proses CRUD (Create, Read, Update, Delete) data Transaksi Barang Masuk di Aplikasi Inventory ini. Untuk mengelola data master barang ini, kita memerlukan 2 (dua) buah form, yaitu Form List Transaksi Barang Masuk, dan Form Entri Transaksi Barang Masuk. Sama seperti form untuk mengelola data master barang, kedua form transaksi ini juga akan menggunakan metode data-binding untuk menampilkan data yang berhasil diambil menggunakan library data access layer yang kita buat sebelumnya.

Artikel ini adalah lanjutan dari artikel berseri tentang Tutorial Membuat Aplikasi Inventory Sederhana Menggunakan VB.net dan Database MySQL

Persiapkan Data Access Layer

Form transaksi ini merupakan form master-detail yang melibatkan 2 (dua) buah table, yaitu transactions sebagai master table, dan transaction_details sebagai detail table. Desain dari kedua table ini dapat di lihat dalam artikel ini. Untuk itu kita perlu mendefinisikan relasi foreign key antar DataTable yang ada di dalam DataSet dsInventory. Relasi ini yang nantinya akan sangat membantu kita dalam proses data-binding ke form transaksi.

[collapsed title=Setting Relasi Foreign Key]Pertama-tama bukalah desain DataSet dsInventory, kemudian cari link relasi antara table transactions dengan table transaction_details, setelah itu klik tombol kanan mouse untuk menampilkan context menu seperti gambar di bawah ini.

Persiapkan Data Access Layer Edit Relation Foreign Key

Setelah ini pilihlah menu Edit Relation, dan kemudian ubahlah setting-nya menjadi “Both Relation and Foreign Key Contraints” dan ubah juga setting Update Rule dan Delete Rule menjadi Cascade, seperti tampak pada gambar di bawah ini.

Persiapkan Data Access Layer Edit Relation Foreign Key

[/collapsed] [collapsed title=Setting Query Berdasarkan Jenis Transaksi]

Berikutnya kita tambahkan Query untuk memudahkan proses data retrieval (temu kembali data) di form list transaksi barang masuk, Caranya dengan membuka DataSet dsInventory, kemudian lakukan klik kanan pada table transactions dan pilih menu “Add Query” seperti tampak pada gambar di bawah ini.

Persiapkan Data Access Layer Add Tambah Query By Tipe Jenis Transaksi

Setelah itu berikan nama method sebagai FillByType dan GetDataByType, karena method ini kita gunakan untuk mengambil data berdasarkan tipe atau jenis transaksinya. Hasilnya akan tampak seperti gambar di bawah ini.

Persiapkan Data Access Layer Add Tambah Query By Tipe Jenis Transaksi

[/collapsed]

Desain Form Entri Transaksi Barang Masuk

Berikutnya kita buat desain form transaksi barang masuk. Desain form transaksi ini akan menggunakan Visual Inheritance seperti yang sudah dibahas sebelumnya di artikel desain user interface dan desain form master barang, jadi silakan pelajari kedua artikel tersebut sebelum melanjutkan membaca artikel ini.

[collapsed title=Desain Form Entri Barang Masuk]Silakan buat sebuah Inherited Form dari template form List dan kemudian tambahkan semua kontrol yang diperlukan antara lain 

  • TextBox untuk Kode Transaksi
  • DateTimePicker untuk Tanggal Transaksi
  • Multiline TextBox untuk field Remarks atau Keterangan
  • DataGridView untuk detail transaksi

Tambahkan juga beberapa komponen

  • DataSet DsInventory
  • TransactionsTableAdapter untuk proses retrieval dan saving data di table transactions.
  • Transaction_detailsTableAdapter untuk proses retrieval dan saving data di table transaction_details.
  • ItemsTableAdapter untuk proses retrieval lookup data items

Hasilnya akan tampak seperti gambar di bawah ini.

Desain Form Entri Transaksi Barang Masuk User Inteface Design

Setelah desain form selesai kita buat, lanjutkan dengan setting data-binding pada property Text untuk field Transaction Code seperti tampak pada gambar di bawah ini. Lakukan juga hal yang sama untuk field Transaction Date, Remarks dan DataGridView. Gambar di bawah adalah contoh setting data-binding property Text untuk Transaction Code.

Desain Form Entri Transaksi Barang Masuk User Inteface Design

[/collapsed]

Berikutnya yang perlu kita lakukan adalah mengkonfigurasikan binding DataGridView agar memudahkan kita menambahkan detail barang yang terlibat dalam transaksi bersangkutan. Khusus untuk binding DataGridView, yang kita lakukan adalah setting property DataMember dari DataGridView ke relasi yang sudah kita buat sebelumnya, yaitu transaction_details_ibfk_1, seperti tampak pada gambar di bawah ini.

[collapsed title=Setting DataGridView untuk Master-Detail]

Desain Form Entri Transaksi Barang Masuk User Inteface Design

[/collapsed]

Setelah setting binding kita lakukan, selanjutnya ubah property Visible untuk beberapa kolom yang tidak perlu dilihat oleh user atau pengguna, misalkan kolom id, trans_id, item_code, dan item_name. Caranya adalah dengan melakukan klik kanan mouse di atas DataGridView, kemudian pilih menu “Edit Columns” setelah itu silakan ubah property visible menjadi false, seperti tampak pada gambar di bawah ini.

[collapsed title=Setting DataGridView untuk Master-Detail]

Desain Form Entri Transaksi Barang Masuk User Inteface Design

Desain Form Entri Transaksi Barang Masuk User Inteface Design

[/collapsed]

Untuk memudahkan pengguna memilih barang yang akan masuk dalam transaksi ini, maka kita buatkan sebuah ComboBox berisikan list Items sehingga user dapat langsung memilih dari daftar yang tersedia. Caranya adalah buka menu “Edit Columns” kemudian pilih field item_id dan set ColumnType sebagai ComboBoxColumn, seperti tampak pada gambar di bawah ini.

[collapsed title=Setting ComboBox Items di DataGridView untuk Master-Detail]

Desain Form Entri Transaksi Barang Masuk User Inteface Design

[/collapsed]

Berikutnya kita beritahukan vb.net untuk mengambil data Items dari DataSet DsInventory dengan cara mengkonfigurasikan property DataSource, DisplayMember, dan ValueMember menjadi seperti tampak pada gambar di bawah ini.

[collapsed title=Setting ComboBox Items di DataGridView untuk Master-Detail]

Desain Form Entri Transaksi Barang Masuk User Inteface Design

[/collapsed]

Hasil akhirnya akan tampak seperti pada gambar di bawah ini.

[collapsed title=Setting ComboBox Items di DataGridView untuk Master-Detail]

Desain Form Entri Transaksi Barang Masuk User Inteface Design

[/collapsed]

Kode Sumber Form Entri Transaksi Barang Masuk

Kode sumber untuk proses penyimpanan data dalam model master-detail agak sedikit sulit dikarenakan setelah menyimpan data baru ke master table, kita harus mengambil id auto_increment yang dihasilkan dari database kemudian menyesuaikannya ke data di detail table agar referential integrity tetap terjaga.

[collapsed title=Kode Sumber Constructor] 

Constructur New kita buat dua versi untuk membedakan proses Add atau Edit, karena perlakuannya berbeda pada saat penyimpanan data, asumsinya adalah jika TransID yang diberikan bernilai kurang dari 0 (nol) maka kita anggap menambahkan data baru.

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' panggil inisialisasi database
        InitializeDatabase(-1)
    End Sub

    Public Sub New(TransID As Integer)
        ' This call is required by the designer.
        InitializeComponent()
        ' panggil inisialisasi database
        InitializeDatabase(TransID)
    End Sub

[/collapsed]

[collapsed title=Kode Sumber Inisialisasi Database] 

Inisialisasi database membedakan proses add new dan edit data seperti tampak pada potongan kode berikut ini.

    Private Sub InitializeDatabase(TransID As Integer)
        ' load lookup/reference table
        Me.ItemsTableAdapter.Fill(Me.DsInventory.items)
        ' try retrieve data
        Try
            ' periksa nilai ItemID
            ' jika kurang dari 0 maka kita asumsikan mau bikin data baru
            ' jika lebih dari 0 maka kita asumsikan ambil bikin data lama
            If TransID < 0 Then
                IsNewData = True
                ' tambahkan row baru
                Me.BindingContext(Me.DsInventory.transactions).AddNew()
                ' nilai default untuk beberapa field
                Dim NewID As String = Helper.GenerateNewID(TransCode)
                Dim dv As DataRowView = Me.BindingContext(Me.DsInventory.transactions).Current
                dv("type_id") = 1 ' IN: barang masuk
                dv("trans_code") = NewID
                dv("trans_date") = DateTime.Today
                TextBox1.Text = NewID
                DateTimePicker1.Value = DateTime.Today
            Else
                IsNewData = False
                ' retrieve data dari database
                Me.TransactionsTableAdapter.FillByID(Me.DsInventory.transactions, TransID)
                Me.Transaction_detailsTableAdapter.FillByTransID(Me.DsInventory.transaction_details, TransID)
            End If
        Catch ex As Exception
            MessageBox.Show("Error retrieving data from database\nDetails: " + ex.Message,
                Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

[/collapsed]

[collapsed title=Kode Sumber Simpan Data] 

Proses penyimpanan data melibatkan dua table seperti pada potongan kode di bawah ini, silakan perhatikan komentar pada tiap baris kode yang menjelaskan maksud dari masing-masing baris kode yang ada.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' try saving data
        Try
            ' akhiri proses editing
            Me.BindingContext(Me.DsInventory.transactions).EndCurrentEdit()
            Me.BindingContext(Me.DsInventory.transaction_details).EndCurrentEdit()
            ' cek apakah add new atau edit data
            If (IsNewData) Then
                Dim dsChanges As New dsInventory
                ' copy master record dari main dataset
                ' harus dilakukan krena main dataset sebelumnya sudah 
                ' AcceptChanges padahal belum diupdate ke database 
                dsChanges.transactions.Rows.Add(Me.DsInventory.transactions(0).ItemArray)
                ' copy juga detail record dari main dataset
                For i = 0 To Me.DsInventory.transaction_details.Rows.Count - 1
                    dsChanges.transaction_details.Rows.Add(Me.DsInventory.transaction_details(i).ItemArray)
                Next

                ' simpan perubahan ke master table
                Me.TransactionsTableAdapter.Update(dsChanges.transactions)

                ' retrieve generated identity field
                Dim id As Long = 0
                Dim sql As String = "select last_insert_id()"
                Using cn As New MySqlConnection(My.Settings.inventoryConnectionString)
                    Using cm As New MySqlCommand(sql, cn)
                        cn.Open()
                        id = cm.ExecuteScalar
                        cn.Close()
                    End Using
                End Using

                ' assign retrieved id to master table
                dsChanges.transactions(0).id = id
                dsChanges.transactions.AcceptChanges()
                ' simpan perubahan ke details table
                Me.Transaction_detailsTableAdapter.Update(dsChanges.transaction_details)

            Else
                ' simpan perubahan ke database
                Me.TransactionsTableAdapter.Update(Me.DsInventory.transactions)
                Me.Transaction_detailsTableAdapter.Update(Me.DsInventory.transaction_details)
            End If
            ' informasikan data berhasil disimpan
            MessageBox.Show("Data BERHASIL disimpan!",
                Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information)
            ' tutup form
            Me.Close()
        Catch ex As Exception
            MessageBox.Show("Error saving data to database " + vbCrLf + "Details: " + ex.Message,
                Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

[/collapsed]

Desain Form List Transaksi Barang Masuk

Berikutnya kita buat desain form list transaksi barang masuk. Desain form list transaksi ini juga akan menggunakan Visual Inheritance seperti yang sudah dibahas sebelumnya di artikel desain user interface dan cara melakukan setting data-binding untuk grid list transaksi bisa di lihat di artikel desain form master barang, jadi silakan pelajari kedua artikel tersebut sebelum melanjutkan membaca artikel ini.

[collapsed title=Desain Form List Transaksi Barang Masuk] 

Desain Form List Transaksi Barang Masuk User Inteface Design

[/collapsed]

Kode Sumber Form List Transaksi Barang Masuk

Secara umum hampir tidak ada perbedaan pada code di artikel sebelumnya, hanya ada penambahan variable TransCode untuk membedakan jenis transaksi yang akan dimuat dari dalam database. Silakan perhatikan dengan seksama komentar yang terdapat dalam baris kode sumber, karena komentar-komentar tersebut menerangkan tujuan dari baris-baris kode yang ada

[collapsed title=Kode Sumber Constructor dan Refresh Data] 

    ' kode jenis transaksi
    Private TransCode As String = "IN"

    Private Sub frmTransactionIn_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' retrieve data from database
        Me.TransactionsTableAdapter.FillByType(Me.DsInventory.transactions, TransCode)
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Me.TransactionsTableAdapter.ClearBeforeFill = True
        Me.TransactionsTableAdapter.FillByType(Me.DsInventory.transactions, TransCode)
    End Sub

[/collapsed]

[collapsed title=Kode Sumber Loading Form Entri Data]Perbedaan Add dan Edit data adalah kita melempar parameter id transaksi ke form entri sebagai kondisi kita melakukan edit data

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' start process
        Cursor = Cursors.AppStarting
        ' prepare variables
        Dim fx As frmTransInEntry
        fx = New frmTransInEntry
        ' tampilkan form
        fx.ShowDialog()
        ' refresh data, ambil data yang berubah
        Button4.PerformClick()
        ' finish process
        Cursor = Cursors.Default
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ' start process
        Cursor = Cursors.AppStarting
        ' prepare variables
        Dim id As Integer
        Dim fx As frmTransInEntry
        ' ambil id data yg akan diedit
        id = DataGridView1.SelectedRows(0).Cells("id").Value
        ' create form entry berdasarkan id yang dipilih
        fx = New frmTransInEntry(id)
        ' refresh data, ambil data yang berubah
        Button4.PerformClick()
        ' tampilkan form
        fx.ShowDialog()
        ' finish process
        Cursor = Cursors.Default
    End Sub

[/collapsed]

[collapsed title=Kode Sumber Hapus Data Transaksi] 

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ' start process
        Cursor = Cursors.AppStarting
        ' prepare variables
        Dim dr As DialogResult
        Dim id As Integer
        Dim code As String
        Dim name As String
        Dim message As String
        Dim pos As Integer
        ' ambil id dan code dari data yg akan diedit
        Dim dv As DataRowView
        dv = Me.BindingContext(Me.TransactionsBindingSource).Current
        id = Convert.ToInt32(dv("id"))
        code = Convert.ToString(dv("code"))
        name = Convert.ToString(dv("name"))
        ' buat pesan konfirmasi
        message = String.Format("Are you sure to delete this [{0}] {1} data ? ", code, name)
        ' try deleting
        Try
            dr = MessageBox.Show(message,
                Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
            If dr = Windows.Forms.DialogResult.Yes Then
                pos = Me.BindingContext(Me.TransactionsBindingSource).Position
                Me.BindingContext(Me.TransactionsBindingSource).RemoveAt(pos)
                Me.TransactionsTableAdapter.Update(Me.DsInventory)
                Me.DsInventory.AcceptChanges()
            End If
        Catch ex As Exception
            MessageBox.Show("Error deleting data from database\nDetails: " + ex.Message,
                Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Me.DsInventory.RejectChanges()
        End Try
        ' finish up
        Cursor = Cursors.Default
    End Sub

[/collapsed]

Simpulan

Jika kita perhatikan kode sumber yang kita tuliskan di aplikasi ini sangat sedikit sekali dikarenakan kita menggunakan metode data-binding. Kita juga tidak perlu lagi repot-repot membuat perintah SQL untuk proses CRUD, karena proses CRUD ini sudah ditangani di data access layer. Dengan makin sedikit-nya kode yang harus kita tuliskan tentunya akan semakin meningkatkan produktifitas kita semua sebagai programmer dan semakin banyak karya-karya fenomenal yang bisa kita buat.

Source Code

Untuk memudahkan teman-teman mempelajari hal ini, silakan Download Source Code Di SiniDibuat menggunakan Visual Studio 2013,  

Salam PojokProgrammer ^_^

 

/