Antarmuka setiap aplikasi modern dalam satu bentuk atau yang lain berisi daftar objek. Saat bekerja dengan mereka, pengguna seringkali membutuhkan jenis tindakan yang sama seperti menyortir, memfilter, mengekspor, dan sebagainya. Implementasi dari operasi-operasi ini seringkali dipersulit oleh fakta bahwa daftar dapat menjadi “dinamis”. Dalam hal ini, data akan dibaca seperlunya tidak hanya dari server ke klien, tetapi juga dari server database ke server aplikasi.
Dalam platform
lsFusion yang terbuka dan gratis
, semua daftar bersifat dinamis secara default dan ditambahkan ke formulir apa pun dalam beberapa baris kode. Pada artikel ini saya akan memberi tahu Anda beberapa detail teknis penerapannya, serta fitur di antarmuka yang secara otomatis diberikan kepada pengguna saat bekerja dengan daftar apa pun pada formulir apa pun.
Ciptaan
Daftar pada formulir di lsFusion ditambahkan oleh pernyataan
OBJECTS :
Tabel akan ditambahkan ke formulir, di mana semua objek dari kelas
Item akan terkandung dalam baris. Anda dapat menambahkan banyak objek ke satu daftar. Sebagai contoh
Dalam hal ini, tabel akan menampilkan semua pasangan objek yang mungkin dari kelas
Item dan
Stock .
Kolom ditambahkan ke daftar dengan pernyataan
PROPERTI :
Dalam tabel dapat ditambahkan rincian sederhana dari objek, serta ekspresi apa pun dengan pengelompokan, partisi, rekursi, dan sebagainya.
Secara default, daftar akan menampilkan semua objek dalam database. Untuk membatasi mereka, Anda dapat menggunakan
pernyataan FILTER :
Dalam kondisi filter, Anda bisa menggunakan ekspresi apa pun yang bergantung pada objek apa pun di formulir.
Navigasi
Ketika pengguna membuka formulir, platform secara otomatis menentukan jumlah catatan yang terlihat tergantung pada ukuran tabel. Untuk kesederhanaan presentasi, kami mengasumsikan bahwa ada 50 catatan seperti itu. Pada setiap saat, platform akan menyimpan 150 catatan pada klien dan di server. Dalam hal ini, objek aktif saat ini harus berada di tengah "jendela" ini: dari catatan ke-50 hingga ke-99. Mungkin ada lebih sedikit entri jika objek saat ini baik di bagian paling awal atau di akhir daftar.
Jika Anda perlu membuat catatan tertentu aktif ketika Anda membuka formulir, maka dua permintaan dibuat ke server database, yang masing-masing membaca 75 catatan di setiap sisi catatan yang diinginkan. Kemudian daftar umum dilem dari hasil mereka. Dalam kasus ketika Anda perlu menginisialisasi daftar dari awal atau akhir, maka satu permintaan dibuat untuk 100 catatan, dan catatan yang diterima pertama atau terakhir diatur aktif. Hal yang sama terjadi jika pengguna menekan CTRL + HOME atau CTRL + END dalam daftar untuk pergi ke awal atau akhir daftar.
Segera setelah pengguna membuat rekaman aktif di luar tengah jendela saat ini (sebelum ke-50 atau setelah ke-99), platform membaca catatan tambahan sehingga catatan saat ini berada di "tengah" dari jendela baru.
Keunikan implementasi daftar dinamis adalah bahwa objek saat ini tidak bisa berada di luar tengah jendela. Karena itu, ketika menggulir daftar, objek saat ini secara otomatis dipindahkan ke area yang terlihat.
Membaca data dalam daftar selalu terjadi dalam dua kueri. Kueri pertama hanya membaca kunci dari catatan yang diperlukan di tabel sementara. Kueri kedua membaca nilai semua kolom untuk kunci yang sudah dibaca. Ini dilakukan dengan alasan bahwa kolom dapat berisi ekspresi apa pun yang dapat dikompilasi ke dalam subquery atau konstruksi SQL kompleks lainnya. Dalam hal ini, platform itu sendiri mendorong kunci-kunci ini ke dalam subqueries sehingga perhitungan nilai-nilai kolom ini tidak melintasi seluruh database, tetapi hanya sesuai dengan kunci yang diperlukan. Ini menciptakan sedikit overhead, karena dua pertanyaan dibuat alih-alih satu, tetapi melindungi terhadap "masuk" yang tidak disengaja ke dalam rencana server database yang tidak efisien.
Penyaringan
Entri dalam daftar pada formulir dapat difilter berdasarkan opsi berikut:
- Indikasi dalam kode seleksi berkelanjutan menggunakan pernyataan FILTER:Ekspresi mungkin tergantung pada objek lain yang dipilih saat ini di formulir. Misalnya, jika ada tabel atau pohon dengan gudang di formulir, maka dalam ekspresi untuk daftar barang, Anda bisa merujuk ke gudang saat ini untuk memfilter hanya barang-barang yang ada di saldo.
- Indikasi dalam kode seleksi, yang dapat diterapkan oleh pengguna seperlunya menggunakan instruksi FILTERGROUP :
Daftar tarik-turun akan ditambahkan ke formulir (atau kotak centang jika ada satu filter dalam grup), yang dengannya pengguna dapat memilih salah satu filter yang perlu diterapkan.

- Pemfilteran khusus yang dibuat oleh pengguna di antarmuka:

Jika kolom dalam daftar tidak dapat diedit, maka ketika memasukkan karakter, filter untuk kolom ini akan dihidupkan secara otomatis, yang dapat diatur ulang dengan sekali tekan tombol ESC.
Platform itu sendiri memantau perubahan dalam kondisi apa pun yang dapat memengaruhi filter saat ini (perubahan objek dependen, tindakan pengguna, dll.). Ketika perubahan tersebut terdeteksi, daftar diperbarui secara otomatis tanpa mengubah objek yang saat ini dipilih. Untuk melakukan ini, dua permintaan dibuat, 75 entri di setiap arah dari yang sekarang, serta selama inisialisasi formulir.
Menyortir
Secara default, entri dalam daftar diurutkan sesuai urutan pengidentifikasi internal objek. Pengidentifikasi ini secara otomatis dihasilkan dalam urutan naik ketika membuat objek (pada saat yang sama, mereka secara global unik di semua kelas), dan indeks selalu dibangun di atasnya.
Mengurutkan dalam daftar dapat diubah sebagai berikut:
- Dengan menunjukkan dalam kode kolom di mana penyortiran dilakukan melalui pernyataan ORDER :
- Mengklik dua kali pada tajuk kolom oleh pengguna (memegang CTRL akan menambahkan penyortiran "bersarang").

Bergantung pada penyortiran saat ini, saat membaca kunci rekaman, ekspresi kolom yang sesuai akan ditambahkan ke blok ORDER BY permintaan. Pada saat yang sama, pengidentifikasi unik dari objek selalu ditambahkan ke penyortiran untuk memastikan bahwa kunci dari semua catatan adalah unik.
Ekspresi bentuk: column1> value1 OR (kolom1 = value1 AND column2> value2) OR (column1 = value1 AND column2 = value2 AND key> value) akan ditambahkan ke klausa WHERE dari permintaan. Juga, saat membaca kunci, instruksi LIMIT dengan jumlah catatan yang dapat dibaca yang dibutuhkan akan ditambahkan ke permintaan. Saat membaca catatan "naik", urutan dalam ORDER BY dan ekspresi di MANA akan "terbalik" sesuai untuk membaca catatan di arah yang berlawanan.
Perlu dicatat bahwa kompleksitas melakukan query ini akan relatif kecil jika ada indeks yang sesuai (karena indeks akan jarak tempuh mulai dari kunci saat ini naik atau turun hanya untuk sejumlah catatan tertentu). Oleh karena itu, untuk mempercepat pekerjaan dengan daftar dinamis saat menyortir menurut kolom ,1, kolom2, disarankan untuk membuat indeks berikut:
Jika penyortiran didasarkan pada kolom terhitung, maka dapat dibuat secara permanen, seperti yang dijelaskan dalam
artikel ini, dan kemudian indeks dapat dibangun di atasnya.
Salah satu fitur dari implementasi tersebut adalah tidak adanya scrollbar "jujur". Saat membaca catatan, hanya jumlah yang diperlukan yang terbaca. Permintaan untuk mendapatkan jumlah total baris dalam daftar melalui COUNT (*) dengan filter yang diinginkan dapat menyebabkan berjalan penuh pada tabel atau indeks, yang akan memengaruhi kinerja secara negatif. Masalah yang sama akan terjadi ketika membaca catatan melalui konstruk OFFSET. Selain itu, harus diingat bahwa saat menavigasi daftar, jumlah entri di dalamnya dapat diubah oleh pengguna lain dengan membuat perubahan baru.
Editing
Anehnya, dalam beberapa platform komersial bahkan mereka tidak dapat menyadari kemampuan untuk mengedit dalam daftar dinamis. Kesulitan utama dalam menerapkan mekanisme ini adalah hanya jendela yang terlihat disimpan di server dan klien, dan perubahan dapat dibuat dalam seluruh daftar.
Tidak ada mekanisme khusus dalam lsFusion yang mengimplementasikan pengeditan daftar secara langsung. Fungsi ini diimplementasikan sebagai bagian dari mekanisme sesi umum.
Semua perubahan yang dibuat dalam sesi perubahan saat ini disimpan dalam tabel sementara. Ketika pengguna mengedit sesuatu pada formulir (termasuk nilai dalam salah satu entri), nilai-nilai baru ditulis ke tabel sementara dengan kunci yang sesuai. Kemudian, ketika kueri kedua (setelah menerima kunci) membaca nilai-nilai kolom, GABUNG dengan tabel sementara yang sesuai dengan perubahan ditambahkan ke kueri.
Saat menyimpan sesi perubahan, kueri dijalankan, yang dalam satu transaksi menulis semua nilai dari tabel sementara ke database.
Penyesuaian grup
Cukup sering, pengguna perlu mengubah nilai kolom untuk semua objek yang dipilih dalam daftar sekaligus. Untuk melakukan ini, ada tombol khusus di bilah alat dari setiap daftar (dengan tombol pintas F12). Ketika ditekan, mode pengeditan sel normal diaktifkan, tetapi perubahan diterapkan bukan pada rekaman saat ini, tetapi untuk semua yang dipilih.
Mekanisme ini memungkinkan Anda untuk dengan cepat mengedit sejumlah besar objek sesuai dengan kriteria yang ditentukan:
Seperti halnya selama pengeditan normal, perubahan tidak langsung disimpan ke database, tetapi dicatat dalam tabel sementara. Maka pengguna perlu mengklik tombol
Simpan untuk menulisnya ke database. Kerugian dari pendekatan ini mungkin karena pengguna secara tidak sengaja mengubah data tambahan. Tetapi di sini, seperti yang mereka katakan, prinsipnya bekerja: "dengan kekuatan besar datang tanggung jawab besar".
Daftar Ringkasan
Dalam daftar apa pun, pengguna diberi kesempatan untuk mengetahui jumlah catatan atau jumlah dengan kolom tertentu dalam pilihan saat ini. Untuk melakukan ini, pengguna perlu mengklik tombol yang sesuai di bilah alat dari daftar tertentu:
Untuk mendapatkan data ini, permintaan akan secara otomatis dihasilkan dengan ekspresi COUNT (*) atau SUM, di mana WHERE ekspresi pemilihan saat ini akan ditambahkan. Dengan fitur ini, Anda dapat dengan cepat mendapatkan total dari daftar tanpa harus membuat laporan.
Di versi desktop klien, juga dimungkinkan untuk menghitung jumlah sel yang dipilih dengan analogi dengan Excel:
Salin / Tempel
Dalam versi desktop, pengguna diberi kesempatan untuk menandai sel-sel tertentu, tekan CTRL + C, dan rekatkan nilai dari sel-sel tersebut ke dalam clipboard:
Dengan cara yang sama, Anda dapat menempelkan tabel dari clipboard ke daftar yang dapat diedit pada formulir apa pun:
Peluang seperti itu sering merupakan alternatif untuk pengembangan impor khusus.
Pengaturan meja
Dalam daftar apa pun, Anda dapat mengubah beberapa parameternya:
Anda dapat mengubah komposisi kolom, ukurannya, judulnya, topeng, dan sebagainya. Anda dapat menyimpan pengaturan tabel baik untuk pengguna saat ini dan untuk semua pengguna (jika pengguna saat ini memiliki hak yang diperlukan).
Perhatikan opsi Ukuran Halaman. Dengan menggunakannya, Anda dapat mengubah ukuran "jendela" yang dijelaskan di awal artikel. Misalnya, alih-alih 50 entri otomatis, Anda dapat menentukan nilai yang lebih besar. Kemudian jumlah data yang lebih besar akan diunduh ke klien dan server, tetapi permintaan akan lebih jarang terjadi. Menyetel nilai parameter ini ke 0 akan menjadikannya normal dari daftar dinamis apa pun, yaitu, semua entri dalam daftar akan selalu dibaca. Ukuran jendela juga dapat ditentukan secara langsung dalam kode menggunakan parameter
pageSize dari pernyataan
DESIGN .
Ekspor ke Excel
Untuk daftar apa pun, dimungkinkan untuk mengunggah semua catatannya di Excel. Untuk melakukan ini, cukup klik tombol berikut:
Ini memperhitungkan pilihan saat ini, penyortiran, serta hanya kolom yang terlihat yang ditentukan dalam pengaturan tabel.
Berputar
Secara default, daftar apa pun ditampilkan sebagai tabel. Tetapi ada kemungkinan untuk beralih ke mode tampilan khusus di mana pengguna dapat membuat berbagai laporan dan diagram:
Dengan sejumlah kecil entri dalam daftar, data akan diproses langsung pada klien. Segera setelah jumlah data melebihi ambang tertentu, permintaan basis data yang dibuat secara otomatis di server akan digunakan untuk mengelompokkan data.
Alternatif
Muncul pertanyaan yang masuk akal. Bagaimana mengatasi masalah pengeditan daftar dinamis di platform di mana fitur ini tidak didukung. Paling sering, mereka membuat daftar sederhana, memaksa pengguna untuk membatasi jumlah entri dengan beberapa pilihan (misalnya, menentukan filter berdasarkan kategori, pemasok atau direktori terkait lainnya).
Namun, pendekatan ini memiliki satu masalah serius. Bahkan dengan pilihan yang sudah ada, tidak ada jaminan bahwa sejumlah besar catatan tidak akan ada dalam sampel. Tidak mungkin untuk menghitung terlebih dahulu jumlah nilai yang diperoleh, karena seringkali kerumitan operasi semacam itu secara langsung sebanding dengan kerumitan dalam memperoleh semua data. Karenanya, dalam beberapa kasus sejumlah besar entri akan ditambahkan ke daftar, yang akan menyebabkan konsumsi sumber daya yang besar di server atau klien, serta penurunan kinerja yang signifikan.
Kesimpulan
Menerapkan daftar dinamis dalam pengembangan modern bukanlah tugas yang paling sepele, karena bagian klien dan server terlibat. Ada beberapa perpustakaan open source dengan lisensi terbuka di dunia yang memungkinkan Anda untuk dengan cepat dan mudah mengimplementasikan fungsi ini.
Di platform lsFusion yang terbuka dan gratis, daftar dinamis dibuat dalam beberapa baris kode dan memberi pengguna banyak peluang untuk bekerja dengannya. Dikombinasikan dengan kemampuan untuk mengedit daftar tersebut, platform ini memungkinkan Anda untuk dengan cepat bekerja dengan dokumen pada ratusan ribu baris, mengatur pekerjaan yang mudah untuk
memilih catatan dalam dokumen, melakukan perubahan grup ke direktori, dan banyak lagi.
Penggunaan daftar dinamis dapat secara signifikan mengurangi konsumsi waktu prosesor dan memori pada server dan klien dengan bekerja dengan set data yang terbatas, serta mengurangi beban pada saluran komunikasi antara server dan klien. Karena efisiensi yang sedemikian tinggi, lima dari delapan
rantai ritel terbesar melakukan kegiatan operasional utama mereka pada
solusi berdasarkan platform lsFusion di Belarus.