Minggu, 25 Agustus 2013

Membuat sms gateway

Membuat sms gateway itu gampang, jangan dipersulit !!!


Berhubung banyaknya pengunjung yang nyasar ke blog ini, gara-gara keyword “sms gateway” saya jadi merasa bersalah klo enggax ikut-ikutan membahas artikel yang satu ini he he he :D .
Walaupun sudah banyak blog yang membahas tentang masalah ini, tapi kayaxnya tema “sms gateway” masih hangat dan saru eh… seru untuk dibahas :D , dan tentunya dengan adanya artikel ini saya berharap lebih banyak lagi yang tersesat ke blog ini :D .
Oke jadi kasusnya apa nih, kita ambil aja sample sederhana yaitu “pembuatan sms gateway untuk request nilai siswa” dan untuk menyederhanakan pembahasan keywordnya kita batasi saja yaitu request nilai tugas dan ulangan.
Apa yang harus di persiapkan, pertama kita rancang dulu databasenya dan berhubung artikel saya yang membahas tentang database SQLite masih hangat jadi untuk databasenya kita menggunakan SQLite saja.

SQLite adalah database standalone yang kecil, mungil dan gratis. Bagaimana cara membuat database di SQLite sudah saya bahas disini kemudian bagaimana mengaksesnya dari aplikasi juga sudah saya bahasa disini.
Berikut adalah rancangan sederhana database sms yang akan kita buat :

Ada banyak cara untuk membaca sms masuk dan membalasanya, salah satunya adalah menggunakan perintah AT COMMAND dan Microsoft sendiri sudah menyediakan komponen yang bisa mengeksekusi perintah-perintah tersebut.
Tentunya cara ini (menggunakan AT COMMAND) bukan cara yang favorit dikalangan programmer instan seperti Anda dan Saya :D , jadi diartikel ini saya menggunakan komponen pihak ketiga.
Ingat komponen ini adalah shareware, segala resiko (kemudahan dalam membuat aplikasi sms gateway) ditanggung sendiri :D , saya disini hanya share dan tidak terikat kerja sama dengan pihak ketiga tersebut.
Halah pernyataan ngawur :D
Berikut adalah cuplikan source code untuk membaca dan mengirim sms menggunakan komponen ActiveXpert SMS
1. Membaca SMS Masuk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub cmdBacaSMS_Click()
    Dim objGsmIn        As ASmsCtrl.GsmIn
 
    Set objGsmIn = New ASmsCtrl.GsmIn
    With objGsmIn
        .Activate "XXX-XXXX-XXXX-XXXXX"  'diisi serial number yg Anda dapatkan secara ilegal
        .Device = "COM1" 'disesuaikan dengan port COM yang digunakan
        .DeviceSpeed = 19200 'default = 0
 
        .Storage = 2 '0=sim 1=device 2=any
        .DeleteAfterReceive = True
        .Receive
 
        If .LastError = 0 Or .LastError = 23140 Then ' Success
            .GetFirstMessage
 
            While .LastError = 0
                Debug.Print "Pengirim : " & .MessageSender
                Debug.Print "Isi SMS : " & .MessageData
 
                'TODO : INSERT KE TABEL SMS_IN
 
                .GetNextMessage
            Wend
        End If
    End With
    Set objGsmIn = Nothing
End Sub
2. Mengirim sms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub cmdKirimSMS_Click()
    Dim objGsmOut       As ASmsCtrl.GsmOut
    Dim objConstants    As ASmsCtrl.Constants
 
    Set objGsmOut = New ASmsCtrl.GsmOut
    Set objConstants = New ASmsCtrl.Constants
 
    With objGsmOut
        .Activate "XXX-XXXX-XXXX-XXXXX"  'diisi serial number yg Anda dapatkan secara ilegal
        .Device = "COM1" 'disesuaikan dengan port COM yang digunakan
        .DeviceSpeed = 19200 'default = 0
        .RequestStatusReport = False
 
        .MessageType = objConstants.asMESSAGETYPE_TEXT 'mengirim pesan maksimal 160 karakter
        '.MessageType = objConstants.asMESSAGETYPE_TEXT_MULTIPART 'jika lebih dari 160 karakter gunakan opsi ini
 
        .MessageRecipient = "nomor tujuan" 'biasanya menggunakan prefix +62
        .MessageData = "isi pesan"
        .Send 'kirim
    End With
 
    Set objConstants = Nothing
    Set objGsmOut = Nothing
End Sub
Jadi cukup dengan bermodalkan 2 cuplikan kode diatas kita akan menyelesaikan aplikasi yg dibahas pada artikel kali ini.
Adapun untuk keyword yang akan digunakan sebagai berikut :
1. Request nilai tugas
keyword : tgs#nis
contoh :
tgs#9941224165
balasan :
Nilai tugas (NAMA SISWA) : BI=95, IPA=75, IPS=80, MTK=85
2. Request nilai ulangan harian
keyword : uh#nis
contoh :
uh#9941224165
balasan :
Nilai ulangan (NAMA SISWA) : BI=95, IPA=75, IPS=80, MTK=85
Berikut penjelasan ringkas beberapa cuplikan source code yang digunakan dalam pembuatan aplikasi sms gateway ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Function connectToDevice(ByVal device As String) As Boolean
    Dim objGsm      As ASmsCtrl.GsmOut
    Dim manufaktur  As String
 
    On Error GoTo errHandle
 
    Set objGsm = New ASmsCtrl.GsmOut
    With objGsm
        .Activate SERIAL_NUMBER
        .device = device
 
        manufaktur = .SendCommand("AT+CGMI", 500)  'menampilkan informasi manufactur
        manufaktur = Replace$(manufaktur, vbCrLf, "")
        manufaktur = Replace$(manufaktur, "OK", "")
        manufaktur = Replace$(manufaktur, "ERROR", "")
        manufaktur = Replace$(manufaktur, "AT+CGMI", "")
    End With
    Set objGsm = Nothing
 
    If Len(manufaktur) > 0 Then
        txtModem.Text = manufaktur
        connectToDevice = True
    End If
 
    Exit Function
errHandle:
    connectToDevice = False
End Function
Sesuai namanya fungsi connectToDevice digunakan untuk mengecek status modem sms yang terpasang, salah satu caranya adalah dengan mengirimkan AT COMMAND “AT+CGM”, AT COMMAND ini berfungsi untuk mendapatkan informasi manufaktur.
Sebagai contoh jika modem sms yg digunakan adalah hp siemens maka nilai yg dihasilkan dari perintah ini adalah “SIEMENS” dan tentunya hp yg bersangkutan juga harus mendukung AT COMMAND.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Private Sub readSMS()
    Dim objGsmIn        As ASmsCtrl.GsmIn
    Dim objConstants    As ASmsCtrl.Constants
    Dim cmd             As cCommand
 
    Dim keyword         As String
    Dim phoneNumber     As String
    Dim i               As Integer
 
    On Error GoTo errHandle
 
    Screen.MousePointer = vbHourglass
    cmdStop.Enabled = False
    tmrReceiveSms.Enabled = False
 
    DoEvents
 
    Set objGsmIn = New ASmsCtrl.GsmIn
    Set objConstants = New ASmsCtrl.Constants
 
    With objGsmIn
        .Activate SERIAL_NUMBER
        .device = cmbPORT.Text
        .DeviceSpeed = 0
 
        .Storage = cmbStorage.ItemData(cmbStorage.ListIndex)
        .DeleteAfterReceive = True 'hapus sms jika sudah dibaca
        .Receive
 
        If .LastError = 0 Or .LastError = 23140 Then 'baca sms sukses
            .GetFirstMessage
 
            strSql = "INSERT INTO sms_in (phone_number, sms_keyword, date_in, time_in) VALUES (?, ?, ?, ?)"
            Set cmd = conn.CreateCommand(strSql)
            conn.BeginTrans
 
            i = 1
            While .LastError = 0
                phoneNumber = rep0to62(.MessageSender)
                keyword = .MessageData
 
                cmd.SetText 1, phoneNumber
                cmd.SetText 2, keyword
                cmd.SetDate 3, Format(Now, "yyyy/MM/dd")
                cmd.SetTime 4, Format(Now, "hh:mm:ss")
 
                cmd.Execute
 
                If i Mod 10 = 0 Then
                    conn.CommitTrans
                    DoEvents
 
                    conn.BeginTrans
                End If
 
                i = i + 1
 
                .GetNextMessage
            Wend
 
            conn.CommitTrans
            Set cmd = Nothing
 
        End If
    End With
    Set objGsmIn = Nothing
 
    If cekSMSIn Then
        Call sendSMS
    Else
        Call Wait(5000)
    End If
 
    cmdStop.Enabled = True
    Screen.MousePointer = vbDefault
 
    tmrReceiveSms.Enabled = True
 
    Exit Sub
errHandle:
    tmrReceiveSms.Enabled = True
End Sub
Prosedur readSMS digunakan untuk membaca sms masuk dan menyimpannya ke tabel sms_in, berhubung komponen ActiveXpert SMS tidak mempunyai event yg menandai adanya sms masuk maka sebagai gantinya kita menggunakan timer untuk memanggil prosedur readSMS.
Salah satu properties penting yang dimiliki oleh ActiveXpert SMS adalah DeleteAfterReceive, jika nilainya diset true maka sms yg masuk akan otomatis dihapus dan tentunya setelah smsnya dibaca.
1
2
3
4
5
6
7
8
9
Private Function cekSMSIn() As Boolean
    Dim ret As Integer
 
    strSql = "SELECT COUNT(*) FROM sms_in WHERE status = 0" 'jika status = 0 berarti sms masuk belum di proses
    ret = CInt(dbGetValue(strSql, 0))
    If ret > 0 Then 'ada sms yg belum diproses
        cekSMSIn = True
    End If
End Function
Prosedur cekSMSIn dibutuhkan oleh prosedur readSMS, jadi dengan adanya prosedur cekSMSIn ini program akan mengetahui kapan waktu yg tepat untuk memanggil prosedur sendSMS.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Private Sub sendSMS()
    Dim rsSend          As cRecordset
    Dim cmd             As cCommand
 
    Dim objGsmOut       As ASmsCtrl.GsmOut
    Dim objConstants    As ASmsCtrl.Constants
 
    Dim phoneNumber     As String
    Dim keyword         As String
    Dim smsBalasan      As String
 
    On Error GoTo errHandle
 
    'cek sms yang belum di proses, ditandai dg status = 0
    strSql = "SELECT id, phone_number, sms_keyword " & _
             "FROM sms_in " & _
             "WHERE status = 0 " & _
             "ORDER BY id"
    Set rsSend = conn.OpenRecordset(strSql)
    If Not rsSend.EOF Then
        Set objGsmOut = New ASmsCtrl.GsmOut
        Set objConstants = New ASmsCtrl.Constants
 
        objGsmOut.Activate SERIAL_NUMBER
        objGsmOut.device = cmbPORT.Text
        objGsmOut.DeviceSpeed = 0
        objGsmOut.RequestStatusReport = False
        objGsmOut.MessageType = objConstants.asMESSAGETYPE_TEXT_MULTIPART
 
        Do While Not rsSend.EOF
            'ganti prefix nomor hp 0 -> +62
            phoneNumber = rep0to62("" & rsSend("phone_number").Value)
            keyword = rsSend("sms_keyword").Value
 
            smsBalasan = getBalasanSms(keyword, phoneNumber)
 
            objGsmOut.MessageRecipient = phoneNumber
            objGsmOut.MessageData = smsBalasan
            objGsmOut.Send
 
            If objGsmOut.LastError = 0 Or objGsmOut.LastError = 23140 Then 'sms sukses dikirim
                'update status sms -> 1
                strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _
                         "WHERE id = ?"
                Set cmd = conn.CreateCommand(strSql)
                With cmd
                    .SetInt32 1, 1
                    .SetInt32 2, objGsmOut.MessageReference
                    .SetInt32 3, rsSend("id").Value
 
                    .Execute
                End With
                Set cmd = Nothing
 
                'insert ke tabel sms_out, untuk histori sms keluar
                strSql = "INSERT INTO sms_out (phone_number, replay_msg, date_out, time_out) VALUES (?, ?, ?, ?)"
                Set cmd = conn.CreateCommand(strSql)
                With cmd
                    .SetText 1, phoneNumber
                    .SetText 2, smsBalasan
                    .SetDate 3, Format(Now, "yyyy/MM/dd")
                    .SetTime 4, Format(Now, "hh:mm:ss")
 
                    .Execute
                End With
                Set cmd = Nothing
 
            Else 'sms gagal dikirim
                'update status sms -> 1
 
                'ini masih bisa dikembangkan lagi dengan menambah kolom max_jumlah_kirim di tabel sms_in
                'jadi bisa diberi aturan sms yg gagal dikirim > 3x baru status smsnya diupdate menjadi 1
                strSql = "UPDATE sms_in SET status = ?, no_ref = ? " & _
                         "WHERE id = ?"
                Set cmd = conn.CreateCommand(strSql)
                With cmd
                    .SetInt32 1, 1
                    .SetInt32 2, objGsmOut.MessageReference
                    .SetInt32 3, rsSend("id").Value
 
                    .Execute
                End With
                Set cmd = Nothing
            End If
 
            Call Wait(5000)
 
            rsSend.MoveNext
        Loop
        Set objConstants = Nothing
        Set objGsmOut = Nothing
    End If
 
    Exit Sub
errHandle:
    Resume Next
End Sub
Prosedur sendSMS akan mengolah sms masuk yg belum di proses (ditandai dengan status = 0), mengupdate statusnya menjadi 1 jika berhasil mengirimkan sms, kemudian menyimpannya ke tabel sms_out sebagai histori pengiriman sms.
1
2
3
4
5
6
Public Function rep0to62(ByVal phoneNumber As String) As String
    'fungsi untuk mengganti prefix 0 -> +62
 
    rep0to62 = phoneNumber
    If Left(phoneNumber, 1) = "0" Then rep0to62 = "+62" & Right(phoneNumber, Len(phoneNumber) - 1)
End Function
Sesuai namanya fungsi ini berguna untuk mengganti prefix nomor hp 0 menjadi +62 (kode indonesia).
Terakhir fungsi untuk memproses keyword sms yang masuk dan sekaligus sebagai balasan untuk sms keluar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
Public Function getBalasanSms(ByVal keywordSms As String, ByVal phoneNumber As String) As String
    Dim rs              As cRecordset
    Dim param1          As String
    Dim arrKeyword()    As String
 
    Dim prefix          As String
    Dim nilai           As String
    Dim nama            As String
 
    Dim tha             As String
    Dim semester        As String
 
    If Len(keywordSms) > 0 Then
        If InStr(1, keywordSms, "#") > 0 Then 'karakter # -> separator keyword
            arrKeyword = Split(keywordSms, "#")
            If Not (Len(arrKeyword(0)) > 0) Then
                getBalasanSms = "Keyword sms salah"
                Exit Function
 
            Else
                'do nothing
            End If
 
        Else
            ReDim arrKeyword(0)
            arrKeyword(0) = keywordSms
        End If
 
    Else
        getBalasanSms = "Keyword sms salah"
        Exit Function
    End If
 
    prefix = arrKeyword(0)
    prefix = UCase$(prefix)
 
    If UBound(arrKeyword) > 0 Then param1 = arrKeyword(1) 'untuk contoh disini param1 bernilai nomor induk siswa
 
    'untuk pengembangan lebih lanjut tahun ajaran dan semester dibuat settingan tersendiri
    tha = "2009/2010"
    semester = 2
 
    Select Case prefix
        Case "TGS"
            'validasi nis siswa
            If Not isValidNIS(param1) Then getBalasanSms = Replace(NIS_SALAH, "<nis>", param1): Exit Function
 
            'validasi no hp siswa
            'nama sekolah sebaiknya disimpan didalam variabel
            If Not isValidHPSiswa(param1, phoneNumber) Then
                getBalasanSms = Replace(HP_UNREG, "<nama_sekolah>", "SMA Negeri Yogyakarta")
                getBalasanSms = Replace(getBalasanSms, "<no_hp>", phoneNumber): Exit Function
            End If
 
            strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 & "'"
            nama = CStr(dbGetValue(strSql, ""))
 
            'mulai proses pencarian nilai
            strSql = "SELECT matapelajaran_kode, nilai " & _
                     "FROM nilai_tugas " & _
                     "WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _
                     "ORDER BY matapelajaran_kode"
            Set rs = conn.OpenRecordset(strSql)
            If Not rs.EOF Then
                Do While Not rs.EOF
                    nilai = nilai & rs("matapelajaran_kode").Value & "=" & rs("nilai").Value & ", "
                    rs.MoveNext
                Loop
            End If
 
            If Len(nilai) > 0 Then
                nilai = Left(nilai, Len(nilai) - 2)
                getBalasanSms = "Nilai tugas (" & nama & ") : " & nilai
 
            Else
                getBalasanSms = "Nilai tugas (" & nama & ") sedang dalam proses pendataan"
            End If
 
        Case "UH"
            'validasi nis siswa
            If Not isValidNIS(param1) Then getBalasanSms = Replace(NIS_SALAH, "<nis>", param1): Exit Function
 
            'validasi no hp siswa
            'nama sekolah sebaiknya disimpan didalam variabel
            If Not isValidHPSiswa(param1, phoneNumber) Then
                getBalasanSms = Replace(HP_UNREG, "<nama_sekolah>", "SMA Negeri Yogyakarta")
                getBalasanSms = Replace(getBalasanSms, "<no_hp>", phoneNumber): Exit Function
            End If
 
            strSql = "SELECT UPPER(nama) FROM siswa WHERE nis = '" & param1 & "'"
            nama = CStr(dbGetValue(strSql, ""))
 
            'mulai proses pencarian nilai
            strSql = "SELECT matapelajaran_kode, nilai " & _
                     "FROM nilai_ulangan " & _
                     "WHERE siswa_nis = '" & param1 & "' AND tahun_ajaran = '" & tha & "' AND semester = " & semester & " " & _
                     "ORDER BY matapelajaran_kode"
            Set rs = conn.OpenRecordset(strSql)
            If Not rs.EOF Then
                Do While Not rs.EOF
                    nilai = nilai & rs("matapelajaran_kode").Value & "=" & rs("nilai").Value & ", "
                    rs.MoveNext
                Loop
            End If
 
            If Len(nilai) > 0 Then
                nilai = Left(nilai, Len(nilai) - 2)
                getBalasanSms = "Nilai ulangan (" & nama & ") : " & nilai
 
            Else
                getBalasanSms = "Nilai ulangan (" & nama & ") sedang dalam proses pendataan"
            End If
 
        Case Else
            getBalasanSms = "Keyword sms salah"
    End Select
End Function

Untuk mengetahui daftar hp/modem apa saja yang didukung, jangan sungkan dan malu-malu untuk mengklik link ini.
Selamat MENCOBA :)

http://coding4ever.wordpress.com/2010/07/12/membuat-sms-gateway-itu-gampang-jangan-dipersulit/

Mengakses database SQLite menggunakan library dhSQLite

Mengakses database SQLite menggunakan library dhSQLite


Ada yang kurang di artikel sebelumnya, yaitu saya belum membahas bagaimana mengakses database SQLite dalam pembuatan aplikasi database.
Secara umum aksi yang sering dilakukan dalam pembuatan aplikasi database hanya seputar pernyataan DML (Insert, Update, Delete dan Select), jadi untuk menyederhanakan pembahasan saya pun membatasi artikel kali ini hanya seputar permasalahan tersebut.
Sebenarnya cukup dengan library ADO pun kita sudah bisa mengakses database SQLite, tetapi pada artikel kali ini saya menggunakan library dhSQLite.
Untuk mengakses database SQLite menggunakan dhSQLite kita cukup menggunakan 3 kelas yaitu :
  1. cConnection, sesuai namanya kelas ini digunakan untuk membuat koneksi ke database
  2. cRecordset, digunakan untuk menampung pernyataan select
  3. cCommand, digunakan untuk mengeksekusi pernyataan insert, update dan delete

sedangkan untuk sample database bisa langsung Anda download disini.
1. Membuat koneksi
Tambahkan sebuah modul, kemudian ketik kode berikut :
1
2
3
4
5
6
7
8
9
10
11
Public Function openDb() As Boolean
    On Error GoTo errHandle
 
    Set conn = New cConnection
    conn.openDb "C:\dbpos\dbpos.db3"
    openDb = True
 
    Exit Function
errHandle:
    openDb = False
End Function
dengan asumsi database dbpos.db3 sudah ada di folder C:\dbpos.
Untuk mencoba fungsi openDb diatas, kita akan memanfaat prosedur Main berikut :
1
2
3
4
5
6
7
8
9
10
Public Sub Main()
    Dim ret As Boolean
 
    ret = openDb
    If ret Then
        'TODO : tampilkan form utama
    Else
        MsgBox "Koneksi gagal", vbExclamation, "Peringatan"
    End If
End Sub
Tentunya agar prosedur Main tersebut bisa dijalankan, kita harus merubah Startup Object menjadi Sub Main.

2. Menambahkan data
Menambahkan data menggunakan objek cCommand sangat mudah sekali, lihat kode berikut :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub cmdSimpan_Click()
    Dim cmd As cCommand
 
    strSql = "INSERT INTO barang (kode_barang, nama_barang, stok, harga_beli, harga_jual) VALUES (?, ?, ?, ?, ?)"
    Set cmd = conn.CreateCommand(strSql)
    With cmd
        .SetText 1, txtKodeBarang.Text
        .SetText 2, txtNamaBarang.Text
        .SetDouble 3, Val(txtStok.Text)
        .SetDouble 4, Val(txtHargaBeli.Text)
        .SetDouble 5, Val(txtHargaJual.Text)
        .Execute
    End With
    Set cmd = Nothing
End Sub
Mirip sekali bukan menambahkan data menggunakan interface PreparedStatement di java :D
Angka 1,2 .. 5 merupakan urutkan field pada pernyataan dml, sedangkan method yang dipanggil setelah berhasil menciptakan objek cCommand sesuai dengan tipe data field.
Contoh kode barang bertipe varchar, maka method yang dipanggil adalah SetText, sedangkan stok, harga beli dan harga jual bertipe numeric makanya method SetDouble yang dipanggil dan jika bertipe integer tinggal panggil aja method SetInt32 dan begitu seterusnya.
Oke kita lihat lagi pada pernyataan berikutnya.
3. Mengedit data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub cmdEdit_Click()
    Dim cmd As cCommand
 
    strSql = "UPDATE barang SET nama_barang = ?, stok = ?, harga_beli = ?, harga_jual = ? " & _
             "WHERE kode_barang = ?"
    Set cmd = conn.CreateCommand(strSql)
    With cmd
        .SetText 1, txtNamaBarang.Text
        .SetDouble 2, Val(txtStok.Text)
        .SetDouble 3, Val(txtHargaBeli.Text)
        .SetDouble 4, Val(txtHargaJual.Text)
        .SetText 5, txtKodeBarang.Text
        .Execute
    End With
    Set cmd = Nothing
End Sub
4. Menghapus data
1
2
3
4
5
6
7
8
9
10
11
Private Sub cmdHapus_Click()
    Dim cmd As cCommand
 
    strSql = "DELETE FROM barang WHERE kode_barang = ?"
    Set cmd = conn.CreateCommand(strSql)
    With cmd
        .SetText 1, txtKodeBarang.Text
        .Execute
    End With
    Set cmd = Nothing
End Sub
5. Menampilkan data
Untuk menampilkan data kita menggunakan pernyataan SELECT, dan ingat pernyataan SELECT mengembalikan data dalam bentuk recordset, sehingga kita harus membuat objek dengan tipe cRecordset.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub cmdTampilkan_Click()
    Dim rs  As cRecordset
 
    strSql = "SELECT kode_barang, nama_barang, stok, harga_beli, harga_jual " & _
             "FROM barang " & _
             "ORDER BY nama_barang"
    Set rs = conn.OpenRecordset(strSql, True)
    If Not rs.EOF Then
        Do While Not rs.EOF
            Debug.Print rs("kode_barang").Value & ", " & rs("nama_barang").Value
            rs.MoveNext
        Loop
    End If
End Sub
6. Insert, Update dan Delete dalam jumlah banyak
Hati-hati jangan langsung mengunakan kode seperti berikut :
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub cmdTest1_Click()
    Dim cmd As cCommand
    Dim i   As Integer
 
    strSql = "INSERT INTO tabel_test (no_urut) VALUES (?)"
 
    Set cmd = conn.CreateCommand(strSql)
    For i = 1 To 1000
        cmd.SetInt32 1, i
        cmd.Execute
    Next i
    Set cmd = Nothing
End Sub
hasil uji coba di laptop saya membutuhkan waktu sekitar 1 menitan, tetapi bandingkan jika menggunakan transaction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub cmdTest2_Click()
    Dim cmd As cCommand
    Dim i   As Integer
 
    strSql = "INSERT INTO tabel_test (no_urut) VALUES (?)"
 
    Set cmd = conn.CreateCommand(strSql)
    conn.BeginTrans
    For i = 1 To 1000
        cmd.SetInt32 1, i
        cmd.Execute
 
        If i Mod 200 = 0 Then
            conn.CommitTrans
            DoEvents
 
            conn.BeginTrans
        End If
    Next i
    conn.CommitTrans
    Set cmd = Nothing
End Sub
hanya membutuhkan waktu 1 detik, wowww lumayan bedakan.
Oke terakhir untuk mencoba semua kode diatas, library dhSQLite harus sudah direferensikan di project kita.

Selamat mencoba :)

http://coding4ever.wordpress.com/2010/07/05/mengakses-database-sqlite-menggunakan-library-dhsqlite/

Mengakses database SQLite menggunakan library dhSQLite

Mengakses database SQLite menggunakan library dhSQLite


Ada yang kurang di artikel sebelumnya, yaitu saya belum membahas bagaimana mengakses database SQLite dalam pembuatan aplikasi database.
Secara umum aksi yang sering dilakukan dalam pembuatan aplikasi database hanya seputar pernyataan DML (Insert, Update, Delete dan Select), jadi untuk menyederhanakan pembahasan saya pun membatasi artikel kali ini hanya seputar permasalahan tersebut.
Sebenarnya cukup dengan library ADO pun kita sudah bisa mengakses database SQLite, tetapi pada artikel kali ini saya menggunakan library dhSQLite.
Untuk mengakses database SQLite menggunakan dhSQLite kita cukup menggunakan 3 kelas yaitu :
  1. cConnection, sesuai namanya kelas ini digunakan untuk membuat koneksi ke database
  2. cRecordset, digunakan untuk menampung pernyataan select
  3. cCommand, digunakan untuk mengeksekusi pernyataan insert, update dan delete

sedangkan untuk sample database bisa langsung Anda download disini.
1. Membuat koneksi
Tambahkan sebuah modul, kemudian ketik kode berikut :
1
2
3
4
5
6
7
8
9
10
11
Public Function openDb() As Boolean
    On Error GoTo errHandle
 
    Set conn = New cConnection
    conn.openDb "C:\dbpos\dbpos.db3"
    openDb = True
 
    Exit Function
errHandle:
    openDb = False
End Function
dengan asumsi database dbpos.db3 sudah ada di folder C:\dbpos.
Untuk mencoba fungsi openDb diatas, kita akan memanfaat prosedur Main berikut :
1
2
3
4
5
6
7
8
9
10
Public Sub Main()
    Dim ret As Boolean
 
    ret = openDb
    If ret Then
        'TODO : tampilkan form utama
    Else
        MsgBox "Koneksi gagal", vbExclamation, "Peringatan"
    End If
End Sub
Tentunya agar prosedur Main tersebut bisa dijalankan, kita harus merubah Startup Object menjadi Sub Main.

2. Menambahkan data
Menambahkan data menggunakan objek cCommand sangat mudah sekali, lihat kode berikut :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub cmdSimpan_Click()
    Dim cmd As cCommand
 
    strSql = "INSERT INTO barang (kode_barang, nama_barang, stok, harga_beli, harga_jual) VALUES (?, ?, ?, ?, ?)"
    Set cmd = conn.CreateCommand(strSql)
    With cmd
        .SetText 1, txtKodeBarang.Text
        .SetText 2, txtNamaBarang.Text
        .SetDouble 3, Val(txtStok.Text)
        .SetDouble 4, Val(txtHargaBeli.Text)
        .SetDouble 5, Val(txtHargaJual.Text)
        .Execute
    End With
    Set cmd = Nothing
End Sub
Mirip sekali bukan menambahkan data menggunakan interface PreparedStatement di java :D
Angka 1,2 .. 5 merupakan urutkan field pada pernyataan dml, sedangkan method yang dipanggil setelah berhasil menciptakan objek cCommand sesuai dengan tipe data field.
Contoh kode barang bertipe varchar, maka method yang dipanggil adalah SetText, sedangkan stok, harga beli dan harga jual bertipe numeric makanya method SetDouble yang dipanggil dan jika bertipe integer tinggal panggil aja method SetInt32 dan begitu seterusnya.
Oke kita lihat lagi pada pernyataan berikutnya.
3. Mengedit data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub cmdEdit_Click()
    Dim cmd As cCommand
 
    strSql = "UPDATE barang SET nama_barang = ?, stok = ?, harga_beli = ?, harga_jual = ? " & _
             "WHERE kode_barang = ?"
    Set cmd = conn.CreateCommand(strSql)
    With cmd
        .SetText 1, txtNamaBarang.Text
        .SetDouble 2, Val(txtStok.Text)
        .SetDouble 3, Val(txtHargaBeli.Text)
        .SetDouble 4, Val(txtHargaJual.Text)
        .SetText 5, txtKodeBarang.Text
        .Execute
    End With
    Set cmd = Nothing
End Sub
4. Menghapus data
1
2
3
4
5
6
7
8
9
10
11
Private Sub cmdHapus_Click()
    Dim cmd As cCommand
 
    strSql = "DELETE FROM barang WHERE kode_barang = ?"
    Set cmd = conn.CreateCommand(strSql)
    With cmd
        .SetText 1, txtKodeBarang.Text
        .Execute
    End With
    Set cmd = Nothing
End Sub
5. Menampilkan data
Untuk menampilkan data kita menggunakan pernyataan SELECT, dan ingat pernyataan SELECT mengembalikan data dalam bentuk recordset, sehingga kita harus membuat objek dengan tipe cRecordset.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub cmdTampilkan_Click()
    Dim rs  As cRecordset
 
    strSql = "SELECT kode_barang, nama_barang, stok, harga_beli, harga_jual " & _
             "FROM barang " & _
             "ORDER BY nama_barang"
    Set rs = conn.OpenRecordset(strSql, True)
    If Not rs.EOF Then
        Do While Not rs.EOF
            Debug.Print rs("kode_barang").Value & ", " & rs("nama_barang").Value
            rs.MoveNext
        Loop
    End If
End Sub
6. Insert, Update dan Delete dalam jumlah banyak
Hati-hati jangan langsung mengunakan kode seperti berikut :
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub cmdTest1_Click()
    Dim cmd As cCommand
    Dim i   As Integer
 
    strSql = "INSERT INTO tabel_test (no_urut) VALUES (?)"
 
    Set cmd = conn.CreateCommand(strSql)
    For i = 1 To 1000
        cmd.SetInt32 1, i
        cmd.Execute
    Next i
    Set cmd = Nothing
End Sub
hasil uji coba di laptop saya membutuhkan waktu sekitar 1 menitan, tetapi bandingkan jika menggunakan transaction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub cmdTest2_Click()
    Dim cmd As cCommand
    Dim i   As Integer
 
    strSql = "INSERT INTO tabel_test (no_urut) VALUES (?)"
 
    Set cmd = conn.CreateCommand(strSql)
    conn.BeginTrans
    For i = 1 To 1000
        cmd.SetInt32 1, i
        cmd.Execute
 
        If i Mod 200 = 0 Then
            conn.CommitTrans
            DoEvents
 
            conn.BeginTrans
        End If
    Next i
    conn.CommitTrans
    Set cmd = Nothing
End Sub
hanya membutuhkan waktu 1 detik, wowww lumayan bedakan.
Oke terakhir untuk mencoba semua kode diatas, library dhSQLite harus sudah direferensikan di project kita.

Selamat mencoba :)

Mengenal lebih dekat database SQLite

Biasanya nih bagi kita yang udah sering nyemplung di dunia pemrograman bahkan sampe kelelep :grin:  pasti udah kenal yang namanya Ms Access dari Microsoft atau Paradox dari Borland.
Itu adalah beberapa contoh database standalone yang sudah sering kita gunakan, nah sekarang saya mengajak Anda untuk mengenal lebih dekat database standalone lainnya yaitu SQLite.
Dan tahukah Anda bahwa firefox juga menggunakan SQLite untuk mengelola data bookmarks dan historynya.
Jadi klo mau tau, apa saja fitur dari SQLite jangan malu-malu untuk segera mengklik link INI.
Pada artikel kali ini kita akan mencoba membuat database dan beberapa tabel di SQLite sesuai rancangan berikut :


Persiapan tool
1. Agar pembuatan database dan tabelnya lebih mudah dan menyenangkan, download dulu SQLite Managernya di sini.
2. Klo udah, install dan jalankan SQLite Managernya.
Membuat database dan tabel
1. Klik menu File -> New Database

2. Isikan lokasi penyimpan database dan alias pada kotak dialog Database Creation Properties

3. Jika berhasil akan tampil nama database di node sebelah kiri, kemudian untuk membuat tabel baru klik menu Table -> New Table

4. Selanjutnya isikan informasi nama tabel, field berikut tipe datanya.

5. Jika semua field yang dibutuhkan sudah lengkap, klik tombol Apply

6. Jika berhasil nama tabel akan muncul di node sebelah kiri.

Membuat tabel dengan field auto number
Ada yang beda dengan SQLite dalam pembuatan field auto number, dimana SQLite mensyaratkan field auto numbernya harus bertipe INTEGER.
Oke kita akan ambil contoh pembuatan tabel ITEM_BELI, dimana tabel ini mempunyai field ID yang berfungsi untuk mencatat record transaksi pembelian.
1. Buat tabel sama seperti langkah-langkah sebelumnya

2. Jika field sudah ditambahkan (ex. field ID), klik tab Indexes kemudian klik tombol Add

3. Pada dialog New Index atur setingan field sesuai gambar


4. Balik ke dialog Desing tabel kemudian klik tombol Apply

Membuat foreign key
1. Aktifkan tabel, klik tab Foreign Keys kemudian klik tombol Add


2. Kembali ke dialog Design tabel kemudian klik tombol Apply

Untuk pembuatan tabel lainnya tinggal ulangi langkah-langkah sebelumnya. Contoh hasil akhir pembuatan tabel :

Membuat Trigger
Yang benar aja SQLite mendukung trigger ? Iya klo enggak percaya main-main aja ke sini.
Sample database lengkap bisa di download di sini.

Senin, 19 Agustus 2013

Instalasi E-Library di ClearOS

Instalasi E-Library di ClearOS

E-Library, dari saya kutip dari wikipedia
Perpustakaan digital (Inggris: digital library atau electronic library atau virtual library) adalah perpustakaan yang mempunyai koleksi buku sebagian besar dalam bentuk format digital dan yang bisa diakses dengan komputer. Jenis perpustakaan ini berbeda dengan jenis perpustakaan konvensional yang berupa kumpulan buku tercetak, film mikro (microform dan microfiche), ataupun kumpulan kaset audio, video, dll. Isi dari perpustakaan digital berada dalam suatu komputer server yang bisa ditempatkan secara lokal, maupun di lokasi yang jauh, namun dapat diakses dengan cepat dan mudah lewat jaringan komputer.
Intinya, dengan E-Library kita tidak usah repot-repot ke perpustakaan untuk mencari buku, karena sudah tersedia di E-library sedangkan untuk membaca buku dalam bentuk fisik kita tentu harus ke perpustakaan.
Salah satu program E-Library adalah SLIMs (Senayan Library Management System ).
SLiMS - Senayan Library Management System, sebuah aplikasi open source berbasis web yang dirancang, dan dibangun untuk memberikan kemudahan kepada para pustakawan dalam menjalankan kegiatannya sehari-hari.
Oke langsung saja tanpa basa-basi lagi, saya akan memberitahukan langkah-langkah instalasi SLIMS
Download dulu masternya di sini atau di sana 
kemudian masuk ke console server ( terminal ) bisa lewat ssh (untuk linux) dan putty (untuk Windows)
Membuat Database SLIMS
masukkan perintah berikut di terminal
mysql -u root -p
kemudian masukkan password root mysql server

kemudian ketikkan perintah berikut
mysql> create database slim_db;
perintah di atas akan menghasilkan database baru dengan nama "slim_db"
mysql> CREATE USER 'slim_user'@'localhost' IDENTIFIED BY 'slimpass';GRANT ALL PRIVILEGES ON *.* TO 'slim_user'@'localhost' IDENTIFIED BY 'slimpass' ;
yang bermaksut untuk membuat user mysql baru bernama "slim_user"
mysql> GRANT ALL PRIVILEGES ON `slim_db`.* TO 'slim_user'@'localhost';
Untuk memberikan hak akses database "slim_db" ke user"slim_user" dalam localhost
kemudian keluar dari mysql
mysql> exit;

kemudian bagi yang di servernya belum diinstall php-gd, silakan install dahulu dengan perintah berikut
# yum install php-gd
kemudian install unzip untuk mengekstrak file zip via terminal
#yum install unzip 
kemudian upload file senayan yang tadi sudah di download ke directory "/var/www/html" (bisa menggunakan nautilus connector, maupun filezilla)

kembali ke terminal,
masuk ke directory "/var/www/html"
# cd /var/www/html/
kemudian ekstrak folder slim tadi
# unzip slims5_meranti-master.zip
hasil ekstrak tadi akan menghasilkan folder dengan nama "slims5_meranti-master", rename folder tersebut agar mudah diakses
# mv slims5_meranti-master perpustakaan 
maksutnya adalah mengganti nama direktory "slims5_meranti-master" menjadi "perpustakaan"

# chown -R apache.apache perpustakaan/
perintah di atas bertujuan untuk mengganti kepemilikan folder perpustakaan ke user dan grup "apache" atau user webserver
# chmod -R 755 perpustakaan/
perintah di atas bertujuan untuk mengganti hak akses direktory perpustakaan ke mode " Read Only"
kemudian masuk ke direktory perpustakaan menggunakan perintah berikut
# cd perpustakaan/
kemudian ketikkan perintah berikut
# chmod -R 777 images repository files
perintah di atas bertujuan untuk mengganti hak akses direktory "images", "repository", dan "files" ke mode " Read-Write" direktory ini memang perlu diberi akses read write agar memudahkan proses input data.

Kemudian lakukan dumping database atau import database
ketikkan pada terminal
# mysql -u slim_user -p slim_db < install/senayan.sql
# mysql -u slim_user -p slim_db < install/sampledata.sql
masukkan satu persatu, kemudian isikan password "slim_user" yang tadi telah dibuat ( "slimpass" )
kemudian copy template konfigurasi SLIM
# cp sysconfig.local.inc-sample.php sysconfig.local.inc.php
kemudian edit file sysconfig.local.inc.php ( bisa dengan nano maupun vi )
# nano sysconfig.local.inc.php
cari bagian
define('DB_NAME', '_DB_NAME_');
define('DB_USERNAME', '_DB_USERNAME_');
define('DB_PASSWORD', '_DB_PASSWORD_');
lalu ganti sesuai dengan database yang telah dibuat tadi, misalnya
define('DB_NAME', 'slim_db');
define('DB_USERNAME', 'slim_user');
define('DB_PASSWORD', 'slimpass');
kemudian simpan ( CTRL+X , kemudian tekan "Y", kemudian enter )

Selesai dengan terminal, kemudian buka web browser anda.
ketikkan alamat berikut
http://IPCOS/perpustakaan/
"IPCOS" diganti dengan alamat IP komputer ClearOS.

tarraaaaaaa, SLIMS telah berhasil di install
Tampilan utama SLIMS
Untuk masuk ke halaman administrator klik menu "Librarian LOGIN" , kemudian masukkan
user : admin
password : admin


sekian tutorial yang saya tulis semoga bermanfaat.
jika anda ingin meng-copy segala artikel di blog ini SILAKAN anda bebas menyebarluaskan atau mencopy konten di blogini tanpa harus mencantumkan alamat blog ini. karena blog ini bersifat open source :D
heheheh

Install CMS Lokomedia di Clear OS 6.3

Install CMS Lokomedia di Clear OS 6.3

CMS LOKOMEDIA adalah salah satu CMS (Content System Management) buatan anak negeri yang tak kalah menarik seperti CMS yang lainnya. Kalian dapat menggunakan untuk web Intansi, sekolah maupun web pribadi, karena CMS ini cocok digunakan untuk beberapa keperluan yang mana tersedia beberapa modul yang siap pakai.
Untuk instalasinya, kita memerlukan sourcecode cms lokomedia, anda dapat mendownloadnya di sini
Download CMS Lokomedia

Setelah anda mendownloadnya, kemudian pindahkan file "lokomedia-1.6.1.zip" ke komputer server ( ClearOS) taruh di direktory
/var/www/html 
bisa menggunakan nautilus connector, filezilla maupun winscp.
kemudian buka terminal / putty dan ketikkan perintah berikut :
ssh root@IPClearOS
ganti "IPClearOS" dengan IP server anda, kemudian anda akan dimintai password "root" server.
jika sudah ketikkan perintah berikut:
# cd /var/www/html/
kemudian ketikkan "ls" dan pastikan sudah terdapat file bernama "lokomedia-1.6.1.zip"
kemudian ekstrak file tersebut menggunakan perintah:
# unzip lokomedia-1.6.1.zip 
jika muncul peringatan command not found berarti anda belum menginstall unzip, anda dapat menginstallnya dengan perintah berikut : # yum install unzip

Kemudian siapkan database untuk CMS Lokomedia, caranya ketikkan perintah berikut
# mysql -u root -p
kemudian anda akan dimintai password user "root" mysql
jika anda sudah memasukkan password yang benar, maka tulisan "#" akan berubah menjadi "mysql> "
kemudian untuk membuat database dengan nama dblokomedia ketikkan perintah berikut :
mysql> create database dblokomedia;
kemudian keluar dari mysql, ketikkan perintah berikut:
 mysql> quit;
kemudian lakukan import atau dumping data dari file "dblokomedia.sql" ke database "dblokomedia"
pastikan file "dblokomedia.sql" sudah berada di direktory "/var/www/html" ketikkan perintah berikut :
# mysql -u root -p dblokomedia < dblokomedia.sql
kemudian anda akan dimintai password lagi
Sekarang coba buka alamat "IPClearOS/lokomedia" di web browser anda
jika muncul halaman berikut berarti anda harus mengedit file konfigurasi Lokomedia
Koneksi ke databse Lokomedia gagal


edit file "koneksi.php" di direktory "lokomedia/config"
# nano lokomedia/config/koneksi.php
kemudian cari bagian :
// definisikan koneksi ke database
$server = "localhost";
$username = "root";
$password = "password";
$database = "dblokomedia";
rubah bagian "$username" dan "$password" sesuai dengan username dan password mysql anda.
jika sudah tekan "CTRL+O" kemudian "enter" kemudian "CTRL+X"

Sekarang coba buka alamat "IPClearOS/lokomedia" di web browser anda
taraaaaaa
akan muncul halaman seperti ini :
Untuk masuk ke halaman administrator CMS lokomedia tinggal tambahkan "adminweb" di alamat yang tadi jadinya  "IPClearOS/lokomedia/adminweb"
kemudian akan muncul halaman berikut :
Halaman login CMS Lokomedia
isikan username : admin dan password : admin. 
Halaman admin CMS lokomedia
Nb: setelah login, segera ubah password anda.
http://aoktox.blogspot.com/2013/01/install-cms-lokomedia-di-clear-os-63.html