Baca Juga
Beberapa hari yang lalu seperti biasa iseng-iseng browsing untuk pengantar tidur, coba mengunjungi alexa.com dan saya ingin melihat perkembangan blog saya, nah saya dapati di keywords ada tulisan "menghilangkan duplikat pada listbox", pasti anak kuliahan ni he3... nggak pernah di ajarin sama dosennya ya?
Pada artikel ini saya bahas menghilangkan duplikasi pada listbox dengan menggunakan if dan looping atau dengan cara lain yaitu menggunakan SELECT DISTINCT
Sebagai contoh saya pakai data di bawah ini :
Hilangkan Duplikasi dengan Fungsi IF dan LOOPING
Sebenarnya secara logika menghilangkan duplikasi pada listbox dan yang semacamnya dapat dilakukan dengan fungsi IF, apabila nilai tertentu sudah pernah di add ke listbox, maka nilai tersebut tidak di add lagi ke listbox.Code programnya menggunakan dua buah fungsi looping (perulangan), lebih tepatnya looping di dalam looping.
looping pertama adalah untuk membaca data (dari database) yang akan di add ke listBox. Didalamnya terdapat looping lagi, yaitu looping untuk membaca list/data pada ListBox yang nantinya digunakan untuk menyamakan dengan data yang dibaca dari database, apabila ternyata antara nilai tertentu dari database sama dengan (=) list/text yang ada pada ListBox maka nilai tertentu tersebut tidak di add lagi ke listBox . Berarti untuk setiap data/record dari database yang dibaca harus melakukan perulangan sebanyak list yang terdapat dalam sebuah ListBox.
Code untuk logika diatas adalah sebagi berikut :
Untuk data yang sedikit tidaklah menjadi suatu masalah jika menggunakan code diatas untuk menghilangkan duplikasi pada saat mengisi listBox, tetapi apabila data yang ada sudah ribuan akan sangat lama untuk mengisi listBox tersebut, karena untuk setiap record harus dilakukan perulangan sebanyak data yang sudah dimasukkan ke dalam listbox.
Hilangkan Duplikasi Dengan SELECT DISTINCT
Apakah SELECT DISTINCT itu? apabila diterjemahkan distinct itu berarti "berbeda", dapat kita pahami bahwa select distinct adalah menampilkan record-record dari sebuah tabel yang memiliki nilai berbeda untuk field tertentu. Dalam sebuah literatur disebutkan bahwa :
Sehingga codenya adalah sebagai berikut :
Pada artikel ini saya bahas menghilangkan duplikasi pada listbox dengan menggunakan if dan looping atau dengan cara lain yaitu menggunakan SELECT DISTINCT
Sebagai contoh saya pakai data di bawah ini :
Hilangkan Duplikasi dengan Fungsi IF dan LOOPING
Sebenarnya secara logika menghilangkan duplikasi pada listbox dan yang semacamnya dapat dilakukan dengan fungsi IF, apabila nilai tertentu sudah pernah di add ke listbox, maka nilai tersebut tidak di add lagi ke listbox.Code programnya menggunakan dua buah fungsi looping (perulangan), lebih tepatnya looping di dalam looping.
looping pertama adalah untuk membaca data (dari database) yang akan di add ke listBox. Didalamnya terdapat looping lagi, yaitu looping untuk membaca list/data pada ListBox yang nantinya digunakan untuk menyamakan dengan data yang dibaca dari database, apabila ternyata antara nilai tertentu dari database sama dengan (=) list/text yang ada pada ListBox maka nilai tertentu tersebut tidak di add lagi ke listBox . Berarti untuk setiap data/record dari database yang dibaca harus melakukan perulangan sebanyak list yang terdapat dalam sebuah ListBox.
Code untuk logika diatas adalah sebagi berikut :
Sub addlistif()
On Error Resume Next
Data1.DatabaseName = App.Path & "\db1.mdb" 'koneksi ke database
Data1.RecordsetType = 1
Data1.RecordSource = "select * from table1" ' Membuka tabel1 dari sebuah database
Data1.Refresh
With List1
.Clear 'mengosongkan listBox
Data1.Recordset.MoveFirst
Do Until Data1.Recordset.EOF ' permulaan perulangan membaca data dari database
n = 0
If Not List1.ListCount = 0 Then
List1.ListIndex = -1
For i = 0 To List1.ListCount - 1 ' perulangan membaca data dari listBox
List1.ListIndex = List1.ListIndex + 1
If Data1.Recordset("nama") = List1.Text Then 'jika data sama
n = 1
Exit For
End If
Next i
Else 'jika listbox dalam kondisi kosong
n = 0
End If
If n = 0 Then .AddItem Data1.Recordset("nama")
Data1.Recordset.MoveNext
Loop
End With
End Sub
Untuk data yang sedikit tidaklah menjadi suatu masalah jika menggunakan code diatas untuk menghilangkan duplikasi pada saat mengisi listBox, tetapi apabila data yang ada sudah ribuan akan sangat lama untuk mengisi listBox tersebut, karena untuk setiap record harus dilakukan perulangan sebanyak data yang sudah dimasukkan ke dalam listbox.
Hilangkan Duplikasi Dengan SELECT DISTINCT
Apakah SELECT DISTINCT itu? apabila diterjemahkan distinct itu berarti "berbeda", dapat kita pahami bahwa select distinct adalah menampilkan record-record dari sebuah tabel yang memiliki nilai berbeda untuk field tertentu. Dalam sebuah literatur disebutkan bahwa :
The SELECT keyword allows us to grab all information from a column (or columns) on a table. This, of course, necessarily mean that there will be redundancies. What if we only want to select each DISTINCT element? This is easy to accomplish in SQL. All we need to do is to add DISTINCT after SELECT. http://www.1keydata.com/sql/sqldistinct.htmlUntuk aturan penulisan syntaxnya adalah sebagai berikut :
"SELECT DISTINCT(nama_kolom) FROM nama_table"
Sehingga codenya adalah sebagai berikut :
Sub addlistdistinct()Bagaimana?lebih simpel bukan?kita hanya perlu mengubah recordsource data dengan syntax SQL, syntax tersebut yang akan menyeleksi record mana yang berbeda untuk ditampilkan sehingga looping hanya dilakukan sebanyak record yang telah diseleksi sebelumnya. Dibandingkan dengan menggunakan fungsi if seperti diatas jelas syntax SQL DISTINCT ini jauh lebih cepat. Hayo pilih yang mana?
Data1.DatabaseName = App.Path & "\db1.mdb" 'koneksi ke database Data1.RecordsetType = 1
Data1.RecordSource = "SELECT DISTINCT(nama) FROM table1" Data1.Refresh
With List1
.Clear
Data1.Recordset.MoveFirst
Do Until Data1.Recordset.EOF
.AddItem Data1.Recordset("nama")
Data1.Recordset.MoveNext
Loop
End With
End Sub
7 Tanggapan
Terima kasih banyak yah,sudah berhasil nih,semoga Tuhan membalas kebaikan anda.
kalo mau menghapus record yang duplikat gimana ya?
mohon pencerhannya untuk menampilkan msgbox
apabila datanya sudah pernah diinput
tapi masih bisa disimpan
Private Sub cmdSimpan_Click()
On Error GoTo errLoad
Dim i As Integer
Dim j As Integer
If fraNoBatch.Visible = True Then Call cmdSelesai_Click
If chkNoOrder.Value = vbChecked Then
If Periksa("text", txtNoOrder, "No Order kosong") = False Then Exit Sub
If txtNoOrder.Text <> substrNoOrder Then txtNoOrder.Text = substrNoOrder
End If
If Periksa("datacombo", dcSupplier, "Nama supplier kosong") = False Then Exit Sub
If fgData.TextMatrix(1, 0) = "" Then MsgBox "Data barang harus diisi", vbExclamation, "Validasi": fgData.SetFocus: fgData.Col = 1: Exit Sub
If (txtNoFaktur.Text = "") Then
MsgBox "No. Faktur kosong", vbCritical, "Validasi"
txtNoFaktur.SetFocus
Exit Sub
End If
For i = 1 To fgData.Rows - 1
With fgData
If .TextMatrix(i, 0) = "" Then Exit For
'Validasi Harga Dinonaktifkan 24/07/2013
If .TextMatrix(i, 8) = 0 Then
MsgBox "Harga barang tidak boleh nol", vbExclamation, "Validasi"
.SetFocus: .Row = i: .Col = 8
Exit Sub
End If
If .TextMatrix(i, 2) = "" Then
MsgBox "Asal Barang masih Kosong", vbExclamation, "Validasi"
.SetFocus: .Row = i: .Col = 2
Exit Sub
End If
' If .TextMatrix(i, 5) = "0" Or fgData.TextMatrix(i, 5) = "" Then
' MsgBox "Jml terima tidak boleh nol", vbExclamation, "Validasi"
' .SetFocus: .Row = i: .Col = 5
' Exit Sub
' End If
If .TextMatrix(i, 4) <> "" Then
If Val(.TextMatrix(i, 5)) > Val(fgData.TextMatrix(i, 4)) Then
MsgBox "Jml terima lebih besar dari pemesanan", vbExclamation, "Validasi"
.SetFocus: .Row = i: .Col = 5
Exit Sub
End If
End If
End With
Next i
If txtNamaFormPengirim.Text = "frmDaftarPenerimaanBarangdariSupplier" Then
strSQL = "Select * from PembayaranTagihanSupplier where NoTerima='" & txtNoTerima.Text & "'"
Set dbRst = Nothing
Call msubRecFO(dbRst, strSQL)
If dbRst.EOF = False Then
MsgBox "NoTerima " & txtNoTerima.Text & " sudah dibayarkan ke supplier", vbExclamation, "Validasi"
Exit Sub
End If
For i = 1 To subintBanyakData
With fgData
If sp_DetailTerimaBarang(subarrKdBarang(i), subarrKdAsal(i), CCur(subarrJmlTerima(i)) * CCur(subarrJmlKemasan(i)), CCur(subarrJmlKemasan(i)), CCur(subarrHargaNetto(i)), CCur(subarrHargaNetto(i)), _
CCur(subarrDiscount(i)), CCur(subarrPpn(i)), CCur(subarrPpnJual(i)), subarrTglKadaluarsa(i), "D") = False Then Exit Sub
End With
Next i
'Fifo
dbConn.Execute "Delete from TagihanSupplier Where NoTerima='" & txtNoTerima.Text & "'"
End If
If sp_StrukTerima() = False Then Exit Sub
For i = 1 To fgData.Rows - 1
With fgData
If .TextMatrix(i, 0) = "" Then Exit For
If .TextMatrix(i, 20) = "" Then
.TextMatrix(i, 20) = 0
End If
If sp_DetailTerimaBarang(.TextMatrix(i, 0), .TextMatrix(i, 14), CCur((.TextMatrix(i, 5))) * CCur(.TextMatrix(i, 7)), CCur(.TextMatrix(i, 7)), CCur(.TextMatrix(i, 9)), CCur(.TextMatrix(i, 20)), _
CCur(.TextMatrix(i, 12)), CCur(.TextMatrix(i, 17)), CCur(.TextMatrix(i, 18)), .TextMatrix(i, 16), "A") = False Then Exit Sub
End With
Next i
If sp_TagihanSupplier = False Then Exit Sub
'Batch Barang
For i = 1 To fgBatch.Rows - 1
With fgBatch
If .TextMatrix(i, 0) <> "" And .TextMatrix(i, 1) <> "" And .TextMatrix(i, 2) <> "" And .TextMatrix(i, 3) <> "" Then
If sp_BatchBarang(.TextMatrix(i, 0), .TextMatrix(i, 2), .TextMatrix(i, 3), .TextMatrix(i, 1), .TextMatrix(i, 6), "A") = False Then Exit Sub '.TextMatrix(i, 6), "A") = False Then Exit Sub
End If
End With
Next i
If MsgBox("Yakin data ini akan di simpan ", vbYesNo + vbExclamation, "Warning") = vbYes Then
If sp_CekPpn(txtNoTerima.Text, txtNoFaktur.Text, dtpTglTerima.Value) = False Then Exit Sub
MsgBox "Proses Penyimpanan Berhasil dengan Noterima [ " & txtNoTerima.Text & " ]", vbInformation + vbOKOnly, "Informasi"
If txtNamaFormPengirim.Text = "frmDaftarPenerimaanBarangdariSupplier" Then
Call Add_HistoryLoginActivity("Add_StrukTerima+Add_DetailTerimaBarang+Add_TagihanSupplier_EDIT")
Else
Call Add_HistoryLoginActivity("Add_StrukTerima+Add_DetailTerimaBarang+Add_TagihanSupplier")
End If
Call cmdBatal_Click
Exit Sub
errLoad:
Call msubPesanError
' End If
End Sub