Minggu, 24 Februari 2019

Form pada SQLiteBoy

Form merupakan data entry sederhana yang tersedia bila extended feature diaktifkan. Form dapat dibuat dengan sintaks berupa JSON (http://www.json.org). Subform sederhana juga didukung oleh SQLiteBoy.

Form dibangun dengan konsep berupa kolom/field yang terlibat, di mana kolom/field bisa diatur agar harus diisi (required), dapat dibaca saja (readonly), telah terisi nilai tertentu (default), bebas diisi atau user harus memilih (dalam bentuk combo box) dan lainnya.



Apa saja yang tersedia dalam form?
  1. Data entry sederhana
  2. Sintaks JSON sederhana
  3. Field readonly 
  4. Field required
  5. Mendukung nilai yang telah ditentukan (opsi) dari SQL Query atau list Python
  6. Nilai default: panggilan fungsi, nilai statis, atau SQL Query
  7. Constraint: memeriksa sebelum menyimpan, untuk mencegah menyimpan nilai yang tidak valid (dimungkinkan untuk memanggil fungsi sebelum perbandingan)
  8. Pengaturan security yang sederhana
  9. Onsave: menjalankan SQL Query (dan menggunakan hasilnya) sebelum data disimpan. SQL Query bisa sangat kompleks dan melibatkan pemanggilan fungsi bersarang.
  10. Subform: digunakan dalam one to many relationship. Namun, field dalam subform terbatas dibandingkan dengan form.
  11. Pesan hasil custom (berdasarkan hasil query SQL) juga didukung
  12. Statement SQL query tambahan dapat diberikan, dan masing-masing akan dieksekusi secara berurutan, jika Anda perlu melakukan tugas tambahan, setelah data form disimpan. 
  13. insert into table dapat dinonaktifkan dengan mengatur insert key menjadi nilai nol / negatif. Ini berguna jika Anda perlu memperbaharui / menghapus data dalam tabel, menggunakan statement query SQL tambahan. Secara default, menyimpan form / subform akan menyisipkan baris baru ke dalam tabel.
  14. Mendukung python handler, yang akan secara otomatis dipanggil bila disediakan. Python handler memudahkan integrasi dengan sistem eksternal (misalnya: sistem ERP).
  15. Tautan dapat ditambahkan ke form
  16. Extended result message: dimungkinkan untuk melakukan operasi perhitungan pada field form, dan menggunakan hasilnya.

Referensi Kode Form

  • Harus sintaks JSON yang valid (json.org)
  • String (termasuk keys di bawah) harus dikutip ganda (antara " dan ")
  • Tanda koma di akhir dictionary atau list tidak diijinkan. 
  • Setiap key adalah case-sensitive, di mana huruf besar/kecil dibedakan. 
  • Setiap definisi form adalah dict ({}).
  • Keys:
Key
Deskripsi
Tipe
Status
Contoh
data
Data pada form
list dari dictionary
Wajib
Lihat: Keys (data)
security
Security pada form
dictionary
Wajib
Lihat: Keys (security)
title
Judul form
string
Opsional
“Form Saya”
info
Informasi tentang form
string
Opsional
“Informasi Form”
sub
Subform:
Harus terdiri dari 5 anggota: tabel terkait (str); kolom relasi dalam tabel subform ke tabel form (str); list dari [jumlah baris (int), jumlah baris wajib diisi (int)]; list dari list kolom [kolom (str), label (str), reference, default]; informasi subform (str).
list
Opsional
["table2", "a", [5,3], [["b", "Column B", [ ["0",
"NO"], ["1", "YES"] ], "1"], ["c", "Column C",
"select a, b from table1", ""]], "My Subform"]
message
custom result message
         - Tidak bisa digunakan untuk subform
          - Harus terdiri atas 3 anggota (str)
            $result (dalam message) akan digantikan oleh hasil SQL Query yang sebenarnya
           - $<column> akan digantikan dengan nilai input dari pengguna untuk kolom yang dituju
         - $last_insert_rowid akan diganti oleh last_insert_rowid () hasil panggilan fungsi (setelah disisipkan ke tabel utama)
         -  $python_handler akan diganti dengan nilai pengembalian python handler (jika disediakan, nilai defaultnya: -1)
         -  Bisa menggunakan html
list
Opsional
["unknown result", "zero result", "success:
$result"]
result
extended result message:
Kriteria yang dimilki persis dengan message dimana perbedaan result memiliki 2 anggota (str)
list
Opsional
[ "$a + $b = $result", "select $a+$b as result" ]
sql0
Statement SQL Query tambahan, yang akan
dikerjakan sebelum form diproses.
list
Opsional

sql2
Statement SQL Query tambahan, yang akan
dikerjakan setelah form diproses.
list
Opsional
["insert into table3(a, b, c, d, e) values($a, $b,
$c, $d, $e)", "insert into table4(x)
values($last_insert_rowid)"]
insert
mencegah insert baris baru ke dalam tabel saat form / subform disimpan jika nilai nol / negatif diberikan
integer
Opsional

confirm
Pesan konfirmasi
string
Optional

focus
Kolom yang menjadi fokus
string
Opsional

link
Tautan
list dari list 2 anggota [target, label]
Opsional
[[“https://messi.com/”, “messi”]]

  • Keys (Data)
Key
Deskripsi
Tipe
Status
Contoh
table
Nama tabel; hanya mendukung satu tabel, tabel lain akan diabaikan jika sudah ada tabel pertama.
string
Wajib
“tablex”
column
Kolom
string
Wajib
“kol5”
label
Label
string
Opsional
“kolom 5”
required
Data wajib diisi sebelum disimpan (0 = tidak wajib, 1 = wajib).
integer
Opsional
1
readonly
Data hanya untuk dibaca (0= data masih bisa dimodifikasi, 1 = hanya bisa dibaca)
integer
Opsional
0
reference
Nilai yang telah ditentukan sebelumnya.
- str: query SQL; mengembalikan 2 kolom: a dan b; HTML select.

- list: nilai statis; list dari 2 anggota; HTML select.

- int: flag (2: HTML input password)
string, list, atau integer
Opsional
- "select col1 as a, col2 as b from table1"

- [ ["0", "NO"], ["1", "YES"] ]

- 2
default
Nilai bawaan.
- str, int: digunakan sebagaimana mestinya.

- list: pemanggilan fungsi SQL setidaknya 1 anggota; anggota pertama harus berbentuk string/str; nilai kembalian akan digunakan sebagai default.

- list (query SQL); harus terdiri dari anggota berbentuk str; anggota pertama: string kosong; anggota kedua: query SQL yang mengembalikan satu kolom: a.
string, list, atau integer
Opsional
- ["sqliteboy_md5", "hello"]

- ["sqlite_version"]
constraint
Memeriksa sebelum form disimpan.
- Berisikan 4 anggota

[“nama_function”, as_str, “kondisi”, “pesan_error”]

nama_fungsi boleh dikosongkan; as_str harus bernilai 1 (memperlakukan pemanggilan argumen function sebagai string) atau 0; kondisi tidak boleh kosong; kondisi harus berisikan perbandingan boolean; pesan_error boleh dikosongkan;

list
Opsional
- ["", 0, "> 10", "must be larger than 10"];
Memeriksa apakah nilai kolom> 10

- ["sqliteboy_len", 1, "> 10", ""]; |
Memeriksa apakah sqliteboy_len (nilai kolom)> 10
onsave
Menjalankan query SQL sebelum data disimpan
- Query SQL bisa saja sangat kompleks dan bercabang

- Query SQL harus mengembalikan satu kolom: onsave

- Pengutipan dilakukan secara otomatis

- $value akan digantikan dengan input dari pengguna

- Nilai yang dikembalikan akan disimpan ke dalam tabel (bukan nilai yang diinput pengguna)
string
Opsional
 "select $value || ' : ' || sqliteboy_upper(sqliteboy_md5($value)) as onsave"

  • Key (Security)
Key
Deskripsi
Tipe
Status
Contoh
run
Untuk mengeksekusi form; pengguna berstatus admin selalu dapat mengeksekusi form.
“”: semua pengguna bisa mengeksekusi form.

list: hanya pengguna yang terdaftar di list saja yang dapat mengeksekusi form.
“” atau list
Wajib
- []

- ["pengguna2", "pengguna3"]
Catatan:
- jika Anda menggunakan primary key pada suatu kolom, kolom yang bersangkutan akan diberi tanda *.
- gunakan function sqliteboy_as_integer  pada constraint untuk konversi atau perbandingan integer.

Contoh Form

1. {
      "title" : "Form Saya",
      "info"  : "Informasi Form",
      "data"  : [
                  {
                    "table"     : "tabel2",
                    "column"    : "x"
                  },
                  {
                    "table"     : "tabel2",
                    "column"    : "y"
                  },
                  {
                    "table"     : "tabel2",
                    "column"    : "z"
                  }
                ],
      "security" : {
                     "run" : ""
                   }
    }

2. {
      "title" : "Form Saya",
      "info"  : "Informasi Form",
      "sub"   : [
                  "table2",
                  "a",
                  [5,3],
                  [
                    ["b", "Column B", [ ["0", "NO"], ["1", "YES"] ], "1"],
                    ["c", "Column C", "select a, b from table1", ""]
                  ],
                  "Subform Saya"
                ],
      "sql2"  : [
                  "insert into table3(a, b, c, d, e) values($a, $b, $c, $d, $e)",
                  "insert into table4(x) values($last_insert_rowid)"
                ],
      "data"  : [
                  {
                    "table"     : "table1",
                    "column"    : "a",
                    "label"     : "column a",
                    "required"  : 1,
                    "reference" : [ ["0", "NO"], ["1", "YES"] ],
                    "default"   : "1"
                  },
                  {
                    "table"     : "table1",
                    "column"    : "b",
                    "reference" : "select sqliteboy_randrange(1, 100000000000) as a, 'hello ' || sqliteboy_time() as b from _sqliteboy_"
                  },
                  {
                    "table"     : "table1",
                    "column"    : "c",
                    "default"   : ["sqliteboy_md5", "hello"],
                    "constraint": ["sqliteboy_len", 1, "= 32", ""],
                    "onsave"    : "select sqliteboy_upper($value) as onsave"
                  },
                  {
                    "table"     : "table1",
                    "column"    : "d",
                    "label"     : "d (incorrect larger than 100)",
                    "required"  : 1,
                    "constraint": ["", 0, "> 100", "must be larger than 100"]
                  },
                  {
                    "table"     : "table1",
                    "column"    : "e",
                    "label"     : "e (correct larger than 100)",
                    "required"  : 1,
                    "constraint": ["sqliteboy_as_integer", 1, "> 100", "must be larger than 100"]
                  },
                  {
                    "table"     : "table1",
                    "column"    : "f"
                  }
                ],
      "focus" : "d",
      "link" : [["https://www.fcbarcelona.com/","fcb"]],
      "message"  : ["hasil tidak diketahui", "kosong", "success: $result"],
      "security" : {
                     "run" : ""
                   }
    }

3. {
          "title" : "Perkalian",
          "data"  : [
                      {
                        "table"     : "tabel2",
                        "column"    : "v"
                      },
                      {
                        "table"     : "tabel2",
                        "column"    : "w"
                      }
                    ],
          "insert" : 0,
          "result" : ["$v + $w = $result", "select $v+$w as result"],
          "security" : {
                         "run" : ""
                       }
    }

Selamat mencoba :).

Tidak ada komentar:

Posting Komentar