Sek, kyanya lebih seru klo aku kasih prolognya doeloe biar asyeek...
Begini ceritanya...
Al-kisah, salah seorang karyawan di sebuah perusahaan (anggaplah sekolah lah, biar enak perumpamaannya), menemui masalah kecil di kompienya. Salah satu game favoritnya yg dia donlot dari GameHouse trial expired! Dia udah 30 hari yg lalu nginstall tu game n skrg dah habis masa uji-cobanya. Berhubung dia ngga mau makae (or ngga nemu) crack-crackan-nya, n berhubung dia masih membutuhkan tu program, akhirnya dia coba2 mundurin tanggal di control panel nya. Dia mundurin ke Juli 2007. Solusi didapat. Tu game akhirnya bisa jalan (lagi)... Asyeeek...
Tp dia baru munculin satu masalah baru. Kebetulan dia tu karyawan TU bagian pembayaran BP3. Nah, pas lagi jam istirahat sekolah, n ada beberapa siswa yg datang ke dia mo mbayar BP3, dia lupa mbalikin lg tanggal sistemnya. Trus dia jalanin deh aplikasi sisfo pembayaran BP3 siswa yg dibuat ama salah satu software house tidak ternama di kotanya. (hehehe, suer bukan software-house ku.. ini cuman cerita rekayasa aja supaya memberikan kesan bombastis. hihihi. kesamaan nama, tempat, dan peristiwa, sungguh bukan karena disengaja... suer dech..)
Back to the story...
Apa yg terjadi?
Sebenarnya, nothing worse happen. Software BP3 yg dia jalankan, sukses dia operasikan dgn baek-baek saja koq... Udah kecatet transaksinya. "eRQee, mbayar 25ribu, sumbangan 5 ribu. Paul, mbayar 25ribu, ngga pake sumbangan. Annur, mbayar 50ribu, tunggakan 2 bulan." ~ semua yg dia catet tersimpen apa adanya koq.
Sebentar, mari kita lihat log transaksi pembayaran BP3 bulan Oktober 2007... Lho koq kosong? Semestinya ada laporan pembayaran dari eRQee, Paul, n Annur... selidik punya selidik, catatan transaksi yg barusan dia masukin rupanya nyangkut ke transaksi bulan Juli 2007. Wahwahwah... repot nieh. Utk ngoreksi transaksi, dia ngga dikasih privileges. Penyesuaian transaksi hanya bs dilakuin ama Waka Keuangan n tangan kanannya. Apesnya, dia bukan waka keuangan n bukan pula tangan kanannya... Pegimane iki?? Gawat. Klo ngelapor, bisa2 dia dimarahin karena memanfaatkan fasilitas kantor utk nge-game. Hiks...
~~ kasian ya? ~~
dan, moral value dr cerita di atas itu adalah :
- jangan maksain program klo dah expired masa trialnya. klo dah habis, en emang tu program bagus, belilah... (usaha dikit keq... minim, browse2 d Craagle keq utk 'beli' versi communitynya. xixixixi...)
- selalu teliti klo mo ngoperasikan program yg sensitif, apalagi klo menyangkut ttg uang.
- semestinya programmer yg bikin tu progam jg memperhatikan masalah penanggalan. karena dari sudut pandang sistem informasi, penanggalan itu sama sensitifnya dgn uang pada poin 2 di atas...
Nah, artikel d sini akan mencoba membahas mengenai upaya preventif supaya hal-hal begituan tidak terjadi di kemudian hari..
Ada beberapa solusi nih supaya pencatatan tanggal transaksi di client bs sinkron dgn tanggal yg berlaku di server...
PERTAMA, pendekatan query. Sejauh ini, ini merupakan cara yang paling-paling ampuh. Misal pake MySQL, gunakan UDF Now() pada query INSERT. Ato GetDate() ~> kalo di SQL Server. Jadi, semisal user menekan tombol "Save" pada form transaksi, n di tombol save itu didefinisikan query INSERT, e.g :
"INSERT INTO TblTrans(Tgl,NIS,JmlBayar,Sumbangan) VALUES(Now(),'11298',25000,5000)";
Tapi kadang pendekatan itu thox ngga cukup. Di form laporan transaksi ada combobox bulan/tahun yg akan meng-automatic-view transaksi yg terjadi pada bulan ini. Nah, biasanya, default valuesnya adalah bulan/tahun sekarang. Programmer biasanya nyettingnya ngga make cara ngirim2 query segala.. cukup pake function Now() dari program aplikasi. Artinya, ngambil settingan tanggal dari localtime dari masing2 kompie. Bukan server... NAH! Masalahnya td ada kasus pemunduran tanggal... gimana solusinya? Kirim query lg utk dapetin bulan sekarang? Boleh... itu pendekatan kedua.
Pendekatan KETIGA, ~ ini sebenarnya inti dari artikel ini (nggak to the point banged sih) ~ maksain settingan tanggal pada kompie client supaya sinkron dgn tanggal di server. Jadi, berapapun tanggal yg disetting di localtime, pas aplikasi dijalanin, aplikasi langsung nyesuaikan ostosmastis tanggal di client supaya SAMA PLEK dgn tanggal di server, se jam-menit-detiknya...
Caranya ?
Simak modul berikut :
Private Declare Function SetSystemTime Lib "kernel32" _
(lpSystemTime As SYSTEMTIME) As Long
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Public Sub SyncTime2ServerTime(ByRef db As ADODB.Connection)
Dim sQuery As String
Screen.MousePointer = vbHourglass
If DATABASE_ENGINE = "MYSQL" Then
sQuery = "SELECT YEAR(NOW()), " & _
"MONTH(NOW()), " & _
"DAY(NOW()), " & _
"HOUR(NOW()), " & _
"MINUTE(NOW()), " & _
"SECOND(NOW())"
ElseIf DATABASE_ENGINE = "SQLSERVER" Then
sQuery = "SELECT Datepart(yyyy, GETDATE()), " & _
" DatePart(mm, GETDATE()), " & _
" DatePart(dd, GETDATE()), " & _
" DatePart(hh, GETDATE()), " & _
" DatePart(mi, GETDATE()), " & _
" DatePart(ss, GETDATE()) "
Else 'kalo access n sqlite...
'nothing will be sync
Screen.MousePointer = vbDefault
Exit Sub
End If
Dim sNewTime As SYSTEMTIME
Dim lLng As Long
Dim rs As ADODB.Recordset
Set rs = db.Execute(sQuery)
If rs.RecordCount > 0 Then
sNewTime.wYear = rs(0)
sNewTime.wMonth = rs(1)
sNewTime.wDay = rs(2)
sNewTime.wHour = CStr(CInt(rs(3)) - 7)
sNewTime.wMinute = rs(4)
sNewTime.wSecond = rs(5)
lLng = SetSystemTime(sNewTime)
End If
rs.close
Set rs = nothing
Screen.MousePointer = vbDefault
End Sub
Private Sub Form_Load()
'blablabla...
SyncTime2ServerTime(db)
'dengan db adalah object ADODB.Connection yg udah
'open connection dengan baek...
End Sub
Gimana? Implementatif bukan? (maaf klo nggak, hehehe...)
Selamat mencoba.
3 comments:
mantab gan......
thank's atas inpo nya...
hix hix hix hix
nise inpo gan
wah tipe mismatch gan...
sungguh?
type mismatch di mana?
ntu code udah lolos seleksi indonesian idol 7 koq... mgkn juragan aja yg kurang co-pas nya ^_^ hehehe..
Posting Komentar