Dokumen ini berisi seluruh query SQL yang dieksekusi dalam aplikasi timbangan, termasuk alur eksekusi saat proses sinkronisasi data.
Saat user menekan tombol "Download" di main window dan mengkonfirmasi dialog, method Accepted() akan dijalankan dengan urutan:
def Accepted(self):
is_Success = local_db.sync_with_server() # Step 1
if (is_Success):
is_Success = local_db.upload_data() # Step 2
if (is_Success):
is_Success = local_db.delete_old_data() # Step 3
if (is_Success):
local_db.synchronize_download() # Step 4
self.close()
INSERT OR REPLACE INTO Equipment
([ID],
[Epicor_Resource_ID],
[Epicor_Equipment_ID],
[Epicor_Asset_Number],
[Location],
[Owned_By],
[Description],
[Type],
[MAC_Address])
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
Tujuan: Menyimpan informasi equipment (Raspberry Pi/PC) berdasarkan MAC address dari API server.
SELECT Set_TB_Equpment_ID
FROM Setting
Tujuan: Mengecek apakah sudah ada setting timbangan yang dipilih sebelumnya.
INSERT OR REPLACE INTO Setting
VALUES (?, ?)
Parameter:
Raspi_Equpment_ID: ID equipment Raspi/PCSet_TB_Equpment_ID: ID sensor timbangan yang dipilih (atau "NULL")Tujuan: Menyimpan/update konfigurasi equipment dan sensor timbangan.
UPDATE SENSOR
SET is_active = 0
Tujuan: Menonaktifkan semua sensor sebelum sinkronisasi data baru dari server.
INSERT OR REPLACE INTO Equipment
([ID],
[Epicor_Resource_ID],
[Epicor_Equipment_ID],
[Epicor_Asset_Number],
[Location],
[Owned_By],
[Description],
[Type])
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
Tujuan: Menyimpan data equipment/timbangan dari server berdasarkan plant.
INSERT OR REPLACE INTO Sensor
([ID],
[Equipment_ID],
[Name],
[Adjustment_value],
[is_active],
[Description],
[Brand],
[Output_format])
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
Tujuan: Menyimpan data sensor timbangan dari server, termasuk format output dan brand.
UPDATE Epicor_Transaction
SET is_active = 0
Tujuan: Menonaktifkan semua job sebelum sinkronisasi data terbaru dari server.
INSERT OR REPLACE INTO Epicor_Transaction
(Job_Number,
Employee_Id,
Plant,
Part_Number,
Part_Description,
Employee_Name,
ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
SV_Product,
Unit_Kemas,
Unit_Product,
Cavity,
Jenis_job,
is_Active)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Tujuan: Menyimpan data job aktif dari Epicor (SAP), termasuk standar berat dan parameter penimbangan.
Catatan Format Tanggal:
MM/DD/YYYYYYYY-MM-DDSELECT Job_Number,
Employee_Id,
Plant,
Part_Number,
Part_Description,
Employee_Name,
ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
SV_Product,
Unit_Product,
Unit_Kemas,
Jenis_job,
Created_at,
is_Finished,
Jumlah_Lot,
Cavity
FROM Parameter_Set_Transaction
WHERE is_Synced = 0
Tujuan: Mengambil semua parameter set transaction yang belum diupload ke server.
UPDATE Parameter_Set_Transaction
SET is_Synced = ?
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
Parameter:
is_Synced = 1: Menandai data sudah berhasil syncTujuan: Mencegah data yang sama diupload berkali-kali.
SELECT ID,
Equipment_ID,
Sensor_ID,
Sensor_Name,
Value_Avg,
Value_Min,
Value_Max,
SV,
SVL,
SVH,
Created_at,
Logging_tag,
Unit,
Job_Number,
Part_Number,
Employee_ID,
Employee_Name,
OOS_Count_Low,
OOS_Count_High,
OOS_Value_Low,
OOS_Value_High,
No_Lot,
Value_Avg_Old,
is_Synced,
Alert_Status,
ClockInDate
FROM Logging_Transaction
WHERE is_Synced = 0
Tujuan: Mengambil semua hasil penimbangan yang belum diupload ke server.
UPDATE Logging_Transaction
SET is_Synced = ?
WHERE ID = ?
Parameter:
is_Synced = 1: Menandai data sudah berhasil syncTujuan: Mencegah data yang sama diupload berkali-kali.
SELECT DISTINCT ET.Job_Number,
ET.Employee_Id,
ET.ClockInDate
FROM Epicor_Transaction ET
WHERE ET.is_Active = 0
AND ET.ClockInDate < date('now','-3 days')
EXCEPT
SELECT DISTINCT PST.Job_Number,
PST.Employee_Id,
PST.ClockInDate
FROM Parameter_Set_Transaction PST
LEFT JOIN Logging_Transaction LT
ON PST.Job_Number = LT.Job_Number
AND PST.Employee_Id = LT.Employee_Id
AND PST.ClockInDate = LT.ClockInDate
WHERE PST.is_Synced = 0
OR LT.is_Synced = 0
Tujuan: Mengidentifikasi data yang:
is_Active = 0)is_Synced = 1)Logika:
DELETE FROM Logging_Transaction
WHERE (( Job_Number = '{row[0]}'
AND Employee_Id = '{row[1]}'
AND ClockInDate = '{row[2]}')
OR ( Job_Number = '...'
AND Employee_Id = '...'
AND ClockInDate = '...')
... )
Tujuan: Menghapus data logging (hasil timbangan) yang sudah lama dan sudah sync.
DELETE FROM Parameter_Set_Transaction
WHERE (( Job_Number = '{row[0]}'
AND Employee_Id = '{row[1]}'
AND ClockInDate = '{row[2]}')
OR ...)
Tujuan: Menghapus parameter set transaction yang sudah lama dan sudah sync.
DELETE FROM Epicor_transaction
WHERE (( Job_Number = '{row[0]}'
AND Employee_Id = '{row[1]}'
AND ClockInDate = '{row[2]}')
OR ...)
Tujuan: Menghapus data job Epicor yang sudah lama dan sudah sync.
Catatan: Jika tidak ada data yang memenuhi kriteria, query menggunakan kondisi WHERE FALSE sehingga tidak ada data yang dihapus.
SELECT MAX(ID)
FROM Logging_Transaction
Tujuan: Mendapatkan ID terakhir untuk menghindari konflik primary key saat insert data dari server.
INSERT OR REPLACE INTO Parameter_Set_Transaction
(Job_Number,
Employee_Id,
Plant,
Part_Number,
Part_Description,
Employee_Name,
ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
SV_Product,
Unit_Product,
Unit_Kemas,
Jenis_job,
Created_at,
is_Finished,
is_Synced,
Jumlah_Lot,
Cavity)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
Parameter:
is_Synced = 1: Data dari server selalu ditandai sudah syncTujuan: Mendownload parameter set transaction dari server (dari device lain atau web).
INSERT OR REPLACE INTO Logging_Transaction
(ID,
Equipment_ID,
Sensor_ID,
Sensor_Name,
Value_Avg,
Value_Min,
Value_Max,
SV,
SVL,
SVH,
Created_at,
Logging_tag,
Unit,
Job_Number,
Part_Number,
Employee_ID,
Employee_Name,
OOS_Count_Low,
OOS_Count_High,
OOS_Value_Low,
OOS_Value_High,
No_Lot,
Value_Avg_Old,
is_Synced,
Alert_Status,
ClockInDate)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
Parameter:
ID: Auto-increment berdasarkan MAX(ID) + 1is_Synced = 1: Data dari server selalu ditandai sudah syncTujuan: Mendownload hasil logging transaction dari server (dari device lain atau web).
-- Untuk Produk Bersih atau Kemas
INSERT INTO Logging_Transaction
(ID,
Equipment_ID,
Sensor_ID,
Sensor_Name,
Job_Number,
Part_Number,
Employee_ID,
Employee_Name,
No_Lot,
is_Synced,
Created_at,
Unit,
Value_Avg,
SVL,
SVH,
Alert_Status,
ClockinDate)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
-- Untuk Produk Kotor (dengan Cavity)
INSERT INTO Logging_Transaction
(ID,
Equipment_ID,
Sensor_ID,
Sensor_Name,
Job_Number,
Part_Number,
Employee_ID,
Employee_Name,
No_Lot,
is_Synced,
Created_at,
Unit,
Value_Avg,
SV,
Alert_Status,
ClockinDate)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
Logika Alert Status:
Value_Avg < SVL OR Value_Avg > SVH → Alert_Status = "NOT OK"Alert_Status = "OK"-- Get SVL and SVH
SELECT SVL, SVH
FROM Logging_Transaction
WHERE ID = ?
-- Update value
UPDATE Logging_Transaction
SET Value_Avg_Old = Value_Avg,
Value_Avg = ?,
Created_at = ?,
Alert_Status = ?,
is_Synced = 0
WHERE ID = ?
-- Get Job info for marking Parameter Set as not synced
SELECT Job_Number, Employee_Name, ClockInDate
FROM Logging_Transaction
WHERE ID = ?
Tujuan: Menyimpan nilai lama sebelum update, dan menandai data perlu sync ulang.
-- Untuk Produk Kotor (dengan SV)
SELECT ID, No_Lot, Value_Avg, Value_Avg_Old, Alert_Status
FROM Logging_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
AND SV IS NOT NULL
ORDER BY No_Lot DESC
-- Untuk Produk Bersih/Kemas (tanpa SV)
SELECT ID, No_Lot, Value_Avg, Value_Avg_Old, Alert_Status
FROM Logging_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
AND SV IS NULL
ORDER BY No_Lot DESC
SELECT ID, No_Lot, Value_Avg, Value_Avg_Old, Alert_Status
FROM Logging_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
AND Alert_Status = 'NOT OK'
ORDER BY No_Lot DESC
Tujuan: Menampilkan hasil timbangan yang out of specification untuk review.
SELECT ID
FROM Logging_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
Tujuan: Menghitung jumlah lot yang sudah ditimbang.
-- Get data from Epicor_Transaction
SELECT Job_Number,
Employee_Id,
Plant,
Part_Number,
Part_Description,
Employee_Name,
ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
Unit_Product,
Unit_Kemas,
Jenis_job,
SV_Product,
Cavity
FROM Epicor_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND is_Active = 1
-- Insert to Parameter_Set_Transaction
INSERT INTO Parameter_Set_Transaction
(Job_Number,
Employee_Id,
Plant,
Part_Number,
Part_Description,
Employee_Name,
ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
Unit_Product,
Unit_Kemas,
Jenis_job,
SV_Product,
Created_at,
is_Finished,
is_Synced,
Jumlah_Lot,
Cavity)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
Parameter:
Created_at: Timestamp saat iniis_Finished = 0: Job baru dimulaiis_Synced = 0: Belum syncJumlah_Lot = 0: Belum ada lotSELECT is_Finished
FROM Parameter_Set_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
-- Update as finished
UPDATE Parameter_Set_Transaction
SET is_synced = 0,
is_Finished = 1,
jumlah_lot = ?
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
Tujuan: Menandai job selesai dan update jumlah lot yang ditimbang.
-- Get Parameter Set Transaction
SELECT Job_Number,
Employee_Id,
Plant,
Part_Number,
Part_Description,
Employee_Name,
ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
SV_Product,
Unit_Product,
Unit_Kemas,
Jenis_job,
Created_at,
is_Finished,
Jumlah_Lot,
Cavity
FROM Parameter_Set_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
AND is_Synced = 0
-- Get Logging Transaction (including NOT OK)
SELECT ID,
Equipment_ID,
Sensor_ID,
Sensor_Name,
Value_Avg,
Value_Min,
Value_Max,
SV,
SVL,
SVH,
Created_at,
Logging_tag,
Unit,
Job_Number,
Part_Number,
Employee_ID,
Employee_Name,
OOS_Count_Low,
OOS_Count_High,
OOS_Value_Low,
OOS_Value_High,
No_Lot,
Value_Avg_Old,
is_Synced,
Alert_Status,
ClockInDate
FROM Logging_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
AND (is_Synced = 0 OR Alert_Status = 'NOT OK')
Catatan: Data dengan status "NOT OK" akan selalu diupload ulang untuk tracking.
SELECT ClockInDate
FROM Epicor_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND is_Active = 1
SELECT Job_Number
FROM Epicor_Transaction
WHERE Jenis_job = ?
AND is_Active = 1
SELECT pst.Job_Number
FROM Parameter_Set_Transaction pst
JOIN Epicor_Transaction et
ON pst.Job_Number = et.Job_Number
AND pst.Employee_ID = et.Employee_ID
AND pst.ClockInDate = et.ClockInDate
WHERE pst.is_Finished = 0
AND et.is_Active = 1
SELECT Employee_Name
FROM Epicor_Transaction
WHERE Job_Number = ?
AND is_Active = 1
SELECT pst.Employee_Name
FROM Parameter_Set_Transaction pst
JOIN Epicor_Transaction et
ON pst.Job_Number = et.Job_Number
AND pst.Employee_ID = et.Employee_ID
AND pst.ClockInDate = et.ClockInDate
WHERE pst.Job_Number = ?
AND pst.is_Finished = 0
AND et.is_Active = 1
SELECT ClockInDate,
Isi_Kemasan_C,
EAN,
SVH_Kemas,
SVL_Kemas,
SVH_Product,
SVL_Product,
Unit_Product,
Unit_Kemas,
Jenis_Job
FROM Epicor_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND is_Active = 1
Display Logic:
Jenis_Job = "Produk": Tampilkan SVL/SVH ProductJenis_Job = "Kemas": Tampilkan SVL/SVH KemasSELECT ClockInDate,
Isi_Kemasan_C,
EAN,
SV_Product,
Unit_Product,
Cavity
FROM Epicor_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND is_Active = 1
SELECT [Name]
FROM Sensor
WHERE is_active = 1
SELECT Raspi_Equpment_ID, Set_TB_Equpment_ID
FROM Setting
UPDATE Setting
SET Set_TB_Equpment_ID = ?
SELECT Raspi_Equpment_ID
FROM setting
SELECT *
FROM Logging_Transaction
WHERE Job_Number = ?
AND Employee_Name = ?
AND ClockInDate = ?
Tujuan: Menghitung lot number berikutnya dengan len(rows) + 1.
isFinished_Parameter_Set_Transaction()insert_Parameter_Set_Transaction()insert_Logging_Transaction() atau update_Logging_Transaction()is_Synced = 0 untuk upload nantisubmit() → Update is_Finished = 1, jumlah_lotsynchronize_upload() → Upload ke serversynchronize_upload() → Upload data tanpa finish jobis_Synced = 0: Data belum sync ke serveris_Synced = 1: Data sudah syncis_Synced = 0is_Finished = 0: Job masih berlangsungis_Finished = 1: Job sudah selesai (submit)is_Finished = 0is_Active = 1: Data aktif/terbaruis_Active = 0: Data lama/tidak dipakaiis_Active = 0, lalu insert data baru dengan is_Active = 1"OK": Nilai dalam range SVL-SVH"NOT OK": Nilai di luar range (out of spec)Value_Avg ditimbang kotor → Bagi dengan CavityValue_Avg / Cavity = Value_Avg per pieceis_Active = 0 DAN is_Synced = 1Dibuat: February 2, 2026
Versi: 1.0
Platform: Python 3.9 + PyQt5 + SQLite3