นี่เป็นแอปพลิเคชันที่ใช้งานได้จริงที่ฉันพัฒนาขึ้นระหว่างการฝึกงานครั้งแรก ฉันวางมันไว้ที่นี่เพื่อให้นักพัฒนาทุกคนมีจุดเริ่มต้น ขออภัย มันจะไม่ทำงานหากคุณลองใช้ในเครื่อง เนื่องจากแอปพลิเคชันนี้สร้างขึ้นโดยใช้บริการส่วนตัวในพื้นที่ที่ทำงานของฉัน อย่างไรก็ตาม ฉันหวังว่าโค้ดนี้จะเป็นประโยชน์สำหรับใครบางคน
โค้ดที่มีประโยชน์ส่วนใหญ่อยู่ที่ไฟล์ LaborDB - ภายในโฟลเดอร์ DB - ซึ่งจะแสดงวิธีเชื่อมต่อกับ API และเนื้อหาอื่นๆ โปรดทราบว่าฉันได้ลบค่าที่ละเอียดอ่อนบางส่วนของตัวแปร/ค่าคงที่หลัก เช่น รหัสผ่านและชื่อผู้ใช้แล้ว นอกจากนี้ เครื่องมือนี้ยังทำให้การเชื่อมต่อกับฐานข้อมูลต่างๆ ไม่มีอะไรเกี่ยวข้องกับ INFOR VISUAL API เลย
นี่คือรายการ DLL ที่จำเป็นในการใช้ API:
นี่คือชุดการกำหนดค่าที่ใช้ หากต้องการตั้งค่านี้ ให้เลือกโครงการใน Solution Explorer (Visual Studio) จากนั้นตัวเลือกควรปรากฏขึ้น
ก่อนที่จะทำการปรับเปลี่ยนใดๆ กับเครื่องมือนี้ จำเป็นต้องมีแนวคิดบางประการเพื่อให้เข้าใจวิธีการทำงานได้ดีขึ้น
###ตั๋ว
ขั้นแรก รายการที่ทำโดยพนักงานจะเรียกว่าตั๋ว และมีสองประเภทคือทางอ้อมและทางตรง
ทางอ้อม
ตั๋วทางอ้อมไม่มีใบสั่งงานใด ๆ ที่เกี่ยวข้อง หากพิจารณาตาราง LABOR_TICKET ให้ละเอียดยิ่งขึ้น คอลัมน์หนึ่งคอลัมน์มีความสำคัญในการพิจารณาว่าตั๋วเป็นแบบทางอ้อมหรือโดยตรง: WORKORDER_BASE_ID ฟิลด์นี้เป็น NULL สำหรับตั๋วทางอ้อมทุกใบ และจำเป็นต้องมีคอลัมน์ INDIRECT_ID เสมอ
โดยตรง
ตั๋วตรงจะมี WORK ORDER ที่เกี่ยวข้องเสมอ ในกรณีนี้ คอลัมน์ WORKORDER_BASE_ID, WORKORDER_LOT_ID, WORKORDER_SPLIT_ID, WORKORDER_SUB_ID AND OPERATION_SEQ_NO จำเป็นเสมอ
กำลังเชื่อมต่อกับ API
ในการเชื่อมต่อกับ API เราใช้คลาส Dbms เรียกวิธีการของมัน OpenDirect เนื่องจากเป็นกระบวนการรับข้อมูลจากฐานข้อมูล SQL คุณควรเปิด จัดเตรียม ดำเนินการ และปิดการเชื่อมต่อ
//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;
}
หากต้องการเปิดการเชื่อมต่อกับ API ให้เรียกใช้ฟังก์ชัน conOpen นี่คือฟังก์ชันตัวช่วย
public static void conOpen()
{
Dbms.OpenDirect(instName, provider, "", source, user, password);
}
การดึงข้อมูล
วิธีทั่วไปที่สุดในการรับข้อมูลจากฐานข้อมูลโดยใช้ API คือการใช้คลาส 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();
การอ่านบันทึกที่ส่งคืน
ข้อมูลที่ส่งคืนหลังจากการเรียกใช้เมธอด Execute() จะถูกเก็บไว้ในออบเจ็กต์เดียวกับที่ใช้ในการร้องขอ
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;
}
การอ่านบันทึกที่ส่งคืนด้วยฟังก์ชัน SQL
ในกรณีที่แบบสอบถามมีฟังก์ชัน SQL วิธีการเข้าถึงการเปลี่ยนแปลงข้อมูลที่ส่งคืน
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());
}
กำลังบันทึกข้อมูล
มีเพียงสองครั้งเท่านั้นที่มีการบันทึกข้อมูลบนโซลูชันนี้ เมื่อบันทึกตั๋วใหม่ และเมื่อบันทึกการแก้ไขตั๋วที่มีอยู่ Class LaborDB มีทั้งหมดสามวิธีที่เกี่ยวข้องกับการบันทึกข้อมูล
บันทึกตั๋วทั้งทางตรงและทางอ้อม
ในการบันทึกตั๋วใหม่ เราใช้คลาส LaborTicket โปรดทราบว่าจำเป็นต้องมีอินสแตนซ์การเชื่อมต่อกับ API สำหรับตั๋วทั้งทางอ้อมและทางตรง กระบวนการจะเหมือนกัน โดยต่างกันเพียงชุดข้อมูลที่บันทึกไว้เท่านั้น (ตรวจสอบข้อมูลตั๋วด้านบน)
//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);
การอัปเดตตั๋วโดยตรงและโดยอ้อม
ในการอัปเดตตั๋ว เราใช้คลาส EditLaborTicket กระบวนการนี้คล้ายกับการบันทึกตั๋วใหม่ ข้อแตกต่างคือในการอัปเดตตั๋ว จำเป็นต้องมีรหัส
//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);
การลบตั๋วโดยตรงและโดยอ้อม
ในการลบตั๋ว เราใช้คลาส DeleteLaborTicket คุณจะต้องแจ้งรหัสตั๋วเท่านั้น
//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);