這是我在第一次實習期間開發的一個工作應用程式。我將其放在這裡是為了給任何開發人員一個起點。不幸的是,如果您在本地嘗試它,它將無法運行,因為該應用程式是使用我工作場所的私人本地服務製作的。儘管如此,我希望該代碼對某人有用。
大多數有用的程式碼都位於 DB 資料夾內的 LaborDB 檔案中,其中顯示如何連接到 API 和其他內容。請記住,我刪除了關鍵變數/常數的一些敏感值,例如密碼和使用者名稱。此外,該工具還可以連接到與 INFOR VISUAL API 沒有任何關係的不同資料庫。
這是使用 API 所需的 DLL 清單:
這是使用的配置集。若要設定此選項,請在解決方案資源管理器 (Visual Studio) 上選擇項目,然後應該會出現該選項。
在對此工具進行任何修改之前,需要了解一些概念,以便更好地理解它的工作原理。
###門票
首先,員工所做的輸入稱為票證,它有兩種類型:間接和直接。
間接
間接工單沒有任何與之相關的工作訂單。如果仔細查看 LABOR_TICKET 表,會發現有一列對於確定工單是間接的還是直接的至關重要:WORKORDER_BASE_ID。對於每個間接工單,此欄位為 NULL,並且始終需要列 INDIRECT_ID。
直接的
直接工單始終有與其相關的工作訂單。在這種情況下,始終需要列 WORKORDER_BASE_ID、WORKORDER_LOT_ID、WORKORDER_SPLIT_ID、WORKORDER_SUB_ID 和 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());
}
儲存數據
此解決方案中只有兩種情況會保存資料:儲存新工單和儲存現有工單的修改。 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 類別。過程與保存新票證時類似。不同之處在於,要更新票證,需要其 ID。
//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。您只需告知票證 ID 即可。
//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);