Kalo mo bikin program database under linux pake xBase programming bisa di coba pake CLIP alamatnya http://www.itk.ru.
Feature:
- Database yang lama kayaknya masih bisa di pake (belum sempet di test)
- Support ke database server seperti: MySQL, PostgreSQL, InterBase, Oracle, dll.
- Support gtk.
- Bisa OOP.
Atau pindah ke Java aja (sekarang gue pake Java, sebelumnya gue pake C++ Builder)
Pake PHP juga bagus.
Atau Python.
Ini contoh program CLIP. Database yang dipake PostgreSQL (maaf kalo panjang):
#include <inkey.ch> #include <box.ch>
#define lebar 28 #define tinggi 6 Static nKol, nBrs, nKolCtr, nBrsCtr Static nKiri, nKanan, nAtas, nBawah Static aLayar Static cKdAkun, nRule, cNote, nSaldo, cKdPajak Static lConn, rs, conn, lAdd, lEdit
Procedure frmAkun
Local nTombol, lBenar, nHapus
set talk off
set status off
Begin Sequence
conn := ConnectNew("PG",,,,,"master_data")
rs := conn:CreateRowset("SELECT * FROM account Order By acc_code",,;
"Insert into account (%FIELDS) Values (%VALUES)",;
"DELETE FROM account WHERE acc_code=:acc_code")
rs:CreateOrder("kode","acc_code", 20)
rs:SetOrder("kode")
lConn := .t.
Recover Using e
Alert("Can't connect to Database")
lConn := .f.
End Sequence
if lConn
rs:GoTop()
endif
nKol := maxcol(); nBrs := maxrow()
nKolCtr := nKol / 2; nBrsCtr := nBrs / 2 nKiri := nKolCtr - lebar; nKanan := nKolCtr + lebar
nAtas := nBrsCtr - tinggi; nBawah := nBrsCtr + tinggi
aLayar := SaveScreen(0, 0, nBrs, nKol)
judul_akun()
tampil()
lBenar := .t.
do while lBenar
nTombol := inkey(0)
switch nTombol
case K_ESC
lBenar := .f.
case K_PGUP
rs:Skip(-1)
if rs:Bof()
rs:GoTop()
endif
case K_PGDN
rs:Skip()
if rs:Eof()
rs:Goto(rs:LastRec())
endif
case K_HOME
rs:GoTop()
case K_END, K_CTRL_END
rs:Goto(rs:LastRec())
case K_INS
lAdd := .t.
lEdit := .f.
data_kosong()
baca_data()
case K_CTRL_INS
lEdit := .t.
lAdd := .f.
baca_record()
baca_data()
case K_DEL
nHapus := Alert("Record ini akan di hapus?", {"Ya",
"Tidak"})
if nHapus == 1
rs:Delete()
rs:RefreshAll()
endif
case K_F1
set color to W+/B+
rs:browse()
set color to
End Switch
tampil()
enddo
conn:Destroy()
RestScreen(0,0, nBrs, nKol, aLayar)
ReturnStatic Procedure judul_akun
Local cJudul, nJudul
cJudul := "[Akun Setup]"
nJudul := Len(cJudul)
DispBox(nAtas, nKiri, nBawah, nKanan, B_SINGLE + " ", "W+/B+")
DevPos(nAtas, nKolCtr - (nJudul/2)); DevOut(cJudul, "W+/B+") DevPos(nAtas + 2, nKiri + 3); DevOut("Kode Akunt :", "W+/B+")
DevPos(Row() + 1, nKiri + 3); DevOut("Rule ID :", "W+/B+")
DevPos(Row() + 1, nKiri + 3); DevOut("Note :", "W+/B+")
DevPos(Row() + 1, nKiri + 3); DevOut("Saldo :", "W+/B+")
DevPos(Row() + 1, nKiri + 3); DevOut("Kode Pajak :", "W+/B+")
DispBox(Row()+ 2, nKiri + 1, Row()+2, nKanan-9, B_SINGLE, "W+/B+")
DispBox(nAtas+ 1, nKanan - 9, nBawah-1, nKanan-9, B_SINGLE, "W+/B+")
DevPos(Row() + 4, nKiri + 6); DevOut("|<< First", "W+/BR+")
DevPos(Row(), Col() + 2); DevOut("< Prev", "W+/BR+")
DevPos(Row(), Col() + 2); DevOut("Next >", "W+/BR+")
DevPos(Row(), Col() + 2); DevOut("Last >>|", "W+/BR+")
DevPos(nAtas + 2, nKanan - 7); DevOut(" Add ", "W+/BR+")
DevPos(Row() + 2, nKanan - 7); DevOut(" Edit ", "W+/BR+")
DevPos(Row() + 2, nKanan - 7); DevOut("Delete", "W+/BR+")
ReturnStatic Procedure baca_data
Local oField if lAdd
@ nAtas + 2, nKiri + 16 Get cKdAkun ;
Pict "@S20 NNNNNNNNNNNNNNNNNNNN" ;
Valid cek_kode(cKdAkun)
else
DevPos(nAtas + 2, nKiri + 16)
DevOutPict(cKdAkun+Space(20-Len(cKdAkun)), "NNNNNNNNNNNNNNNNNNNN",
"G+/B+")
endif
@ Row() + 1, nKiri + 16 Get nRule Pict "@S8 99999999"
@ Row() + 1, nKiri + 16 Get cNote Pict "@S30
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"
@ Row() + 1, nKiri + 16 Get nSaldo Pict "@S21 999999999999999999999"
@ Row() + 1, nKiri + 16 Get cKdPajak
Read
if LastKey() != K_ESC
oField := Map()oField:acc_code := AllTrim(cKdAkun)
oField:acc_rule_id := Val(AllTrim(nRule))
oField:acc_note := AllTrim(cNote)
oField:acc_balance := Val(AllTrim(nSaldo))
oField:tax_code := AllTrim(cKdPajak)
if lAdd
rs:Append(oField)
endif
if lEdit
conn:Command("Update account set acc_rule_id=:rl,acc_note=:nt,acc_balance=:bl,tax_code=:tx where acc_code=:ac", ;
{{"rl",nRule},;
{"nt",cNote},;
{"bl",nSaldo},;
{"tx",cKdPajak},;
{"ac",cKdAkun}})
rs:RefreshAll()
endif
endif
Return
Static Procedure tampil
if lConn
baca_record()
else
data_kosong()
endifDevPos(nAtas + 2, nKiri + 16); DevOutPict(cKdAkun+Space(20-Len(cKdAkun)), "NNNNNNNNNNNNNNNNNNNN", "G+/B+")
DevPos(Row() + 1, nKiri + 16); DevOutPict(nRule, "99999999", "G+/B+")
DevPos(Row() + 1, nKiri + 16); DevOutPict(cNote+Space(30-Len(cNote)), "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "G+/B+")
DevPos(Row() + 1, nKiri + 16); DevOutPict(nSaldo, "9,999,999,999,999,999.9999", "G+/B+")
DevPos(Row() + 1, nKiri + 16); DevOutPict(cKdPajak, "NN", "G+/B+")
Return
Static Procedure baca_record
cKdAkun := rs:GetValue('acc_code')
nRule := rs:GetValue('acc_rule_id')
cNote := rs:GetValue('acc_note')
nSaldo := rs:GetValue('acc_balance')
cKdPajak:= rs:GetValue('tax_code')
ReturnStatic Procedure data_kosong
cKdAkun := Space(20)
nRule := Space(8)
cNote := Space(30)
nSaldo := Space(21)
cKdPajak:= Space(2)
ReturnStatic Function cek_kode(cKode)
Local lBetul, cKd
cKd := AllTrim(cKode)
rs:SetOrder("kode")
if rs:Seek(cKd)
Alert("Record tersebut sudah ada!")
lBetul := .f.
else
lBetul := .t.
endif
Return lBetul--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
