Fertigungsauftrag ändern 
From Theobald Software
In diesem Beispiel ändern wir mit Hilfe der Funktion "CLOI_CHANGES_UPL_31" einen Fertigungsauftrag. Dies könnte beispielsweise nötig sein, wenn ein externes Programm die Einplanung der Fertigungsaufträge übernimmt und die Änderung dann an das SAP zurückmeldet.
Um die Kopfdaten eines Fertigungsauftrages zu ändern ist die Fertigungsauftragsnummer und das zu ändernde Feld nötig. Die einzelnen Felder können Sie in der SAP-Doku nachlesen. Diese finden Sie hier. In unserem Beispiel verändern wir die die Starttermin (Feld GSTRP) und den Endtermin (Feld GLTRP). Weitere Möglichkeiten wären das Ändern der Menge (Feld BDMNG) oder der Startzeit (Feld GSUZP). Mit dem Feld "METHOD" geben wir den Wert "SCHEDULE" mit, was die Funktion dazu veranlasst, den Fertigungsauftrag neu zu terminieren. Die Tabelle "CLOI_MESSAGE_LOG_EXP" enthält die Messagecodes. Bei erfolgreicher Buchung bekommen wir folgende Meldung zurück:
Der Code C7 - 071 steht für "Vorgang ist eingeplant". Die einzelnen Codes können in der Transaktion "SE91" nachgelesen werden.
Damit die Funktion funktioniert, muss das Verbindungsobjekt Con als Instanz-Variable der Klasse vorhanden sein.
public static string ChangeProductionOrder(string AUFNR, string VORNR, string APLFL) { string rMessage = ""; RFCFunction func = Con.CreateFunction("CLOI_CHANGES_UPL_31"); func.Exports["CLOI_IF_PAR"].ToStructure()["COMMITFLG"] = "C"; func.Exports["CLOI_IF_PAR"].ToStructure()["R3_VERSION"] = "60"; //SAP Version func.Exports["CLOI_IF_PAR"].ToStructure()["MSG_FILTER"] = ""; // Show All Messages func.Exports["CLOI_IF_PAR"].ToStructure()["MSGLOG_REQ"] = "X"; //Message Return Tables func.Exports["CLOI_IF_PAR"].ToStructure()["MSGOBJ_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["ORD_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["ORDOPR_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["METLOG_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["ORDSEQ_REQ"] = "X"; // Change Header Data // Change Start Time RFCStructure orduRow = func.Tables["CLOI_ORDU_IMP"].Rows.Add(); orduRow["AUFNR"] = AUFNR; orduRow["FIELD"] = "GSTRP"; orduRow["VALUE"] = "20080815"; //Change Finish Time orduRow = func.Tables["CLOI_ORDU_IMP"].Rows.Add(); orduRow["AUFNR"] = AUFNR; orduRow["FIELD"] = "GLTRP"; orduRow["VALUE"] = "20080815"; orduRow = func.Tables["CLOI_ORDU_IMP"].Rows.Add(); orduRow["AUFNR"] = AUFNR; orduRow["FIELD"] = "METHOD"; orduRow["VALUE"] = "SCHEDULE"; func.Execute(); if (func.Tables["CLOI_MESSAGE_LOG_EXP"].RowCount > 0) { RFCStructure MyMessageRow = func.Tables["CLOI_MESSAGE_LOG_EXP"].Rows[0]; rMessage = "MessageType: " + MyMessageRow[3].ToString() + " Message (Please Check SE91): " + MyMessageRow[1].ToString() + " - " + MyMessageRow[2].ToString(); } else { rMessage = "No Messages found"; } return rMessage; }
In unserem zweiten Beispiel ändern wie die Positionsdaten eines Fertigungsauftrags. Für einen bestimmten Vorgang (in der Variable VORNR mitgegeben) ändern wir die verschiedenen Start- und Endzeiten, sowie die Start- und Endtermine. In diesem Fall ist der Wert des Feldes "METHOD" nicht "Schedule" sondern "Dispatch", was die gesamte Umterminierung der Positionsdaten veranlasst. Weitere änderebare Felder können Sie wieder in der SAP-Doku nachlesen, welche Sie hier finden.
public static string ChangeProductionOrderPos(string AUFNR, string VORNR, string APLFL) { string rMessage = ""; RFCFunction func = Con.CreateFunction("CLOI_CHANGES_UPL_31"); func.Exports["CLOI_IF_PAR"].ToStructure()["COMMITFLG"] = "C"; func.Exports["CLOI_IF_PAR"].ToStructure()["R3_VERSION"] = "60"; //SAP Version func.Exports["CLOI_IF_PAR"].ToStructure()["MSG_FILTER"] = ""; // Show All Messages func.Exports["CLOI_IF_PAR"].ToStructure()["MSGLOG_REQ"] = "X"; //Message Return Tables func.Exports["CLOI_IF_PAR"].ToStructure()["MSGOBJ_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["ORD_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["ORDOPR_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["METLOG_REQ"] = "X"; func.Exports["CLOI_IF_PAR"].ToStructure()["ORDSEQ_REQ"] = "X"; // Change Position Data RFCStructure opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); // Changes the work center opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "ARBPL"; opruRow["VALUE"] = "1112"; // Note : The internal ID of workcenter //Earliest date when execution of operation can finish opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSEDD"; opruRow["VALUE"] = "20080812"; //Earliest time when execution of operation can finish opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSEDZ"; opruRow["VALUE"] = "080000"; //Earliest date when execution of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSAVD"; opruRow["VALUE"] = "20080812"; //Earliest time when execution of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSAVZ"; opruRow["VALUE"] = "080000"; //Earliest date when processing of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSSBD"; opruRow["VALUE"] = "20080812"; //Earliest time when processing of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSSBZ"; opruRow["VALUE"] = "080000"; //Earliest date when teardown of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSSAD"; opruRow["VALUE"] = "20080812"; //Earliest time when teardown of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "FSSAZ"; opruRow["VALUE"] = "080000"; //Latest date when execution of operation can finish opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSEDD"; opruRow["VALUE"] = "20080813"; //Latest time when execution of operation can finish opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSEDZ"; opruRow["VALUE"] = "100000"; //Latest date when execution of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSAVD"; opruRow["VALUE"] = "20080813"; //Latest time when execution of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSAVZ"; opruRow["VALUE"] = "100000"; //Latest date when teardown of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSSAD"; opruRow["VALUE"] = "20080813"; //Latest time when teardown of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSSAZ"; opruRow["VALUE"] = "100000"; //Latest date when processing of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSSBD"; opruRow["VALUE"] = "20080813"; //Latest time when processing of operation can start opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "SSSBZ"; opruRow["VALUE"] = "100000"; //Dispatches the Order. opruRow = func.Tables["CLOI_ORD_OPRU_IMP"].Rows.Add(); opruRow["AUFNR"] = AUFNR; opruRow["VORNR"] = VORNR; opruRow["APLFL"] = APLFL; opruRow["FIELD"] = "METHOD"; opruRow["VALUE"] = "DISPATCH"; func.Execute(); if (func.Tables["CLOI_MESSAGE_LOG_EXP"].RowCount > 0) { RFCStructure MyMessageRow = func.Tables["CLOI_MESSAGE_LOG_EXP"].Rows[0]; rMessage = "MessageType: " + MyMessageRow[3].ToString() + " Message (Please Check SE91): " + MyMessageRow[1].ToString() + " - " + MyMessageRow[2].ToString(); } return rMessage; }


