Il s'agit d'une application fonctionnelle que j'ai développée lors de mon premier stage. Je le mets ici pour donner à tout développeur un point de départ. Malheureusement, il ne fonctionnera pas si vous l'essayez localement car cette application a été réalisée à l'aide d'un service local privé sur mon lieu de travail. Néanmoins, j'espère que le code sera utile à quelqu'un.
La plupart du code utile se trouve dans le fichier LaborDB - dans le dossier DB - où il montre comment se connecter à l'API et à d'autres éléments. Veuillez garder à l'esprit que j'ai supprimé certaines valeurs sensibles de variables/constantes clés telles que les mots de passe et les noms d'utilisateur. De plus, cet outil établissait des connexions à différentes bases de données qui n'ont rien à voir avec l'API INFOR VISUAL.
Voici la liste des DLL requises pour utiliser l'API :
Il s'agit de l'ensemble de configuration utilisé. Pour configurer cela, sélectionnez le projet dans l'Explorateur de solutions (Visual Studio), puis l'option devrait apparaître.
Avant toute modification sur cet outil quelques notions sont nécessaires pour mieux comprendre son fonctionnement.
###BILLETS
Premièrement, les entrées effectuées par les employés sont appelées tickets et il en existe deux types, indirects et directs.
Indirect
Les tickets indirects ne sont associés à aucun ORDRE DE TRAVAIL. Si l'on regarde de plus près la table LABOR_TICKET, une colonne est cruciale pour déterminer si un ticket est indirect ou direct : WORKORDER_BASE_ID. Ce champ est NULL pour chaque ticket indirect et la colonne INDIRECT_ID est toujours obligatoire.
Direct
Les billets directs sont toujours associés à un ORDRE DE TRAVAIL. Dans ce cas, les colonnes WORKORDER_BASE_ID, WORKORDER_LOT_ID, WORKORDER_SPLIT_ID, WORKORDER_SUB_ID ET OPERATION_SEQ_NO sont toujours obligatoires.
Connexion à l'API
Pour nous connecter à l'API nous utilisons la classe Dbms appelant sa méthode OpenDirect. En tant que processus d'obtention de données à partir d'une base de données SQL, vous devez ouvrir, préparer, exécuter et fermer la connexion.
//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;
}
Pour ouvrir une connexion à l'API, appelez la fonction conOpen. Il s'agit d'une fonction d'assistance.
public static void conOpen()
{
Dbms.OpenDirect(instName, provider, "", source, user, password);
}
Récupération de données
Le moyen le plus générique d'obtenir des données de la base de données à l'aide de l'API consiste à utiliser la classe 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();
Lecture des enregistrements retournés
Les données renvoyées après l'appel de la méthode Execute() sont stockées dans le même objet que celui utilisé pour la demander.
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;
}
Lecture des enregistrements renvoyés avec des fonctions SQL
Dans les cas où la requête contient des fonctions SQL, la manière d'accéder aux données renvoyées change.
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());
}
Sauvegarde des données
Il n'y a que deux occasions où des données sont enregistrées sur cette solution, lors de l'enregistrement d'un nouveau ticket et lors de l'enregistrement des modifications d'un ticket existant. La classe LaborDB contient trois méthodes au total liées à la sauvegarde des données.
Sauvegarde des billets DIRECTS ET INDIRECTS
Pour enregistrer un nouveau ticket nous utilisons la classe LaborTicket, notez qu'il est nécessaire d'avoir une instance de connexion à l'API. Pour les billets indirects et directs, le processus est le même, ne différant que par l'ensemble des informations enregistrées (vérifiez les informations sur les BILLETS ci-dessus).
//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);
Mise à jour des tickets DIRECTS et INDIRECTS
Pour mettre à jour un ticket, nous utilisons la classe EditLaborTicket. Le processus est similaire à celui lors de l’enregistrement d’un nouveau ticket. La différence est que pour mettre à jour un ticket, son identifiant est requis.
//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);
Suppression de tickets DIRECTS et INDIRECTS
Pour supprimer un ticket, nous utilisons la classe DeleteLaborTicket. Il vous suffit de renseigner l'identifiant du ticket.
//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);