Salam kenal semuanya.

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)
Return

Static 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+")   
Return

Static 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()
        endif

DevPos(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')
Return

Static Procedure data_kosong
        cKdAkun := Space(20)
        nRule   := Space(8)
        cNote   := Space(30)
        nSaldo  := Space(21)
        cKdPajak:= Space(2)
Return

Static 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]



Kirim email ke