DOSEN PEMBIMBING
Dedi Supardi S.T,M.Kom.
DISUSUN OLEH
Rully Fildansyah
NIM : 17184604
Semester : 1 (satu)
Menyetujui
Teknik Informatika
i
KATA PENGANTAR
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.
Penyusun
ii
DAFTAR ISI
BAB I : PENDAHULUAN
1.1 Latar Belakang ................................................................................... 1
1.2 Tujuan ................................................................................................ 2
1.3 Ruang Lingkup ................................................................................... 2
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
v
Gambar 3.20 : Konfigurasi query combobox ................................................. 28
vi
Gambar 3.43 : Konfigurasi SQLConnection1 ................................................ 52
Gambar 3.54 Tampilan melihat foto absen mahasiswa oleh dosen ............... 57
vii
DAFTAR TABEL
viii
Tabel 3.11 : Komponen form Info ................................................................. 48
ix
Source Code 3.11 : RegisterButton form login .............................................. 39
x
BAB I
PENDAHULUAN
Latar Belakang
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
Ruang Lingkup
c. Database MySQL
d. Datasnap system
2
BAB II
LANDASAN TEORI
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.
3
berasal dari Persia yang ditemukan pada Abad Ke 9. Dari masa ke masa, kata
algoritma mulai berkembang di abad ke 18.
a. Linked List
4
Gambar 2.1 : Linked List
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).
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)
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
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.1 Pengertian
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.
9
bagi anda yang ingin menguasai bahasa sql dan mahir dalam pembuatan
database.
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.
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.
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;
REVOKE perintah ini digunakan untuk mencabut hak akses yang telah
diberikan kepada user. Dalam ini merupakan kebalikan dari perintah GRANT.
2.3 MySQL
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.
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.
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.4 DataSnap
2.4.1 Pengertian
13
Gambar 2.6 : DataSnap
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
a. Tabel 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
Status_id FK INT 11
no_hp - Varchar 50
b. Tabel tb_status
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
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:
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:
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
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
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
Ketika database dan Tabel selesai. maka skema diagram database adalah
seperti berikut:
20
Gambar 3.7 : Skema diagram database dbabsen
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:
22
Dengan source code sebagai berikut:
a. FDConnection
b. FDQuery
c. DataSetProvider
d. ClientDataSet
23
Gambar 3.10 : Komponen-komponen di ServerMethodsUnit1
a. Konfigurasi AbsenConnection
24
b. Konfigurasi FDQuery Tb_MatkulTable
25
Gambar 3.14 : Konfigurasi query Tb_akunTable
Dan setelah itu konfiguraskan tab parameters seperti berikut:
26
Gambar 3.16 : Konfigurasi DSP_akun
27
Setelah itu konfigurasi DSP_matkul seagai berikut:
28
Gambar 3.21 : Konfigurasi DSP_combobox
29
Gambar 3.23 : Konfigurasi parameters jadwal
30
g. Konfigurasi FDQuery Tb_ruangTable
31
h. Konfigurasi FDQuery Tb_absenmhsTable
32
i. Konfigurasi FDQuery verify
33
Gambar 3.32 : Konfigurasi DSP_verify
// 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);
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
a. Form Login
1. Desain Form
36
2. Komponen Form
TabControl1 - TTabControl
LoginTab - TTabItem
VSB - TVertScrollbox
LogoLayout -
FormLayout -
FooterLayout -
Layout1 - TLayout
Layout2 -
Layout3 -
Layout4 -
LogoImage - TImage
Aplikasi Layanan
Logolabel TLabel
Absen
RegisterButton Daftar
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;
//_________________________________________________________________
39
b. Form Register
1. Desain Form
TabControl1 - TTabControl
DaftarTab - TTabItem
VSB - TVertScrollbox
FormLayout - TLayout
FooterLayout -
Layout1 -
Layout2 -
Edit2 NIDN/NIM
Edit3 E-mail
40
Edit4 Password TEdit
Edit6 Alamat
Edit7 No. Hp
Image1 - TImage
ComboEdit1 - TComboEdit
Button2 Kembali
3. Source Code
begin
ClientModule1.CDS_akun.close;
ClientModule1.CDS_akun.open;
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
c. Form MainDosen
1. Desain Form
42
2. Komponen Form
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
Btn_refresh_image - TImage
Btn_kirim_image -
SpeedButton1 -
Btn_refresh - TButton
Btn_kirim -
3. Source Code
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;
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
d. Form MainMhs
1. Desain Form
45
TabControl1 - TTabControl
MainMhsTab - TTabItem
VSB - TVertScrollbox
ActionList1 - TActionList
Toolbar1 - TToolbar
Layout1 -
LMhsFrame -
Lfoto - TLayout
Lkanan -
Lkiri -
Lengah -
Rectangle1 - TRectangle
Rectangle3 -
Combo_matkul - TComboEdit
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
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
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 :
Label3 Alamat :
Label4 e-mail :
Label5 No. Hp
Lbl_nama ‘’
Lbl_noin ‘’
Lbl_alamat ‘’
Lbl_email ‘’
Lbl_no ‘’
Lbl_jurusan ‘’
3. Source Code
49
TabControl1.ActiveTab := mainMhs
else TabControl1.ActiveTab := mainDosen;
end;
f. Form Foto
1. Desain Form
2. Komponen Form
TabControl1 - TTabControl
FotoTab - TTabItem
Layout1 - Tlayout
ProgressBar1 - TProgressBar
Toolbar1 - TToolbar
50
Rectangle1 - TRectangle
Image1 - TImage
Btn_back_image -
Btn_back - TButton
4. Source Code
51
Gambar 3.42 : Komponen-komponen ClientModuleUnit1
52
Setelah selesai konfigurasikan DSProviderConnection1 tambahkan nama
pada ServerClassName dengan nama server methods yang berada pada datasnap
server, seperti di bawah ini:
53
Gambar 3.46 : Membuka Live Binding
Setelah itu maka akan muncul livebinding dan konfigurasi seperti contoh
di bawah ini:
54
3.3 Screenshoot Hasil Jadi Aplikasi Mobile (Android)
55
Gambar 3.50 : Tampilan capture photo mahasiswa
56
Gambar 3.53 : Tampilan verifikasi absen mahasiswa oleh dosen
57
BAB IV
PENUTUP
4.1 Kesimpulan
4.2 Saran
58
DAFTAR PUSTAKA
http://woocara.blogspot.com/2016/02/pengertian-algoritma-contoh-algoritma.html
(diakses pada tanggal 30 Juli 2018)
https://mnurmusa.wordpress.com/2017/03/24/algoritma-dan-struktur-data/
(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
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}
unit ServerMethodsUnit1;
interface
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);
end.
//
// Created by the DataSnap proxy generator.
// 7/22/2018 11:39:32 PM
//
unit ClientClassesUnit1;
interface
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
destructor TServerMethods1Client.Destroy;
begin
FEchoStringCommand.DisposeOf;
FReverseStringCommand.DisposeOf;
FDownloadCommand.DisposeOf;
FUploadCommand.DisposeOf;
inherited;
end;
end.
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}
destructor TClientModule1.Destroy;
begin
FServerMethods1Client.Free;
inherited;
end;
end.
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}
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);
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;
end;
// REGISTER
TAB_________________________________________________________________
begin
ClientModule1.CDS_akun.close;
ClientModule1.CDS_akun.open;
// 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____________________________________________________________________
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;
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;
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;
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____________________________________________________________________
end.