Ini adalah aplikasi kerja yang saya kembangkan selama magang pertama saya. Saya meletakkannya di sini untuk memberikan titik awal kepada pengembang mana pun. Sayangnya tidak akan berjalan jika dicoba secara lokal karena aplikasi ini dibuat menggunakan layanan lokal swasta di tempat kerja saya. Namun demikian, saya berharap kode ini bermanfaat bagi seseorang.
Sebagian besar kode yang berguna ada di file LaborDB - di dalam folder DB - yang menunjukkan cara terhubung ke API dan hal-hal lainnya. Harap diingat bahwa saya menghapus beberapa nilai sensitif dari variabel/konstanta kunci seperti kata sandi dan nama pengguna. Selain itu, alat ini membuat koneksi ke database berbeda yang tidak ada hubungannya dengan INFOR VISUAL API.
Ini adalah daftar DLL yang diperlukan untuk menggunakan API:
Ini adalah kumpulan konfigurasi yang digunakan. Untuk mengatur ini pilih proyek pada Solution Explorer (Visual Studio) maka opsi akan muncul.
Sebelum modifikasi apa pun dilakukan pada alat ini, diperlukan beberapa konsep untuk lebih memahami cara kerjanya.
###TIKET
Pertama, pencatatan yang dilakukan oleh karyawan disebut tiket dan ada dua jenisnya, tidak langsung dan langsung.
Tidak langsung
Tiket tidak langsung tidak memiliki PERINTAH KERJA yang terkait dengannya. Jika tabel LABOR_TICKET dilihat lebih dekat, satu kolom sangat penting untuk menentukan apakah suatu tiket bersifat tidak langsung atau langsung: WORKORDER_BASE_ID. Bidang ini adalah NULL untuk setiap tiket tidak langsung dan kolom INDIRECT_ID selalu wajib diisi.
Langsung
Tiket langsung selalu memiliki PERINTAH KERJA yang terkait dengannya. Dalam hal ini, kolom WORKORDER_BASE_ID, WORKORDER_LOT_ID, WORKORDER_SPLIT_ID, WORKORDER_SUB_ID DAN OPERATION_SEQ_NO selalu diperlukan.
Menghubungkan ke API
Untuk terhubung ke API kami menggunakan kelas Dbms yang memanggil metodenya OpenDirect. Sebagai proses mendapatkan data dari database SQL Anda harus membuka, mempersiapkan, mengeksekusi dan menutup koneksi.
//get the product
public static Model.WorkOrderModel getWorkOrderId(string baseId, string instance)
{
//open con to the api
conOpen();
Model.WorkOrderModel wo = new Model.WorkOrderModel();
string query = "Select BASE_ID, LOT_ID, SPLIT_ID, STATUS FROM VMFG.WORK_ORDER WHERE USER_9 LIKE '%,' + ? + ',%'";
GeneralQuery gen = null;
gen = new GeneralQuery(instName);
gen.Prepare("WORK_ORDER", query);
gen.Parameters[0] = baseId;
gen.Execute();
if (gen.Tables["WORK_ORDER"].Rows.Count > 0)
{
wo.baseId = gen.Tables["WORK_ORDER"].Rows[0]["BASE_ID"].ToString();
wo.lotId = gen.Tables["WORK_ORDER"].Rows[0]["LOT_ID"].ToString();
wo.splitId = gen.Tables["WORK_ORDER"].Rows[0]["SPLIT_ID"].ToString();
wo.status = gen.Tables["WORK_ORDER"].Rows[0]["STATUS"].ToString();
}
Dbms.Close(instName);
return wo;
}
Untuk membuka koneksi ke API, panggil fungsi conOpen. Ini adalah fungsi pembantu.
public static void conOpen()
{
Dbms.OpenDirect(instName, provider, "", source, user, password);
}
Mengambil data
Cara paling umum untuk mendapatkan data dari database menggunakan API adalah menggunakan kelas GeneralQuery.
GeneralQuery gen = new GeneralQuery(instName);
gen.Prepare("WORKORDER", "Select BASE_ID, SUB_ID, PART_ID FROM VMFG.WORK_ORDER WHERE BASE_ID = ?");
gen.Parameters[0] = baseId;
gen.Execute();
Membaca catatan yang dikembalikan
Data yang dikembalikan setelah memanggil metode Execute() disimpan dalam objek yang sama yang digunakan untuk memintanya.
if (gen.Tables["WORKORDER"].Rows.Count > 0)
{
for (var i = 0; i <= gen.Tables["WORKORDER"].Rows.Count - 1; i++)
{
workOrders.Add(gen.Tables["WORKORDER"].Rows[i]["SUB_ID"].ToString() + " " + gen.Tables["WORKORDER"].Rows[i]["PART_ID"].ToString());
}
Dbms.Close(instName);
return workOrders;
}
Membaca catatan yang dikembalikan dengan fungsi SQL
Dalam kasus di mana kueri berisi fungsi SQL, cara mengakses perubahan data yang dikembalikan.
Model.DatePeriodModel dp = new Model.DatePeriodModel();
GeneralQuery gen = null;
gen = new GeneralQuery(instName);
gen.Prepare("ACCOUNT_PERIOD", "SELECT MIN(BEGIN_DATE) FROM VMFG.ACCOUNT_PERIOD WHERE STATUS = 'A' AND YEAR(BEGIN_DATE) = YEAR(GETDATE()) AND CALENDAR_ID = 'BACH'");
gen.Execute();
if (gen.Tables["ACCOUNT_PERIOD"].Rows.Count > 0)
{
dp.min = DateTime.Parse(gen.Tables["ACCOUNT_PERIOD"].Rows[0]["Column1"].ToString());
}
Menyimpan data
Hanya ada dua kesempatan di mana data disimpan pada solusi ini, saat menyimpan tiket baru dan saat menyimpan modifikasi pada tiket yang sudah ada. Kelas LaborDB berisi total tiga metode yang terkait dengan penyimpanan data.
Menyimpan tiket LANGSUNG DAN TIDAK LANGSUNG
Untuk menyimpan tiket baru kami menggunakan kelas LaborTicket, perhatikan bahwa diperlukan instance koneksi ke API. Baik untuk tiket tidak langsung maupun langsung, prosesnya sama, hanya berbeda pada kumpulan informasi yang disimpan (Periksa informasi TIKET di atas).
//open con to the api
conOpen();
//new labor ticket
LaborTicket ticket = new LaborTicket(instName);
ticket.Prepare();
//preparing the data
DataRow dr = (DataRow)ticket.NewRunLaborRow(1);
dr["BASE_ID"] = baseId;
dr["LOT_ID"] = lotId;
dr["SPLIT_ID"] = splitId;
dr["SUB_ID"] = leg;
dr["SEQ_NO"] = Int32.Parse(opn);
dr["TRANSACTION_TYPE"] = "RUN";
dr["EMPLOYEE_ID"] = employeeId;
dr["HOURLY_COST"] = hourlyCost;
dr["HOURS_WORKED"] = hoursworked;
dr["MULTIPLIER_1"] = overtime.Equals("OT") ? 1.500 : 1.000;
dr["TRANSACTION_DATE"] = date;
dr["SHIFT_DATE"] = date;
dr["SITE_ID"] = "BACH";
//api method to save
try
{
ticket.Save();
}
catch (Exception ex)
{
Dbms.Close(instName);
}
Dbms.Close(instName);
Memperbarui tiket LANGSUNG dan TIDAK LANGSUNG
Untuk memperbarui tiket kami menggunakan kelas EditLaborTicket. Prosesnya sama seperti saat menyimpan tiket baru. Bedanya, untuk mengupdate tiket diperlukan ID-nya.
//open con to the api
conOpen();
//new edit labor ticket
EditLaborTicket editTicket = new EditLaborTicket(instName);
editTicket.Prepare();
//preparin the data
DataRow dr;
dr = (DataRow)editTicket.NewEditLaborRow(ticketId);
dr["SITE_ID"] = "BACH";
dr["INDIRECT_ID"] = indirectId;
dr["HOURS_WORKED"] = hoursWorked;
dr["MULTIPLIER_1"] = overtime.Equals("OT") ? 1.500 : 1.000;
//api method to save
try
{
editTicket.Save();
}
catch
{
Dbms.Close(instName);
}
Dbms.Close(instName);
Menghapus tiket LANGSUNG dan TIDAK LANGSUNG
Untuk menghapus tiket kita menggunakan kelas DeleteLaborTicket. Anda hanya perlu menginformasikan id tiketnya.
//open con to the api
conOpen();
//new delete labor ticket
DeleteLaborTicket deleteTicket = new DeleteLaborTicket(instName);
deleteTicket.Prepare();
//preparing the data
DataRow dr;
dr = (DataRow)deleteTicket.NewDeleteLaborRow(ticketId);
//api method to delete
try
{
deleteTicket.Save();
}
catch
{
Dbms.Close(instName);
}
Dbms.Close(instName);