Anda di halaman 1dari 88

MAKALAH

PEMBUATAN APLIKASI PENGABSENAN

DOSEN PEMBIMBING
Dedi Supardi S.T,M.Kom.

DISUSUN OLEH
Rully Fildansyah

UNIVERSITAS NUSA PUTRA


FAKULTAS TEKNIK
TEKNIK INFORMATIKA
2017/2018
LEMBAR PENGESAHAN

Judul : Aplikasi Pengabsenan

Nama : Rully Fildansyah

NIM : 17184604

Program Studi : Teknik Informatika

Semester : 1 (satu)

Jenjang : Strata Satu (S1)

Menyetujui

Ketua program Studi

Teknik Informatika

Dedi Supardi S.T,M.Kom.

i
KATA PENGANTAR

Puji syukur kehadirat allah swt dalam pembuatan aplikasi pengabsenan


sebagai tugas ulangan akhir semester mata kuliah algoritma dan struktur data ini
tak lepas dari rahmat dan karunianya. Shalawat dan salam semoga tercurah
limpahkan kepada nabi Muhammad saw.

Saya ucapkan terimakasih kepada pihak-pihak yang telah membantu saya


dalam pembuatan aplikasi pengabsenan ini. Dan terimakasih banyak kepada dosen
pembimbing yang telah memberikan pemahaman serta membimbing saya dalam
pembuatan aplikasi pengabsenan ini.

Aplikasi dan paper ini saya akui masih banyak kekurangan karena pengalaman
dan kemampuan yang saya miliki sangat kurang. Oleh kerena itu saya harapkan
kepada para pembaca untuk memberikan masukan-masukan yang bersifat
membangun untuk kesempurnaan aplikasi dan paper ini.

Sukabumi, 31 Juli 2018

Penyusun

ii
DAFTAR ISI

LEMBAR PENGESAHAN ............................................................................. i


KATA PENGANTAR ..................................................................................... ii
DAFTAR ISI .................................................................................................... iii
DAFTAR GAMBAR ....................................................................................... v
DAFTAR TABEL . ............................................................................................ viii
DAFTAR SOURCE CODE ......................................................................... ix

BAB I : PENDAHULUAN
1.1 Latar Belakang ................................................................................... 1
1.2 Tujuan ................................................................................................ 2
1.3 Ruang Lingkup ................................................................................... 2

BAB II : LANDASAN TEORI


2.1 Algoritma dan Struktur Data .............................................................. 3
2.1.1 Algoritma .................................................................................. 3
2.1.2 Struktur Data ............................................................................. 4
2.2 Structured Query Language(SQL) ..................................................... 9
2.2.1 Pengertian .................................................................................. 9
2.2.2 Sejarah ....................................................................................... 9
2.2.3 Jenis Perintah SQL .................................................................... 9
2.3 MySQL ............................................................................................... 11
2.3.1 Pengertian dan Sejarah .............................................................. 11
2.3.2 Kelebihan MySQL .................................................................... 12
2.3.3 Kelemahan MySQL .................................................................. 13
2.4 Datasnap ............................................................................................. 13
2.4.1 Pengertian .................................................................................. 13
2.4.2 Arsitektur Datasnap ................................................................... 14

BAB III : PEMBAHASAN


3.1 Merancang Database MySQL ........................................................... 16

iii
3.1.1 Membuat Database ................................................................... 16
3.1.2 Membuat Table ......................................................................... 16
3.1.3 Skema Diageam Database ........................................................ 20
3.2 Merancang Aplikasi Mobile (Android) .............................................. 21
3.2.1 Membuat Datasnap Server ........................................................ 22
3.2.2 Membuat Aplikasi Mobile (android) ......................................... 35
3.2.3 Membuat Datasnap Client ......................................................... 51
3.3 Screenshoot Hasil Jadi Aplikasi Mobile (Android) ............................. 55

BAB IV : PENUTUP
4.1 Kesimpulan .......................................................................................... 58
4.2 Saran ..................................................................................................... 58

DAFTAR PUSTAKA
LAMPIRAN - LAMPIRAN

iv
DAFTAR GAMBAR

Gambar 2.1 : Linked List ............................................................................... 5

Gambar 2.2 : Array ........................................................................................ 6

Gambar 2.3 : Queue ....................................................................................... 6

Gambar 2.4 : Stack ......................................................................................... 7

Gambar 2.5 : Tree .......................................................................................... 8

Gambar 2.6 : Datasnap ..................................................................................... 14

Gambar 3.7 : Skema diagram database dbabsen ............................................ 21

Gambar 3.8 : Membuat datasnap server ......................................................... 22

Gambar 3.9 : Desain Form server .................................................................. 22

Gambar 3.10 : Komponen-komponen di ServerMethodsUnit1 ..................... 24

Gambar 3.11 : Konfigurasi AbsenConnection ............................................... 24

Gambar 3.12 : Konfigurasi query Tb_MatkulTable ...................................... 25

Gambar 3.13 : Konfigurasi DSP_matkul ....................................................... 25

Gambar 3.14 : Konfigurasi query Tb_akunTable .......................................... 26

Gambar 3.15 : Konfigurasi parameters Tb_akunTable .................................. 26

Gambar 3.16 : Konfigurasi DSP_akun .......................................................... 27

Gambar 3.17 : Konfigurasi CDS_akun ............................................................ 27

Gambar 3.18 : Konfigurasi query Tb_statusTable ......................................... 27

Gambar 3.19 : Konfigurasi DSP_status ......................................................... 28

v
Gambar 3.20 : Konfigurasi query combobox ................................................. 28

Gambar 3.21 : Konfigurasi DSP_combobox ................................................. 29

Gambar 3.22 : Konfigurasi query jadwal ....................................................... 29

Gambar 3.23 : Konfigurasi parameters jadwal .............................................. 30

Gambar 3.24 : Konfigurasi DSP_jadwal ........................................................ 30

Gambar 3.25 : Konfigurasi CDS_jadwal ....................................................... 30

Gambar 3.26 : Konfigurasi query Tb_ruangTable ......................................... 31

Gambar 3.27 : Konfigurasi DSP_ruang ......................................................... 31

Gambar 3.28 : Konfigurasi query Tb_absenmhsTable .................................. 32

Gambar 3.29 : Konfigurasi DSP_absenmhs..................................................... 32

Gambar 3.30 : Konfigurasi query verify ........................................................ 33

Gambar 3.31 : Konfigurasi parameters verify ................................................ 33

Gambar 3.32 : Konfigurasi DSP_verify ......................................................... 34

Gambar 3.33 : Konfigurasi CDS_verify ........................................................ 34

Gambar 3.34 : Membuat Aplikasi android ....................................................... 36

Gambar 3.35 : Desain form login ..................................................................... 36

Gambar 3.36 : Desain form register ................................................................. 40

Gambar 3.37 : Desain form MainDosen .......................................................... 42

Gambar 3.38 : Desain form MainMhs ........................................................... 45

Gambar 3.39 : Desain form Info .................................................................... 48

Gambar 3.40 : Desain form foto .................................................................... 50

Gambar 3.41 : Membuat Datasnap Client Module ........................................ 51

Gambar 3.42 : Komponen-komponen ClientModuleUnit1 ........................... 52

vi
Gambar 3.43 : Konfigurasi SQLConnection1 ................................................ 52

Gambar 3.44 : Konfigurasi DSProviderConnection1 .................................... 53

Gambar 3.45 : Konfigurasi ClientDataSet ..................................................... 53

Gambar 3.46 : Membuka Live Binding ......................................................... 54

Gambar 3.47 : Konfigurasi Live Binding ...................................................... 54

Gambar 3.48 : Tampilan form login & daftar ................................................ 55

Gambar 3.49 : Tampilan form daftar ............................................................... 55

Gambar 3.50 Tampilan capture photo mahasiswa ......................................... 56

Gambar 3.51 Tampilan pengiriman absen ..................................................... 56

Gambar 3.52 Tampilan informasi akun ......................................................... 56

Gambar 3.53 Tampilan verifikasi absen mahasiswa oleh dosen .................... 57

Gambar 3.54 Tampilan melihat foto absen mahasiswa oleh dosen ............... 57

vii
DAFTAR TABEL

Tabel 3.1 : Table tb_akun ............................................................................... 17

Tabel 3.2 : Table tb_status ............................................................................... 17

Tabel 3.3 : Table tb_matkul ........................................................................... 18

Tabel 3.4 : Table tb_matkul ............................................................................. 18

Tabel 3.5 : Table tb_jadwal ............................................................................ 19

Tabel 3.6 : Table tb_absenmhs ...................................................................... 20

Tabel 3.7 : Komponen form log in ................................................................. 37

Tabel 3.8 : Komponen form register .............................................................. 40

Tabel 3.9 : Komponen form MainDosen ....................................................... 43

Tabel 3.10 : Komponen form MainMhs ........................................................ 45

viii
Tabel 3.11 : Komponen form Info ................................................................. 48

Tabel 3.12 : Komponen form foto.................................................................... 50

DAFTAR SOURCE CODE

Source Code 3.1 : Query Create Database ..................................................... 16

Source Code 3.2 : Query Create Table tb_akun ............................................. 16

Source Code 3.3 : Query Create Table tb_status ............................................. 17

Source Code 3.4 : Query Create Table tb_matkul ......................................... 18

Source Code 3.5 : Query Create Table tb_ruang ........................................... 18

Source Code 3.6 : Query Create Table tb_jadwal .......................................... 19

Source Code 3.7 : Query Create Table tb_absenmhs....................................... 20

Source Code 3.8 : btn_port form server ......................................................... 23

Source Code 3.9 : Function upload & download ........................................... 35

Source Code 3.10 : LoginButton form login .................................................. 39

ix
Source Code 3.11 : RegisterButton form login .............................................. 39

Source Code 3.12 : Edit5 form register .......................................................... 41

Source Code 3.13 : Button1 form register ..................................................... 42

Source Code 3.14 : Button2 form register ..................................................... 42

Source Code 3.15 : btn_kirim form MainDosen ............................................ 44

Source Code 3.16 : btn_refresh form ............................................................. 45

Source Code 3.17 : Listbox1 form MainDosen ............................................. 45

Source Code 3.18 : TakePhotoFromCameraActionList1 form MainMhs ..... 47

Source Code 3.19 : btn_kirim form MainMhs ............................................... 48

Source Code 3.20 : btn_back form info ......................................................... 50

Source Code 3.21 : btn_back form foto ......................................................... 51

x
BAB I

PENDAHULUAN

Latar Belakang

Penggunaan aplikasi perangkat lunak sudah menjadi kebutuhan banyak orang


untuk memudahkan pekerjaan pada era teknologi informasi saat ini. Aplikasi
perangkat lunak juga dapat menjadi solusi dari berbagai macam masalah, mulai dari
masalah yang sederhana sampai masalah yang rumit. Oleh karena itu di zaman
sekarang ini banyak orang yang menggunakan perangkat lunak khususnya
perangkat lunak yang dapat berjalan di perangkat mobile (smartphone) atau
berbasis android.

Dengan populernya pemakaian perangkat lunak yang dapat berjalan pada


perangkat mobile, tentunya dapat menjadi solusi untuk menyelesaikan suatu
masalah yang sering dihadapi. Salah satunya adalah untuk menyelesaikan masalah
pengabsenan mahasiswa dan dosen di perguruan tinggi. Pengabsenan merupakan
suatu kegiatan menyebutkan nama-nama orang pada daftar nama yang tersedia
untuk memeriksa hadir tidaknya seseorang.

Pengabsenan dengan cara biasa atau manual sangat tidak efektif dan memiliki
banyak kekurangan serta tidak terkontrol dalam pelaksanaannya. Salah satu
kekurangan system absen manual adalah mahasiswa dapat melakukan kecurangan
pada saat melakukan pengabsenan seperti menghadirkan temannya yang tidak hadir.
Dengan menggunakan logika, algoritma, dan pemograman kita dapat membuat
sebuah program atau aplikasi yang dapat menyelesaikan masalah pengabsenan
secara manual yang banyak memiliki kekurangan.

1
Tujuan

a. Menerapkan pengetahuan algoritma dan struktur data.

b. Menerapkan sistem database MySQL

c. Menerapkan sistem datasnap

d. Merancang dan membangun aplikasi pengabsenan.

Ruang Lingkup

a. Algoritma dan struktur data

b. Structured Query Language (SQL)

c. Database MySQL

d. Datasnap system

2
BAB II

LANDASAN TEORI

2.1 Algoritma dan Struktur Data

2.1.1 Algoritma

Algoritma adalah suatu urutan dari beberapa langkah yang logis guna
menyelesaikan masalah. Pada saat kita memiliki masalah, maka kita harus dapat
untuk menyelesaikan masalah tersebut dengan menggunakan langkah-langkah
yang logis. Contoh dari algoritma sederhana dalam kehidupan nyata adalah pada
saat memasak air. Hal-hal yang perlu dilakukan untuk memasak air seperti
berikut : siapkan panci, masukkan air secukupnya ke dalam panci, tutup panci
tersebut, letakkan panci tersebut di atas kompor, hidupkan kompor dengan api
sedang, apabila air sudah mendidih, matikan kompor, setelah itu angkat panci
tersebut dari kompor. Langkah-langkah untuk memasak air tersebut merupakan
algoritma memasak air. Sehingga memiliki urutan langkah-langkah yang logis.

Dalam ilmu matematika dan komputer, pengertian algoritma merupakan


prosedur dari beberapa langkah demi langkah untuk penghitungan. Algoritma
dipakai untuk penghitungan, penalaran otomatis, dan pemrosesan data.
Pengertian algoritma ialah suatu metode yang efektif diekspresikan sebagai
rangkaian yang terbatas dari beberapa instruksi yang telah dijelaskan dengan
baik guna menghitung sebuah fungsi. Susunan algoritma dimulai dari kondisi
awal dan input awal, instruksi tersebut mendeskripsikan komputasi yang apabila
itu dieksekusi serta diproses dengan melewati urutan-urutan kondisi terbatas
yang terdefinisi dengan baik, sehingga dapat menghasilkan output atau keluaran
dan berhenti di kondisi akhir yang telah ditentukan.

Algoritma sangat diperlukan untuk mengolah data yang ada di komputer.


Dalam sistem komputer, pengertian algoritma ialah logika yang dibuat dengan
memakai software oleh para pembuat perangkat lunak untuk membuat software
tersebut menjadi lebih bagus. Kata Algoritma ditemukan oleh Abu Abdullah
Muhammad Ibnu Musa Al-Khwarizmi, beliau merupakan matematikawan yang

3
berasal dari Persia yang ditemukan pada Abad Ke 9. Dari masa ke masa, kata
algoritma mulai berkembang di abad ke 18.

2.1.2 Struktur Data

Struktur data adalah sebuah proses bagaimana menyimpan, menyusun, dan


mengurutkan data dalam memory agar dapat dipergunakan secara
efisien. Struktur data bisa juga berarti tata letak data yang berisi kolom-kolom
data,baik itu kolom yang tampak oleh pengguna (user) ataupun kolom yang
hanya digunakan untuk keperluan pemrograman yang tidak tampak oleh
pengguna. Sebuah struktur data dapat diterapkan untuk pengolahan database,
misalnya untuk keperluan data keuangan, atau untuk pengolah kata (word
processing) yang kolomnya berubah secara dinamis. Berikut ini beberapa jenis
struktur data yang umum digunakan :

a. Linked List

Linked list merupakan sebuah struktur data list yang saling


terhubung melalui suatu link. Dalam sebuah linked list terdapat node dan
link. Node pertama disebut head. Ada beberapa tipe linked list misalnya
single linked list, double linked list, dan circular linked list. Suatu node
pada linked list terdiri dari data item dan pointer ke node lainnya. Single
linked list hanya memiliki 1 pointer yang mengarah ke node selanjutnya
sehingga hanya bisa melakukan proses penelusuran ke depan (forward).
Double linked list terdiri dari data item dan dua pointer yang menunjuk ke
node sebelum dan sesudahnya. Jadi double linked link bisa melakukan
proses penelusuran ke depan (forward) dan belakang (backward).
Circular linked list mirip dengan single linked list, namun pointer node
terakhir menunjuk ke alamat head.

4
Gambar 2.1 : Linked List

Pada linked list dapat dilakukan operasi seperti insert menambahkan


node baru baik di depan (head), di tengah, ataupun di belakang (tail).
Operasi remove menghapus salah satu node. Update untuk memperbaharui
nilai suatu node. Retrieve untuk mendapatkan informasi tentang isi dari
suatu node tertentu.

b. Array
Array merupakan salah satu tipe list yang memiliki suatu key atau
yang lebih dikenal dengan index untuk menandai setiap elemen array
tersebut. Pada beberapa bahasa pemrograman ukuran suatu array harus
dideklarasikan terlebih dahulu sehingga memiliki lokasi yang fix dalam
memori. Array biasanya diberi nama untuk membedakannya dengan array
yang lain. Salah satu karakteristik array adalah bahwa semua elemen yang
tersimpan di dalamnya memiliki tipe data yang sama. Jadi, data float tidak
bisa ditampung dalam sebuah array yang memiliki tipe data integer. Array
diakses dengan menggunakan index-nya. Index adalah suatu nilai yang
menunjukkan urutan elemen dalam array, adapun elemen adalah data yang
tersimpan dalam index tertentu. Misalkan Integer Array A[10]=12 maka
bisa diartikan sebuah array A bertipe integer pada index

5
Gambar 2.2 : Array

c. Queue
Queue juga merupakan salah satu jenis list namun memiliki sifat
yang khas. Queue biasa dalam bahasa Indonesia disebut sebagai antrian.
Queue bisa diimplementasikan dengan array ataupun linked list. Pada
queue operasi penambahan (insertion) hanya bisa dilakukan di bagian
belakang queue. Adapun penghapusan (deletion) hanya bisa dilakukan di
bagian depan queue. Oleh karena itu, queue menerapkan prinsip First In
First Out (FIFO). Salah satu variasi dari queue adalah Priority Queue.
Pada Priority Queue setiap elemen queue memiliki suatu nilai (key) yang
menunjukkan tingkat prioritasnya. Biasanya nilai yang lebih kecil
menunjukkan prioritas lebih besar. Adanya nilai ini menyebabkan prinsip
FIFO bisa diabaikan. Suatu elemen yang datang belakangan bisa
dieksekusi terlebih dahulu karena memiliki prioritas lebih tinggi dari
elemen yang sudah ada sebelumnya. Oleh karena itu, priority queue
memiliki operasi tambahan yaitu mampu menentukan elemen dengan
prioritas terbesar MAX (A), menaikkan prioritas suatu elemen ke nilai
tertentu INCREASE-KEY (A, key, k), menentukan elemen terbesar dan
menghapusnya/ekstrak REMOVE-MAX(A).

Gambar 2.3 : Queue

d. Stack
Stack juga termasuk salah satu jenis list. Dalam bahasa indonesia
stack biasa disebut juga sebagai tumpukan. Sama seperti queue, stack juga
memiliki sifat atau operasi tertentu yang membedakannya dari list secara

6
umum. Ukuran stack dapat ditentukan pada saat deklarasi. Jadi stack
tersebut hanya mampu menampung sekian elemen sesuai dengan yang
dideklarasikan di awal. Hal ini menyebabkan adanya operasi pada stack
untuk mengetahui kondisi stack apakah kosong (isEmpty) atau penuh
(isFull). Selain itu, ada dua operasi pada stack yaitu menambahkan
tumpukan (Push) atau mengambil tumpukan (Pop). Perintah Push akan
menambah jumlah elemen dalam tumpukan dan harus didahului dengan
perintah isFull. Hal ini dilakukan untuk menjamin bahwa masih ada ruang
yang kosong untuk menambahkan elemen baru pada stack. Adapun
perintah Pop akan mengambil elemen paling atas pada tumpukan sehingga
jumlah elemen berkurang dan harus didahului dengan perintah isEmpty.
Mengapa? karena sebelum mengambil sebuah elemen pada stack harus
dipastikan dulu bahwa stack tersebut tidak kosong. Berbeda dengan Queue,
Stack menganut prinsip Last In First Out (LIFO). Elemen yang terakhir
masuk ke dalam stack akan pertama kali dikeluarkan karena sifat stack
yang membatasi operasi hanya bisa dilakukan pada salah satu sisinya saja
(bagian atas tumpukan)

Gambar 2.4 : Stack

e. Tree
Struktur data Tree memiliki bentuk yang berbeda dengan struktur
data list. Ada dua istilah umum dalam tree yaitu node dan edge. Node
adalah elemen penyusun tree sedangkan edge adalah sesuatu yang
menghubungkan suatu node dengan node yang lain. Ada beberapa istilah
dalam struktur data tree yaitu

7
 Root merupakan node yang berada dipuncak tree. Node ini tidak
memiliki Parent.
 Parent merupakan suatu node yang memiliki child
 Child merupakan suatu node yang berada di bawah node lain
yang berhubungan secara langsung
 Sibling merupakan kumpulan node yang memiliki parent yang
sama
 Descendant merupakan kumpulan node yang berada setelah
node tertentu dan berada pada satu jalur (path)
 Ancestor merupakan kumpulan node yang berada sebelumnya
node tertentu dan berada pada satu jalur (path)
 Leaf merupakan node yang tidak memiliki child biasa juga
dikenal dengan sebutan external node
 Internal node seluruh node yang paling tidak memiliki sebuah
child.
 Subtree merupakan sebuah tree yang lebih kecil pada tree yang
lebih besar
 Path merupakan urutan suatu node dengan edge yang
menghubungkan sebuah node dengan descendant-nya
 Level node adalah jumlah edge yang menghubungkan node
tersebut dengan root + 1

Gambar 2.5 : Tree

Ada beberapa jenis tree misalnya binary tree, B tree, dan B+ tree.
Masing-masing tree ini memiliki karakteristik yang berbeda. Meskipun

8
demikian, secara umum mengikuti pengertian atau istilah pada tree secara
umum.

2.2 Structured Query Language (SQL)

2.2.1 Pengertian

Structured Query Language (SQL) adalah suatu bahasa (language) yang


digunakan untuk mengakses data di dalam sebuah database relasional. SQL
sering juga disebut dengan istilah query, dan bahasa SQL secara praktiknya
digunakan sebagai bahasa standar untuk manajemen database relasional. Hingga
saat ini hampir seluruh server database atau software database mengenal dan
mengerti bahasa SQL.

2.2.2 Sejarah

Awal mula lahirnya bahasa SQL yaitu pada bulan Juni 1970, dimana saat
Jhonny Oracle yang merupakan seorang peneliti dari perusahaan IBM memiliki
gagasan pembuatan basis data relasional, ide tersebut dituangkan dalam sebuah
artikel. Di dalam artikel tersebut juga dibahas mengenai kemungkinan membuat
sebuah bahasa standar untuk mengakses data dalam database tersebut. Bahasa
standar tersebut diberinama SEQUEL (Structured English Query Language).
Setelah kemunculan artikel tersebut lalu IBM memutuskan untuk
mengembangkan pembuatan bahasa SEQUEL. Namun penamaan SEQUEL
dalam bahasa standar tersebut bermasalah dengan hukum sehingga diubahlah
menjadi SQL.

2.2.3 Jenis Perintah SQL

Dalam penggunaan SQL terdapat beberapa perintah yang berguna untuk


mengakses dan memanajemen data yang terdapat dalam database. Jenis
peringah SQL secara umum dibagi kepada tiga sub perintah, yaitu DDL (Data
Definition Language), DML (Data Manipulation Language), dan DCL (Data
Control Language). Ketiga sub perintah tersebut sangat perlu untuk dipahami

9
bagi anda yang ingin menguasai bahasa sql dan mahir dalam pembuatan
database.

a. Data Definition Language (DDL)

DDL adalah sub perintah dari bahasa SQL yang digunakan untuk
membangun kerangka sebuah database, dalam hal ini database dan table.
Terdapat tiga perintah penting dalam DDL, yaitu CREATE, ALTER, DROP.

CREATE perintah ini digunakan untuk membuat, termasuk di


dalamnya membuat database baru, tabel baru view baru, dan kolom baru.
Contoh: CREATE DATABASE nama_database;

ALTER perintah ALTER berfungsi untuk mengubah struktur tabel


yang telah dibuat. Mencakup di dalamnya mengubah nama tabel, menambah
kolom, mengubah kolom, menghapus kolom, dan memberikan atribut pada
kolom.
Contoh: ALTER TABLE nama_tabel ADD nama_kolom datatype;

DROP perintah DROP berfungsi untuk menghapus database atau tabel.


Contoh: DROP DATABASE nama_database;

b. Data Manipulation Language (DML)

DML adalah sub perintah dari bahasa SQL yang digunakan untuk
memanipulasi data dalam database yang telah dibuat. Terdapat empat
perintah penting dalam DML, yaitu INSERT, SELECT, UPDATE, dan
DELETE.

INSERT perintah ini digunakan untuk memasukkan data baru ke dalam


sebuah tabel. Perintah ini tentu saja bisa dijalankan ketika database dan tabel
sudah dibuat.
Contoh: INSERT INTO nama_tabel VALUES (data1, data2, dst…);

10
SELECT: perintah ini digunakan untuk mengambil dan menampilkan
data dari tabel atau bahkan dari beberapa tabel dengan penggunaan relasi.
Contoh: SELECT nama_kolom1, nama_kolom2 FROM nama_tabel;

UPDATE: perintah update digunakan untuk memperbaharui data pada


sebuah tabel.
Contoh: UPDATE nama_tabel SET kolom1=data1, kolom2=data2,…
WHERE kolom=data;

DELETE: perintah delete digunakan untuk menghapus data dari sebuah


tabel.
Contoh: DELETE FROM nama_tabel WHERE kolom=data;

c. Data Control Language (DCL)

DCL adalah sub bahasa SQL yang berfungsi untuk melakukan


pengontrolan data dan server database-nya, seperti manipulasi user dan hak
akses (priviledges). Yang termasuk perintah dalam DCL ada dua, yaitu
GRANT dan REVOKE.

GRANT perintah ini digunakan untuk memberikan hak akses oleh


admin ke salah satu user atau pengguna. Hak akses tersebut bisa berupa hak
membuat (CREATE), mengambil data (SELECT), menghapus data
(DELETE), mengubah data (UPDATE), dan hak khusus lainnya yang
berhubungan dengan sistem database.

REVOKE perintah ini digunakan untuk mencabut hak akses yang telah
diberikan kepada user. Dalam ini merupakan kebalikan dari perintah GRANT.

2.3 MySQL

2.3.1 Pengertian dan Sejarah

MySQL adalah sebuah perangkat lunak sistem manajemen basis data SQL
(DBMS) yang multithread, dan multi-user. MySQL adalah implementasi dari

11
sistem manajemen basis data relasional (RDBMS). MySQL dibuat oleh TcX dan
telah dipercaya mengelola sistem dengan 40 buah database berisi 10.000 tabel
dan 500 di antaranya memiliki 7 juta baris.

MySQL AB merupakan perusahaan komersial Swedia yang mensponsori


dan yang memiliki MySQL. Pendiri MySQL AB adalah dua orang Swedia yang
bernama David Axmark, Allan Larsson dan satu orang Finlandia bernama
Michael “Monty”. Setiap pengguna MySQL dapat menggunakannya secara
bebas yang didistribusikan gratis dibawah lisensi GPL(General Public License)
namun tidak boleh menjadikan produk turunan yang bersifat komersial.

Pada saat ini MySQL merupakan database server yang sangat terkenal di
dunia, semua itu tak lain karena bahasa dasar yang digunakan untuk mengakses
database yaitu SQL. SQL (Structured Query Language) pertama kali diterapkan
pada sebuah proyek riset pada laboratorium riset San Jose, IBM yang bernama
system R. Kemudian SQL juga dikembangan oleh Oracle, Informix dan Sybase.
Dengan menggunakan SQL, proses pengaksesan database lebih user-friendly
dibandingan dengan yang lain, misalnya dBase atau Clipper karena mereka
masih menggunakan perintah-perintah pemrograman murni. MySQL dapat
digunakan secara berdiri sendiri maupun di lekatkan pada bahasa pemograman
seperti C, dan Delphi.

2.3.2 Kelebihan MySQL

Sebagai salah satu software yang banyak digunakan oleh berbagai


kalangan, MySQL memiliki banyak sekali keunggulan. Berikut ini adalah
beberapa keunggulan dan juga kelebihan DBMS MySQL :

1. Merupakan salah satu software yang portable


2. MySQL merupakan salah satu DBMS yang opensource
3. Multi-User
4. Memiliki tipe data yang bervariasi
5. Memilki fitur keamanan yang baik
6. Administrative tools yang lengkap

12
7. Struktur tabel yang lebih fleksibel
8. Dapat diintegrasikan dengan berbagai bahasa pemrograman
9. Tidak membutuhkan spesifikasi hardware yang tinggi
10. RAM Kecil dapat menggunakannya

2.3.3 Kelemahan MySQL

Meskipun memiliki banyak kelebihan, terutama karena merupakan salah


satu program atau software yang opensource, ternyata MySQL juga memiliki
beberapa kekurangan. Berikut ini adalah beberapa kekurangan MySQL :

1. Sulit untuk diaplikasikan pada intansi atau perusahan dengan database


yang besar
2. Support yang kurang
3. Tidak populer untuk aplikasi game dan mobile

2.4 DataSnap

2.4.1 Pengertian

Sebelumnya dikenal sebagai MIDAS, DataSnap adalah teknologi Delphi


yang memungkinkan pengembangan aplikasi multi-tier, aplikasi database multi-
tier yang paling terkenal. Ada juga dukungan penuh untuk C ++ Builder.
DataSnap tidak bergantung pada MIDAS. DataSnap menawarkan kemungkinan
untuk membuat aplikasi Client-Server yang berkomunikasi melalui Internet,
jaringan lokal, atau localhost. Fitur utama DataSnap adalah kemampuan aplikasi
client untuk memanggil metode yang diimplementasikan pada server. DataSnap
secara otomatis menghasilkan interface yang diperlukan client untuk
berkomunikasi dengan server, yang berisi prototipe metode server.

13
Gambar 2.6 : DataSnap

DataSnap menyediakan cara bagi client untuk berkomunikasi secara aman


dengan server, menggunakan transfer aman konten data JSON (JavaScript
Object Notation) melalui TCP / IP atau HTTP. Kemampuan untuk menentukan
filter di kedua ujung saluran komunikasi, untuk tujuan enkripsi dan kompresi,
meningkatkan keamanan.Manfaat lain dari teknologi DataSnap adalah bahwa ia
menawarkan kemungkinan untuk secara asinkron memberitahukan semua
aplikasi client tentang perubahan yang dibuat ke server, sehingga client dapat
mengambil tindakan yang tepat. Callback tidak mengharuskan client untuk
memanggil salah satu metode server.

2.4.2 Arsitektur DataSnap

Teknologi DataSnap memungkinkan pengembangan aplikasi Client-


Server, di mana baik atau kedua client dan server menjalankan aplikasi Delphi
atau C++ Builder. Komunikasi antara client dan server dapat dilakukan melalui
localhost, jaringan lokal, atau melalui Internet. Anda dapat memilih jenis
koneksi dengan mengatur properti CommunicationProtocol dari komponen
TSQLConnection ke TCP / IP atau HTTP, pada waktu desain.

14
Komunikasi Klien-Server dicapai melalui pertukaran konten data JSON
(JavaScript Object Notation). Respons server juga dapat dikirim dalam format
HTML, menggunakan teknologi WebBroker. Jika firewall berjalan di client atau
server, DataSnap menyediakan opsi untuk merutekan transfer data melalui
terowongan, menimpa firewall dan memungkinkan komunikasi antara client
atau server berlangsung. DataSnap memungkinkan implementasi client atau
server dalam aplikasi yang sama, yang juga dikenal sebagai konektivitas dalam
proses.

15
BAB III

PEMBAHASAN

3.1 Merancang Database MySQL

Sebelum membuat aplikasi pengabsenan haruslah membuat dulu database


aplikasi tersebut. Database digunakan untuk menyimpan seluruh informasi dan
data yang akan digunakan pada aplikasi pengabsenan yang akan dibuat. Database
aplikasi pengabsenan ini dibuat menggunakan software MySQL Workbench 6.0

3.1.1 Membuat Database

Pertama-tama buat database aplikasi pengabsenan dengan nama


“dbabsen”, dengan query sebagai berikut:

CREATE DATABASE IF NOT EXISTS dbabsen;


Source code 3.1 : Query Create Database

3.1.2 Membuat Table

Setelah membuat database buat table sesuai dengan kebutuhan aplikasi


pengabsenan yang akan dibuat, diantaranya adalah tabel-tabel berikut:

a. Tabel tb_akun

Tabel ini digunakan untuk menyimpan data-data akun atau informasi


dari pengguna (user). Dengan query sebagai berikut:

CREATE TABLE tb_akun(


nomor_induk VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL,
pass VARCHAR(50) NOT NULL,
nama VARCHAR(50) NOT NULL,
alamat VARCHAR(100) NOT NULL,
status_id INT(11) NOT NULL,
no_hp VARCHAR(50) NOT NULL,
PRIMARY KEY (nomor_induk),
INDEX (status_id),
FOREIGN KEY (status_id) REFERENCES tb_status (statusid) ON
UPDATE CASCADE
) ENGINE=InnoDB;
Source code 3.2 : Query Create Table tb_akun

16
Tabel 3.1 : Table tb_akun
Nama Field Key Tipe Data Lebar

nomor_induk PK Varchar 50

email - Varchar 50

pass - Varchar 50

nama - Varchar 50

alamat - Varchar 100

Status_id FK INT 11

no_hp - Varchar 50

b. Tabel tb_status

Tabel ini digunakan untuk menyimpan data status (dosen atau


mahsiswa) dan jurusan pengguna (user). Dengan query sebagai berikut:

CREATE TABLE tb_status (


statusid INT(11) NOT NULL AUTO_INCREMENT,
status VARCHAR(50) NOT NULL,
jurusan VARCHAR(50),
PRIMARY KEY (statusid)
) ENGINE=InnoDB;
Source code 3.3 : Query Create Table tb_status

Tabel 3.2 : Table tb_status


Nama Field Key Tipe Data Lebar

statusid PK INT 11

status - Varchar 50

jurusan - Varchar 50

c. Tabel tb_matkul
Tabel ini digunakan untuk menyimpan data mata kuliah yang ada.
Dengan query sebagai berikut:

17
CREATE TABLE tb_matkul (
kode_matkul VARCHAR(50) NOT NULL,
matkul VARCHAR(50) NOT NULL,
PRIMARY KEY (kode_matkul)
)ENGINE=InnoDB;
Source code 3.4 : Query Create Table tb_matkul

Tabel 3.3 : Table tb_matkul


Nama Field Key Tipe Data Lebar

Kode_matkul PK Varchar 50

matkul - Varchar 50

d. Tabel tb_ruang

Tabel ini digunakan untuk menyimpan data ruang kelas yang ada.
Dengan query sebagai berikut:

CREATE TABLE tb_ruang (


kode_ruang VARCHAR(50) NOT NULL,
ruang VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (kode_ruang)
) ENGINE=InnoDB;
Source code 3.5 : Query Create Table tb_ruang

Tabel 3.4 : Table tb_matkul


Nama Field Key Tipe Data Lebar

Kode_ruang PK Varchar 50

ruang - Varchar 50

e. Tabel tb_jadwal
Tabel ini digunakan untuk menyimpan data jadwal mata kuliah yang
ada. Dengan query sebagai berikut:

CREATE TABLE tb_jadwal (


jadwal_id INT(11) NOT NULL AUTO_INCREMENT,
nidn VARCHAR(50) NOT NULL,
kode_ruang VARCHAR(50) NOT NULL,
kode_matkul VARCHAR(50) NOT NULL,

18
jurusan_id INT(11) NOT NULL,
hari VARCHAR(50) NOT NULL,
waktu_masuk TIME NOT NULL,
waktu_keluar TIME NOT NULL,
PRIMARY KEY (jadwal_id),
INDEX (nidn),
INDEX (kode_ruang),
INDEX (kode_matkul),
INDEX (jurusan_id),
FOREIGN KEY (nidn) REFERENCES tb_akun (nomor_induk) ON
UPDATE CASCADE,
FOREIGN KEY (kode_ruang) REFERENCES tb_ruang (kode_ruang)
ON UPDATE CASCADE,
FOREIGN KEY (kode_matkul) REFERENCES tb_matkul
(kode_matkul) ON UPDATE CASCADE,
FOREIGN KEY (jurusan_id) REFERENCES tb_status (statusid) ON
UPDATE CASCADE
)ENGINE=InnoDB;
Source code 3.6 : Query Create Table tb_jadwal

Tabel 3.5 : Table tb_jadwal


Nama Field Key Tipe Data Lebar

Jadwal_id PK INT 11

nidn FK Varchar 50

Kode_ruang FK Varchar 50

Kode_matkul FK Varchar 50

Jurussan_id FK INT 11

hari - Varchar 50

Waktu_masuk - Time -

Waktu_keluar - Time -

f. Tabel tb_absenmhs
Tabel ini digunakan untuk menyimpan data absen mahasiswa. Dengan
query sebagai berikut:
CREATE TABLE tb_absenmhs (
absenmhs_id INT(11) NOT NULL AUTO_INCREMENT,

19
nim VARCHAR(50) NOT NULL,
waktu_absen TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
jadwal_id INT(11) NOT NULL,
ket VARCHAR(50) NULL DEFAULT NULL,
foto VARCHAR(50) NULL DEFAULT NULL,
verify TINYINT(1) NOT NULL DEFAULT '0',
lihat_foto VARCHAR(50) NOT NULL DEFAULT 'Lihat Foto',
PRIMARY KEY (absenmhs_id),
INDEX (nim),
INDEX (jadwal_id),
FOREIGN KEY (nim) REFERENCES tb_akun (nomor_induk) ON
UPDATE CASCADE,
FOREIGN KEY (jadwal_id) REFERENCES tb_jadwal (jadwal_id) ON
UPDATE CASCADE
)ENGINE=InnoDB;
Source code 3.7 : Query Create Table tb_absenmhs

Tabel 3.6 : Table tb_absenmhs


Nama Field Key Tipe Data Lebar

Absnemhs_id PK INT 11

nim FK Varchar 50

Waktu_absen - Timestamp -

Jadwal_id FK INT 11

ket - Varchar 50

foto - Varchar 50

verify - Tinyint 1

Lihat_foto - Varchar 50

3.1.3 Skema Diagram Database

Ketika database dan Tabel selesai. maka skema diagram database adalah
seperti berikut:

20
Gambar 3.7 : Skema diagram database dbabsen

3.2 Merancang Aplikasi Mobile (Android)

Aplikasi pengabsenan yang akan dirancang menggunakan software RAD


Studio 10.2. Untuk menghubungkan database dengan aplikasi android yang akan
dibuat, menggunakan sistem datasnap yang ada di software RAD Studio 10.2.
Berikut adalah langkah-angkah membangun dan merancang aplikasi android
pengabsenan:

21
3.2.1 Membuat Datasnap Server

Buka aplikasi RAD Studio 10.2 klik File > New > Other > Delphi
Project > Datasnap Server > Datasnap Server, Seperti gambar dibawah ini:

Gambar 3.8 : Membuat datasnap server

Setelah itu akan muncul unit-unit diantaranya Unit1, ServerMethodsUnit1,


ServerContainerUnit1. Pada Unit1 desain form seperti gambar dibawah ini:

Gambar 3.9 : Desain Form server

22
Dengan source code sebagai berikut:

procedure TForm1.btnPortClick(Sender: TObject);


begin
if btnPort.Caption = 'Start' then
begin
ServerContainer1.DSTCPServerTransport1.Port :=
StrToInt(edtPort.Text);
ServerContainer1.DSServer1.Start;
if ServerContainer1.DSServer1.Started then
begin
btnPort.Caption := 'Stop';
end
end
else
begin
ServerContainer1.DSServer1.Stop;
if not ServerContainer1.DSServer1.Started then
begin
btnPort.Caption := 'Start';
end;
end;
end;
Source code 3.8 : btn_port form server

Setelah itu tambahakan komponen-komponen ke unit ServerMethodUnit1


untuk menyambugkan database dengan aplikasi android. Berikut komponen-
kompenen yang ditambahkan:

a. FDConnection

b. FDQuery

c. DataSetProvider

d. ClientDataSet

Seperti gambar berikut:

23
Gambar 3.10 : Komponen-komponen di ServerMethodsUnit1

Setelah selesai menambahkan semua komponen diatas, konfigurasikan


kompononen-komponen diatas seperti berikut:

a. Konfigurasi AbsenConnection

Gambar 3.11 : Konfigurasi AbsenConnection

24
b. Konfigurasi FDQuery Tb_MatkulTable

Gambar 3.12 : Konfigurasi query Tb_MatkulTable

Setelah itu konfigurasi DSP_matkul seagai berikut:

Gambar 3.13 : Konfigurasi DSP_matkul

c. Konfigurasi FDQuery Tb_akunTable

25
Gambar 3.14 : Konfigurasi query Tb_akunTable
Dan setelah itu konfiguraskan tab parameters seperti berikut:

Gambar 3.15 : Konfigurasi parameters Tb_akunTable

Setelah itu konfigurasi DSP_matkul seagai berikut:

26
Gambar 3.16 : Konfigurasi DSP_akun

Dan konfigurasi CDS_akun sebagai berikut:

Gambar 3.17 : Konfigurasi CDS_akun

d. Konfigurasi FDQuery Tb_statusTable

Gambar 3.18 : Konfigurasi query Tb_statusTable

27
Setelah itu konfigurasi DSP_matkul seagai berikut:

Gambar 3.19 : Konfigurasi DSP_status

e. Konfigurasi FDQuery combobox

Gambar 3.20 : Konfigurasi query combobox

Setelah itu konfigurasi DSP_matkul seagai berikut:

28
Gambar 3.21 : Konfigurasi DSP_combobox

f. Konfigurasi FDQuery jadwal

Gambar 3.22 : Konfigurasi query jadwal

Dan setelah itu konfiguraskan tab parameters seperti berikut:

29
Gambar 3.23 : Konfigurasi parameters jadwal

Setelah itu konfigurasi DSP_jadwal seagai berikut:

Gambar 3.24 : Konfigurasi DSP_jadwal

Dan konfigurasi CDS_jadwal sebagai berikut:

Gambar 3.25 : Konfigurasi CDS_jadwal

30
g. Konfigurasi FDQuery Tb_ruangTable

Gambar 3.26 : Konfigurasi query Tb_ruangTable

Setelah itu konfigurasi DSP_Tb_ruangTable seagai berikut:

Gambar 3.27 : Konfigurasi DSP_ruang

31
h. Konfigurasi FDQuery Tb_absenmhsTable

Gambar 3.28 : Konfigurasi query Tb_absenmhsTable

Setelah itu konfigurasi DSP_Tb_absenmhsTable seagai berikut:

Gambar 3.29 : Konfigurasi DSP_absenmhs

32
i. Konfigurasi FDQuery verify

Gambar 3.30 : Konfigurasi query verify

Dan setelah itu konfiguraskan tab parameters seperti berikut:

Gambar 3.31 : Konfigurasi parameters verify

Setelah itu konfigurasi DSP_jadwal seagai berikut:

33
Gambar 3.32 : Konfigurasi DSP_verify

Dan konfigurasi CDS_jadwal sebagai berikut:

Gambar 3.33 : Konfigurasi CDS_verify

Setelah semuanya sudah di konfigurasi maka tambahkan function upload


dan download dalam source code unit ServerMethodsUnit1, seperti di bawah ini:

// Function Download_____________________________________________
function TServerMethods1.Download(const Title: string; out Size: Int64):
TStream;
var
PathFolder : string;
begin
PathFolder := ExtractFilePath('E:\UAS\foto\');
Result := TFileStream.Create(PathFolder + Title, fmOpenRead OR
fmShareDenyNone);
Size := Result.Size;
Result.Position := 0;
end;
//_____________________________________________________________
// Function Upload_______________________________________________
function TServerMethods1.Upload(const Title: string; size: Int64;

34
const AStream: TStream): Boolean;
var
FileStream : TStream;
Mem : TMemoryStream;
Buffer : PByte;
BytesRead, BufSize : Integer;
PathFolder : string;
begin
Result := True;
BufSize := 1024;
try
Mem := TMemoryStream.Create;
GetMem(Buffer, BufSize);
try
FileStream := AStream;
FileStream.Position := 0;
repeat
BytesRead := FileStream.Read(Pointer(Buffer)^, BufSize);
if (BytesRead) > 0 then begin
Mem.WriteBuffer(Pointer(Buffer)^,BytesRead);
end;
until (BytesRead < Bufsize);

PathFolder := ExtractFilePath('E:\UAS\foto\') + Title;


Mem.SaveToFile(PathFolder);
finally
FreeMem(Buffer, BufSize);
FreeAndNil(Mem);
end;
except on E: Exception do begin
Result := False;
end;
end;
end;
//_____________________________________________________________

Source code 3.9 : Function upload & download

3.2.2 Membuat Aplikasi Mobile (Android)

Buka aplikasi RAD Studio 10.2 klik File > New > Other > Delphi Project >
Multi-Device Project > Blank Application, seperti dibawah ini:

35
Gambar 3.34 : Membuat Aplikasi android

Setelah itu, membuat beberapa form yang di butuhkan untuk membuat


aplikasi android, seperti di bawah ini:

a. Form Login

1. Desain Form

Gambar 3.35 : Desain form login

36
2. Komponen Form

Tabel 3.7 : Komponen form log in


Name Caption/Text Object

TabControl1 - TTabControl

LoginTab - TTabItem

VSB - TVertScrollbox

LogoLayout -

FormLayout -

FooterLayout -

Layout1 - TLayout

Layout2 -

Layout3 -

Layout4 -

LogoImage - TImage

Aplikasi Layanan
Logolabel TLabel
Absen

LoginButton Masuk TButton

RegisterButton Daftar

UsernameEdit Username TEdit

PasswordEdit Password

UserImage - TImage

LockImage -

3. Source Code

// LOG IN_________________________________________________________
procedure TClientForm.LoginFrame1LoginButtonClick(Sender: TObject);
begin
if (LoginFrame1.usernameedit.text = EmptyStr)

37
or (LoginFrame1.passwordedit.text = EmptyStr) then
begin
ShowMessage('Masukan username/password !');
end
else
begin
with ClientModule1.CDS_akun do
begin
Close;
ParamByName('email').Value := loginframe1.UsernameEdit.Text;
Open;
if RecordCount = 0 then begin
ShowMessage('username atau password salah');
end
else
begin
if (FieldByName('pass').Text <>
LoginFrame1.passwordedit.Text) then
begin
ShowMessage('username atau password salah');
end
else
begin
if (FieldByName('status').Text = 'dosen') then
begin
TabControl1.ActiveTab := MainDosen;
Label2.Text := FieldByName('nama').Text;
Label1.Text := FieldByName('jurusan').Text;
InfoFrame1.lbl_nama.Text :=
FieldByName('nama').Text;
InfoFrame1.lbl_noin.Text :=
FieldByName('nomor_induk').Text;
InfoFrame1.lbl_alamat.Text :=
FieldByName('alamat').Text;
InfoFrame1.lbl_email.Text :=
FieldByName('email').Text;
InfoFrame1.lbl_no.Text :=
FieldByName('no_hp').Text;
InfoFrame1.L6.Visible := False;
end
else if (FieldByName('status').Text = 'mahasiswa') then
begin
TabControl1.ActiveTab := MainMhs;
Label2.Text := FieldByName('nama').Text;
Label1.Text := FieldByName('jurusan').Text;
InfoFrame1.lbl_nama.Text :=
FieldByName('nama').Text;

38
InfoFrame1.lbl_noin.Text :=
FieldByName('nomor_induk').Text;
InfoFrame1.lbl_alamat.Text :=
FieldByName('alamat').Text;
InfoFrame1.lbl_email.Text :=
FieldByName('email').Text;
InfoFrame1.lbl_no.Text :=
FieldByName('no_hp').Text;
InfoFrame1.lbl_jurusan.Text :=
FieldByName('jurusan').Text;
end;
end;
end;
end;
ClientModule1.CDS_matkul.Close;
ClientModule1.CDS_matkul.CommandText :=
'select kode_matkul, matkul from tb_matkul where kode_matkul like "' +
ClientModule1.CDS_akun.FieldByName('status_id').text +'-%";';
ClientModule1.CDS_matkul.Open;

with ClientModule1.CDS_jadwal do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
open;
end;

with ClientModule1.CDS_verify do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
ParamByName('matkul').Value :=
DosenMainFrame1.combo_matkul.Text;
open;
end;
end;
end;
//_________________________________________________________________

Source code 3.10 : LoginButton form login

procedure TClientForm.LoginFrame1RegisterButtonClick(Sender: TObject);


begin
TabControl1.ActiveTab := DaftarTab;
end;
Source code 3.11 : RegisterButton form login

39
b. Form Register

1. Desain Form

Gambar 3.36 : Desain form register


2. Komponen Form

Tabel 3.8 : Komponen form register


Name Caption/Text Object

TabControl1 - TTabControl

DaftarTab - TTabItem

VSB - TVertScrollbox

FormLayout - TLayout

FooterLayout -

Layout1 -

Layout2 -

Edit1 Nama Lengkap

Edit2 NIDN/NIM

Edit3 E-mail

40
Edit4 Password TEdit

Edit5 Re-type Password

Edit6 Alamat

Edit7 No. Hp

Image1 - TImage

ComboEdit1 - TComboEdit

Button1 Daftar TButton

Button2 Kembali

3. Source Code

procedure TClientForm.regFrame1Edit5Change(Sender: TObject);


begin
regFrame1.Edit5Change(Sender);
end;
Source code 3.12 : Edit5 form register

procedure TClientForm.regFrame1Button1Click(Sender: TObject);

begin
ClientModule1.CDS_akun.close;
ClientModule1.CDS_akun.open;

if regFrame1.Edit5.Text <> regFrame1.Edit4.Text then


begin
ShowMessage('Validasi Password Tidak Cocok');
end
else if (regFrame1.Edit1.Text = '')
or (regFrame1.Edit2.Text = '')
or (regFrame1.Edit4.Text = '')
or (regFrame1.Edit5.Text = '')
or (regFrame1.Edit6.Text = '')
or (regFrame1.Edit7.Text = '')
or (regFrame1.comboedit1.items.text = '') then
begin
ShowMessage('Data Tidak Lengkap');
end
else
begin
clientmodule1.CDS_akun.Insert;

41
clientmodule1.CDS_akun.FieldByName('nomor_induk').AsString :=
regFrame1.edit2.Text;
clientmodule1.CDS_akun.FieldByName('nama').AsString :=
regFrame1.edit1.Text;
clientmodule1.CDS_akun.FieldByName('email').AsString :=
regFrame1.edit3.Text;
clientmodule1.CDS_akun.FieldByName('pass').AsString :=
regFrame1.edit4.Text;
clientmodule1.CDS_akun.FieldByName('status_id').AsInteger :=
regFrame1.Comboedit1.ItemIndex + 1;
clientmodule1.CDS_akun.FieldByName('alamat').AsString :=
regFrame1.edit6.Text;
clientmodule1.CDS_akun.FieldByName('no_hp').AsString :=
regFrame1.edit7.Text;
ClientModule1.CDS_akun.Post;
ClientModule1.CDS_akun.ApplyUpdates(-1);
ShowMessage('Pendaftaran Berhasil');
end;
end;
Source code 3.13 : Button1 form register

procedure TClientForm.regFrame1Button2Click(Sender: TObject);


begin
TabControl1.ActiveTab := LognTab;
end;
Source code 3.14 : Button2 form register

c. Form MainDosen

1. Desain Form

Gambar 3.37 : Desain form MainDosen

42
2. Komponen Form

Tabel 3.9 : Komponen form MainDosen


Name Caption/Text Object

TabControl1 - TTabControl

MainDosenTab - TTabItem

VertScrollBox1 - TVertScrollbox

Layout1 -

L_button_refresh - TLayout

L_btnkirim -

Rectangle1 - TRectangle

Rectangle2 -

Verify_grid - TStringgrid

ListBox1 - TListBox

Toolbar1 - TToolbar

Combo_matkul - TComboEdit

Label1 Mata Kuliah: TLabel

Btn_refresh_image - TImage

Btn_kirim_image -

SpeedButton1 -

Btn_refresh - TButton

Btn_kirim -

3. Source Code

procedure TClientForm.DosenMainFrame1btn_kirimClick(Sender: TObject);


var row:integer;
begin
with ClientModule1.CDS_verify do
begin

43
edit;
for row := 0 to DosenMainFrame1.verify_grid.RowCount-1 do
begin
FieldByName('verify').AsString :=
DosenMainFrame1.verify_grid.Cells[2,row];
end;
post;
ApplyUpdates(-1);
ShowMessage('Success');
end;
end;

Source code 3.15 : btn_kirim form MainDosen

procedure TClientForm.DosenMainFrame1btn_refreshClick(Sender: TObject);


begin
ClientModule1.CDS_verify.close;
ClientModule1.CDS_verify.open;
ClientModule1.CDS_absenmhs.close;
ClientModule1.CDS_absenmhs.open;
with ClientModule1.CDS_jadwal do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
open;
end;

with ClientModule1.CDS_verify do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
ParamByName('matkul').Value :=
DosenMainFrame1.combo_matkul.Text;
open;
end;
end;
procedure TClientForm.DosenMainFrame1combo_matkulChange(Sender:
TObject);
begin
with ClientModule1.CDS_jadwal do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
open;
end;

with ClientModule1.CDS_verify do
begin

44
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
ParamByName('matkul').Value :=
DosenMainFrame1.combo_matkul.Text;
open;
end;
end;
Source code 3.16 : btn_refresh form MainDosen

procedure TClientForm.DosenMainFrame1ListBox1Click(Sender: TObject);


begin
nama_foto := ClientModule1.CDS_verify.FieldByName('foto').Text;
PDownloadImage;
TabControl1.ActiveTab := fotoTab;
end;
Source code 3.17 : Listbox1 form MainDosen

d. Form MainMhs

1. Desain Form

Gambar 3.38 : Desain form MainMhs


2. Komponen Form

Tabel 3.10 : Komponen form MainMhs


Name Caption/Text Object

45
TabControl1 - TTabControl

MainMhsTab - TTabItem

VSB - TVertScrollbox

ActionList1 - TActionList

Toolbar1 - TToolbar

Layout1 -

LMhsFrame -

Lfoto - TLayout

Lkanan -

Lkiri -

Lengah -

Rectangle1 - TRectangle

Rectangle3 -

Combo_matkul - TComboEdit

Label1 Mata kuliah : TLabel

Btn_kamera -

Btn_kirim - TButton

Speedbutton1 -

Btn_kamera_image -

Btn_kirim_image - TImage

foto -

3. Source Code

procedure
TClientForm.mainMhsFrame1TakePhotoFromCameraAction1DidFinishTaking(
Image: TBitmap); //take photo
begin
mainMhsFrame1.foto.Bitmap.Assign(image);

46
try
imagestream := Tmemorystream.create;
mainMhsFrame1.foto.Bitmap.SaveToStream(imagestream);
sizeimage := imagestream.Size;
imagestream.Position := 0;
except on E: exception do
ShowMessage(e.Message);
end;
end;
Source code 3.18 : TakePhotoFromCameraActionList1 form MainMhs

procedure TClientForm.mainMhsFrame1btn_kirimClick(Sender: TObject);


// upload data
var jadwal_id : string;
sekarang : TDateTime;
waktu : string;
begin
try
sekarang := now;
waktu := FormatDateTime('yyyymmdd_hhmmss',sekarang);
nama_foto := InfoFrame1.lbl_noin.Text +'_'+ waktu + '.jpg';

with ClientModule1.cds_jadwal do
begin
close;
parambyname('matkul').value := mainMhsFrame1.Combo_matkul.Text;
open;
jadwal_id := FieldByName('jadwal_id').text;
close;
end;

clientmodule1.CDS_absenmhs.Insert;
clientmodule1.CDS_absenmhs.FieldByName('nim').AsString :=
InfoFrame1.lbl_noin.Text;
clientmodule1.CDS_absenmhs.FieldByName('jadwal_id').AsInteger :=
strtoint(jadwal_id);
clientmodule1.CDS_absenmhs.FieldByName('foto').AsString := nama_foto;
ClientModule1.CDS_absenmhs.Post;
ClientModule1.CDS_absenmhs.ApplyUpdates(-1);
ShowMessage('Berhasil Dikirim');

if
ClientModule1.ServerMethods1Client.Upload(nama_foto,sizeimage,imagestream
) then
begin
imagestream.Free;
end
else ShowMessage('Upload Gagal');

47
except on E: Exception do
ShowMessage(e.Message);
end;
end;
Source code 3.19 : btn_kirim form MainMhs

e. Form Info

1. Desain Form

Gambar 3.39 : Desain form Info


2. Komponen Form

Tabel 3.11 : Komponen form Info


Name Caption/Text Object

TabControl1 - TTabControl

InfoTab - TTabItem

VSB - TVertScrollbox

Toolbar1 - TToolbar

Image1 - TImage

48
Btn_back - TButton

Rectangle1 - TRectangle

Rectangle2 - TRectangle

Layout1 -

L1 -

L2 -

L3 - TLayout

L4 -

L5 -

L6 -

Label1 Nama :

Label2 NIM / NIDN :

Label3 Alamat :

Label4 e-mail :

Label5 No. Hp

Label6 Jurusan : TLabel

Lbl_nama ‘’

Lbl_noin ‘’

Lbl_alamat ‘’

Lbl_email ‘’

Lbl_no ‘’

Lbl_jurusan ‘’

3. Source Code

procedure TClientForm.InfoFrame1btn_backClick(Sender: TObject);


begin
if InfoFrame1.L6.Visible = True then

49
TabControl1.ActiveTab := mainMhs
else TabControl1.ActiveTab := mainDosen;
end;

Source code 3.20 : btn_back form info

f. Form Foto

1. Desain Form

Gambar 3.40 : Desain form foto

2. Komponen Form

Tabel 3.12 : Komponen form foto


Name Caption/Text Object

TabControl1 - TTabControl

FotoTab - TTabItem

Layout1 - Tlayout

ProgressBar1 - TProgressBar

Toolbar1 - TToolbar

50
Rectangle1 - TRectangle

Image1 - TImage

Btn_back_image -

Btn_back - TButton

4. Source Code

procedure TClientForm.fotoFrame1btn_backClick(Sender: TObject);


begin
TabControl1.ActiveTab := mainDosen;
end;
Source code 3.21 : btn_back form foto

3.2.3 Membuat DataSnap Client

Setelah selesai merancang dan mendesain aplikasi android selanjutnya


merancang ClientModule, caranya ke File > New > Other > Delphi Projects >
Datasnap Server > Datasnap Client Module, seperti di bawah ini:

Gambar 3.41 : Membuat Datasnap Client Module

Setelah selesai tambahkan komponen-komponen pada


ClientModuleUnit1, seperti di bawah ini:

51
Gambar 3.42 : Komponen-komponen ClientModuleUnit1

Konfigurasikan komponen SQLConnection1 diatas. Tambahkan nama


pada ServerClassName dengan nama server methods yang berada pada data
snap server, seperti dibawah ini:

Gambar 3.43 : Konfigurasi SQLConnection1

52
Setelah selesai konfigurasikan DSProviderConnection1 tambahkan nama
pada ServerClassName dengan nama server methods yang berada pada datasnap
server, seperti di bawah ini:

Gambar 3.44 : Konfigurasi DSProviderConnection1

Setelah selesai konfigurasikan pada setiap ClientDataSet pada properti


RemoteServer masukan DSProviderConnection1 setelah selesai, maka pada
ProviderName masukan masing-masing DataSetProvider pada masing-masing
ClientDataSet, seperti contoh pada CDS_akun di bawah ini:

Gambar 3.45 : Konfigurasi ClientDataSet

Setelah selesai semuanya di konfigurasi lanjut konfigrasi livebinding


dengan cara klik kanan pada form > bind visualy, seperti di bawah ini:

53
Gambar 3.46 : Membuka Live Binding

Setelah itu maka akan muncul livebinding dan konfigurasi seperti contoh
di bawah ini:

Jika pada setiap ClientDataSet tidak ada maka harus di uses


ClientModuleUnit1.pas terlebih dahulu, jika invalid pada CDS maka harus di
connection pada setiap CDS dan SQLConnection pada ClientModule1.

Gambar 3.47 : Konfigurasi Live Binding

54
3.3 Screenshoot Hasil Jadi Aplikasi Mobile (Android)

Setelah menyelesaikan tahapan-tahapan diatas maka hasil jadi dari Aplikasi


Android Pengabsenan yang dibuat akan tampak seperti dibawah ini :

Gambar 3.48 : Tampilan form login & daftar

Gambar 3.49 : Tampilan form daftar

55
Gambar 3.50 : Tampilan capture photo mahasiswa

Gambar 3.51 : Tampilan pengiriman absen

Gambar 3.52 : Tampilan informasi akun

56
Gambar 3.53 : Tampilan verifikasi absen mahasiswa oleh dosen

Gambar 3.54 : Tampilan melihat foto absen mahasiswa oleh dosen

57
BAB IV

PENUTUP

4.1 Kesimpulan

Perancangan dan pembuatan aplikasi pengabsenann kuliah ini bertujuan


untuk mempermudah staff terkait untuk mengontrol dan melaksanakan proses
pengabsenan di perguruan tinggi maupun sekolah. Aplikasi ini juga
mempermudah dosen, guru, mahasiswa, ataupun siswa untuk melihat dan
menjalankan pengabsenan.

Pembuatan aplikasi pengabsenan ini juga sebagai penerapan mata kuliah


algoritma dan struktur data khususnya materi tentang struktur data dan
database. Aplikasi ini menerapkan sistem datasnap yang memungkinkan untuk
mengembangkan apikasi multi-tier, dan menerapkan cara penggunaan
database MySQL serta cara-cara pembuatan aplikasi berbasis mobile(android).

4.2 Saran

Saran yang dapat diberikan untuk pengembangan aplikasi pengabsenan ini


adalah:

1. Pengembangan rancangan sistem pengabsenan ini diharapkan lebih


kompleks dan lebih baik lagi.

2. Pengembangan rancangan sistem pengabsenan ini diharapakan dapat


terintegrasi dengan web sehingga dapat memudahkan.

3. Pengguna sistem diharapkan memenuhi segala prosedur yang ada yang


dibutuhkan oleh sistem untuk mengimplementasikan sistem pengabsenan
ini.

58
DAFTAR PUSTAKA

http://woocara.blogspot.com/2016/02/pengertian-algoritma-contoh-algoritma.html
(diakses pada tanggal 30 Juli 2018)

https://www.mahirkoding.com/pengenalan-struktur-data/ (diakses pada tanggal 30


Juli 2018)

https://mnurmusa.wordpress.com/2017/03/24/algoritma-dan-struktur-data/
(diakses pada tanggal 30 Juli 2018)

https://id.wikipedia.org/wiki/SQL (diakses pada tanggal 30 Juli 2018)

https://upyes.wordpress.com/2013/02/06/pengertian-dan-sejarah-mysql/ (diakses
pada tanggal 30 Juli 2018)

https://dosenit.com/software/dbms/mysql/kelebihan-dan-kekurangan-mysql-server
(diakses pada tanggal 30 Juli 2018)
LAMPIRAN – LAMPIRAN

 Soure code form server

unit FUtama;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
edtPort: TEdit;
btnPort: TButton;
Label1: TLabel;
procedure btnPortClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation

{$R *.dfm}

uses ServerContainerUnit1, ServerMethodsUnit1;

procedure TForm1.btnPortClick(Sender: TObject);


begin
if btnPort.Caption = 'Start' then
begin
ServerContainer1.DSTCPServerTransport1.Port := StrToInt(edtPort.Text);
ServerContainer1.DSServer1.Start;
if ServerContainer1.DSServer1.Started then
begin
btnPort.Caption := 'Stop';
end
end
else
begin
ServerContainer1.DSServer1.Stop;
if not ServerContainer1.DSServer1.Started then
begin
btnPort.Caption := 'Start';
end;
end;
end;
end.
 Soure code form ServerMethodsUnit1

unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, System.Json,


DataSnap.DSProviderDataModuleAdapter,
Datasnap.DSServer, Datasnap.DSAuth, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQL,
FireDAC.Phys.MySQLDef, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf, FireDAC.DApt, Datasnap.DBClient, Datasnap.Provider,
Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
TServerMethods1 = class(TDSServerModule)
AbsenConnection: TFDConnection;
Tb_akunTable: TFDQuery;
Tb_statusTable: TFDQuery;
DSP_akun: TDataSetProvider;
combobox: TFDQuery;
DSP_status: TDataSetProvider;
DSP_combobox: TDataSetProvider;
Tb_statusTablestatusid: TFDAutoIncField;
Tb_statusTablestatus: TStringField;
Tb_statusTablejurusan: TStringField;
Tb_akunTablenomor_induk: TStringField;
Tb_akunTableemail: TStringField;
Tb_akunTablepass: TStringField;
Tb_akunTablenama: TStringField;
Tb_akunTablealamat: TStringField;
Tb_akunTablestatus_id: TIntegerField;
Tb_akunTableno_hp: TStringField;
Tb_akunTablestatus: TStringField;
Tb_akunTablejurusan: TStringField;
CDS_akun: TClientDataSet;
CDS_akunnomor_induk: TStringField;
CDS_akunemail: TStringField;
CDS_akunpass: TStringField;
CDS_akunnama: TStringField;
CDS_akunalamat: TStringField;
CDS_akunstatus_id: TIntegerField;
CDS_akunno_hp: TStringField;
CDS_akunstatus: TStringField;
CDS_akunjurusan: TStringField;
Tb_ruangTable: TFDQuery;
Tb_ruangTablekode_ruang: TStringField;
Tb_ruangTableruang: TStringField;
DSP_ruang: TDataSetProvider;
DSP_absenmhs: TDataSetProvider;
jadwal: TFDQuery;
DSP_jadwal: TDataSetProvider;
CDS_jadwal: TClientDataSet;
jadwaljadwal_id: TFDAutoIncField;
jadwalnidn: TStringField;
jadwalkode_ruang: TStringField;
jadwalkode_matkul: TStringField;
jadwaljurusan_id: TIntegerField;
jadwalhari: TStringField;
jadwalwaktu_masuk: TTimeField;
jadwalwaktu_keluar: TTimeField;
jadwalmatkul: TStringField;
CDS_jadwaljadwal_id: TAutoIncField;
CDS_jadwalnidn: TStringField;
CDS_jadwalkode_ruang: TStringField;
CDS_jadwalkode_matkul: TStringField;
CDS_jadwaljurusan_id: TIntegerField;
CDS_jadwalhari: TStringField;
CDS_jadwalwaktu_masuk: TTimeField;
CDS_jadwalwaktu_keluar: TTimeField;
CDS_jadwalmatkul: TStringField;
DSP_matkul: TDataSetProvider;
Tb_matkulTable: TFDQuery;
Tb_absenmhsTable: TFDQuery;
verify: TFDQuery;
DSP_verify: TDataSetProvider;
CDS_verify: TClientDataSet;
verifynim: TStringField;
verifywaktu_absen: TSQLTimeStampField;
verifyjadwal_id: TIntegerField;
verifyket: TStringField;
verifyfoto: TStringField;
verifyverify: TBooleanField;
verifylihat_foto: TStringField;
verifynama: TStringField;
verifynidn: TStringField;
verifykode_ruang: TStringField;
verifykode_matkul: TStringField;
verifyjurusan_id: TIntegerField;
verifyhari: TStringField;
verifywaktu_masuk: TTimeField;
verifymatkul: TStringField;
CDS_verifynim: TStringField;
CDS_verifywaktu_absen: TSQLTimeStampField;
CDS_verifyjadwal_id: TIntegerField;
CDS_verifyket: TStringField;
CDS_verifyfoto: TStringField;
CDS_verifyverify: TBooleanField;
CDS_verifylihat_foto: TStringField;
CDS_verifynama: TStringField;
CDS_verifynidn: TStringField;
CDS_verifykode_ruang: TStringField;
CDS_verifykode_matkul: TStringField;
CDS_verifyjurusan_id: TIntegerField;
CDS_verifyhari: TStringField;
CDS_verifywaktu_masuk: TTimeField;
CDS_verifymatkul: TStringField;
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
function Download(const Title: string; out Size: Int64): TStream;
function Upload(const Title : string; size : Int64; const AStream : TStream) : Boolean;
end;

implementation

{$R *.dfm}

uses System.StrUtils;

// Function Download____________________________________________________________
function TServerMethods1.Download(const Title: string; out Size: Int64): TStream;
var
PathFolder : string;
begin
PathFolder := ExtractFilePath('E:\UAS\foto\');
Result := TFileStream.Create(PathFolder + Title, fmOpenRead OR fmShareDenyNone);
Size := Result.Size;
Result.Position := 0;
end;
//______________________________________________________________________________

// Function Upload______________________________________________________________
function TServerMethods1.Upload(const Title: string; size: Int64;
const AStream: TStream): Boolean;
var
FileStream : TStream;
Mem : TMemoryStream;
Buffer : PByte;
BytesRead, BufSize : Integer;
PathFolder : string;
begin
Result := True;
BufSize := 1024;
try
Mem := TMemoryStream.Create;
GetMem(Buffer, BufSize);
try
FileStream := AStream;
FileStream.Position := 0;
repeat
BytesRead := FileStream.Read(Pointer(Buffer)^, BufSize);
if (BytesRead) > 0 then begin
Mem.WriteBuffer(Pointer(Buffer)^,BytesRead);
end;
until (BytesRead < Bufsize);

PathFolder := ExtractFilePath('E:\UAS\foto\') + Title;


Mem.SaveToFile(PathFolder);
finally
FreeMem(Buffer, BufSize);
FreeAndNil(Mem);
end;
except on E: Exception do begin
Result := False;
end;
end;
end;
//______________________________________________________________________________

function TServerMethods1.EchoString(Value: string): string;


begin
Result := Value;
end;

function TServerMethods1.ReverseString(Value: string): string;


begin
Result := System.StrUtils.ReverseString(Value);
end;

end.

 Soure code form ClientClassesUnit1

//
// Created by the DataSnap proxy generator.
// 7/22/2018 11:39:32 PM
//

unit ClientClassesUnit1;

interface

uses System.JSON, Data.DBXCommon, Data.DBXClient, Data.DBXDataSnap, Data.DBXJSON,


Datasnap.DSProxy, System.Classes, System.SysUtils, Data.DB, Data.SqlExpr,
Data.DBXDBReaders, Data.DBXCDSReaders, Data.DBXJSONReflect;

type
TServerMethods1Client = class(TDSAdminClient)
private
FEchoStringCommand: TDBXCommand;
FReverseStringCommand: TDBXCommand;
FDownloadCommand: TDBXCommand;
FUploadCommand: TDBXCommand;
public
constructor Create(ADBXConnection: TDBXConnection); overload;
constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean);
overload;
destructor Destroy; override;
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
function Download(Title: string; out Size: Int64): TStream;
function Upload(Title: string; size: Int64; AStream: TStream): Boolean;
end;

implementation

function TServerMethods1Client.EchoString(Value: string): string;


begin
if FEchoStringCommand = nil then
begin
FEchoStringCommand := FDBXConnection.CreateCommand;
FEchoStringCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FEchoStringCommand.Text := 'TServerMethods1.EchoString';
FEchoStringCommand.Prepare;
end;
FEchoStringCommand.Parameters[0].Value.SetWideString(Value);
FEchoStringCommand.ExecuteUpdate;
Result := FEchoStringCommand.Parameters[1].Value.GetWideString;
end;

function TServerMethods1Client.ReverseString(Value: string): string;


begin
if FReverseStringCommand = nil then
begin
FReverseStringCommand := FDBXConnection.CreateCommand;
FReverseStringCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FReverseStringCommand.Text := 'TServerMethods1.ReverseString';
FReverseStringCommand.Prepare;
end;
FReverseStringCommand.Parameters[0].Value.SetWideString(Value);
FReverseStringCommand.ExecuteUpdate;
Result := FReverseStringCommand.Parameters[1].Value.GetWideString;
end;

function TServerMethods1Client.Download(Title: string; out Size: Int64): TStream;


begin
if FDownloadCommand = nil then
begin
FDownloadCommand := FDBXConnection.CreateCommand;
FDownloadCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FDownloadCommand.Text := 'TServerMethods1.Download';
FDownloadCommand.Prepare;
end;
FDownloadCommand.Parameters[0].Value.SetWideString(Title);
FDownloadCommand.ExecuteUpdate;
Size := FDownloadCommand.Parameters[1].Value.GetInt64;
Result := FDownloadCommand.Parameters[2].Value.GetStream(FInstanceOwner);
end;

function TServerMethods1Client.Upload(Title: string; size: Int64; AStream: TStream): Boolean;


begin
if FUploadCommand = nil then
begin
FUploadCommand := FDBXConnection.CreateCommand;
FUploadCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FUploadCommand.Text := 'TServerMethods1.Upload';
FUploadCommand.Prepare;
end;
FUploadCommand.Parameters[0].Value.SetWideString(Title);
FUploadCommand.Parameters[1].Value.SetInt64(size);
FUploadCommand.Parameters[2].Value.SetStream(AStream, FInstanceOwner);
FUploadCommand.ExecuteUpdate;
Result := FUploadCommand.Parameters[3].Value.GetBoolean;
end;

constructor TServerMethods1Client.Create(ADBXConnection: TDBXConnection);


begin
inherited Create(ADBXConnection);
end;

constructor TServerMethods1Client.Create(ADBXConnection: TDBXConnection;


AInstanceOwner: Boolean);
begin
inherited Create(ADBXConnection, AInstanceOwner);
end;

destructor TServerMethods1Client.Destroy;
begin
FEchoStringCommand.DisposeOf;
FReverseStringCommand.DisposeOf;
FDownloadCommand.DisposeOf;
FUploadCommand.DisposeOf;
inherited;
end;

end.

 Soure code form ClientModuleUnit1

unit ClientModuleUnit1;

interface

uses
System.SysUtils, System.Classes, ClientClassesUnit1, Data.DBXDataSnap,
Data.DBXCommon, IPPeerClient, Data.DB, Data.SqlExpr, Datasnap.DBClient,
Datasnap.DSConnect;

type
TClientModule1 = class(TDataModule)
CDS_status: TClientDataSet;
CDS_combobox: TClientDataSet;
CDS_comboboxconcatstatusjurusan: TStringField;
CDS_akun: TClientDataSet;
CDS_akunnomor_induk: TStringField;
CDS_akunemail: TStringField;
CDS_akunpass: TStringField;
CDS_akunnama: TStringField;
CDS_akunalamat: TStringField;
CDS_akunstatus_id: TIntegerField;
CDS_akunno_hp: TStringField;
CDS_akunstatus: TStringField;
CDS_akunjurusan: TStringField;
CDS_matkul: TClientDataSet;
CDS_absenmhs: TClientDataSet;
CDS_absenmhsabsenmhs_id: TAutoIncField;
CDS_absenmhsnim: TStringField;
CDS_absenmhswaktu_absen: TSQLTimeStampField;
CDS_absenmhsjadwal_id: TIntegerField;
CDS_absenmhsket: TStringField;
CDS_absenmhsfoto: TStringField;
CDS_absenmhsverify: TBooleanField;
CDS_verify: TClientDataSet;
SQLConnection1: TSQLConnection;
DSProviderConnection1: TDSProviderConnection;
CDS_jadwal: TClientDataSet;
CDS_jadwaljadwal_id: TAutoIncField;
CDS_jadwalnidn: TStringField;
CDS_jadwalkode_ruang: TStringField;
CDS_jadwalkode_matkul: TStringField;
CDS_jadwaljurusan_id: TIntegerField;
CDS_jadwalhari: TStringField;
CDS_jadwalwaktu_masuk: TTimeField;
CDS_jadwalwaktu_keluar: TTimeField;
CDS_jadwalmatkul: TStringField;
CDS_verifynim: TStringField;
CDS_verifywaktu_absen: TSQLTimeStampField;
CDS_verifyjadwal_id: TIntegerField;
CDS_verifyket: TStringField;
CDS_verifyfoto: TStringField;
CDS_verifyverify: TBooleanField;
CDS_verifylihat_foto: TStringField;
CDS_verifynama: TStringField;
CDS_verifynidn: TStringField;
CDS_verifykode_ruang: TStringField;
CDS_verifykode_matkul: TStringField;
CDS_verifyjurusan_id: TIntegerField;
CDS_verifyhari: TStringField;
CDS_verifywaktu_masuk: TTimeField;
CDS_verifymatkul: TStringField;
private
FInstanceOwner: Boolean;
FServerMethods1Client: TServerMethods1Client;
function GetServerMethods1Client: TServerMethods1Client;
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property InstanceOwner: Boolean read FInstanceOwner write FInstanceOwner;
property ServerMethods1Client: TServerMethods1Client read GetServerMethods1Client write
FServerMethods1Client;

end;

var
ClientModule1: TClientModule1;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

constructor TClientModule1.Create(AOwner: TComponent);


begin
inherited;
FInstanceOwner := True;
end;

destructor TClientModule1.Destroy;
begin
FServerMethods1Client.Free;
inherited;
end;

function TClientModule1.GetServerMethods1Client: TServerMethods1Client;


begin
if FServerMethods1Client = nil then
begin
SQLConnection1.Open;
FServerMethods1Client:=
TServerMethods1Client.Create(SQLConnection1.DBXConnection, FInstanceOwner);
end;
Result := FServerMethods1Client;
end;

end.

 Soure code form Aplikasi Android

unit Client;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Graphics, FMX.Forms, FMX.Dialogs, FMX.TabControl,
System.Actions, FMX.ActnList,
FMX.Objects, FMX.StdCtrls, ULoginFrame, UregFrame, Data.Bind.EngExt,
Fmx.Bind.DBEngExt, System.Rtti,
System.Bindings.Outputs, Fmx.Bind.Editors, Data.Bind.Components,
Data.Bind.DBScope, UmaindosenFrame, UmainMhsFrame, FMX.Controls.Presentation,
FMX.MultiView, FMX.ListBox, FMX.Layouts, UInfoFrame, Fmx.Bind.Grid,
Data.Bind.Grid, FMX.Gestures, FMX.Menus, UfotoFrame, System.IOUtils;

type
TClientForm = class(TForm)
VertScrollBox1: TVertScrollBox;
TabControl1: TTabControl;
LognTab: TTabItem;
DaftarTab: TTabItem;
MainDosen: TTabItem;
MainMhs: TTabItem;
InfoTab: TTabItem;
FotoTab: TTabItem;
LoginFrame1: TLoginFrame;
BackgrounRect: TRectangle;
Bacground: TRectangle;
regFrame1: TregFrame;
mainMhsFrame1: TmainMhsFrame;
DosenMainFrame1: TDosenMainFrame;
InfoFrame1: TInfoFrame;
fotoFrame1: TfotoFrame;
MultiView2: TMultiView;
Rectangle2: TRectangle;
Label3: TLabel;
Label4: TLabel;
Layout3: TLayout;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
BindSourceDB1: TBindSourceDB;
BindingsList1: TBindingsList;
LinkFillControlToField1: TLinkFillControlToField;
BindSourceDB2: TBindSourceDB;
LinkFillControlToField2: TLinkFillControlToField;
BindSourceDB3: TBindSourceDB;
LinkFillControlToField3: TLinkFillControlToField;
BindSourceDB4: TBindSourceDB;
LinkGridToDataSourceBindSourceDB4: TLinkGridToDataSource;
LinkListControlToField1: TLinkListControlToField;
MultiView1: TMultiView;
Rectangle1: TRectangle;
Label1: TLabel;
Label2: TLabel;
Layout1: TLayout;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure TitleActionUpdate(Sender: TObject);
procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift:
TShiftState);
procedure regFrame1Button1Click(Sender: TObject);
procedure regFrame1Button2Click(Sender: TObject);
procedure mainMhsFrame1TakePhotoFromCameraAction1DidFinishTaking(
Image: TBitmap);
procedure Button2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
procedure Rec1Click(Sender: TObject);
procedure InfoFrame1SpeedButton1Click(Sender: TObject);
procedure mainMhsFrame1SpeedButton3Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure mainMhsFrame1btn_kirimClick(Sender: TObject);
procedure DosenMainFrame1btn_kirimClick(Sender: TObject);
procedure DosenMainFrame1btn_refreshClick(Sender: TObject);
procedure DosenMainFrame1combo_matkulChange(Sender: TObject);
procedure DosenMainFrame1ListBox1Click(Sender: TObject);
procedure fotoFrame1btn_backClick(Sender: TObject);
procedure InfoFrame1btn_backClick(Sender: TObject);
procedure DosenMainFrame1SpeedButton1Click(Sender: TObject);
procedure LoginFrame1LoginButtonClick(Sender: TObject);
procedure LoginFrame1RegisterButtonClick(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }

procedure PDownloadImage;
var sizeimage : int64;
imagestream : TStream;
nama_foto : string;
end;

var
ClientForm: TClientForm;

implementation

{$R *.fmx}
{$R *.NmXhdpiPh.fmx ANDROID}

uses ClientClassesUnit1, ClientModuleUnit1;

procedure TClientForm.PDownloadImage;
var
ReStream : TStream;
Mem : TMemoryStream;
Buffer : PByte;
BufSize : integer;
BytesRead : integer;
Size : Int64;
PathFolder : string;
begin
BufSize := 1024;
try
Mem := TMemoryStream.Create;
GetMem(Buffer, BufSize);
try
ReStream := ClientModule1.ServerMethods1Client.Download(nama_foto, Size);
ReStream.Position := 0;
if (Size <> 0) then begin
fotoFrame1.ProgressBar1.Max := Size;
fotoFrame1.ProgressBar1.Value := 0;
repeat
BytesRead := ReStream.Read(Pointer(Buffer)^, BufSize);
if BytesRead > 0 then begin
Mem.WriteBuffer(Pointer(Buffer)^, BytesRead);
end;
fotoFrame1.ProgressBar1.Value := Mem.Size;
Application.ProcessMessages;
until (BytesRead < BufSize);

PathFolder :=
System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, nama_foto);
Mem.SaveToFile(PathFolder);

if ExtractFileExt(PathFolder) = '.jpg' then begin


fotoFrame1.Image1.Bitmap.LoadFromFile(PathFolder);
end;

if Size <> Mem.Size then begin


raise Exception.Create('Image error!');
end;
end;
finally
FreeMem(Buffer, BufSize);
FreeAndNil(Mem);
fotoFrame1.ProgressBar1.Max := 0;
fotoFrame1.ProgressBar1.Value := 0;
end;
except on E: Exception do begin
ShowMessage(e.Message);
end;
end;
end;

procedure TClientForm.TitleActionUpdate(Sender: TObject);


begin
if Sender is TCustomAction then
begin
if TabControl1.ActiveTab <> nil then
TCustomAction(Sender).Text := TabControl1.ActiveTab.Text
else
TCustomAction(Sender).Text := '';
end;
end;

procedure TClientForm.FormCreate(Sender: TObject);


begin
{ This defines the default active tab at runtime }
TabControl1.First(TTabTransition.None);
regFrame1.Image1.Visible := False;
regFrame1.Image1.Visible := False;
end;

procedure TClientForm.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift:
TShiftState);
begin
if (Key = vkHardwareBack) and (TabControl1.TabIndex <> 0) then
begin
TabControl1.First;
Key := 0;
end;
end;

procedure TClientForm.fotoFrame1btn_backClick(Sender: TObject);


begin
TabControl1.ActiveTab := mainDosen;
end;

procedure TClientForm.Button2Click(Sender: TObject);


begin
TabControl1.ActiveTab := LognTab;
end;

procedure TClientForm.mainMhsFrame1SpeedButton3Click(Sender: TObject);


begin
TabControl1.ActiveTab := InfoTab;
end;

procedure TClientForm.Label3Click(Sender: TObject);


begin
TabControl1.ActiveTab := InfoTab;
end;

procedure TClientForm.Rec1Click(Sender: TObject);


begin

end;

// REGISTER
TAB_________________________________________________________________

procedure TClientForm.LoginFrame1RegisterButtonClick(Sender: TObject);


begin
TabControl1.ActiveTab := DaftarTab;
end;

procedure TClientForm.regFrame1Button2Click(Sender: TObject);


begin
TabControl1.ActiveTab := LognTab;
end;

procedure TClientForm.regFrame1Button1Click(Sender: TObject);

begin
ClientModule1.CDS_akun.close;
ClientModule1.CDS_akun.open;

if regFrame1.Edit5.Text <> regFrame1.Edit4.Text then


begin
ShowMessage('Validasi Password Tidak Cocok');
end
else if (regFrame1.Edit1.Text = '')
or (regFrame1.Edit2.Text = '')
or (regFrame1.Edit4.Text = '')
or (regFrame1.Edit5.Text = '')
or (regFrame1.Edit6.Text = '')
or (regFrame1.Edit7.Text = '')
or (regFrame1.comboedit1.items.text = '') then
begin
ShowMessage('Data Tidak Lengkap');
end
else
begin
clientmodule1.CDS_akun.Insert;
clientmodule1.CDS_akun.FieldByName('nomor_induk').AsString := regFrame1.edit2.Text;
clientmodule1.CDS_akun.FieldByName('nama').AsString := regFrame1.edit1.Text;
clientmodule1.CDS_akun.FieldByName('email').AsString := regFrame1.edit3.Text;
clientmodule1.CDS_akun.FieldByName('pass').AsString := regFrame1.edit4.Text;
clientmodule1.CDS_akun.FieldByName('status_id').AsInteger :=
regFrame1.Comboedit1.ItemIndex + 1;
clientmodule1.CDS_akun.FieldByName('alamat').AsString := regFrame1.edit6.Text;
clientmodule1.CDS_akun.FieldByName('no_hp').AsString := regFrame1.edit7.Text;
ClientModule1.CDS_akun.Post;
ClientModule1.CDS_akun.ApplyUpdates(-1);
ShowMessage('Pendaftaran Berhasil');
end;
end;
//______________________________________________________________________________

// LOG IN_______________________________________________________________________
procedure TClientForm.LoginFrame1LoginButtonClick(Sender: TObject);
begin
if (LoginFrame1.usernameedit.text = EmptyStr)
or (LoginFrame1.passwordedit.text = EmptyStr) then
begin
ShowMessage('Masukan username/password !');
end
else
begin
with ClientModule1.CDS_akun do
begin
Close;
ParamByName('email').Value := loginframe1.UsernameEdit.Text;
Open;
if RecordCount = 0 then begin
ShowMessage('username atau password salah');
end
else
begin
if (FieldByName('pass').Text <> LoginFrame1.passwordedit.Text) then
begin
ShowMessage('username atau password salah');
end
else
begin
if (FieldByName('status').Text = 'dosen') then
begin
TabControl1.ActiveTab := MainDosen;
Label2.Text := FieldByName('nama').Text;
Label1.Text := FieldByName('jurusan').Text;
InfoFrame1.lbl_nama.Text := FieldByName('nama').Text;
InfoFrame1.lbl_noin.Text := FieldByName('nomor_induk').Text;
InfoFrame1.lbl_alamat.Text := FieldByName('alamat').Text;
InfoFrame1.lbl_email.Text := FieldByName('email').Text;
InfoFrame1.lbl_no.Text := FieldByName('no_hp').Text;
InfoFrame1.L6.Visible := False;
end
else if (FieldByName('status').Text = 'mahasiswa') then
begin
TabControl1.ActiveTab := MainMhs;
Label2.Text := FieldByName('nama').Text;
Label1.Text := FieldByName('jurusan').Text;
InfoFrame1.lbl_nama.Text := FieldByName('nama').Text;
InfoFrame1.lbl_noin.Text := FieldByName('nomor_induk').Text;
InfoFrame1.lbl_alamat.Text := FieldByName('alamat').Text;
InfoFrame1.lbl_email.Text := FieldByName('email').Text;
InfoFrame1.lbl_no.Text := FieldByName('no_hp').Text;
InfoFrame1.lbl_jurusan.Text := FieldByName('jurusan').Text;
end;
end;
end;
end;
ClientModule1.CDS_matkul.Close;
ClientModule1.CDS_matkul.CommandText :=
'select kode_matkul, matkul from tb_matkul where kode_matkul like "' +
ClientModule1.CDS_akun.FieldByName('status_id').text +'-%";';
ClientModule1.CDS_matkul.Open;

with ClientModule1.CDS_jadwal do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
open;
end;

with ClientModule1.CDS_verify do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
ParamByName('matkul').Value := DosenMainFrame1.combo_matkul.Text;
open;
end;
end;
end;
//______________________________________________________________________________

// LOG OUT____________________________________________________________________

procedure TClientForm.SpeedButton2Click(Sender: TObject);


begin
TabControl1.ActiveTab := LognTab;

Label1.Text := '';
Label2.Text := '';
InfoFrame1.lbl_nama.Text := '';
InfoFrame1.lbl_noin.Text := '';
InfoFrame1.lbl_alamat.Text := '';
InfoFrame1.lbl_email.Text := '';
InfoFrame1.lbl_no.Text := '';
InfoFrame1.lbl_jurusan.Text := '';

LoginFrame1.UsernameEdit.Text := '';
LoginFrame1.PasswordEdit.Text := '';
end;

procedure TClientForm.SpeedButton4Click(Sender: TObject);


begin
TabControl1.ActiveTab := LognTab;

Label1.Text := '';
Label2.Text := '';
InfoFrame1.lbl_nama.Text := '';
InfoFrame1.lbl_noin.Text := '';
InfoFrame1.lbl_alamat.Text := '';
InfoFrame1.lbl_email.Text := '';
InfoFrame1.lbl_no.Text := '';
InfoFrame1.lbl_jurusan.Text := '';

LoginFrame1.UsernameEdit.Text := '';
LoginFrame1.PasswordEdit.Text := '';
end;
//______________________________________________________________________________

// DOSEN TAB_________________________________________________________________
//verifikasi absen mhs oleh dosen
procedure TClientForm.DosenMainFrame1btn_kirimClick(Sender: TObject);
var row:integer;
begin
//row := DosenMainFrame1.verify_grid.RowCount-1;
with ClientModule1.CDS_verify do
begin
edit;
for row := 0 to DosenMainFrame1.verify_grid.RowCount-1 do
begin
FieldByName('verify').AsString := DosenMainFrame1.verify_grid.Cells[2,row];
end;
post;
ApplyUpdates(-1);
ShowMessage('Success');
end;
end;
//refresh verify dosen
procedure TClientForm.DosenMainFrame1btn_refreshClick(Sender: TObject);
begin
ClientModule1.CDS_verify.close;
ClientModule1.CDS_verify.open;
ClientModule1.CDS_absenmhs.close;
ClientModule1.CDS_absenmhs.open;

with ClientModule1.CDS_jadwal do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
open;
end;

with ClientModule1.CDS_verify do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
ParamByName('matkul').Value := DosenMainFrame1.combo_matkul.Text;
open;
end;
end;
procedure TClientForm.DosenMainFrame1combo_matkulChange(Sender: TObject);
begin
with ClientModule1.CDS_jadwal do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
open;
end;

with ClientModule1.CDS_verify do
begin
close;
ParamByName('nidn').Value := InfoFrame1.lbl_noin.Text;
ParamByName('matkul').Value := DosenMainFrame1.combo_matkul.Text;
open;
end;
end;

procedure TClientForm.DosenMainFrame1ListBox1Click(Sender: TObject);


begin
nama_foto := ClientModule1.CDS_verify.FieldByName('foto').Text;
PDownloadImage;
TabControl1.ActiveTab := fotoTab;
end;

procedure TClientForm.DosenMainFrame1SpeedButton1Click(Sender: TObject);


begin

end;
//______________________________________________________________________________

// MHS TAB____________________________________________________________________
// insert absen mhs
procedure TClientForm.mainMhsFrame1TakePhotoFromCameraAction1DidFinishTaking(
Image: TBitmap); //take photo
begin
mainMhsFrame1.foto.Bitmap.Assign(image);
try
imagestream := Tmemorystream.create;
mainMhsFrame1.foto.Bitmap.SaveToStream(imagestream);
sizeimage := imagestream.Size;
imagestream.Position := 0;
except on E: exception do
ShowMessage(e.Message);
end;
end;

procedure TClientForm.mainMhsFrame1btn_kirimClick(Sender: TObject); // upload data


var jadwal_id : string;
sekarang : TDateTime;
waktu : string;
begin
try
sekarang := now;
waktu := FormatDateTime('yyyymmdd_hhmmss',sekarang);
nama_foto := InfoFrame1.lbl_noin.Text +'_'+ waktu + '.jpg';

with ClientModule1.cds_jadwal do
begin
close;
parambyname('matkul').value := mainMhsFrame1.Combo_matkul.Text;
open;
jadwal_id := FieldByName('jadwal_id').text;
close;
end;

clientmodule1.CDS_absenmhs.Insert;
clientmodule1.CDS_absenmhs.FieldByName('nim').AsString := InfoFrame1.lbl_noin.Text;
clientmodule1.CDS_absenmhs.FieldByName('jadwal_id').AsInteger := strtoint(jadwal_id);
clientmodule1.CDS_absenmhs.FieldByName('foto').AsString := nama_foto;
ClientModule1.CDS_absenmhs.Post;
ClientModule1.CDS_absenmhs.ApplyUpdates(-1);
ShowMessage('Berhasil Dikirim');

if ClientModule1.ServerMethods1Client.Upload(nama_foto,sizeimage,imagestream) then
begin
imagestream.Free;
end
else ShowMessage('Upload Gagal');

except on E: Exception do
ShowMessage(e.Message);
end;
end;

//______________________________________________________________________________

// INFO TAB____________________________________________________________________

procedure TClientForm.SpeedButton1Click(Sender: TObject);


begin
TabControl1.ActiveTab := InfoTab;
end;

procedure TClientForm.SpeedButton3Click(Sender: TObject);


begin
TabControl1.ActiveTab := InfoTab;
end;

procedure TClientForm.InfoFrame1btn_backClick(Sender: TObject);


begin
if InfoFrame1.L6.Visible = True then
TabControl1.ActiveTab := mainMhs
else TabControl1.ActiveTab := mainDosen;
end;

procedure TClientForm.InfoFrame1SpeedButton1Click(Sender: TObject);


begin
if InfoFrame1.L6.Visible = True then
TabControl1.ActiveTab := mainMhs
else TabControl1.ActiveTab := mainDosen;
end;
//______________________________________________________________________________

end.

Anda mungkin juga menyukai