هذا تطبيق عملي قمت بتطويره خلال فترة تدريبي الأولى. أضعه هنا لإعطاء أي مطور نقطة انطلاق. لسوء الحظ، لن يتم تشغيله إذا جربته محليًا لأنه تم إنشاء هذا التطبيق باستخدام خدمة محلية خاصة في مكان عملي. ومع ذلك، آمل أن يكون الكود مفيدًا لشخص ما.
توجد معظم التعليمات البرمجية المفيدة في ملف LaborDB - داخل مجلد DB - حيث يوضح كيفية الاتصال بواجهة برمجة التطبيقات (API) والأشياء الأخرى. من فضلك، ضع في اعتبارك أنني قمت بإزالة بعض القيم الحساسة للمتغيرات/الثوابت الرئيسية مثل كلمات المرور وأسماء المستخدمين. كما قامت هذه الأداة بإجراء اتصالات بقواعد بيانات مختلفة لا علاقة لها بواجهة برمجة التطبيقات INFOR VISUAL.
هذه هي قائمة مكتبات DLL المطلوبة لاستخدام واجهة برمجة التطبيقات:
هذه هي مجموعة التكوين المستخدمة. لإعداد هذا، حدد المشروع في Solution Explorer (Visual Studio) ثم يجب أن يظهر الخيار.
قبل إجراء أي تعديل على هذه الأداة، هناك حاجة إلى بعض المفاهيم لفهم كيفية عملها بشكل أفضل.
###التذاكر
أولا الإدخالات التي يقوم بها الموظفون تسمى التذاكر وهناك نوعان منها غير مباشرة ومباشرة.
غير مباشر
لا تحتوي التذاكر غير المباشرة على أي أمر عمل يتعلق بها. إذا ألقينا نظرة فاحصة على جدول LABOR_TICKET، فسيكون هناك عمود واحد ضروري لتحديد ما إذا كانت التذكرة غير مباشرة أم مباشرة: WORKORDER_BASE_ID. هذا الحقل فارغ لكل تذكرة غير مباشرة والعمود 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());
}
حفظ البيانات
هناك مناسبتان فقط يتم فيهما حفظ البيانات على هذا الحل، عند حفظ تذكرة جديدة وعند حفظ التعديلات على تذكرة موجودة. يحتوي 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);
حذف التذاكر المباشرة وغير المباشرة
لحذف تذكرة نستخدم فئة RemoveLaborTicket. ما عليك سوى إبلاغ معرف التذكرة.
//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);