Hari ini kita melihat penggunaan kotak dialog saat mengedit data di LibreOffice Base (OpenOffice Base). Seperti yang kami temukan di posting sebelumnya, formulir LibreOffice Base (OpenOffice Base) sebenarnya adalah turunan dari editor teks Penulis LibreOffice (OpenOffice). Untuk mengatur antarmuka jendela di dalam Formulir, Dialog digunakan - yang dibuat dengan mudah dalam antarmuka visual bawaan, tetapi tidak memiliki dukungan untuk berkomunikasi dengan tabel database. Kami akan mengatur koneksi ini dengan makro OO Basic.
Mari kita mulai. Buat dua tabel dalam database:
produk
- id (integer, kunci utama)
- nama (string)
pesanan
- id (integer, kunci utama)
- productId (integer)
- hitung (integer)
- tanggal (tipe data Tanggal)
Buat formulir pesanan, tambahkan elemen Formulir ke formulir dengan nama pesanan. Serta Kontrol Tabel dengan sumber data pesanan. Cara melakukan ini dibahas dalam
Bagian 2 dari serangkaian pesan.
Saat mengatur properti kolom tanggal, harap perhatikan properti yang ditandai dalam gambar dengan panah yang memungkinkan Anda menampilkan data dalam format yang diinginkan dan gunakan kalender drop-down untuk memilih tanggal tertentu.
Sekarang, tepat di tabel, Anda dapat menambah dan mengubah data. Sampai titik tertentu, ini nyaman, mirip dengan pekerjaan biasa dari klien dengan prosesor meja. Tetapi pada beberapa titik, masalah mulai yang juga karakteristik bekerja dengan prosesor meja. Data dapat diubah secara acak tanpa menyadarinya. Dan setelah menyadari tidak mungkin untuk memutar kembali semuanya seperti semula. Ada sedikit ruang untuk speaker baru, dan pengguliran horizontal yang tidak menyenangkan dapat terbentuk. Judul kolom juga memiliki batas ukuran (jika tidak mereka tidak akan cocok secara horizontal), dan ini tidak memungkinkan deskripsi rinci tentang data.
Sebagai tindakan setengah, Anda dapat menempatkan bidang biasa untuk entri data di sebelah tabel (Kontrol Teks, Kontrol Angka, dll.). Tetapkan bidang yang sesuai dari tabel pesanan sebagai sumber data dan semuanya akan berfungsi. Saat menavigasi dataset, data di bidang input akan berubah. Saat mengubah data di bidang input, data dalam tabel database akan berubah. Namun solusi ini tidak akan terlihat sangat indah.
Oleh karena itu, kami menerapkan fungsi tersebut menggunakan Dialog. Dialog memiliki satu batasan signifikan. Bidang entri dialog tidak terkait dengan tabel database. Oleh karena itu, mengisi kolom entri Dialog dari tabel database, dan menyimpan input field ke tabel database perlu dilakukan dengan makro OO Basic. Namun, ini bagus, karena memungkinkan Anda untuk mempertimbangkan kemungkinan pemrograman OO Basic (sebelum itu, pesan saya dijelaskan hanya bekerja dengan lingkungan, tetapi semua ini adalah persiapan untuk pesan hari ini).
Untuk memunculkan editor Dialog, Anda harus memilih dari menu Tools-> Macro-> Organize Mac-> LibreOffice Basic-> Organizer-> Dialog-> New | Edit | Delete. Saya ingin memiliki cara yang lebih cepat untuk sampai ke editor ini. Setelah itu, editor dialog (sayangnya, bukan yang paling nyaman) akan terbuka, di mana kita akan membuat bidang dengan nama-nama bidang dalam tabel database. Seingat Anda, Dialog tidak secara otomatis mengikat ke tabel database, jadi kami akan menulis makro untuk melakukan ini. Dan sebagai konvensi penamaan, mari kita tentukan nama bidang input dan bidang tabel database yang sama.
Editor dengan formulir yang sudah selesai akan terlihat seperti ini:
Selanjutnya, tambahkan dua tombol ke Dialog. Kami akan memberikan nama tombol secara acak, tetapi mulai dengan garis bawah, untuk membedakannya dari bidang basis data. Setiap tombol di palet properti dapat diberi tindakan. Mari kita atur aksi OK ke tombol - menutup dialog dengan konfirmasi tindakan. Dan yang kedua - Batalkan - menutup dialog tanpa mengonfirmasi tindakan.
Tutup editor Dialog, dan kembali ke editor Formulir. Mari kita membuat tombol yang memanggil dialog dan menetapkan prosedur handler Order_Edit untuk itu, di mana kita akan mengisi Dialog dari tabel database FromBaseToDialog (oForm, oDialog), dan menyimpan data dari tabel database Dialog FromDialogToBase (oDialog, oForm).
Sub Order_Edit(Event) Dim oDialog As Object Dim orders As Object orders = Thiscomponent.DrawPage.Forms.GetByName("orders") DialogLibraries.LoadLibrary("Standard") oDialog = CreateUnoDialog(DialogLibraries.Standard.dialogOrder) FromBaseToDialog(orders, oDialog) If oDialog.Execute() = 1 Then FromDialogToBase(oDialog, orders) orders.UpdateRow() End If End Sub Sub FromBaseToDialog(oForm, oDialog) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then ODialog.GetControl(sName).SetText(oForm.Columns.GetByName(sName).String) End If Next I End Sub Sub FromDialogToBase(oDialog, oForm) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then oForm.Columns.GetByName(sName).UpdateString(Trim(oDialog.GetControl(sName).GetText())) End If Next I End Sub
Diasumsikan bahwa Dialog disimpan di pustaka Standar sebagai dialogOrder. Secara alami, Anda dapat memilih nama lain. Nama-nama kontrol yang dimulai dengan garis bawah dilewati dan tidak diproses. Juga, nama yang dimulai dengan Label, yang digunakan untuk header bidang teks, tidak diproses.
Memanggil oDialog.Execute () = 1 menampilkan Dialog di dalam jendela Formulir dan menjeda makro sampai tombol OK atau Batal diklik. Ketika Anda mengklik OK, nilai kembali sama dengan satu.