
Bagian kedua dari bahasa lsFusion dan trilogi platform. Bagian pertama dapat ditemukan di
sini .
Ini akan fokus pada logika representasi, yaitu, pada segala sesuatu yang berkaitan dengan menggabungkan data dan menampilkannya kepada pengguna atau sistem informasi lainnya.
Jelas bahwa banyak orang mungkin tidak begitu tertarik untuk melihat presentasi petarung, dan mereka ingin melihat pertarungan nyata, jika mungkin dengan darah (dan itu akan terjadi, karena pembahasan artikel sebelumnya membantu untuk lebih memahami tempat-tempat pesaing potensial yang tidak terlindungi dan di mana untuk mengalahkannya) . Tetapi ada dua hal yang perlu dipertimbangkan:
a) ini Habr. Artinya, sumber daya teknis, mereka tidak suka gambar-gambar indah dan slogan iklan di sini - untuk mengatakan sesuatu, Anda perlu detail tentang bagaimana Anda akan mencapai ini.
b) ini adalah pasar untuk pengembangan sistem informasi, dan sangat mirip dengan pasar untuk produk penurunan berat badan. Di sini, semua orang mengatakan bahwa kita memiliki yang cepat dan mudah. Tetapi ketika sampai pada detail, di mana, seperti yang Anda tahu, iblis terletak, baik CRUD sederhana digunakan sebagai contoh atau mereka menggunakan berbagai trik: mereka menunjukkan beberapa cuplikan kode, dan menyembunyikan bagian utama dengan kata-kata βitu tidak masalah "," Selesai dalam beberapa menit "dan semuanya seperti itu.
Sebenarnya, itulah sebabnya kami memiliki dua opsi: mulai dengan keuntungan dan risiko mendapat celaan karena omong kosong pemasaran, atau mulai dengan deskripsi teknis dan pertanyaan "mengapa kita perlu bahasa lain". Secara teoritis, tentu saja, semua ini bisa dilakukan dalam satu artikel, tetapi artikel seperti itu akan sulit tidak hanya untuk dibaca, tetapi bahkan hanya untuk menggulir. Karenanya, kami memilih opsi kedua, meskipun jika masih penting bagi seseorang untuk mengetahui alasan penampilan dan kelebihan bahasa saat ini (dan bukan di artikel mendatang), selamat datang di
situs . Itu hanya terdiri dari tiga halaman: apa, bagaimana dan mengapa tidak, dan menurut saya, memberikan informasi yang cukup untuk menjawab semua pertanyaan ini. Plus, Anda juga dapat mencoba platform
online di sana , termasuk untuk memastikan bahwa tidak ada "piano di semak-semak" di sana, dan kode dari contoh di artikel ini benar-benar semua kode yang diperlukan untuk menjalankan aplikasi.
Tapi cukup penyimpangan liris, kita kembali ke
presentasi deskripsi
pejuang dari logika representasi.
Seperti logika domain (artikel pertama), semua konsep logika presentasi di lsFusion membentuk tumpukan:

dan dalam urutan tumpukan inilah saya akan membicarakannya.
Bentuk
Formulir adalah konsep yang paling penting (dan bahkan praktis satu-satunya) dalam logika presentasi, yang bertanggung jawab untuk semuanya - baik untuk interaksi pengguna dan untuk mencetak, mengekspor dan mengimpor data.
Formulir secara logis dapat dibagi menjadi dua bagian:
- Struktur formulir menentukan data apa yang ditunjukkan oleh formulir.
- Presentasi formulir menentukan bagaimana ini menampilkan data ini.
Bentuk struktur
Kita mulai, secara alami, dengan struktur bentuk.
Benda-benda
Saat membuat formulir, Anda harus terlebih dahulu menentukan objek mana yang akan ditampilkan. Perlu dicatat bahwa mungkin ada sedikit kebingungan dalam terminologi antara objek bentuk dan objek yang ditampilkan dalam objek bentuk ini. Oleh karena itu, di masa depan, jika ini tidak jelas dari konteksnya, kami akan menggunakan istilah "bentuk objek" (untuk kasus pertama) dan "objek dalam database" (untuk yang kedua).
Untuk setiap objek bentuk, Anda perlu mengatur kelasnya. Kelas ini dapat berupa primitif (bawaan) atau objek (kustom).
Sesuai dengan urutan menambahkan objek ke formulir, daftar objek yang dipesan terbentuk. Dengan demikian, objek terakhir untuk satu set objek tertentu akan disebut objek dari set ini dengan nomor seri maksimum dalam daftar ini (yaitu, yang terbaru).
Setiap objek pada formulir pada waktu tertentu memiliki nilai saat ini. Perubahannya terjadi tergantung pada presentasi, baik sebagai hasil dari tindakan yang sesuai dari pengguna dalam presentasi interaktif, atau "secara virtual" dalam proses membaca data dalam representasi statis.
Properti dan Tindakan
Setelah mendefinisikan objek pada formulir, Anda bisa menambahkan properti dan tindakan, menggantikan objek yang dijelaskan di atas untuk mereka sebagai input ke argumen.
Perhatikan bahwa menambahkan tindakan hanya relevan untuk presentasi interaktif, mereka diabaikan dalam laporan dan ekspor. Juga, mengingat bahwa perilaku properti dan tindakan dari sudut pandang tampilan mereka di formulir persis sama, di masa depan kami hanya akan menggunakan istilah properti (untuk tindakan perilaku tersebut persis sama).
Tampilkan objek
Setiap properti ditampilkan tepat pada satu objek pada formulir (kami akan menyebutnya objek tampilan properti ini). Secara default, objek tampilan adalah objek, yang terakhir untuk set objek yang diteruskan ke input properti ini. Misalnya, jika kita memiliki bentuk saldo saat ini dengan dua objek - gudang dan barang, dan tiga properti - nama gudang dan barang dan saldo barang di gudang:
Kemudian, untuk nama gudang, objek tampilan adalah s (gudang), dan untuk nama barang dan sisanya, i (barang).
Namun, jika perlu, pengembang dapat menentukan objek tampilan secara eksplisit (yaitu, misalnya, dalam tampilan interaktif menunjukkan properti dengan sisanya di tabel gudang, bukan barang).
Filter dan Penyortiran
Untuk setiap formulir, pengembang dapat menetapkan filter dan pesanan yang akan membatasi daftar objek yang tersedia untuk dilihat / dipilih pada formulir, serta urutan tampilan.
Untuk mengatur filter, Anda harus menentukan properti yang akan digunakan sebagai kriteria filter. Filter akan diterapkan ke tabel objek itu, yang merupakan yang terakhir untuk set objek yang diteruskan ke input properti ini (yaitu, sama dengan definisi objek tampilan properti). Dalam hal ini, hanya set objek (seri) yang akan ditampilkan untuk nilai properti yang bukan NULL. Misalnya, jika kita menambahkan filter currentBalance (s, i) OR isActive (i) ke formulir di atas:
saat menampilkan produk, hanya produk yang seimbang atau ditandai aktif yang akan ditampilkan.
Urutkan didefinisikan sebagai daftar properti pada formulir di mana objek pesanan harus ditampilkan. Kalau tidak, semuanya mirip dengan filter.
Kelompok objek
Platform ini juga memiliki kemampuan untuk menggabungkan objek menjadi
sekelompok objek . Dalam hal ini, "produk Cartesian" dari objek-objek ini akan ditampilkan dalam tabel / daftar (yaitu, untuk dua objek - semua pasangan, tiga objek - tiga kali lipat, dll.).
Dengan demikian, hampir di mana-mana, baik sebelum dan sesudah, alih-alih objek tunggal formulir, Anda dapat menggunakan kelompok objek.
Sebenarnya, inilah yang dilakukan dalam dokumentasi: istilah "kelompok objek" yang lebih umum digunakan di mana-mana, tetapi agar tidak menyulitkan hal-hal dalam artikel ini (dan kelompok objek yang terdiri dari beberapa objek digunakan lebih jarang), diputuskan untuk melupakan dan mempertimbangkan kelompok objek. bahwa sekelompok objek selalu terdiri dari tepat satu objek dan, karenanya, menggunakan istilah "objek" di mana-mana alih-alih "kelompok objek" yang lebih kompleks dan "kumpulan objek".
Grup Properti
Properti pada formulir, seperti objek, juga dapat digabungkan menjadi grup, yang, pada gilirannya, digunakan dalam interaktif (desain default) dan representasi hierarkis formulir (tentang mereka beberapa saat kemudian). Secara default, pengikatan properti ke grup bersifat global (artinya, ia ditetapkan untuk properti untuk semua formulir sekaligus), namun, jika perlu, untuk formulir individual pengikatan ini dapat didefinisikan ulang.
Objek Kolom
Secara default, properti ditampilkan tepat satu kali di objek tampilan. Dalam hal ini, sebagai nilai objek selain objek tampilan properti ini (kami menyebutnya atas), nilai saat ini digunakan. Namun, platform juga memiliki kemampuan untuk menampilkan satu properti beberapa kali sehingga nilai beberapa objek teratas tidak digunakan oleh nilai saat ini, tetapi semua objek dalam database yang cocok untuk filter. Dengan pemetaan properti ini, semacam "matriks" terbentuk - (objek tampilan) x (objek atas). Oleh karena itu, untuk membuat matriks seperti itu, ketika menambahkan properti ke formulir, perlu untuk menunjukkan objek atas mana yang harus digunakan untuk membuat kolom (kita akan memanggil objek objek-in-kolom).
Jadi, dengan apa yang ditampilkan formulir, kurang lebih diketahui, mari kita beralih ke bagaimana ia bisa melakukan ini.
Pengiriman formulir
Ada tiga pengiriman formulir:

Lihat ScreenshotInteraktif:

Dicetak:

Terstruktur:

- Interaktif. Pandangan yang dengannya pengguna dapat berinteraksi adalah mengubah data dan objek saat ini dengan memicu berbagai peristiwa. Sebenarnya, representasi ini biasanya disebut formulir.
- Dicetak Biasanya disebut laporan - mengunggah semua data formulir dan menyajikannya dalam bentuk grafis. Termasuk dengan kemungkinan mencetaknya (dari mana namanya).
- Terstruktur - representasi formulir dalam berbagai format terstruktur (JSON, XML, DBF, dll.). Biasanya digunakan untuk integrasi lebih lanjut dengan sistem lain.
Representasi interaktif dan dicetak adalah grafik, yaitu, mereka menampilkan data yang diterima dalam ruang dua dimensi: kertas atau layar perangkat. Oleh karena itu, masing-masing representasi ini memiliki desain, yang, tergantung pada representasi tertentu, dapat diatur menggunakan mekanisme yang sesuai (tentang mereka sedikit kemudian).
Presentasi yang dicetak dan terstruktur adalah statis, yaitu, mereka membaca semua data pada saat formulir dibuka (berbeda dengan yang interaktif, yang membaca data seperlunya).
Deskripsi pertunjukan akan dimulai, mungkin, dengan yang paling sulit - presentasi interaktif.
Presentasi interaktif
Dalam tampilan interaktif, objek formulir ditampilkan dalam bentuk tabel. Baris dalam tabel ini sesuai dengan objek dalam database yang memenuhi filter yang ditentukan, kolom, pada gilirannya, sesuai dengan properti.
Namun, jika perlu, properti bisa ditampilkan bukan sebagai kolom tabel, yaitu, untuk semua barisnya, tetapi sebagai bidang terpisah pada formulir, yaitu, hanya untuk nilai saat ini dari objek formulir. Sebagai contoh:
Mengubah nilai saat ini dari objek formulir terjadi baik sebagai hasil dari pengguna mengubah baris saat ini dari tabel, atau sebagai hasil dari melakukan tindakan yang dibuat menggunakan operator pencarian khusus (MENCARI).
Perhatikan bahwa cara properti ditampilkan dalam panel atau tabel, sebagai aturan, diatur bukan untuk setiap properti secara terpisah, tetapi sebagai keseluruhan untuk objek formulir. Oleh karena itu, jika objek bentuk ditandai sebagai PANEL, maka semua propertinya ditampilkan di panel (yaitu, untuk nilai saat ini), jika tidak (secara default) semua propertinya ditampilkan dalam tabel. Properti tanpa parameter dan tindakan default ditampilkan di panel.
Semua tabel dalam tampilan interaktif adalah dinamis secara default, yaitu, hanya sejumlah terbatas objek dalam database yang dibaca, dan sisanya dibaca sebagai objek saat ini dalam perubahan tabel. Jumlah objek yang ditampilkan dalam hal ini dapat ditentukan secara otomatis berdasarkan ketinggian bagian yang terlihat dari tabel, atau ditetapkan oleh pengembang secara eksplisit saat membuat formulir.
Juga, formulir dalam presentasi interaktif sepenuhnya reaktif, yaitu, secara otomatis memperbarui semua data pada formulir ketika setiap data yang mempengaruhi mereka berubah (seperti Bereaksi, hanya dalam kasus umum). Plus, semua ini dilakukan bukan dengan perhitungan ulang penuh (seperti pada React yang sama), tetapi secara bertahap, terlebih lagi, pada SQL server.
Secara umum, lucu ketika, ketika membandingkan dengan teknologi lain, Anda mencoba untuk memasukkan tiga persyaratan teratas dalam tugas, orang sering membuat mata bulat, seolah-olah mereka diminta untuk meluncurkan seseorang ke luar angkasa. Meskipun tidak terpenuhinya persyaratan kedua oleh setiap pengguna normal akan diklasifikasikan sebagai bug, dan persyaratan pertama dan ketiga adalah bahwa formulir yang dikembangkan akan bekerja secara normal ketika setidaknya sedikit data muncul dalam database (misalnya puluhan ribu rekaman).
Presentasi interaktif didukung dalam mode klien web (mis. Aplikasi web di browser) dan dalam mode klien desktop (aplikasi Java). Klien desktop, seperti halnya klien asli, memiliki respons yang sedikit lebih baik dari antarmuka, tetapi yang paling penting, ini memungkinkan Anda untuk bekerja dengan peralatan dan melakukan operasi lain yang tidak tersedia di browser (terutama karena masalah keamanan).
Pohon Objek
Selain tabel, platform ini juga memungkinkan Anda untuk mengatur tampilan objek dalam bentuk pohon, baik datar ("bersarang" di setiap tabel lainnya) dan rekursif (misalnya, "bersarang" objek dalam database).
Faktanya, pohon flat adalah generalisasi tabel, ketika beberapa tabel "digabungkan" menjadi satu tabel sekaligus:
Ini adalah mekanisme yang relatif kompleks dan jarang digunakan dalam praktiknya, jadi kami tidak akan membahasnya secara rinci.
Tetapi pohon rekursif, sebaliknya, cukup sering digunakan (misalnya, untuk mengimplementasikan pengklasifikasi). Untuk menampilkan objek bentuk dalam bentuk pohon seperti itu, perlu untuk menetapkan filter tambahan untuknya - properti yang nilainya untuk objek yang lebih rendah harus sama dengan objek atas. Awalnya, objek teratas dianggap NULL.
Manajemen formulir pengguna
Untuk memastikan ergonomi yang lebih baik dari sistem (termasuk untuk tidak membuat formulir untuk semua orang), bagian dari operasi untuk menyiapkan presentasi interaktif formulir dapat dilakukan oleh pengguna sendiri. Misalnya, operasi tersebut adalah:
- pengaturan tabel (kolom yang terlihat, urutan, font, dll.),
- membuat filter dan jenis khusus,
- pengelompokan data berdasarkan nilai kolom,
- cetak tabel dan unggah ke Excel.
Selain itu, pengembang dapat membuat grup filter yang disebut, yang dapat dinyalakan / dimatikan secara mandiri oleh pengguna. Sebagai contoh:
Ini tidak semua kemungkinan untuk mengkustomisasi sistem oleh pengguna, tetapi kami akan kembali ke kemungkinan lain di artikel ketiga, karena sebagian besar dari mereka masih tidak memiliki hubungan langsung dengan logika presentasi.
Perhatikan bahwa fungsionalitas yang dijelaskan di atas merujuk lebih ke fungsionalitas platform ERP, yang sudah sepenuhnya bertentangan dengan judul artikel. Di sisi lain, seperti yang disebutkan dalam artikel pertama, di masa depan, bahasa / platform mengklaim sebagai pengganti, termasuk kelas platform ini, jadi tidak benar untuk tidak menyebutkan fitur ini sama sekali.
Operator Obyek
Salah satu skenario paling umum untuk bekerja dengan formulir adalah menambah / menghapus objek, serta mengeditnya dalam formulir baru. Untuk mengimplementasikan skenario seperti itu, platform memiliki seperangkat operator yang telah ditentukan yang memungkinkan Anda untuk membuat tindakan yang diperlukan dalam satu kata tepat di operator pembuatan formulir:
- BARU - buat objek
- EDIT - mengedit objek
- NEWEDIT - membuat dan mengedit objek
- HAPUS - menghapus objek
Juga, karena sangat sering diperlukan untuk melakukan tindakan ini dalam sesi baru (jika Anda perlu memisahkan tindakan membuat objek dari tindakan pada formulir dari mana objek ini dibuat), platform mendukung gula sintaksis yang sesuai - opsi NEWSESSION dan NESTEDSESSION, yang bekerja mirip dengan operator dengan nama yang sama membuat tindakan, tetapi, seperti operator itu sendiri yang bekerja dengan objek, tidak mengharuskan pengembang untuk membuat dan memberi nama tindakan baru. Sebagai contoh:
Secara default, saat mengedit objek, formulir pengeditan disebut, yang secara otomatis dihasilkan untuk kelas objek formulir yang diteruskan. Namun, sering kali perlu mendefinisikan ulang formulir ini (misalnya, menambahkan informasi tambahan, mengubah desain, dll.) Untuk melakukan ini, cukup membuat formulir pengeditan yang diperlukan dan menunjukkan bahwa itu adalah formulir default untuk mengedit objek dari kelas tertentu:
Demikian juga, formulir untuk memilih objek dari kelas yang diberikan didefinisikan ulang.
Desain bentuk
Seperti kebanyakan GUI yang ada, desain presentasi interaktif formulir adalah hierarki yang simpulnya adalah komponen. Komponen, pada gilirannya, dapat berupa:
- wadah - komponen yang mengandung komponen lain.
- komponen dasar - representasi grafis dari elemen dasar: tabel, panel properti, grup filter, dll.
Mekanisme untuk mengatur komponen di dalam wadah pada dasarnya mengulang
Tata Letak Kotak Fleksibel CSS (dan diterapkan di klien web dengan itu), jadi kami tidak akan memikirkan mekanisme ini dengan sangat rinci.
Perhatikan bahwa desain formulir biasanya tidak dibuat dari awal (karena cukup memakan waktu). Biasanya, desain formulir secara otomatis dibuat berdasarkan pada struktur formulir, dan kemudian pengembang hanya mengubahnya sedikit: misalnya, menambahkan wadah baru dan mentransfer komponen yang ada ke dalamnya:
Contoh desain formulir defaultHirarki wadah dan komponen dalam desain default akan terlihat seperti ini:

Form Design 2.0 (React)
Melihat representasi interaktif dari formulir di tangkapan layar di atas (atau, misalnya, dalam demo online), Anda dapat melihat bahwa desain formulir saat ini di antarmuka pengguna, katakanlah, cukup asketis. Ini, tentu saja, tidak pernah menjadi masalah khusus untuk sistem informasi, di mana pengguna utamanya adalah karyawan atau mitra perusahaan yang memiliki sistem informasi ini. Selain itu, terlepas dari asketisme, mekanisme desain formulir saat ini memungkinkan Anda untuk menerapkan kasus yang sangat sulit, misalnya, POS:
Tetapi jika menyangkut, katakanlah, SaaS B2B atau B2C, apalagi Internet banking, misalnya, maka pertanyaan segera mulai muncul tentang bagaimana membuat desain lebih ergonomis.
Pada tahap saat ini, untuk mengatasi masalah ini,
perpustakaan javascript khusus
telah dikembangkan, tugas utamanya adalah membuat dan memperbarui objek-js khusus yang berisi data formulir. Dengan demikian, objek ini dapat digunakan sebagai keadaan untuk komponen Bereaksi dan dengan demikian membuat desain apa pun dan interaktivitas tambahan dari formulir yang sedang dikembangkan. Sebagai contoh:
Bereaksi formulir contoh (pada kode dan kotak)Atau contoh yang lebih kompleks - dengan daftar turun bawah dan menggunakan API REST (atau lebih tepatnya Stateless) untuk ini:
Bereaksi contoh formulir dengan daftar turun bawah (pada codesandbox)Benar, masalah dengan pendekatan ini adalah bahwa bentuk-bentuk dari contoh di atas tidak akan tertanam baik di antarmuka platform umum atau dalam aliran kontrol tindakan secara umum. Oleh karena itu, salah satu tugas paling cepat dalam pengembangan platform adalah penerjemahan mekanisme desain formulir ke dalam skema yang digunakan dalam desain laporan (presentasi cetak):
- Platform secara otomatis menghasilkan desain reaksi berdasarkan pada struktur formulir seperti pada contoh di atas.
- Jika perlu, pengembang dapat menyimpan dan mengedit sesuai keinginannya. Dengan demikian, maka platform akan menggunakan desain yang diedit ini ketika membuka formulir.
Plus, pendekatan ini akan memungkinkan pembuatan formulir Bereaksi Asli, dan dengan demikian akan memungkinkan pembuatan aplikasi seluler asli. Meskipun masalah ini (dengan aplikasi seluler asli) kami belum bekerja terlalu dalam.
Benar, kami mencatat bahwa mekanisme desain lama juga akan didukung, karena, untuk aplikasi bisnis yang sama, ia menjalankan fungsinya dengan sempurna.
Formulir Acara
Bentuk peristiwa adalah mekanisme kunci kedua setelah peristiwa domain, yang bertanggung jawab untuk menentukan kapan harus melakukan tindakan.
Platform ini memiliki seluruh rangkaian berbagai bentuk acara yang muncul sebagai akibat dari tindakan pengguna tertentu, tetapi dalam artikel ini kami hanya akan mempertimbangkan satu, yang paling sering digunakan di antaranya - acara GANTI. Peristiwa ini terjadi ketika pengguna memprakarsai perubahan properti / panggilan aksi, misalnya, dengan menekan tombol non-sistem pada keyboard, berada di bidang properti yang sedang diubah, atau dengan mengklik bidang ini dengan mouse.
Adapun peristiwa di area subjek, untuk acara dalam bentuk, Anda dapat menentukan pemrosesan - tindakan yang akan dilakukan ketika peristiwa yang ditentukan terjadi. Perhatikan bahwa sebagian besar peristiwa formulir sudah memiliki beberapa pemrosesan default yang di luar kotak mengimplementasikan perilaku yang paling diharapkan oleh pengguna (misalnya, dengan acara PERUBAHAN yang disebutkan di atas, meminta input dari pengguna dan mengubah properti ke nilai yang dimasukkan). Namun, dalam praktiknya, kadang-kadang situasi memang muncul ketika untuk beberapa bentuk acara perlu menentukan beberapa pemrosesan tertentu, misalnya:
, β , ( , , , paste , ). . .
, , , , , , , , INPUT.
, , , , , , . Sebagai contoh:
, , :
, INPUT β . (ASK):
(DIALOG) , , , , .
.
, . , , . , «» . , A B, A B, A A, B (A, B) B, A B ( «» ).
, , :
Sebagai contoh:

, , , , .
LGPL β JasperReports.
, JasperReports , . , :
- «» ( , O1, O2, O3,β¦ On, O2 β O1, O3 β O2 ..) ;
- , .
«» , SUBREPORT ( , -):

:
JasperReports (, lsFusion). , . , JasperSoft Studio.
, lsFusion- IDEA, Eclipse, ( Eclipse JasperReports ). IDEA , language injection, jrxml-, , , , , , . , , Eclipse GrammarKit autocomplete (, ), stub-, lazy chameleon- ( ), , . .
() :
- (XML, JSON) β , () -.
- (DBF, CSV, XLS) β - . parent, «» -.
, (- ), , , ( ). . , .
β XML, JSON. , , JSON ( XML ).
/ JSON , : JSON-, β , β . :
JSON/ , / :
, / :
JSON ::= { JSON , / } JSON , / ::= JSON 1 | JSON 1 | JSON 1 JSON 2 | JSON 2 | JSON 2 ... JSON M | JSON M | JSON M JSON ::= " " : JSON ::= " " : { JSON , / } JSON ::= " " : [ { JSON , / 1 }, { JSON , / 2 }, ... { JSON , / N }, ]
:
{ "s": [ { "date": "21.02.19", "sd": [ { "money": { "item": " 3", "quantity": 1, "price": 5, "index": 1 } } ], "stock": " 2", "customer": " 2" }, { "date": "15.03.19", "sd": [ { "money": { "item": " 1", "quantity": 1, "price": 5, "index": 1 } }, { "money": { "item": " 2", "quantity": 1, "price": 10, "index": 2 } }, { "money": { "item": " 3", "quantity": 1, "price": 15, "index": 3 } }, { "money": { "item": " 4", "quantity": 1, "price": 20, "index": 4 } }, { "money": { "item": "Milk", "quantity": 1, "price": 50, "index": 5 } } ], "stock": " 1", "customer": " 3" }, { "date": "04.03.19", "sd": [ { "money": { "item": " 1", "quantity": 2, "price": 4, "index": 1 } }, { "money": { "item": " 2", "quantity": 3, "price": 4, "index": 2 } }, { "money": { "item": " 1", "quantity": 2, "price": 5, "index": 3 } } ], "stock": " 1", "customer": " 2" }, { "date": "04.03.19", "sd": [ { "money": { "item": " 1", "quantity": 3, "price": 1, "index": 1 } }, { "money": { "item": " 2", "quantity": 2, "price": 1, "index": 2 } } ], "stock": " 1", "customer": " 2" }, { "date": "14.03.19", "sd": [ { "money": { "item": " 2", "quantity": 1, "price": 2, "index": 1 } } ], "stock": " 1", "customer": " 2" }, { "date": "17.04.19", "sd": [ { "money": { "item": " 2", "quantity": 5, "price": 6, "index": 1 } }, { "money": { "item": " 1", "quantity": 2, "price": 6, "index": 2 } } ], "stock": " 1", "customer": " 1" }, { "date": "21.02.19", "sd": [ { "money": { "item": " 3", "quantity": 1, "price": 22, "index": 1 } } ], "stock": " 2", "customer": " 1" }, { "date": "21.02.19", "sd": [ { "money": { "item": " 3", "quantity": 1, "price": 22, "index": 1 } } ], "stock": " 2", "customer": " 1" }, { "date": "20.02.19", "sd": [ { "money": { "item": " 3", "quantity": 1, "price": 22, "index": 1 } } ], "stock": " 2", "customer": " 1" } ] }
, JSON JSON-. , , IDE JSON , β JSON. , ( , , JSON- ), . / JSON .
, :
, , , ( ). , , , / :
, SELECT SQL. , , , ( , ).
, , , β .
, , , :
β ( ) . .
(SHOW, DIALOG)
:
- (WAIT) β , , , , .
- (NOWAIT) β .
.
, :
- (FLOAT) β .
- (DOCKED) β System.forms.
, β .
, , (DIALOG). (, , ), , , .
, , (INPUT), ( ), , , ( ), , , ( ).
(PRINT)
( ) , JasperReports : DOC, DOCX, XLS, XLSX, PDF, HTML, RTF , JasperReports. , , , , ( , ).
, - (PREVIEW), , / . , , .
(EXPORT, IMPORT)
, , , : XML, JSON, DBF, CSV, XLS, XLSX. .
, , , β . () , () , .
β , , Β« Β», :
- .
- ( , , , , , TRUE f(a) = b β f(a) b)
TRUE ( , , 0 , .., , , ).
, , . , , , . . ( ), .
- , ( ). , , ( ). .
. , β .
β , . , , . , , .

.

100x100 . , , . , «» . , ( ). , . , .
. , - , , .
:
- , β , , .
- β forms, log, status, root, toolbar, tree, (, root, , )
, β , , , , , ERP-. , , Β« Β», : ? Benarkah? ? , -, lsFusion language-based ( SQL ABAP), library-based ( Java 1C) / . , , β domain-specific , . -, , , , . : , , , . , , , ( ).
. β , :
, :
- . «» : , , / . , , , , , , .
- . control flow . , β .
- SQL ( ORM). , , , .
Kesimpulan
, , (, , , , tutorial, , , ). , , ( ) «», , lsFusion.
, , β . , . , , Β« . .Β», , ( - ).
. : Β« Β». , . , , lsFusion SQL-. , , , β , - , . , SQL- (
). , . , , ( , ), , , . Β«?Β», Β« ...?Β» Β«?Β».
UPD:
.