Dies ist eine Arbeitsanwendung, die ich während meines ersten Praktikums entwickelt habe. Ich füge es hier ein, um jedem Entwickler einen Ausgangspunkt zu geben. Leider funktioniert es nicht, wenn Sie es lokal ausprobieren, da diese Anwendung über einen privaten lokalen Dienst an meinem Arbeitsplatz erstellt wurde. Dennoch hoffe ich, dass der Code für jemanden nützlich ist.
Der meiste nützliche Code befindet sich in der Datei LaborDB – im DB-Ordner – wo er zeigt, wie man eine Verbindung zur API und anderen Dingen herstellt. Bitte beachten Sie, dass ich einige sensible Werte von Schlüsselvariablen/Konstanten wie Passwörtern und Benutzernamen entfernt habe. Außerdem stellte dieses Tool Verbindungen zu verschiedenen Datenbanken her, die nichts mit der INFOR VISUAL API zu tun haben.
Dies ist die Liste der erforderlichen DLLs zur Verwendung der API:
Dies ist der verwendete Konfigurationssatz. Um dies einzurichten, wählen Sie das Projekt im Projektmappen-Explorer (Visual Studio) aus. Die Option sollte dann angezeigt werden.
Bevor an diesem Tool Änderungen vorgenommen werden, sind einige Konzepte erforderlich, um die Funktionsweise besser zu verstehen.
###TICKETS
Erstens werden die von den Mitarbeitern vorgenommenen Eingaben als Tickets bezeichnet und es gibt zwei Arten davon: indirekte und direkte.
Indirekt
Mit indirekten Tickets ist kein ARBEITSAUFTRAG verknüpft. Wenn man sich die Tabelle LABOR_TICKET genauer ansieht, ist eine Spalte entscheidend, um festzustellen, ob ein Ticket indirekt oder direkt ist: WORKORDER_BASE_ID. Dieses Feld ist für jedes indirekte Ticket NULL und die Spalte INDIRECT_ID ist immer erforderlich.
Direkt
Zu Direkttickets gehört immer ein ARBEITSAUFTRAG. In diesem Fall sind immer die Spalten WORKORDER_BASE_ID, WORKORDER_LOT_ID, WORKORDER_SPLIT_ID, WORKORDER_SUB_ID UND OPERATION_SEQ_NO erforderlich.
Verbindung zur API herstellen
Um eine Verbindung zur API herzustellen, verwenden wir die Klasse Dbms, die ihre Methode OpenDirect aufruft. Beim Abrufen von Daten aus einer SQL-Datenbank sollten Sie die Verbindung öffnen, vorbereiten, ausführen und schließen.
//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;
}
Um eine Verbindung zur API zu öffnen, rufen Sie die Funktion conOpen auf. Dies ist eine Hilfsfunktion.
public static void conOpen()
{
Dbms.OpenDirect(instName, provider, "", source, user, password);
}
Daten abrufen
Die allgemeinste Methode zum Abrufen von Daten aus der Datenbank mithilfe der API ist die Verwendung der GeneralQuery-Klasse.
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();
Zurückgegebene Datensätze lesen
Die nach dem Aufruf der Methode Execute() zurückgegebenen Daten werden in demselben Objekt gespeichert, mit dem sie angefordert wurden.
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;
}
Zurückgegebene Datensätze mit SQL-Funktionen lesen
In Fällen, in denen die Abfrage SQL-Funktionen enthält, ändert sich die Art und Weise, wie auf die zurückgegebenen Daten zugegriffen wird.
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());
}
Daten speichern
Es gibt nur zwei Fälle, in denen Daten auf dieser Lösung gespeichert werden: beim Speichern eines neuen Tickets und beim Speichern von Änderungen an einem bestehenden Ticket. Die Klasse LaborDB enthält insgesamt drei Methoden zum Speichern von Daten.
Speichern von DIREKT- UND INDIREKT-Tickets
Um ein neues Ticket zu speichern, verwenden wir die Klasse LaborTicket. Beachten Sie, dass eine Verbindungsinstanz zur API erforderlich ist. Für indirekte und direkte Tickets ist der Vorgang derselbe und unterscheidet sich nur durch die gespeicherten Informationen (siehe TICKETS-Informationen oben).
//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);
Aktualisierung von DIREKT- und INDIREKT-Tickets
Um ein Ticket zu aktualisieren, verwenden wir die Klasse EditLaborTicket. Der Vorgang ist ähnlich wie beim Speichern eines neuen Tickets. Der Unterschied besteht darin, dass zum Aktualisieren eines Tickets dessen ID erforderlich ist.
//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);
DIREKTE und INDIREKTE Tickets löschen
Um ein Ticket zu löschen, verwenden wir die Klasse DeleteLaborTicket. Sie müssen lediglich die ID des Tickets angeben.
//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);