Modul 10. Membuat Nomor peminjaman secara otomatis pada Form Transaksi Peminjaman Buku pada Delphi 7.0 + MS. Access 2007

Program Aplikasi Perpustakaan dengan Delphi + Ms. Access 2007
Ahmad Rizal Abidin, M.Kom

4checks.com-Free Shipping and Handling on All Personal Checks with code DWF008
Karena project Prjpustaka sebelumnya sudah dibuat dan From peminjaman pun sudah dibuat pada modul 8. Klik disini , maka pada kesempatan ini adalah melengkapi frmpinjam yaitu dengan cara:

Membuat nomor pinjam secara otomatis yang terdiri dari 9 digit yang dihasilkan dengan proses :

Dua digit pertama adalah tahun
Dua digit kedua adalah bulan
Lima digit terakhir adalah nomor urut
Sehingga menghasilkan nomor : 100100001

Adapun langkah-langkahnya adalah :
1. Membuat fungsi rightstr dengan cara mengetikan koding secara langsung diluar procedure di bawah implementation.
// Membuat Fungsi Left, right, mid String
//sumber : Klik disini

…
implementation

{$R *.dfm}
function RightStr
    (Const Str: String; Size: Word): String;
begin
  if Size > Length(Str) then Size := Length(Str) ;
  RightStr := Copy(Str, Length(Str)-Size+1, Size)
end;

function MidStr
    (Const Str: String; From, Size: Word): String;
begin
  MidStr := Copy(Str, From, Size)
end;

function LeftStr
    (Const Str: String; Size: Word): String;
begin
  LeftStr := Copy(Str, 1, Size)
end;
//sumber : http://delphi.about.com/cs/adptips1999/a/bltip1099_2.htm

2. Membuat koding pada Form Create sebagai berikut :

procedure TFrmPinjam.FormCreate(Sender: TObject);
var i,nomor: integer;
nom,no : string;
begin

//Membuat Nomor peminjaman secara otomatis
decodedate(date,Thn,Bln,hari);
adoquery5.Close;
adoquery5.SQL.clear;
adoquery5.SQL.add('Select * from pinjam');
adoquery5.open;
if adoquery5.RecordCount = 0 then
  nomor := 1
else
begin
nom := rightstr(inttostr((adoquery5.fields[0].AsInteger)),5);
nomor := strtoint(nom) + 1;
end;
no:='0';
for i := 1 to (4 - length(inttostr(nomor))) do
begin
  no := no + '0';
end;
edit1.text := rightstr(inttostr(thn),2) + rightstr(('0'+inttostr(bln)),2)+no+ inttostr(nomor);

//untuk menghitung tanggal tempo
decodedate(date,Thn,Bln,hari);
hari := hari + 5;
tanggal := encodedate(thn,bln,hari);
edit2.Text := formatdatetime('DD/MM/yyyy',tanggal) ;
sg.RowCount :=1;
sg.ColCount:=5;
sg.Cells[0,0]:='No';
sg.Cells[1,0]:='Kode Buku';
sg.Cells[2,0]:='Judul buku';
sg.Cells[3,0]:='Pengarang';
sg.Cells[4,0]:='Qty';

sg.ColWidths [0]:=40;
sg.ColWidths [1]:=60;
sg.ColWidths [2]:=80;
sg.Colwidths[3]:=80;
sg.colwidths[4]:=60;

end;

@Ahmad
Selamat MEncOba…

Materi yang berhubungan :
Modul 1. Dasar Pemograman Delphi 7
Modul 2. Alur Program Delphi 7.0
Modul 3. Membuat Database dengan Menggunakan Microsoft Acces 2007
Modul 4. Membuat Menu Pada Delphi 7.0
Modul 5. Membuat Form Penerbit pada Delphi 7.0
Modul 6. Membuat Form Anggota pada Delphi 7.0
Modul 7. Membuat Form Buku pada Delphi 7.0
Modul 8. Membuat Form Transaksi Peminjaman Buku pada Delphi 7.0
Modul 9. Membuat Form Transaksi Pengembalian Buku pada Delphi 7.0 + MS. Access 2007
Modul 10. Membuat Nomor peminjaman secara otomatis pada Form Transaksi Peminjaman Buku pada Delphi 7.0 + MS. Access 2007
Modul 11. Membuat Report dengan Rave
Modul 12. Membuat Report dengan Rave + Delphi 7

37 Responses

  1. Tambahan
    jangan lupa ganti
    if Size > Length(Str) then Size := Length(Str) ;
    jadi
    if Size > Length(Str) then Size := Length(Str) ; // lebih besar

    dan tambahkan
    var Thn,Bln,hari:Word;
    pada procedure OnCreate nya

    • bang saya pemula delphi bagaimana cara membuat nomor secara otomatis yang muali dari anggka nol setiap menyimpan no nya otomastis nambah satu angka..

      menggunakan komponen db acces…adoquery datasaurce…

      • edit aja koding untuk membuat nomor otomatis diatas menjadi
        ….
        if adoquery5.RecordCount = 0 then
        nomor := 1
        else
        begin
        nomor := adoquery5.RecordCount + 1;
        end;

        edit1.text := nomor;

  2. thanks…
    infonya… udah diperbaiki…

    dan ditambahkan untuk menghitung tanggal tempo

    tanggal : tdatetime; // pada variabel

  3. mau nanya mas …punya materi ato bahasa program C++ dan Algoritma ttang Penyewaan buku g? yg terdiri dari buku yg disewa, waktu (tgl/bulan/tahn) pinjam dan waktu (tgl/bln/thun) kembali?
    ada ya mas ya…pasti adakan ??? please

  4. haw hbat nih artikel bisa membantu sya… makasih mas

  5. pak, bagaimana kalo kita may buat report yang dalam 1 lembar (a4) dibagi 2…. jadi 1 lembar ada dua report sekaligus.. dan data yang di tampilkan di halaman 1 ada dua record, di lembar selanjutnya record nya nyambung. ?
    jadi 1 lembar ada dua report dengan record continue? trims please sent me via email suriadi.didiek at gmail dot com..

  6. Askm Pak Kalau buat faktur otomatis dgn java caranya gimana pak,,,?
    Terimakasih

    • logikanya sama …, yang penting kita harus tahu cara menghitung jumlah record yang ada di dalam tabel transaksi, select count (*) as ….
      terus tambah dengan angka 1

  7. Asslmkm pak….
    ikutan tanya nih, gimana yah listing program Button Searching kalau di form nya memakai DBEdit sedangkan koneksi nya menggunakan ADOConnection atau ADOTable….
    trimkas …

    • aduh… kasusnya apa yach…. ???
      DBEdit konsepnya untuk menampilkan data dari tabel secara otomatis…, tetapi kalau digunakan untuk search biasanya melibatkan dua tabel…
      pastikan kedua tabel terkoneksi ke adoquery dan sertakan dua datasource, serta untuk dbeditnya sudah terkoneksi ke datasource dan datafield…
      procedure TForm1.Button1Click(Sender: TObject);
      begin
      terus buat aja kodingnya seperti ini :
      adoquery2.SQL.clear;
      adoquery2.SQL.Add(‘select * from pelanggan where id_pembeli =”‘+ dbedit1.Text +'”‘);
      adoquery2.Open;
      if not adoquery2.Eof then
      begin
      datasource2.DataSet := adoquery2;
      dbedit3.DataSource := datasource2;
      dbedit3.DataField :=’nama’;
      end;
      adoquery1.sql.clear;
      adoquery1.SQL.Add(‘select * from penjualan’);
      adoquery1.Open;
      end;

  8. mo nanya mas…..
    saya mencoba memakai modul 10, tapi timbul pesan undeclared identifier ‘Thn’, saya kurang mengerti, maklum baru coba belajar delphi….. kalao berkenan boleh dong kirm saya filenya programnya, makasih ya…
    sukses untuk anda

  9. oh ya… berarti variabel Thn belum didefinisikan… tambahkan aja pada variabel global

    var
    thn : integer;

    caranya buka kodingnya, pergi baris paling atas, terus baca baris per baris kebawah sampai ketemu tulisan Var
    dibawah var itu ketik thn : integer;
    klo filenya entah masih ada entah enggak … soalnya udah setahun sih…

    • makasih ya…sekarang udah bisa, tapi ada error untuk melakukan penghitungan yang kedua….di database yang saya gunakan untuk menyimpan hasil perhitungan otomatis bertype text….. saya menggunakan database access….
      berikut potongan program yg saya gunakan…..

      procedure TFrmInpKunjungan.XiButton1Click(Sender: TObject);
      begin
      If XiButton1.Caption=’&Data Baru’ Then
      begin
      DModul.ADSJP.Append;
      FormShow1(Sender);
      DModul.ADKunjungan.Append;
      XiButton1.Caption:=’&Simpan’;
      XiButton4.Caption:=’&Batal’;
      dbEdit1.Text:=DateToStr(Now);
      dbEdit2.SetFocus;
      if DModul.ADSJP.RecordCount = 0 then
      nomor := 1
      else
      begin
      nom := rightstr(inttostr((DModul.ADSJP.fields[0].AsInteger)),5);
      nomor := strtoint(nom) + 1;
      end;
      no:=’0′;
      for i := 1 to (4 – length(inttostr(nomor))) do
      begin
      no := no + ‘0’;
      end;
      dbedit2.text := rightstr(inttostr(thn),2) + rightstr((‘0’+inttostr(bln)),2)+no+ inttostr(nomor);
      dbEdit10.Text:=dbEdit2.Text;
      end
      else
      begin
      If Application.MessageBox(‘Anda yakin datanya sudah benar ?’,
      ‘Konfirmasi’,
      mb_YesNo + mb_IconQuestion)=IDYes Then
      begin
      DModul.ADSJP.Post;
      DModul.ADKunjungan.Post;
      FormShow(Sender);
      XiButton1.Caption:=’&Data Baru’;
      XiButton4.Caption:=’&Keluar’;
      end;
      end;
      end;

      • maaf ada yang kelewat…. dari listing di atas dihasilkan nilai 0000001, seandainya format yg saya ingini seperti ini TRK-YYMMnilaiotomatis (TRK-11021). nah angka 1 setelah angka 2 ini yang ingin selalu saya hitung secara otomatis. sederhananya; saya ingin menggabungkan nilai string+date+numeric hasil yg diharapkan TRK-YYMMnilaiotomatis.

        terimakasih dan mohon maaf karena saya bingung cara menjelaskannya seperti apa.

  10. tambahkan aja TRK di awal, terus size nomor di database berapa yach… harus disesuaikan… kalau memang panjangnya nomor hanya untuk menampupng (TRK-11021) berarti sembilan… ini masalahnya… serharusnya (TRK-110200001) berarti jumlah sizenya 13 dan perintah berikut :
    nom := rightstr(inttostr((DModul.ADSJP.fields[0].AsInteger)),5);

    ini digunakan untuk mengambil 5 digit disebelah kanan sehingga menghasilkan 000001
    terus
    nomor := strtoint(nom) + 1;
    dengan perintah diatas maka 00001 + 1 akan menghasilkan nilai 2, dst…

    untuk trknya tambahkan aja… diawali seperti listing berikut
    dbedit1.text := ‘TRK-‘+rightstr(inttostr(thn),2) + rightstr((‘0’+inttostr(bln)),2)+no+ inttostr(nomor);

    emangnya hanya TRK- aja kode yang akan ditambahkan… kalau ada yang lain jadikan aja variabel…
    good luck…

    • maaf baru berkunjung lagi… terimakasih sekarang saya sudah mengeri proses perhitungan secara otomatis seperti di atas… terimakasih dan sukses untuk anda. tapi sekarang saya lagi buntu, program yang sudah saya buat tidak bisa lebih dari user, bagaimana caranya membuat program multi user… bila berkenan via e-mail ya… sukses untuk anda

  11. tolong dong cara menggabungkan TRK-YYMMnilaiotomatis….. waktu saya sampa hari rabu nih…. please….

  12. makasih banyak mas..

  13. mau tanya pak,
    saya sudah coba modul 10 ini, tapi ada sedikit yang saya rubah disini karena untuk penomorannya saya urutkan berdasarkan tahun+nmr urut (4 digit tahun dan 3 digit nmr urut)
    Database yg saya gunakan disini adalah MySQL. Berikut potongan program yang saya buat :

    procedure TfrmBarangAE.AddMode();
    var
    tgl:TDate;
    i,nomor : integer;
    nom,no,thn : string;
    begin
    Caption := ‘Input Data Barang’;
    clear;
    //Membuat Kode Barang secara otomatis
    tgl:=date;
    thn:=FormatDateTime(‘yyyy’,tgl);
    frmBarang.QBarang.Close;
    frmBarang.QBarang.SQL.clear;
    frmBarang.QBarang.SQL.add(‘Select * from barang’);
    frmBarang.QBarang.Open;
    frmBarang.QBarang.Last;
    if frmBarang.QBarang.RecordCount = 0 then
    nomor := 1
    else
    begin
    nom := rightstr(inttostr((frmBarang.QBarang.fields[0].AsInteger)),3);
    nomor := strtoint(nom) + 1;
    end;
    no:=’0′;
    for i := 1 to (2 – length(inttostr(nomor))) do
    begin
    no := no + ‘0’;
    end;
    txtKode.Text := rightstr(thn,4) + no+ inttostr(nomor);
    end;

    untuk penomorannya sudah berjalan, tapi kalau tahunnya sudah berganti nomor urutnya ko terus berlanjut ya pak…misal thn 2010 nomornya sudah sampai 2010098 nah, di thn 2011 berlanjut mjd 20110099. Gimana caranya setiap pergantian thn nmr urutnya di mulai dari 001 lagi.

    Terima kasih pak, di tunggu jawabannya 🙂

    • benar… tentunya nomornya berlanjut karena nilai digit terakhir pada kunci ditambah 1, tapi kalau ingin pada tahun 2011 berubah menjadi nomor 001 kembali tentunya harus ada kondisi yang menyeleksi tahun …
      jika empat digit pertama dari kunci berbeda maka nomor mulai dari 001 ….

  14. Mas maaf saya punya permasalahan dalam coding, mau tanya…

    procedure TFormBarang.EditKodeBarangChange(Sender: TObject);
    begin
    ADOQueryBarangMasuk.SQL.Clear;
    ADOQueryBarangMasuk.SQL.Add(‘select * from BARANG where KD_BARANG=”‘+EditKodeBarang.Text+'”‘);
    ADOQueryBarangMasuk.Open;

    if not ADOQueryBarangMasuk.Eof then
    begin
    ComboBoxNamaBarang.Text:=ADOQueryBarangMasuk.FieldValues[‘NM_BARANG’];
    EditWarna.Text:=ADOQueryBarangMasuk.FieldValues[‘WARNA’];
    EditSatuan.Text:=ADOQueryBarangMasuk.FieldValues[‘SATUAN’];
    EditBanyakBarang.Text:=ADOQueryBarangMasuk.FieldValues[‘BANYAK_BARANG’];
    ADOQueryBarangMasuk.Open;
    end;
    end;

    Pada EditKodeBarang saya kasih coding seperti itu, tapi kenapa waktu memasukan data pada dbgrid muncul sekilas selebih nya tidak tampil.. tapi data masuk ke database…
    bagaimana mengatasi hal seperti ini mas, terima kasih banyak…

  15. ass… langsung aja ya..bagaimana cara membuat program multi user di delphi 6 menggunakan database access 2007 terus databasenya di password, saya sudah buntu nih, udh coba 3 minggu blm bisa… bila berkenan via e-mail. terimakasih dan sukses untuk anda

    • Untuk membuat program multi user biasanya :
      1. Menyediakan tabel user pada Access adapun fieldnya (user dan password)
      2. membua Form Login dengan delphi (user dan password)
      3. pada saat program dijalankan hendaknya form login dulu yang aktif, setelah memasukan user dan password terus diklik tombol OK maka akan tampil form Menu
      berarti pada tombol OK itulah anda buat perintah untuk membaca tabel user…
      4. pada Form menu sediakan satu Menu File yang terdiri dari Login dan Logout, serta exit
      5. pada saat logout di klik seluruh menu kecuali menu File dan submenu login aktif, sedangkan untuk semua menu tidak aktif (tidak bisa diklik)…

      Untuk membuat password pada Access 2007, dapat diklik Database Tools dan Klik Decrypt Database, buat password anda…
      selesai deh…

  16. ass….saya mau nanya nich mas….gmn sich bikin transaksi peminjaman buku dan pengembalian buku kalau kena denda,,,,dan jumlah denda keluar otomatis,,,,,??? ksh tau carana donk…… tapi bikinnya pake visual basic dan database sql server??

  17. Mo tanya ne mas giman kalau kita ingin mendaptakan nilai otomatis miasalkan untuk lama bekerja dengan menggunakan pergantian tanggal, setiap tanggal berganti maka jumlah hari kaerja kita bertambah 1 secara otomatis gmna implementasi programnya ya Mas……….Mohon Bantuannnya…..?

  18. Maaf Pak sebelumnya, Saya mau nanya ne Pak, bagaimana ya membuat source code misalkan stok barang pada form “A” berjumlah 50, saat terjadi transaksi penerimaan barang pada form “B” sebanyak 20, maka secara otomatis stok barang pada form “A” bertambah menjadi 70. Mohon bantuannya ya Pak..!!! Terima Kasih.

  19. KAK KALAU MENGGUNAKAN DATABASE MYSQL itu kayak mana lagi penggunaan NO .Urut nya.

  20. ass…ak dh nyobain pake modul yg ini, tp kok untuk input yg ke 3 tetep aja no urutnya 2 ya? mohon pencerahannya…

  21. Ass…
    Salam kenal mas rizal..
    Mohon maaf maaf sebelumnya, saya mo konsultasi, saya kesulitan dalam pembuatan nomor transaksi berdasarkan tanggal, setelah cari2 akhirnya sampe jg di laman mas rizal… saya coba mengkopi + menerapkan diprogram saya dan akhirnya jadi tp kenapa ya mas kok nomor transaksinya mentok sampe nomor urut 2 gak mau naek ketiga, dan juga ketika berubah bulan kok nomor urutnya ga kembali kesatu lagi ya mas.
    contoh : 120800001
    120800002
    setelah saya coba2 ga berubah/tidak naik nomor urutnya masih tetap 120800002 seharusnya 120800003, dan juga saya coba ganti bulan 09 tp datanya masih 120900002 seharusnya 120900001 kembali kesatu.
    mohon bantuannya mas rizal … terima kasih..

    procedure TFPengeluaran.Tgl_Faktur_PengeluaranKeyPress(Sender: TObject; var Key: Char);
    var i,nomor: integer;
    nom,no : string;
    Thn,Bln,hari : Word;
    begin
    If Key = #13 Then
    Begin
    //Tgl := FormatDateTime(‘PJddmmyy’, Tgl_Faktur_Pengeluaran.Date);

    //Membuat Nomor peminjaman secara otomatis
    decodedate(Tgl_Faktur_Pengeluaran.Date,Thn,Bln,hari);

    DM.QPengeluaran.Close;
    DM.QPengeluaran.SQL.clear;
    DM.QPengeluaran.SQL.add(‘Select * from Pengeluaran’);
    DM.QPengeluaran.open;

    if DM.QPengeluaran.RecordCount = 0 then
    nomor := 1
    else
    begin
    nom := rightstr(inttostr((DM.QPengeluaran.fields[0].AsInteger)),5);
    nomor := strtoint(nom) + 1;
    end;
    no:=’0′;
    for i := 1 to (4 – length(inttostr(nomor))) do
    begin
    no := no + ‘0’;
    end;
    Kode_Transaksi.text := rightstr(inttostr(thn),2) + rightstr((‘0’+inttostr(bln)),2)+no+ inttostr(nomor);
    Nama_Pemohon.SetFocus;
    end
    Else

    If Key = #27 Then
    Begin
    FormCreate(Sender);
    End;
    End;

    WASS…

    • kalau nilai akhir nya masih tetap 2 berarti yang terbaca oleh program record pertama, tambahkan aja dengan perintah DM.QPengeluaran.last; spt berikut :
      ….
      DM.QPengeluaran.SQL.add(‘Select * from Pengeluaran’);
      DM.QPengeluaran.open;
      DM.QPengeluaran.last;

      dan untuk bln berikutnya agar nomor menjadi 1 tambahkan aja logika
      jika bln kemaren + 1 = bulan sekarang maka
      nomor = 1
      ….

      moga sukses

      • Makasih banyak mas rizal sudah menjawab pertanyaan saya, untuk menambahkan procedure :
        jika bln kemaren + 1 = bulan sekarang maka
        nomor = 1
        harus ditempatkan dimana mas? klo ga keberatan saya minta tolong mas langsung dicontohkan/diimplementasikan, terus bln kemaren or bulan sekarang harus dibuat variable lagi ga mas? maaf ya mas saya masih pemula,
        Terima kasih banyak mas atas bantuannya…

  22. Makasih banyak mas rizal sudah menjawab pertanyaan saya, untuk menambahkan procedure :
    jika bln kemaren + 1 = bulan sekarang maka
    nomor = 1
    harus ditempatkan dimana mas? klo ga keberatan saya minta tolong mas langsung dicontohkan/diimplementasikan, terus bln kemaren or bulan sekarang harus dibuat variable lagi ga mas? maaf ya mas saya masih pemula,
    Terima kasih banyak mas atas bantuannya…

  23. pak mohon pencerahan kok sy running muncul pesan error “invalid argument to date encode” maklum pak pemula… mohon bimbingan

  24. Gimana klo belakangnya itu mau diganti pake jam dan menit jadi nantinya seperti ini 123123591 nah angka satu di belakang ini tetap menjadi nomor urut. mohon bantuannya…

  25. mas mw nnya, klu mw buat potongan hutang tiap bulan secara otomatis gmn?
    tlg bantu y mas….Thank’s

Leave a reply to wandi Cancel reply