SELECT DISTINCT solusi hilangkan duplikasi

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 :
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.html
Untuk aturan penulisan syntaxnya adalah sebagai berikut :

"SELECT DISTINCT(nama_kolom) FROM nama_table"


 Sehingga codenya adalah sebagai berikut :
Sub addlistdistinct()
    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

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?

Untuk Link download yang sudah saya perbaiki dapat dilihat pada halaman DOWNLOAD, walaupun baru sedikit semoga bisa bermanfaat,untuk cara download silakan lihat DI SINI, Terima kasih

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


Formulir Kontak

Nama

Email *

Pesan *

Pengikut