これは私が最初のインターンシップ中に開発した実用的なアプリケーションです。すべての開発者に出発点を提供するためにここに記載しています。残念ながら、このアプリケーションは職場のプライベート ローカル サービスを使用して作成されたため、ローカルで試しても実行されません。それでも、このコードが誰かの役に立つことを願っています。
役立つコードのほとんどは、DB フォルダー内の LaborDB ファイルにあり、API への接続方法やその他のものを示しています。パスワードやユーザー名などの主要な変数/定数の機密性の高い値を削除したことに留意してください。また、このツールは、INFOR VISUAL API に関連しないさまざまなデータベースへの接続を作成しました。
API を使用するために必要な DLL のリストは次のとおりです。
これは使用される構成のセットです。これを設定するには、ソリューション エクスプローラー (Visual Studio) でプロジェクトを選択すると、オプションが表示されます。
このツールに変更を加える前に、ツールがどのように機能するかをよりよく理解するためにいくつかの概念を理解する必要があります。
###チケット
まず、従業員が入力するものをチケットと呼びますが、これには間接的なものと直接的なものの2種類があります。
間接的
間接チケットには、それに関連する作業指示がありません。 LABOR_TICKET テーブルを詳しく調べると、チケットが間接的か直接的かを判断するために重要な列 WORKORDER_BASE_ID が 1 つあります。このフィールドはすべての間接チケットに対して NULL であり、列 INDIRECT_ID は常に必須です。
直接
直接チケットには、それに関連する作業指示が常に含まれます。この場合、列 WORKORDER_BASE_ID、WORKORDER_LOT_ID、WORKORDER_SPLIT_ID、WORKORDER_SUB_ID、および OPERATION_SEQ_NO が常に必要です。
APIへの接続
API に接続するには、OpenDirect メソッドを呼び出すクラス Dbms を使用します。 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());
}
データの保存
このソリューションでデータが保存されるのは、新しいチケットを保存するときと、既存のチケットへの変更を保存するときの 2 回だけです。 LaborDB クラスには、データの保存に関連する合計 3 つのメソッドが含まれています。
直接チケットと間接チケットの保存
新しいチケットを保存するには、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);