这是我在第一次实习期间开发的一个工作应用程序。我将其放在这里是为了给任何开发人员一个起点。不幸的是,如果您在本地尝试它,它将无法运行,因为该应用程序是使用我工作场所的私人本地服务制作的。尽管如此,我希望该代码对某人有用。
大多数有用的代码都位于 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);