Skip to main content

Memindahkan Data Antar Dua List Box

Seperti telah diketahui, list box berguna meminimalkan kesalahan ketik saat kita hendak memasukkan data ke dalam sebuah tabel. Dengan mematikan properti Allow Value List Edits yang ada pada sebuah list box, pemasukkan data hanya bisa dilakukan dengan memilih, pengguna tidak diperkenankan untuk mengetikkan sesuatu.

Pada pembahasan kali ini, kita akan membuat dua buah list box, di mana list box yang satu digunakan sebagai sumber data, dan list box lainnya digunakan sebagai tempat untuk menyimpan data. Penggunaan contoh di bawah ini mungkin dapat menjelaskan maksud dari pemindahan data antar dua list box.

Departemen Sumber Daya Manusia (SDM) sebuah perusahaan tentu mempunyai arsip daftar riwayat hidup masing-masing karyawannya. Di dalam daftar riwayat hidup itu, tercantup berbagai macam data pribadi karyawan seperti nama, nomor KTP, status pernikahan, pengalaman bekerja, jenjang karir, dan sebagainya sampai dengan kegiatan olah raga yang sering dilakukan oleh si karyawan yang bersangkutan. Daftar riwayat hidup ini biasanya dimasukkan oleh karyawan (terutama karyawan baru) melalui formulir isian. Dari formulir itulah, staff SDM memasukkan datanya ke dalam database komputer. Nah, list box yang akan kita bahas di sini khusus berkaitan dengan kegiatan olah raga.

Pada posting terdahulu, kita sudah membuat list box yang berisi nama jenis olah raga. Dalam sebuah sistem informasi SDM, nama jenis olah raga itu dimasukkan sebagai bagian dari preferensi sistem (system preference), pengaturan sistem (system setting), panel kontrol (control panel), atau istilah-istilah semacam itu. Data dari pengaturan sistem ini kemudian digunakan untuk membantu memudahkan staff SDM memasukkan data olah raga yang ada pada masing-masing karyawan. Gambaran konsepnya seperti di bawah ini.
Gambar 1
Data dalam list box A diambil dari tabel master pengaturan sistem yang ditampilkan untuk membantu staff SDM mengisikan daftar riwayat hidup. Data dalam list box B merupakan form control jenis olah raga yang dipilih/disukai oleh karyawan. Data dalam list box B merupakan bagian dari daftar riwayat hidup karyawan yang disimpan di tabel master daftar riwayat hidup.

Dengan menggunakan list box A, staff SDM dapat memilih berbagai macam jenis olah raga yang disukai oleh karyawannya untuk kemudian dimasukkan ke dalam daftar riwayat hidup karyawan yang bersangkutan. Tentu saja jenis olah raga yang dipilih sesuai dengan formulir isian daftar riwayat hidup karyawan yang bersangkutan. Untuk sekedar informasi, formulir isian daftar riwayat hidup biasanya hanya berisi kotak kosong, di mana karyawan akan menuliskan semua data pribadi sesuai dengan pertanyaan/kuesioner terkait.

Untuk memindahkan data antar dua list box, ikuti langkah berikut ini:
  1. Buka dalam format design view, form yang telah dibuat di posting yang berjudul Manipulasi Data Dengan Menggunakan List Box Pada Form di Access.Bila form ini belum ada, buatlah terlebih dahulu dengan mengikuti petunjuk yang ada pada postingan itu.
  2. Pada list box lstListNamaOlahRaga, ubahlah properti Multi Select=Extended (berada pada tab Other).
  3. Kopilah tombol perintah Tambahkan, tombol perintah Hapus, dan list box lstListNamaOlahRaga dan paste di sebelah kanan seperti pada gambar design view di bawah ini.
    Gambar 2
  4. Ubahlah properti hasil kopian sebagai berikut.
    1. Tombol perintah tambahkan:
      1. Name=Tambahkan2
      2. Caption=Tambahkan->
    2. Tombol perintah Kembalikan:
      1. Name=Kembalikan
      2. Caption=<-Kembalikan
    3. List box Olah Raga Yang Dipilih:
      1. Name= lstOlahRagaYgDipilih
  5. Buka module form dan hapuslah semua kode VBA yang ada dalam modul form itu. Selanjutnya, salin kode VBA berikut ini ke dalam modul form:
    Option Compare Database
    Private Sub lstListNamaOlahRaga_KeyDown(KeyCode As Integer, Shift As Integer)
      If KeyCode = 46 Then Hapus_Click
    End Sub
    Private Sub Hapus_Click()
      TambahKembali Me.lstListNamaOlahRaga.Name
    End Sub
    Private Sub lstOlahRagaYgDipilih_KeyDown(KeyCode As Integer, Shift As Integer)
      If KeyCode = 8 Then Kembalikan_Click
    End Sub
    Private Sub Tambahkan_Click()
      Dim i, n As Integer, strLista As Variant, ada As Boolean
      If Me.txtInputBox = "" Then
        MsgBox "Tidak ada data yang ditambahkan"
        Exit Sub
      End If
      With Me.lstListNamaOlahRaga
        If .ListCount = 0 Then
          .RowSource = Chr(39) & Me.txtInputBox & Chr(39)
        Else
          strLista = Split(.RowSource, ";")
          For i = LBound(strLista) To UBound(strLista)
            If strLista(i) = Chr(39) & Me.txtInputBox & Chr(39) Then
              ada = True
             Exit For
            Else
              ada = False
            End If
          Next i
          If ada Then
            MsgBox Chr(39) & Me.txtInputBox & Chr(39) & " sudah ada dalam daftar."
            Me.txtInputBox.SetFocus
            Exit Sub
          End If
          .RowSource = .RowSource & ";" & Chr(39) & Me.txtInputBox & Chr(39)
        End If
        .value = .ItemData(.ListCount - 1)
      End With
      Me.txtInputBox = ""
      Me.txtInputBox.SetFocus
    End Sub
    Private Sub Tambahkan2_Click()
      TambahKembali "lstListNamaOlahRaga", "lstOlahRagaYgDipilih"
    End Sub
    Private Sub Kembalikan_Click()
      TambahKembali Me.lstOlahRagaYgDipilih.Name, Me.lstListNamaOlahRaga.Name
    End Sub
    Private Function TambahKembali(lstSumber As String, Optional lstTarget As String)
      Dim oItem, oTemp, selectedItem, selectedTemp As Variant
      Dim blSelected, ada As Boolean
      Dim ctlSumber, ctlTarget As Control
      Dim p, i, j, n As Integer
      
      Set ctlSumber = Controls(lstSumber)
      If lstTarget <> "" Then Set ctlTarget = Controls(lstTarget) Else Set ctlTarget = Nothing
      With ctlSumber
        If .ItemsSelected.Count = 0 Then Exit Function
        oItem = Split(.RowSource, ";")
        ReDim selectedTemp(.ItemsSelected.Count - 1)
        
        If .ItemsSelected.Count = .ListCount Then
          selectedTemp = oItem
          .RowSource = ""
        Else
          i = 0
          For Each selectedItem In .ItemsSelected
            selectedTemp(i) = Chr(39) & .ItemData(selectedItem) & Chr(39)
            For n = 0 To UBound(oItem)
              If oItem(n) = Chr(39) & .ItemData(selectedItem) & Chr(39) Then
                ada = True
                Exit For
              End If
            Next n
            j = 0
            If ada Then
              ReDim oTemp(UBound(oItem) - 1)
              For n = 0 To UBound(oItem)
                If oItem(n) <> Chr(39) & .ItemData(selectedItem) & Chr(39) Then
                  oTemp(j) = oItem(n)
                  j = j + 1
                End If
              Next n
            End If
            oItem = oTemp
            If i = 0 Then p = selectedItem
            i = i + 1
          Next selectedItem
          .RowSource = Join(oItem, ";")
        End If
        If p < .ListCount Then
          .Selected(p) = True
        Else
          .Selected(.ListCount - 1) = True
        End If
      End With
      If lstTarget <> "" Then
        With ctlTarget
          If .ListCount = 0 Then
            .RowSource = Join(selectedTemp, ";")
          Else
            .RowSource = .RowSource & ";" & Join(selectedTemp, ";")
          End If
        End With
      End If
    End Function
Form siap digunakan dan dua buah list box siap untuk dicoba. Tampilan form dalam format form view akan sama seperti gambar 1 di atas, atau bila dihilangkan arsirannya akan tampak seperti gambar 3 di bawah ini.
Gambar 3
Penambahan atau pengurangan data dilakukan oleh Private Function TambahKembali yang bisa dipanggil setiap saat di tempat yang diperlukan seperti tombol perintah Tambahkan, Hapus, dan Kembalikan. Selain itu, kita juga bisa menggunakan backspace untuk mengembalikan item pada Olah Raga Yang Dipilih ke Nama Olah Raga melalui Private Sub lstOlahRagaYgDipilih_KeyDown.

Comments

Post a Comment

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access