Anda di halaman 1dari 43

UNIQUEID()

Unik - tidak ada yang sama dalam satu kelompok data


Expression UNIQUEID() akan memberikan 8 digit kombinasi angka dan
huruf (dalam text type) yang dijadikan sebagai identifier atau key dari
setiap baris dalam suatu kelompok data (tabel). Secara statistic, 8
kombinasi tersebut memiliki kemungkinan duplikat yang sangat kecil.
UNIQUEID("UUID")

Penggunaan "UUID" (Universally Unique Identifier) dalam expression


UNIQUEID() akan memberikan kelompok kombinasi dari 4 UNIQUEID()
yang sesuai dengan penggunaan yang lebih memberikan kemungkinan
duplikat yang hampir mendekati 0. UUID ini juga di panggil dengan
GUID (Globally Unique Identifier) yang digunakan di banyak software lain,
seperti dalam 3D design (Smartplant ataupun PDMS).
Expression UNIQUEID() akan secara otomatis di berikan oleh Appsheet
sebagai bantuan apabila secara design, nama column mengindikasikan
hal tersebut. Seperti penggunaan nama column MuridID atau ReportID
akan secara otomatis di berikan UNIQUEID() di initial value.
Biasanya, diawal penggunaan Appsheet akan sedikit bingung dengan
UNIQUEID() dan label, tapi seiring berjalan waktu, maka kita akan terbiasa
dengan itu.
Penggunaan KEY atau identifier dari setiap baris data bisa saja
menggunakan sesuatu yang lain, tergantung dengan tabel yang kita buat.
Misalnya tabel user, maka bisa kita gunakan email sebagai KEY. Kadang,
kita menginginkan suatu unique identifier yang berbeda, contohnya
adalah nomor surat ataupun nomor PO, maka kita harus memperhatikan
beberapa kondisi yang memungkinkan pengguna dari aplikasi dapat
memasukkan data pada saat yang bersamaan dan menghasilkan text
yang sama. Beberapa kombinasi itu seperti misalnya:
CONCATENATE( RIGHT(("000000" & ([_RowNumber] - 1)), 7), "-", UNIQUEID() )
(MID(“abcdefghijklmnopqrstuvwxyz”, RANDBETWEEN(1, 26), 1) & UNIQUEID())
CONCATENATE(UNIQUEID(),"-",UNIQUEID(),"-",UNIQUEID(),"-",UNIQUEID(),"-",UNIQUEID())
CONCATENATE(TODAY(), " ", UNIQUEID())

atau seperti ini:


PO sequence numbering
Padasaat sudah lebih advance, kita bisa menggunakan system numbering
seperti system booking ID yang akan mengontrol ID yang akan diberikan
untuk digunakan. Ini seperti request document number untuk engineering
document, atau request PR number untuk penggunaan di SAP, ataupun
PO seperti contoh diatas lainnya. Dan bisa di kombinasikan dengan
submission + Approval system agar memastikan bahwa text yang
digunakan sebagai Key adalah unique - tidak ada lagi yang sama.
Bayangkan apabila kita memiliki PO number yang sama untuk vendor
yang berbeda, misalnya. Maka akan sulit untuk dapat menelusuri data
terkait dengan PO number tersebut, seperti misalnya data invoice, data
pengiriman barang, data pembayaran, dan lain sebagainya yang
seharusnya dapat di hubungkan dengan PO number yang merupakan
KEY.
Terkait dengan Key, Silahkan juga di lihat kembali Latihan Appsheet
sebelumnya.
USEREMAIL()
Mengambil alamat email
USEREMAIL() akan memberikan alamat email dari user yang melakukan
login (untuk aplikasi dengan kebutuhan login). Hart Exinity membangun
corporate sistem, sehingga hampir seluruhnya membutuhkan login untuk
aplikasi yang di develop dan menjadikan USEREMAIL() sebagai expression
yang selalu di temui di setiap aplikasi yang di buat. Expression yang
menggunakan USEREMAIL() bisa digunakan di mana saja, seperti
penggunaan di contoh berikut:
Initial value: Untuk mengambil email address dari user dan input di database tabel.
Editable-If: Hanya dapat di edit oleh user yang melakukan entry data ataupun orang lain yang di tentukan
Show-If: Menunjukkan suatu column apabila user memiliki alamat email yang kita tentukan atau memiliki role yang di set.
App Formula: menghitung jumlah jam kerja dari user dan membandingkan dengan user lain, track siapa yang melakukan edit terhadap row.
Security filter: agar data yang di download HANYA data milik user itu saja, bukan user lain.
Slice: menampilkan data sesuai dengan user masing-masing, seperti outstanding action, open action item, dan lain-lain.
Key: sebagai key untuk user tabel atapun customer tabel.
Action valid-if: untuk show-hide action berdasarkan email user
Virtual column: sebagai filtering data, pengelompokan data berdasarkan email pengguna.

Berikut adalah beberapa contoh penggunaan USEREMAIL() dalam


expression:
COUNT(
SELECT(
History[Rencana Hari ini],
[UserEmail] = [_THISROW].[UserEmail], TRUE)
)

// Untuk menghitung jumlah rencana hari ini di tabel history sesuai


dengan USEREMAIL
IN(USEREMAIL(), TableName[Emails])

// Akan menghasilkan TRUE atau FALSE, dimana menjadi TRUE kalau


USEREMAIL() ada di dalam column Emails di tabel yang di inginkan.
IN(USEREMAIL(), SELECT(Users[Email], ("Admin" = [Role])))

//Bisa digunakan sebagai slice untuk menunjukkan row dimana


USEREMAIL() merupakan Admin di column Role.
FILTER(
"Issues",
AND(
([Status] = "Open"),
([Assigned to] = USEREMAIL())
)
)

//Untuk melakukan filter dan menunjukkan issue tabel yang masih open
dan di assign kepada saya.
OR(
AND((TIMENOW() >= "9:00 AM"), (TIMENOW() < "5:00 PM")),
IN(WEEKDAY(TODAY()), {"Saturday", "Sunday"}),
IN(
USEREMAIL(),
SELECT(Users[Email], [Special Access?], TRUE)
)
)

//Untuk memberikan access kepada user di jam dan hari tertentu.


TOTALHOURS(
SUM(
SELECT(
Timesheets[Hours],
AND(
([Employee] = USEREMAIL()),
([Date Worked] > (TODAY() - WEEKDAY(TODAY()))),
([Date Worked] <= (TODAY() - WEEKDAY(TODAY())) + 7)
)
)
)
)

//Untuk menjumlahkan total jam kerja di minggu ini.


LOOKUP(
USEREMAIL(),
"Employee",
"email",
"manager name"
)

//memberikan nama manager untuk user yang sedang login.


Penggunaan USEREMAIL() bisa untuk column dengan type email ataupun
text.
TODAY()
Time is Today()
Expression TODAY() memberikan tanggal hari ini sesuai dengan device
yang di gunakan oleh user. Sering digunakan sebagai intial value untuk
column dengan tipe DATE untuk memudahkan user melakukan input
data. Kadang kita menggunakan TODAY() untuk melakukan slice terhadap
tabel agar bisa melakukan filter sehingga kita akan batasi view sesuai
dengan hari ini saja, ataupun kita melakukan perhitungan dengan
menggunakan virtual column dengan expression TODAY() sebagai salah
satu faktornya. Beberapa contoh penerapan expression TODAY() antara
lain:
(TODAY() - 1)

//Akan memberikan tanggal kemarin.


(TODAY() + 1)

//Memberikan tanggal esok hari.


(TODAY() + 7)

//Memberikan tanggal minggu depan.


(TODAY() - WEEKDAY(TODAY()))

//Memberikan tanggal di hari Sabtu minggu lalu.


(TODAY() - WEEKDAY(TODAY()) + 4)

//Memberikan tanggal hari Rabu di minggu ini.


HOUR(TODAY() - [TargetDate]) / 24

// Memberikan jumlah hari antara hari ini dengan target date.


(TODAY() = DATE([Data]))

//Memberikan seluruh data dimana tanggal di column data sama dengan


tanggal hari ini.
SWITCH(WEEKDAY(EOMONTH(TODAY(),-1)+1),
1,IFS(DAY(EOMONTH(TODAY(),0))>28,DAY(EOMONTH(TODAY(),0))-29),
5,IFS(DAY(EOMONTH(TODAY(),0))<31,DAY(EOMONTH(TODAY(),0))-28),
6,IFS(DAY(EOMONTH(TODAY(),0))>28,1),
7,IFS(DAY(EOMONTH(TODAY(),0))>30,1), DAY(EOMONTH(TODAY(),0))-28
)

//Memberikan jumlah hari kerja dalam satu bulan kecuali hari sabtu dan
minggu.
[Date Completed]>=TODAY()-2

//memberikan tanggal penyelesaian yang lebih besar dari 2 hari dari hari
ini.
Untuk semua expression disini, kita juga bisa dengan mudah mencarinya
di https://www.appsheet.com/Support.
Contoh berikut adalah apabila kita mencari kata TODAY, maka akan
diberikan artikel dan juga contoh aplikasi yang terkait dengan expression
TODAY itu. Contoh aplikasi bisa kita copy dan di pelajari untuk di
terapkan fungsinya kedalam aplikasi yang kita buat.
Search artikel dan Contoh Aplikasi
Penerapan TODAY() akan banyak di temui untuk beragam aplikasi yang
dibuat dengan appsheet. Bisa juga kita batasi data dengan menggunakan
security filter dimana dibatasi data yang terdownload ke user device
hanyalah data yang hari ini saja untuk mempercepat proses sync,
mempercepat aplikasi dalam mengolah data dan memberikan fokus
kepada apa yang harus dilakukan dalam waktu dekat saja.
.NOW()
Expression NOW() akan memberikan tanggal dan waktu (jam, menit,
detik) saat ini (sekarang) untuk DATETIME column yang sesuai dengan
device yang di gunakan oleh pengguna aplikasi. Kadang kita
menginginkan waktu yang tepat selain dari pada tanggal, maka kita bisa
memilih DATETIME column dan gunakan NOW() sebagai intial value
timestamp nya. Tergantung dimana kita akan gunakan expression NOW()
tersebut, tapi beberapa contoh adalah sebagai berikut:
AND(MONTH([DATE])=MONTH(NOW()), YEAR([DATE])=YEAR(NOW()))

//Menunjukkan rows bulan ini.


EOWEEK(NOW())

//Sama seperti menanyakan hari sabtu minggu ini tanggal berapa?


DATE(NOW())

//Memberikan tanggal hari ini, seperti TODAY()


DATETIME(NOW())

//Tanggal dan jam sekarang

Penggunaan NOW() yang lebih complex


NOW() juga bisa di gunakan sebagai trigger untuk suatu action atau bot
beroperasi. Atau di gunakan sebagai app formula untuk selalu
memberikan kondisi terakhir kapan row tersebut di update.
TIMENOW()
TIMENOW() sebenarnya sama seperti NOW(), tapi memberikan nilai jam
sesuai dengan device yang di gunakan oleh user. Apabila kita hanya ingin
mengetahui jam pasti kapan clock-in atau out misalnya, maka kita bisa
gunakan TIMENOW() ini.
TIMENOW() + 1
// menambah 1 jam dari sekarang
TIMENOW() + "003:03:00"
// tambah 3 jam 3 menit dari sekarang
TIMENOW() - "003:03:00"
// 3 jam 3 menit yang lalu
(TIMENOW() - 1)
//satu jam yang lalu
(TIMENOW() + 1)
//1 jam lagi
(TIMENOW() + 24)
//besok di jam yang sama.
Agar di perhatikan penggunaan TIMENOW() untuk permanent column
ataupun virtual column.
UTCNOW()
Apabila kita mulai share aplikasi ke rekan kerja atau orang lain, akan mulai
terlihat kebutuhan adanya suatu pengukuran waktu yang absolute yang
tidak tergantung kepada device user. Kadang ada user yang jam di device
nya tidak cocok karena di setting manual. UTCNOW() bisa digunakan
untuk mengatasi hal seperti ini. Untuk menambahkan sesuai dengan
waktu di Jakarta, misalnya, maka kita bisa lakukan +7 untuk
menambahkan 7 jam dari waktu UTCNOW() tersebut, akan tetapi, aplikasi
harus online karena UTCNOW() memberikan nilai waktu UTC di server
appsheet berdasarkan waktu local user.
Silahkan di coba dan di test mana yang lebih cocok untuk kita gunakan di
aplikasi kita.
(NOW() - UTCNOW())
//Akan memberikan durasi beda waktu antara user timezone dengan UTC.
[TIMESTAMP] + (TIME(RIGHT("0"&((FLOOR(TOTALMINUTES([TIMESTAMP] - UTCNOW()) +
USERTZOFFSET())/60)*-1),2)&":00:00") - "00:00:00")
ISBLANK()
ISBLANK() merupakan expression yang akan memberikan confirmasi
apakah column/table/rows/list memiliki value. Tidak seperti beberapa
expression lainnya, ISBLANK() tidak tergantung kepada type column.
Kami sering gunakan ISBLANK() untuk hampir semua logika aplikasi
(Show_IF, Editable_IF, Required_IF ataupun lainnya).
Dengan menggunakan ISBLANK() kita bisa melakukan pengecekan
apakah hasil dari expression akan memberikan hasil yang kita inginkan,
ataupun kita bisa gunakan ISBLANK() untuk memastikan suatu column
yang bukan key tidak memiliki duplicate value:
ISBLANK( FILTER( “NamaTabel”, AND( ISNOTBLANK([imei]),([imei] =
[_THISROW].[imei]) ) ) -LIST([_THISROW]) )
Bisa juga ISBLANK() digunakan sebagai Valid-if statement:
ISBLANK( FILTER( "CalendarTable" AND( ([_THISROW].[Date] = [Date]),
([_THISROW].[Time] = [Time]) ) ) - LIST([_THISROW]) )
ISNOTBLANK()
Kebalikan dari ISBLANK() adalah ISNOTBLANK() atau NOT(ISBLANK()),
dimana sering kita memiliki logika aplikasi untuk memunculkan column
apabila suatu column lain telah terisi. Contoh yang sederahana adalah
apabila kita menginginkan suatu column hanya di tunjukkan kepada user
apabila column yang lain memiliki value, misalnya untuk end-date dimana
kita hanya menunjukkan column tersebut setelah column start-date di isi
oleh user. Contoh:
ISNOTBLANK([Start-Date])

Tergantung bagaimana kita mempunyai cara kerja dan logika aplikasi apa
yang akan kita terapkan, dan sering kali ISNOTBLANK() digunakan untuk
melakukan filter awal agar jumlah data yang di analisa menjadi lebih
sedikit sehingga aplikasi menjadi lebih cepat di running, seperti:
ISNOTBLANK( FILTER( "Tool List", ([Quantity At Storage) > 0) ) )

atau gunakan untuk sesuatu logika yang lebih complex seperti:

kombinasi ISBLANK() dan ISNOTBLANK() dalam expression


Dengan memberikan ISNOTBLANK() untuk SELECT() expression seperti:
COUNT(
SELECT(
Orders[_ROWNUMBER],
AND(
ISNOTBLANK([SpecialInstructions]),
([DateDone] >= [_THISROW].[BeginDate]),
([DateDone] < [_THISROW].[EndDate]))
)
)

akan mengurangi beban pencarian data karena kita sudah limit pencarian
di tabel tersebut dengan ISNOTBLANK().
(AND()
Beberapa contoh expression diatas sudah memberikan expression AND() ini, yang kita gunakan apabila kita
menginginkan agar SELURUH item memberikan hasil TRUE. Baiknya kita gunakan bahasa yang sederhana untuk
memahami expression yang akan kita buat, misalnya kita ingin agar Appsheet memberikan daftar dari semua item di
suatu tabel dimana column special instruction itu ada value nya DAN tanggal selesai lebih besar dari pada tanggal
mulai yang kita mau DAN JUGA tanggal selesai lebih kecil dari pada tanggal selesai yang kita specify. Ini adalah cara
membaca expression diatas. Beberapa contoh penggunaan AND():
AND(FALSE, FALSE)
// FALSE
AND(FALSE, TRUE)
// FALSE
AND(TRUE, FALSE)
// FALSE
AND(TRUE, TRUE)
// TRUE
AND(
ISNOTBLANK([Grade]),
([Grade] = "A")
)
// TRUE apabila grade column memiliki value "A" dan tidak kosong.
AND(
([Name] = "Acme"),
([Rating] > 3),
[Preferred?]
)
// TRUE kalau rating>3 dan namanya adalah Acme dan column preferred itu yes.
AND(
(LEN([_THIS]) > 3),
CONTAINS([_THIS], "@")
)
// TRUE kalau column memiliki 3 huruf atau lebih, dan mengandung simbil @
AND(
IN(
[Sales Contact],
LIST(USEREMAIL(), "")
),//2
NOT(
[DO NOT CALL]
),//4
([Last Contact] < (TODAY() - 30))//3
)//1
//Validasi row tidak overalap:
AND(
([End] > [Start]),
(COUNT(
FILTER(
"MyTable",
OR(
AND(
([Start] >= [_THISROW].[Start]),
([Start] <= [_THISROW].[End])
),
AND(
([End] >= [_THISROW].[Start]),
([End] <= [_THISROW].[End])
)
AND(
([Start] < [_THISROW].[Start]),
([End] > [_THISROW].[End])
)
)
)
) = 0)
)

AND([Color]="Green",[CompleteDate]>TODAY())
// Mencari warna hijau dengan completion date yang belum terlampaui.
IFS(
AND(
[_THISROW_BEFORE].[status_code]<>"Completed",
[status_code]="Completed"
), NOW(),
AND(
[_THISROW_BEFORE].[status_code]="Completed",
[status_code]<>"Completed"
), "",
AND(
[_THISROW_BEFORE].[status_code]="Completed",
[status_code]="Completed" ),
[_THISROW_BEFORE].[act_end_date])
//Contoh penggunaan AND() untuk memberikan value blank("") ataupun
NOW()
OR()
OR() apabila digunakan untuk menjawab BENAR atau SALAH (TRUE /
FALSE ) dalam suatu expression, akan memberikan hasil apabila ada salah
satu pilihan yang memberikan nilai TRUE. Bisa dengan bahasa sehari-hari
kita bayangkan suatu kalimat pilihan seperti apakah ada pilihan berikut ini
yang benar? Kalau ada, maka tampilkan pilihan tersebut. Beberapa
penggunaan seperti:
OR(FALSE, FALSE)
// FALSE
OR(FALSE, TRUE)
// TRUE
OR(TRUE, FALSE)
// TRUE
OR(TRUE, TRUE)
// TRUE
OR(([_THIS] < -2), ([_THIS] > 2))
// TRUE apabila column value berada di luar range -2 ke 2.
OR(([Color] = "Red"), ([Color] = "Yellow"), ([Color] = "Green"))
// TRUE kalau column value itu ada yang berwarna salah satu dari Red,
Yellow, or Green.
OR() seperti diatas sama saja dengan:
IN([Color], {"Red" "Yellow", "Green"})
//Untuk memberikan access (misalnya di Show-if):
OR(
AND((TIMENOW() >= "9:00 AM"), (TIMENOW() < "5:00 PM")),
IN(WEEKDAY(TODAY()), {"Saturday", "Sunday"}),
IN(
USEREMAIL(),
SELECT(Users[Email], [Special Access?], TRUE)
)
)
Atau memberikan pilhan berdasarkan column:
OR(CONTAINS([Fruit],"Oranges"),CONTAINS([Fruit],"Apples"),CONTAINS([Fruit],"Ban
anas"))
NOT()
Kadang kita ingin agar analisa data itu berdasarkan suatu yang TIDAK
atau BUKAN kebernaran. Seperti misalnya BUKAN hari sabtu, atau BUKAN
hari libur ataupun BELUM selesai.
Maka bisa digunakan NOT() expression seperti beberapa contoh berikut
ini:
NOT(TRUE)

// FALSE
NOT(FALSE)

// TRUE
NOT(ISBLANK([Detail]))

// TRUE if the Detail column value is not blank.


Yang juga sama seperti:
ISNOTBLANK([Detail])
NOT(WEEKDAY(TODAY()) = "Sunday")

// TRUE apabila hari ini bukan hari Minggu.


Bisa juga di tuliskan dengan:
WEEKDAY(TODAY()) <> "Sunday"
NOT(IN([Color]), {"Orange", "Red"})

// TRUE if the Color column value is not Orange or Red.


Bisa juga menjadi:
AND(([Color] <> "Orange"), ([Color] <> "Red"))

Sampai disini, kita mulai melihat bahwa beberapa expression bisa


dituliskan berbeda-beda, malah bisa menggunakan expression lainnya
tapi akan memberikan hasil yang sama. Ini akan sangat bergantung
kepada pemahaman tentang logika aplikasi yang sedang dibuat oleh
seorang App Creator. Dengan pengenalan tersebut, maka setiap aplikasi
bisa dibuat dengan cara apa saja (banyak caranya) akan tetapi cara yang
dipilih seharusnya memberikan hasil yang cepat, akurat dan mudah
digunakan oleh user.
CONCATENATE()
CONCATENATE() merupakan TEXT atupun LONGTEXT yang kita gabung
untuk memberikan informasi yang lebih kepada pengguna aplikasi.
Contoh sederhana seperti menggabungkan Tag Number dengan
Description dari item, atau menggabungkannama depan dengan nama
belakang, ataupun untuk memastikan bahwa satu orang tidak boleh
memilih item yang sama lebih dari satu kali, ataupun kita berusaha
memberikan informasi yang singkat tapi jelas terkait dengan activity dan
progress nya.
CONCATENATE("Good", "morning", "!")
CONCATENATE("Good", " ", "morning", "!")
CONCATENATE("Good morning, ", [First Name], "!")
CONCATENATE([Last Name], ", ", [First Name])
CONCATENATE("Today is ", MONTH("4/1/2010"), "/", DAY("4/1/2010"), ".") : Today is 4/1.
CONCATENATE(
"Today is ",
INDEX(
{"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"},
WEEKDAY("4/1/2010")
),
"."
)
IF()
Pilihan
Sama seperti excel atau google sheet, IF(statement, True option, False
Option), begitulah cara penulisannya dan bisa di buat multiple IF
statement. Apabila kita mengerti IF di excel, maka akan lebih mudah
memahaminya. Beberapa contoh penulisan expression IF() seperti:
IF(TRUE, "Yes!", "No!")

// Yes!
IF(FALSE, "Yes!", "No!") // No!
IF((1 > 0), "Yes!", "No!") // Yes!
IF((1 < 0), "Yes!", "No!") // No!
IF(
ISBLANK(""),"Yes!",
"No!"
)
// Yes!
IF(
NOT(ISBLANK("")),"Yes!",
"No!"
)
// No!
// Equivalent to
IF(
ISNOTBLANK(""),"Yes!",
"No!"
)
IF(
([Count] < 0), 0,
[Count]
)
// Returns 0 kalau value count lebih kecil dari 0 dan kalau tidak value itu sendiri yang akan di berikan.
// Equivalent to:
MIN(
LIST(0, [Count])
)
IF(
([Date] = TODAY()), TRUE,
FALSE
)
// Returns TRUE kalau DATE value adalah hari ini, selain itu FALSE.
// Equivalent to:
([Date] = TODAY())
IF(([Status] = "Open"), "Green",
IF(([Status] = "Closed"), "Red",
IF(([Status] = "Not Started"), "Blue",
"Purple")
)
)

//Returns "Green" kalau status OPEN, RED kalau status closed, atau blue
kalau status belum dimulai, selain itu Purple.

//USERSETTINGS IF:
IF(
USERSETTINGS("Names in uppercase?"), UPPER([Name]),
[Name]
)

// Returns NAME column sebagai Huruf besar kalau user setting true.
IF(
ISNOTBLANK([Phone Number]), [Phone Number],
"(no phone)"
)
IF(
ISNOTBLANK([Customer].[Discount Rate]),
([Price] * [Customer].[Discount Rate]),
[Price]
)

//Leap Year?
IF(
(MONTH(
DATE(
"2/28/"
& YEAR(
TODAY()
)
)
+ 1
)
= 2
),
"leap year",
"not leap year"
)

// Weekday or Weekend?
IF(
IN(
WEEKDAY(TODAY()),
LIST(1, 7)
),
"It's the weekend!",
"It's a weekday."
)
IFS()
IFS() merupakan salah satu logic expression yang hampir selalu ada
apabila Hart Exinity membuat aplikasi. IFS() akan mengecek kondisi yang
diberikan secara urutan dari atas kebawah dan akan berhenti mengecek
apabila ditemui kondisi yang menghasilkan TRUE. Jadi, kita harus
mengurutkan kondisi-kondisi sedemikian rupa sehingga kondisi yang
paling tidak bawah adalah kondisi yang terakhir. Contoh untuk
menentukan kondisi SUBMITTED, REVIEWED, atau APPROVED.
Beberapa contoh penulisan IFS() adalah:
IFS(TRUE, "Yes!") // Yes!
IFS(FALSE, "Yes!") // blank (no value)
IFS(FALSE, "Yes!", TRUE, "No!") // No! (equivalent to
IF(FALSE, "Yes!", "No!")
//Contoh penulisan untuk pemilihan nomor telphone:
IFS(
ISNOTBLANK([Mobile Phone]), [Mobile Phone],
ISNOTBLANK([Work Phone]), [Work Phone],
ISNOTBLANK([Home Phone]), [Home Phone]
)
//Equivalent to:
ANY(
LIST(
[Mobile Phone]
[Work Phone],
[Home Phone]
)
- LIST("")
)
//Summarize Delivery
IFS(
ISBLANK([Due Date]),
"Unscheduled",
(TODAY() > [Due Date]),
"Overdue!",
(TODAY() = [Due Date]),
"Due today",
(TODAY() = ([Due Date] - 1)),
"Due tomorrow",
TRUE,
(([Due Date] - TODAY()) & " days remain")
)
//Convert a weekday number to a name.
IFS(
(WEEKDAY(TODAY()) = 1), "Sunday",
(WEEKDAY(TODAY()) = 2), "Monday",
(WEEKDAY(TODAY()) = 3), "Tuesday",
(WEEKDAY(TODAY()) = 4), "Wednesday",
(WEEKDAY(TODAY()) = 5), "Thursday",
(WEEKDAY(TODAY()) = 6), "Friday",
TRUE, "Saturday",
)
//Functionally equivalent to but less efficient than:
SWITCH(
WEEKDAY(TODAY()),
1, "Sunday",
2, "Monday",
3, "Tuesday",
4, "Wednesday",
5, "Thursday",
6, "Friday",
"Saturday",
)
***************
Contoh secara logika kita menginginkan:
If Speed > 70 then = Speed - 30
If Speed is lower than 70 but higher than 30 then = Speed -15
If Speed lower than 30 then = Speed, maka penulisannya menjadi:
IF(
[Speed] > 70 , [Speed] - 30,
IF(
[Speed] < 30 , [Speed] ,
[Speed] - 15
)
)
//OR:
IFS(
([Speed] > 70),
([Speed] - 30),
([Speed] > 30),
([Speed] - 15),
TRUE,
[Speed]
)
SWITCH()
SWICH() merupakan bentuk lain dari logika expression dengan
menganalisa semua kemungkinan dan memberikan default value kalau
tidak ada yang memberikan nilai TRUE. Contoh penulisan expression
seperti:
SWITCH(
WEEKDAY(TODAY()),
1, "Sunday",
2, "Monday",
3, "Tuesday",
4, "Wednesday",
5, "Thursday",
6, "Friday",
"Saturday",
)

SWITCH() expression yang lebih complex.


HERE()
HERE() akan memberikan LATLONG position sesuai dengan device user
apabila GPS di hidupkan. Apabila GPS dimatikan, maka akan muncul nilai
0000,0000. Beberapa penulisan HERE() untuk initial value tinggal di
tuliskan HERE(), contoh lainnya adalah:
DISTANCE([HERE(), [LatLong_Column]) <= 1

//Sample:
DISTANCE(HERE(), LATLONG(13.993581, -40.555116))

// Apabila digabung dengan CONTECT():


OR(
CONTEXT(“Host”) <> “Browser”, //1)
IF(
IN(
USEREMAIL(),
LIST(“Email1”, “Email2”)
), true,
DISTANCE(
HERE(), LatLong(“41.945583”, “-43.812112”)
) <= 1
) //2)
)

Atau menggunakan DISTANCE untuk membatasi action user berdasarkan


jarak dengan suatu koordinate yang di tentukan:
DISTANCE (LATLONG (20.700896, -103.364275) , HERE ()) <.2
CONTEX()
CONTEXT() dapat di analogikan sebagai suatu expression yang akan
memberikan indikasi tentang penggunaan aplikasi. Seperti user saat ini
berada di view apa? dan kalau user sedang mengisi form maka
sembunyikan beberapa column berikut atau sebaliknya, munculkan
column hanyaapabila user berada di form view.
Untuk hide column di semua view kecuali form, maka gunakan expression berikut di Show_If :
CONTEXT("ViewType") = "form"
Sebaliknya, untuk di hide:
CONTEXT("ViewType") <> "form"
Untuk di tunjukkan hanya di form view dan detail view:
IN(CONTEXT("View"), LIST("MyTable_Form", "MyTable_Detail"))

Beberapa contoh lain:


IN(CONTEXT("View"), LIST("Orders_Detail", "Orders_Form"))
("Form" = CONTEXT("ViewType"))
SWITCH(CONTEXT("Host"), "Device", "Tap below to:", "Browser", "Click below to:", "")

Untuk menggunakan CONTEXT() sebagai identifikasi user device, bisa


gunakan ini di intial value:
CONTEXT("Device")
LINKTOVIEW()
LINKTOVIEW() merupakan action type expression yang di gunakan untuk
membawa user ke view yang kita inginkan apabila user melakukan click
untuk action tersebut.
Contoh:
LINKTOVIEW("My Open Action")
LINKTOVIEW(IF([Choice] = "Veggie View", "Vegetables", "Fruits"))

LINKTOFORM()
LINKTOFORM() akan membawa user kapada form yang di inginkan dan
mengisikan dengan beberapa data yang kita specify.
LINKTOFORM("Table2 Form", "Name2", [Name1], "Color2", [Color1])

LINKTOFILTEREDVIEW()
Apabila kita ingin membawa user kepada suatu view berdasarkan kepada
suatu filter criteria, maka gunakan LINKTOFILTEREDVIEW():
LINKTOFILTEREDVIEW("Some Table View", [Date Column] = TODAY())
LINKTOFILTEREDVIEW(“Order View”, [Order Status] = Open)

LINKTOFILTEREDVIEW(
"Table A",
(
COUNT([meso] - LIST())
<> COUNT([meso] - [_THISROW].[meso])
)
)
/*

LINKTOFILTEREDVIEW(“Customers Table View”,


AND([Sales Rep] = [_THISROW].[Sales Rep Id], [Priority] = High))

LINKTOFILTEREDVIEW(“Students Table View”, [Age] < [_THISROW].[Age])

LINKTOFILTEREDVIEW("Inventory list_Detail", [Description] = [_THISROW].[Scanner])

LINKTOFILTEREDVIEW(“AllProperties_Results”,
IN([Neighborhood_name], [_THISROW].[Neighborhood_name]))

LINKTOFILTEREDVIEW("Inventory",
IN([Product Code], LIST(“100001”,“100002”, "100003")))
CONCATENATE(
LINKTOFILTEREDVIEW(
"Inventory",
IN([Product Code], LIST(“100001”,“100002”))
),
"&quickedit=true"
)

LINKTOFILTEREDVIEW(“Student Names”, [Program Name]=[_THISROW].[Program Name])

LINKTOFILTEREDVIEW("Items", AND([Color] = [_THISROW].[Color], [Size] = [_THISROW].[Size]))


[_THIS]
Expression [_THIS] bisa diartikan sebagai cell ini. kita bisa gabungkan
[_THIS] dengan ISBLANK() menjadi ISBLANK{[_THIS]) untuk melakukan
analisa apabila cell tersebut blank atau tidak.
Dimulai di sini, akan semakin sulit untuk mencerana dan yang dibutuhkan
hanyalah latihan -latihan dan latihan. 10 expression berikutnya lebih
merupakan suatu cara bagi app kreator untuk memberikan kepada user
apa yang seharusnya user lihat/butuhkan. Apabila kita tidak mengetahui
keinginan user, maka biasanya di lakukan sambil data di kumpulkan dan
mulai di susun setelah itu. Akan lebih baik apabila sudah paham
mengenai bahasa SQL, karena hampir sama dengan itu - Appsheet's way.
[_THISROW]
Expression [_THISROW] akan banyak di jumpai apabila kita memiliki lebih
dari satu tabel. [_THISROW] bisa saja di artikan sebagai ROW INI, tapi
yang akan di berikan adalah KEY value. Sehingga [_THISROW] akan
mendekati apabila di gabungkan dengan expression lain dan tidak berdiri
sendiri. Expression ini yang paling singkat akan merupakan list /daftar dan
bisa dengan mudah dibuat dengan LIST([_THISROW].
SELECT()
SELECT() expression merupakan inti dari Appsheet. Ada beberapa fungsi
yang sama tapi pada dasarnya merupakan keturunan atau kependekan
(makro) dari SELECT(). Untuk memahami kita harus membayangkan
bahwa kita ada di tabel terpisah dan ingin agar tabel laindi tunjukkan di
tabel terpisah tersebut dengan kriteria yang kita inginkan. Disinikami
berikan contoh sederhana saja:
SELECT(Customers[Phone Number], ([Provinsi] = "Bali"))

// akan memberikan daftar dari nomor telephone dari Bali. Duplicate


nomor telephone mungkin akanjuga di berikan apabila ada.
SELECT(Customers[Provinsi], ([Kecamatan] = "Cakung"), TRUE)

// memberikan daftar provinsi yang memiliki kecamatan dengan nama


CAKUNG. TRUE menunjukkan untuk menghilangkan duplicate provinsi
apabila ada.

ANY()
ANY() merupakan pasangan dari SELECT() yang akan memberikan salah satu dari item yang berada di daftar:
ANY(Students[Name])
ANY(SELECT(Students[Name], TRUE))
ANY(LIST(1, 2, 3)) //returns Number: 1
ANY({"Red", "Yellow", "Green"}) //returns Text: Red
ANY(SELECT(Products[Price], ([Color] = "Orange")))
//Equivalent to:
LOOKUP("Orange", "Products", "Color", "Price")
ANY(TOP(SORT(Products[Price], TRUE), 1))
//Equivalent to
MAX(Products[Price])
Preferred Value
ANY(
TOP(
(
LIST([Mobile Phone], [Office Phone], [Home Phone])
- LIST("")
),
1
)
)
//Equivalent to:
INDEX(
(
LIST([Mobile Phone], [Office Phone], [Home Phone])
- LIST("")
),
1
)

SUM()
SUM(Classes[Seat Count])
SUM(SELECT(Classes[Seat Count], TRUE))
SUM([Discounts]) // The sum of the items in the Discounts column value, where Discounts is of type List.
SUM(LIST(1, 2, 3)) //returns Number: 6
Sum Values from Select Rows
SUM(
SELECT(
Deliveries[DeliveryCharge],
AND(
([DateDone] >= [_THISROW].[BeginDate]),
([DateDone] < [_THISROW].[EndDate])
)
)
)
LOOKUP()
LOOKUP("Bob's Burgers", "Restaurants", "Name", "Phone")
//Equivalent to
ANY(SELECT(Restaurants[Phone], ([Name] = "Bob's Burgers")))
LOOKUP([_THISROW], "Managers", "Location", "Name")
//Equivalent to
ANY(SELECT(Managers[Name], ([Location] = [_THISROW])))
LOOKUP([_THISROW].[Order ID], "Orders", "Order ID", "Order Date"))
//Equivalent to
ANY(SELECT(Orders[Order Date], ([Order ID] = [_THISROW].[Order ID])))
//or
[Order ID].[Order Date].
LOOKUP([_THISROW].[Order ID], "Orders", "Order ID", "Order Date")
The equivalent SELECT() expression:
ANY(SELECT(Orders[Order Date], ([_THISROW].[Order ID] = [Order ID])))

COUNT()
Berhitung dan membuat chart
COUNT() sudah cukup jelas dengan adanya SELECT().

FILTER()
Filtering Data
FILTER() merupakan special case SELECT() dimana yang diberikan adalah key
value. FILTER() dengan IN() akan memberikan hasil yang efficient dan lebih
cepat.
FILTER("Customers", ([Provinsi] = "Bali"))
FILTER(Customers, ([Kecamatan] = "Cakung"))

IN()
IN() sudah cukup jelas dan tinggal di mantapkan saja.
EOMONTH()
EOMONTH() biasanya digunakan untuk membatasi bulan ke bulan yang
lainnya dalam kalender. Contoh ada di bagian bawah dari tulisan ini.

REF_ROWS()
References
Ini adalah expression yang singkat dan biasanya dibuat secara otomatis
apabila kita menyatakan suatu column adalah type REF. Akan tetapi,
penggunaan harus juga di perhatikan karena dapat memperlambat sytem
sync time.
LOGIKA APLIKASI
Logika Aplikasi
Dalam membuat aplikasi, kita akan di hadapkan pada logika yang merupakan keinginan bagaimana aplikasi akan
berfungsi. Mengerti terntang 11 terminologi penting di Appsheet merupakan langkah yang penting untuk di lakukan.
App Formulas
Initial Values
Virtual Columns
Dereference
Editable_If
Valid_If
Suggested Values
Show_If
Enum dan EnumList
Key
IsAPartOf
Appsheet memberikan guidance yang sangat jelas untuk setiap terminologi yang di gunakan, yang kita lakukan disini
adalah berusaha memahami dari sudut pandang kreator aplikasi dan gunakan fungsi yang tepat untuk menghasilkan
aplikasi yang berkualitas.
Beberapa lokasi Expression ditandai dengan "FLASK"

App Formulas
Apabila kita menginginkan column value langsung terupdate setelah melakukan edit atau update dari suatu row,
maka bisa gunakan App Formula. App Formula dapat dapat di gabungkan dengan logika operator seperti IF(), IFS(),
ISBLANK(), ISNOTBLANK(), SWITCH().
Beberapa contoh penggunaan app formula seperti:
IFS(
AND(
ISNOTBLANK([Jam Keluar]),
ISNOTBLANK([Jam Masuk])
),
[Jam Keluar]-[Jam Masuk],
TRUE,
""
)
Formula diatas memliki arti sebagai berikut: "Apabila column Jam-Keluar dan column Jam masuk tidak
kosong, maka isikan formula dengan mengurangi nilai di column Jam keluar dikurangi jam masuk.
Sedangkan apabila kondisi tersebut tidak terpenuhi, maka isi dengan blank ("") saja."

Penggunaan sublime text untuk memudahkan membaca formula


Penggunaan app formula akan banyak di temui setelah kita mulai terbiasa menggunakan Appsheet dan mulai
memiliki bayangan atau gambaran seperti apa Aplikasi akan berfungsi.
Namun, kadang kita menginkan suatu formula yang selalu menunjukkan hasil terupdate setiap kali sync. Untuk itu,
gunakan Virtual column.
Atau, kita menginginkan value di spreadsheet terupdate dengan AppFormula, maka dapat dilakukan dengan
menggunakan bot atau form-saved-action.
Penggunaan app formula yang umum diantaranya adalah:
Menggunakan USEREMAIL() untuk mengetahui siapa yang terakhir mengedit row
Menggunakan HERE() untuk mencatat dimana lokasi user memasukkan/edit input datanya
Menggunakan action untuk mengupdate App formula

App formula bisa agak panjang seperti ini


Untuk dapat membaca app formula, sebaiknya gunakan prinsip "bawang", dan tuliskan secara vertical
seperti diatas. Penulisan app formula atau expression lainnya bisa saja dengan langsung, tapi akan sulit
dipahami atau di cerna dan biasanya setelah 1 minggu, yang membuat expression tersebut sulit di
mengerti kembali apabila penulisannya tidak tersusun. Contoh expression diatas dapat dibaca dengan
bahasa yang kita pahami adalah sebagai berikut: "Apabila tanggal hari ini lebih besar dari 20, maka
gunakan value total jam kerja dari tabel history dimana tanggal bukan hari libur dan atau tanggal lebih
besar dari 20 bulan ini. Kalau tanggal hari ini lebih kecil dari 20, maka jumlahkan manhour dari tanggal
20 bulan kemarin sampai dengan tanggal 20 bulan ini".
Initial Values
Initial value bisa di artikan seperti terjemahannya yaitu nilai awal, untuk memudahkan user sehingga tidak perlu
mengetik pada saat mengisi form, biasanya dengan suatu expression yang sederhana seperti TODAY(), NOW(),
TIMENOW(), HERE(), USEREMAIL(), UNIQUEID() ataupun sesuatu yang lebih complex seperti melihat nilai terakhir
yang di masukkan oleh user tersebut di tabel terpisah.
Initial value hanya akan di hitung satu kali saja diawal ketika row di create. Apabila ingin initial value selalu terhitung
setiap kali melakukan edit, maka bisa gunakan reset-on-edit dengan posisi ON.
Initial value dapat dijadikan sebagai EDITABLE sehingga pengguna aplikasi bisa melakukan edit terhadap nilai yang di
berikan, atau lebih seringnya memberikan expression FALSE supaya tidak editable, tapi masih dapat di edit melalui
action/workflow.
Initial value dapat berupa expression LOOKUP() ataupun berupa dereference.

Initial value dengan LOOKUP()


Initial value bisa juga diberikan expression yang lebih complex:

Initial value yang lebih "panjang"


Umumnya, apabila kita membuat nama column dalam bahasa inggris maka Appsheet akan memberikan beberapa
automatic initial value yang biasanya digunakan. Sebagai App Creator, kita harus melakukan pengecekan untuk
semua automatic-intelligent expression. Bisa juga kita hapus dan di kosongkan apabila itu tidak tepat. Kadang, kita
ingin user memberikan input value sendiri tapi kita tidak mau user bisa melakukan edit setelah value tersebut di
save. Untuk logika aplikasi seperti ini, maka di gabungkan dengan editable_if seperti ISBLANK(_THIS), yang berarti
user bisa melakukan edit apabila value cell adalah blank.

Sering juga kita akan bertemu dengan logika aplikasi dimana kita ingin intial value di gabungkan dengan kondisi lain,
maka kita bisa gunakan IF() atau IFS() atau logika expression lainnya yang sesuai.
Virtual Columns
Salah satu fungsi dari virtual column adalah untuk dapat langsung melihat hasil perhitungan setelah sync di lakukan.
Virtual column akan selalu terhitung ulang setiap kali melakukan sync, walaupun tidak ada data yang berubah.
Spreadsheet column - ada baiknya kita panggil sebagai column bukan virtual, adalah column yang terlihat di
spreadsheet atau di database. Virtual column tidak terlihat. Untuk dapat lebih memahami antara virtual column dan
bukan virtual column, maka kita bisa melakukan penge
pengetesan
tesan dengan memberikan app formula seperti TODAY()+1
untuk kedua type column test tersebut (yang memiliki nama berbeda). Apabila keesokan hari kita buka aplikasi dan
melakukan sync, maka virtual column akan menunjukkan tanggal esok hari, sementara yang bu bukan virtual column
akan menunjukkan tanggal hari ini. Awalnya akan agak membingungkan, apalagi dengan adanya formula TODAY(),
akan tetapi, sebenarnya kedua type column tersebut memiliki fungsi yang berbeda dan terserah kita sebagai App
Creator untuk menggunakan fungsinya.
Virtual columns akan memberatkan system dan menambah durasi waktu sync apabila app formula nya
tidak efisien.
Apalagi apabila banyak sekali virtual column dan harus melihat data yang semakin hari semakin bertambah banyak,
tinggal menunggu waktu saja sebelum akhirnya aplikasi menjadi terlalu berat untuk di gunakan.
Virtual column dapat juga membuat aplikasi terasa cepat dan bisa menunjukkan hasil sebelum sync di lakukan.
Contoh aplikasi keranjang belanja yang kami shared bisa menjadi contoh acuan untuk ini.

Contoh penggunaan virtual column yang efisien


Dalam membuat aplikasi, baiknya kita target sync time lebih kecil dari 10 detik agar aplikasi sselalu
elalu berada dalam
kondisi yang layak untuk di gunakan. Untuk Exinity, kami memiliki cara tertentu sehingga sync time akan berada di
bawah 5 detik.
Sync time dari salah satu aplikasi kami
Untuk type column REF, akan ada virtual column berupa LIST yang secara otomatis ditambahkan oleh Appsheet. Ini
akan banyak bermanfaat di awalnya, tapi setelah kita membuat beberapa aplikasi, maka biasanya kita akan sadar
bahwa salah satu yang membuat aplikasi terasa berat adalah adanya virtual column berupa LIST yang tidak terlalu
efisien. Dalam mencari jalan menuju aplikasi yang lebih cepat, lebih efisien, maka banyak cara di ciptakan tergantung
pada kreasi dari App Creator sendiri, selama jalan yang diambil akan memberikan sync time yang lebih cepat,
membuat aplikasi lebih mudah di gunakan, maka jalan itu sudah benar.

Kadang juga, kita butuh untuk menggabungkan beberapa column menjadi satu column agar dapat di track informasi
detailnya, seperti menggabungkan nama depan dengan nama belakang, atau menggabungkan nama dengan nama
kota, atau nama orang dengan nama pelajaran, dan lainnya. Untuk ini, gunakan virtual column sebagai column
bantuan.
Dereference
Istilah reference, dereference dan reverse reference akan lebih mudah di mengerti apabila kita membayangkan
bahwa antara satu tabel dengan tabel lain ada jendela penghubung (REF). Biasanya kita memberikan REF column
untuk membuat relation antara tabel tersebut. Dengan adanya column REF, maka kita bisa gunakan dereference,
yang berupa [REF].[ColumnLain]. Seolah-olah, REF column adalah jendela yang bisa melihat nilai dari column-column
di tabel yang lain.
Ini akan bermanfaat untuk intial value, app formula atau expression lainnya termasuk di virtual column.
Untuk reverse reference, boleh di bilang merupakan kebalikan dari dereference dan secara syntac hanya dibedakan
dengan adanya TITIK atau tidak pakai TITIK.
Selain REF, kita bisa juga menggunakan ENUM dan ENUMLIST dengan based type REF, yang akan memberikan hasil
yang sama seperti REF. Yang membedakan, penggunaan ENUM dan ENUMLIST based type REF ini tidak akan
membuat virtual column secara otomatis - ini bisa membuat sync time menjadi lebih cepat.
Kadang, kita ingin mendapatkan value dari tabel lain yang terhubung dengan REF, tergantung bagaimana skenario
tabelnya, tapi kita bisa membuat dereference dengan methode seperti contoh order tabel dan email address:
[Order Id].[Customer Name].[Email]

IsAPartOf
Istilah IsAPartOf dapat di artikan bahwa tabel ini merupakan bagian dari tabel utama, tanpa adanya tabel utama,
maka tabel ini tidak akan berarti. Tabel dengan IsAPartOf dari tabel lain akan bisa di tambahkan contentnya dari
tabel lain tersebut, sehingga menghapus data utama juga akan menghapus semua record di tabel pendukungnya.
Appsheet membatasi IsAPartOf hanya bisa dilakukan satu kali, tapi ada cara dimana IsAPartOf bisa di lakukan
sebanyak yang kita mau, ini kadang bermanfaat dan bisa di gunakan untuk kasus-kasus tertentu. Salah satu contoh
aplikasi kamu adalah terkait dengan 1 tabel photo yang dihubungkan dengan beberapa tabel lain dengan isaAPartOf
semua, silahkan di copy dan di pelajari langkahnya di contoh Aplikasi kami: Ambil Banyak photo.

Satu tabel dengan beberapa isaPartof


Enum dan EnumList
Enum adalah dropdown yang merupakan validation apa saja pilihan yang bisa di pilih oleh user agar seragam dalam
melakukan pilihan dan menghilangkan kesalahan karena type atau human error. Dengan ENUM, pilihan yang boleh
di ambil hanya 1 saja. Enum bisa berbasiskan text, number, decimal, atau apapun yang merupakan type column di
appsheet. Sedangkan Enumlist pilihan yang diambil dapat lebih dari satu.
Baik Enum maupun Enumlist dapat digunakan dengan based type REF, sehingga bisa dimanfaatkan untuk
dereference atau reverse reference.
Contoh penerapan enum adalah dengan memberikan pilihan status {On Going , Delayed , Done}, dimana untuk suatu
waktu hanya akan ada satu yang berlaku. Penerapan enumlist seperti pengambilan barang dari gudang {paku , argon
, Kawat Las} dimana bisa saja dalam satu waktu pemilihan dilakukan untuk beberapa material.
Baik Enum maupun Enumlist dapat berupa daftar sederhana, atau daftar yang merupakan isian dari user, atau daftar
meihat tabel tertentu yang di tentukan, atau berupa kondisi tertentu untuk memunculkan pilihan tertentu. Dapat
juga kita membuatkan dropdown validation di spreadsheet yang mana Appsheet akan mengambil value tersebut dan
dijadikan sebagai enum/enumlist.

Enumlist LatLong

Key
Awalnya akan butuh sedikit waktu untuk memahami tentang key di appsheet. Key merupakan identitas dari row
yang kita buat sebagai bagian dari aplikasi yang memudahkan kita dalam penyusunan data. Key column tidak boleh
ada yang duplicate, karena itu appsheet memiliki key generator yaitu berupa UNIQUEID() ataupun
UNIQUEID("UUID"). Key tidak selama nya berupa UNIQUEID(), kadang bisa berbentuk text, number ataupun tanggal
beserta waktu ataupun nama negara misalnya. Selama kita yakin (dengan pengetahuan yang cukup) bahwa tidak
akan mungkin data bisa duplicate apabila satu atau lebih orang memasukkan data di waktu yang sama. Contoh key
yang kurang bagus adalah nama orang, kadang nama orang bisa sama. Tapi apabila kita gunakan email address
sebagai key, maka tidak akan duplicate.
Suggested Values
Suggested value merupakan nilai yang di sarankan, jadi sebagai app creator, kita berusaha memberikan suatu nilai
yang di sarankan berdasarkan kondisi tertentu dan diusahakan nilai itulah yang akan di pilih. User akan tetap bisa
merubah sendiri nilai yang di sarankan tersebut. Nilai ini bisa berupa daftar sederhana, reference ke tabel lain,
ataupun sesuatu yang lebih complex dari itu.
(WorkersTbl[ID] - SPLIT(SELECT(JobsTbl[Workers], TRUE), " , "))
Untuk contoh diatas, suggested value akan melihat tabel worker dan menghilangkan semua worker yang telah di
assign job nya di job tabel. jadi yang muncul hanya worker yang belum mempunyai assignment.

Contoh suggested value untuk inspection fleet

Editable_If
Editable_If merupakan suatu pertanyaan yang harus dijawab sendiri oleh App Creator, kapan data boleh di edit oleh
user? apakah data boleh di edit oleh user? dengan kondisi apa data boleh di edit oleh user. Biasanya dengan
membuat pernyataan FALSE, maka data tidak dapat diedit oleh user setelah initial value di berikan. Atau dengan
memberikan ISNOTBLANK([_THIS]), maka data tidak bisa di edit apabila ada cell value yang telah terisi.
Sering juga kita membuat row editable apabila user adalah orang yang melakukan input. Atau editable apabila user
adalah admin atau lainnya.

Valid_If
Valid_if biasanya digunakan bersamaan dengan REF, tapi kadang juga bisa berdiri sendiri. Misalnya kita ingin data
agar di input di jam tertentu.

Show_If
Sering kita ingin agar data itu ada, tapi tidak perlu di munculkan. Maka kita gunakan show_if. Kadang, kita ingin agar
data hanya muncul di form saja, atau jangan muncul di form dan hanya muncul di view tabel saja. Semua tergantung
kepada kreasi dari App Creator.
LATIHAN 1
Data
Dalam menyusun data, sebaiknya dilakukan dengan pemikiran sederhana dan kita bisa ajukan beberapa pertanyaan
yang akan di jelaskan dibawah dengan contoh kasus adalah sebagai berikut.
Ada keinginan untuk membuat aplikasi untuk mencatat nilai ujian murid sekolah di beberapa kelas di
suatu sekolah. Di dalam tiap kelas tersebut ada sekitar 40 orang murid dan ada sekitar 10 mata
pelajaran. Setiap mata pelajaran melakukan 3 kali ulangan dalam satu semester (6 bulan). Bagaimana
cara penyusunan tabel data agar bisa di buatkan aplikasi appsheet nya?
Apabila di perhatikan kasus diatas, maka ada beberapa entity yang ada didalamnya, digambarkan secara sederhana
sebagai berikut:

Aplikasi Monitoring Nilai Ujian dan Tabelnya


Dengan membuat bagan sederhana seperti diatas, maka kita dapat menggambarkan bahwa:
Akan ada tabel Kelas: yang beriisikan nama kelas, seperti kelas berapa?
Ada tabel Murid: disini kita masukkan identitas murid dan yang terkait dengan murid.
Ada tabel mata pelajaran: berisikan nama-nama mata pelajaran dan tergantung kondisi, bisa juga berisikan nama guru yang mengajar pelajaran tersebut
Ada tabel hasil ulangan untuk setiap mata pelajaran.
Dengan memperhatikan relasi antara tabel, maka kita dapat mengetahui bahwa satu murid bisa mengikuti banyak
mata pelajaran dan satu mata pelajaran akan ada beberapa ulangan, sehingga hasil ulangan akan ada beberapa kali.
Ini adalah relational tabel, many-to-many. Dalam membuat langkah selanjutnya, maka Hasil ulangan kita jadikan
sebagai bridge-tabel atau tabel penghubung yang beriisikan Key-ID dari Murid dan Key-ID dari Mata pelajaran
beserta data ulangan dan data lainnya. Sehingga, langkah kedua adalah membuat column dari masing-masing data
tabel tersebut:

Aplikasi Motoring Nilai Ujian beserta tabel dan columnya


Kita juga tidak harus terlalu detail untuk langkah pertama ini, kita ambil hanya hal terpenting saja dulu. Apabila nanti
mau ditambahkan column lain, kita tinggal tambahkan dan Appsheet akan dapat menggabungkannya setelah kita
lakukan update column structure. Dan bisa juga setelah kita connect google sheet dengan Appsheet, kita berfikiran
untuk merubah susunan tabel diatas menjadi lebih sederhana. Jangan khawatir, tinggal di lakukan saja.
Memperhatikan susunan column dan type datanya, ada beberapa Appsheet Expression (formula) yang bisa
digunakan supaya memberikan hasil yang kita inginkan:
TODAY()
ini untuk menunjukkan tanggal hari di mana ulangan di lakukan. Karena biasanya hasil ulangan baru bisa di dapatkan
beberapa hari setelah ulangan, maka kita jadikan itu sebagai initial value dan editable.
UNIQUEID()
Untuk secara otomatis memberikan ID yang unique dan memudahkan dalam penyusunan tabel.
Membuat Tabel di Google Sheet
Dengan penggambaran seperti diatas, maka tabel google sheet akan bisa dibuatkan seperti ini:

Tabel di Google Sheet


Dengan memberikan nama sheet untuk setiap sheet yang dibuatkan, maka akan di ambil oleh Appsheet menjadi nama tabel. Dikarena kan
penggunaan bahasa indonesia, maka kita harus melakukan pengecekan type column di appsheet agar sesuai dengan yang di inginkan. Apabila
mengunakan bahasa inggris, umumnya Appsheet akan secara cerdas memberikan type column dan initial valuenya.
Membuat Aplikasi dengan Appsheet
Setalah tabel Google Sheet siap, maka kita bisa mulai menghubungkannya di Appsheet dengan cara membuat tabel baru. Kita mulai masukkan
tabel sesuai urutan yang kita inginkan, dan untuk latihan-1 ini, urutannya adalah seperti bagan diatas, jadi kita akan mulai dengan
memasukkan tabel kelas.
Pemikiran awal dalam menghubungkan tabel
Setiap kali kita menghubungkan tabel dengan Appsheet, maka sebaiknya di pikirkan apakah tabel tersebut akan memiliki kemampuan untuk
Delete? Contoh untuk tabel kelas, kita tidak ingin ada yang bisa menghapus catatan mengenai kelas, maka opsi deletes tidak kita pilih. Apabila
data kelas sudah ada, maka akan lebih baik tabel Kelas dibuat sebagai Read-Only yang juga akan membuat tabel di baca lebih cepat, tidak
sering di update dan bisa mempercepat waktu sync antara data yang ada di tabel pengguna dan data yang ada di tabel Appsheet server.

Masukkan tabel lainnya


Setelah satu persatu tabel di masukkan dan di cek type columnya. Maka Appsheet akan secara otomatis membuatkan view untuk kita yang
menjadi sebagai interface antara user dengan Appsheet server.
Tabel Murid yang di sesuaikan di Appsheet
Kita bisa mulai memasukkan data awal sebagai pengecekan saja. Data awal ini, bisa dihapus nantinya padawaktu aplikasi Appsheet kita sudah
siap untuk di sebarkan.
Data awal untuk kelas
Jangan khawatir untuk data awal ini, karena data awal ini juga di gunakan sebagai simulasi input data dan juga pengaturan view. Setelah kita
masukkan beberapa data kelas dan beberapa data murid, kita bisa lanjukan untuk menghubungkan tabel ujian dan tabel hasil ujiannya.
Simulasi pengisian hasil ulangan
Setelah itu kita bisa membuatkan view dan memulai melakukan simulasi untuk mengisi hasil ulangan seperti tampak diatas. Dan mulai
melakukan pengaturan view sesuai dengan yang kita inginkan.
Pengaturan view dan pengelompokkan data
Untuk saat ini kita lakukan secara sederhana dahulu tanpa melakukan perubahan format font atau background, secara fungsi kita lakukan
pengecekan dan pengaturan.
Contoh view murid
Sehingga bisa kita mulai pikirkan beberapa type users yang akan menggunakan aplikasi ini, seperti misalnya murid (hanya boleh melihat hasil
ulangannya sendiri, misalnya) atau guru, boleh meihat hasil ulangan mata pelajarannya di semua kelas tapi tidak bisa melihat hasil ulangan mata
pelajaran lain, wali kelas bisa melihat semua hasil murid di kelasnya saja untuk semua mata pelajaran. Atau apapun yang menjadi pemikiran kita,
untuk penggunaan aplikasi ini.

Setelah itu aplikasi biasa di share kepada orang lain untuk mendapatkan masukan dan kita bisa langsung perbaiki apabila ada kesalahan.
Penerapan database dan prinsip hubungan antara tabel telah di berikan
contoh di Latihan-1 belajar Appsheet ini. Mudah-mudahan membantu dan di
persilahkan untuk mengikuti forum appsheet dan juga bertanya langsung
kepada Hart Exinity dalam bahasa Indonesia, kami akan jawab segera semua
pertanyaannya. Belajar Appsheet bisa dilakukan untuk kasus yang lain, dan
kali ini di berikan kasus mengenai murid dan nilai ujiannya karena pasti kita
pernah mengalami hal tersebut dan semoga bisa di pahami sebagai bagian
dari pengembangan Citizen developer Indonesia terutama untuk
penggunaan Appsheet Indonesia supaya lebih banyak yang bisa
memanfaatkannya.

Anda mungkin juga menyukai