Para Programmer ataupun Software Enginner pasti pernah menggunakan SQL. minimal untuk proces CRUD (create, Read, Update, Delete) sederhana. namun sedikit yang memanfaatkan SQL proses perhitung rumit seperti penggajian, perhitungan average harga barang, ststus inventiry dan sebagainya hanya menggunakan Single SQL Statement alias dengan satu perintah SQL saja, waktu lalu saat diskusi online dengan kawan di facebook saya tergelitikmembuat contoh SQL beraksi untuk menghitung nilai stok dan harga rata barang terjadi proses keluar masuk barang pada bulan ternteu Contoh kasusnya adalah sperti ini
Di Ketahui ;
QOB := 1.670,28 Kg ( Opening Balance )
vOB := Rp. 8.397.476,7 ( Value Opening Balance
Akumulasi selama 1 bulan dari pembelian ( Harus Proses seluruh transaksi masuk )
SQB := 1.600,Kg ( Supply quantity Barang )
vSQB := Rp. 8.825.600 ( Value Quantity Barang )
Akumulasi pemakain material selam 1 bulan ( Harus Proses seluruh Transaksi Keluar )
uQB := 973,83 ( Used Quantity Balance )
Di Tanya ;
vuQB : …..?? ( Value used Quatity Balance )
SAB : …… ( Saldo akhir balance )
vSAB : ……..( Value saldo akhir balance )
Jawab ;
Average Bahan Baku := (( vSQB+vOB) / (QOB+SQB) )
vuQB := uQB * average bahan baku
SAB := (( QOB+SQB)-UQB)
vSAB := SAB * average bahan baku
berinteraksi dengan database, maka ada Aturan Emas yang harus selalu dipegang. Golden Rule disampaikan oleh Tom Kyte, Oracle Evangelist,
Sebisa mungkin, selalu menggunakan perintah SQL.
Jika Anda tidak bisa dalam perintah SQL tunggal, kemudian gunakan Prosedur Tersimpan
Jika Anda tidak dapat menggunakan Stored Prosedur, dilakukan di aplikasi kita
Jika Anda masih tidak bisa juga, mungkin kita perlu berpikir hati-hati, tidak Anda berpikir kita benar-benar perlu melakukan hal ini? :)
Untuk itu kami akan mencoba untuk menyelesaikan masalah di atas hanya menggunakan satu perintah SQL saja. Tapi saya akan menjelaskan langkah-demi-langkah dalam membangun "perintah SQL" adalah, sehingga teman-teman dapat memahami algoritma dan logika di dalamnya. Untuk hal ini saya akan menggunakan PostgreSQL untuk menyelesaikan, tetapi hasil akhirnya adalah perintah SQL standar yang dapat digunakan dalam setiap RDBMS lainnya. Mari kita mulai dengan membuka baris perintah PostgreSQL
C:\Program Files\PostgreSQL\9.3\bin>psql -U postgres -d inventory
psql (9.3.1)
WARNING: Console code page (850) differs from Windows code page (1252)
8-bit characters might not work correctly. See psql reference
page "Notes for Windows users" for details.
Type "help" for help.
Untuk mengatasi kasus di atas kita perlu beberapa buah meja, yaitu
- item meja untuk menampung data master barang.
- tabel item_balances untuk menampung data bulanan saldo awal untuk setiap item.
- transaksi meja untuk mencatat transaksi harian, barang keluar dan masuk.
Pertama-tama kita buat struktur table items.
inventory=# -- -----------------------
inventory=# -- buat table items
inventory=# -- -----------------------
inventory=# create table items (
inventory(# id serial primary key,
inventory(# code varchar(20) not null,
inventory(# name varchar(200) null
inventory(# ) ;
CREATE TABLE
fill some data using the insert command into. and show the results to be sure.
inventory=# -- -----------------------
inventory=# -- masukkan beberapa data
inventory=# -- -----------------------
inventory=# insert into items (code, name)
inventory-# select 'ITEM01', 'Barang Pertama' union all
inventory-# select 'ITEM02', 'Barang Kedua' union all
inventory-# select 'ITEM03', 'Barang Ketiga'
inventory-# ;
INSERT 0 3
inventory=# -- -----------------------
inventory=# -- lihat hasilnya
inventory=# -- -----------------------
inventory=# select * from items
inventory-# ;
id | code | name
----+--------+----------------
1 | ITEM01 | Barang Pertama
2 | ITEM02 | Barang Kedua
3 | ITEM03 | Barang Ketiga
(3 rows)
Selanjutnya kita mengatur meja saldo item yang digunakan untuk menyimpan saldo awal dan harga barang setiap bulan. perlu untuk periode bidang-bulan untuk identifikasi.
inventory=# -- -----------------------
inventory=# -- buat table balance
inventory=# -- -----------------------
inventory=# create table item_balances (
inventory(# id serial primary key,
inventory(# item_id integer not null,
inventory(# period date not null,
inventory(# quantity numeric(15,2),
inventory(# unit_price numeric(15,2),
inventory(# foreign key (item_id) references items(id)
inventory(# ) ;
CREATE TABLE
do JOIN terhadal table items, and the result of crosstab item_balance transactions for the calculation process in accordance with the formula given at the beginning of this article
inventory=# -- -----------------------inventory=# -- perhitungan akhirinventory=# -- -----------------------inventory=# select it.id, it.code, it.nameinventory-# , bl.period, bl.quantity QOB, bl.unit_price Avg1inventory-# , ( bl.quantity *bl.unit_price ) vOBinventory-# , tx.qty_in SQB, tx.value_in vSQB, tx.qty_out uQBinventory-# , ( (tx.value_in +bl.quantity *bl.unit_price) / (bl.quantity +tx.qty_in) ) Avg2inventory-# , tx.qty_outinventory-# * ( (tx.value_in+bl.quantity*bl.unit_price) / (bl.quantity +tx.qty_in) ) vuQBinventory-# , ( bl.quantity +tx.qty_in ) -tx.qty_out SABinventory-# , ( (bl.quantity +tx.qty_in) -tx.qty_out )inventory-# * ( (tx.value_in +bl.quantity *bl.unit_price) / (bl.quantity +tx.qty_in) ) vSABinventory-# from items itinventory-# join item_balances bl on it.id = bl.item_idinventory-# left join (inventory(# select item_idinventory(# , date_trunc('month',tx_date) tx_dateinventory(# , sum(case when tx_type='IN' then quantity else 0 end) qty_ininventory(# , sum(case when tx_type='IN' then quantity*unit_price else 0 end) value_ininventory(# , sum(case when tx_type='OUT' then quantity else 0 end) qty_outinventory(# from transactionsinventory(# group by item_idinventory(# , date_trunc('month',tx_date)inventory(# ) txinventory-# on bl.item_id = tx.item_idinventory-# and bl.period = tx.tx_dateinventory-# ;id | code | name | period | qob | avg1 | vob | sqb | vsqb | uqb | avg2 | vuqb | sab | vsab----+--------+----------------+------------+---------+----------+-------------+---------+-------------+---------+----------+-------------+---------+-------------1 | ITEM01 | Barang Pertama | 2013-12-01 | 1600.00 | 23125.00 | 37000000.00 | 300.00 | 7437500.00 | 700.00 | 23388.16 | 16371712.00 | 1200.00 | 28065792.002 | ITEM02 | Barang Kedua | 2013-12-01 | 1250.00 | 13100.00 | 16375000.00 | 3000.00 | 43325000.00 | 2700.00 | 14047.06 | 37927062.00 | 1550.00 | 21772943.003 | ITEM03 | Barang Ketiga | 2013-12-01 | 3250.00 | 3100.00 | 10075000.00 | 3000.00 | 10900000.00 | 4700.00 | 3356.00 | 15773200.00 | 1550.00 | 5201800.00(3 rows)
Kita berhasil membuat satu perintah SQL untuk perhitungan status stok akhir bulan dan menghitung harga rata-ratanya. hasil dari perintah SQL ini sudah matang, sehingga aplikasi kita - PHP atau VB.net atau lainnya - bisa langsung menampilkan hasilnya tanpa perlu melakukan proses perhitungan lagi........
Semoga berguna buat anda Semua....
Tidak ada komentar:
Posting Komentar