Umlagerung mit gefüllten Werten öffnen
Michael Hubenschmid
Hallo zusammen,habe folgendes Problem. Beim Kunden habe ich auf der Alarm Maske einen Button der eine Umlagerung öffnen soll und diese schon mit Werten vorerfassen soll. Nur leider stehe ich an dem Punkt an, die Zeilen der Umlagerung vorzuerfassen (Query die die Zeilendaten liefert fehlt noch).
Vieleicht kann mir hierzu jemand die Syntax flüstern.
Der entsprechende Teil meines Codes (Problem ist im delegate Bereich) sind folgendermassen aus:
ublic Helper()
{
try
{
// PLACE A BUTTON ON THE ALERT WINDOW
// ONLY WHEN ITS A USER FROM THE DEPARTEMENT
bool createButton = false;
string userName = SwissAddonFramework.B1Connector.GetB1Connector().Company.UserName;
string queryUser = @"SELECT USER_CODE FROM OUSR WHERE USER_CODE='" + userName + "'";
using(System.Data.SqlClient.SqlDataReader sdrUser = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(queryUser))
{
if(sdrUser.Read())
{
if(sdrUser["USER_CODE"].ToString().Equals("manager"))
{
createButton = true;
}
}
}
if(createButton)
{
Form alertForm = Form.GetFormFromType("198", 1);
Button btn = Button.CreateNew("MTF_B1");
btn.ButtonType = Button.ButtonTypes.Caption;
btn.Value = "Konsignation";
btn.SetSizeAndPosition(Button.GetFromUID(alertForm, "16"));
btn.Left += Button.GetFromUID(alertForm, "16").Width + 5;
btn.Width = Button.GetFromUID(alertForm, "16").Width;
alertForm.AddItem(btn);
//Button.GetFromUID(alertForm,"16").Enabled = false;
//Button.GetFromUID(alertForm, "16").Visible = false;
Button.GetFromUID(alertForm, "16").Refresh();
btn.AddHandler_ItemPressed(ModeComponent.FormModes.ALL, null, delegate(SwissAddonFramework.UI.EventHandling.ItemEvents.ItemPressed ev)
{
try
{
Matrix m = Matrix.GetFromUID(ev.Form, "5");
int rowCount = m.Rows.Count;
int selectedRows = 0;
int commonRow = 1;
string selectedRowIDs = "";
for (int i = 0; i < rowCount; i++)
{
bool isRowSelected = m.SelectedRows.IsRowSelected(commonRow);
if (isRowSelected == true)
{
//MessageBox.Show("Zeile: " + commonRow.ToString() + " selektiert!", "OK");
selectedRowIDs = selectedRowIDs.Insert(selectedRowIDs.Length, i.ToString() + ";");
selectedRows++;
}
commonRow++;
}
//MessageBox.Show("Anzahl selektierter Zeilen: " + selectedRows.ToString(), "OK");
if(selectedRows == 0)
{
MessageBox.Show("Bitte eine Alarmmeldung selektieren!", "OK");
return;
}
if(selectedRows > 1)
{
MessageBox.Show("Bitte nur eine Alarmmeldung selektieren!", "OK");
return;
}
if(selectedRows == 1)
{
//MessageBox.Show("Selektierte Zeile: " + selectedRowIDs, "OK");
string messSubj = m.GetValue("1", int.Parse(selectedRowIDs.Replace(";", "")));
if(!messSubj.StartsWith("PRÜFUNG KONIGNATIONSBESTAND"))
{
MessageBox.Show("Bitte Alarmmeldung einer Konsignationsprüfung selektieren!", "OK");
}
else
{
string cardCode = messSubj.Substring(messSubj.IndexOf("(")+1, messSubj.IndexOf("/") - messSubj.IndexOf("(")-1);
//MessageBox.Show(cardCode, "OK");
string whsCode = messSubj.Substring(messSubj.IndexOf("/")+1, messSubj.IndexOf(")") - messSubj.IndexOf("/")-1);;
//MessageBox.Show(whsCode, "OK");
string formType = "940";// Stock Transfer FormType
string menuId = "3080";// Stock Transfer MenuItemNumber
SwissAddonFramework.UI.EventHandling.ItemEvents.FormLoadEventHandler del = null;
del = delegate (SwissAddonFramework.UI.EventHandling.ItemEvents.FormLoad ev2)
{
SwissAddonFramework.UI.Components.Form.RemoveHandler(formType, SwissAddonFramework.UI.Components.ModeComponent.FormModes.ALL, del);
ev2.Form.Select();
ev2.Form.Mode = SwissAddonFramework.UI.Components.ModeComponent.FormModes.ADD;
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["3"]).Value = cardCode;
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["41"]).Value = ((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["41"]).Value + " - Konsignation";
//((SwissAddonFramework.UI.Components.Matrix) ev2.Form.Items["23"]).Rows.Add(0);
//((SwissAddonFramework.UI.Components.Matrix).GetFromUID(ev2.Form, "23").Rows.Add();
/*((SwissAddonFramework.UI.Components.TextEdit) ev.Form.Items["14"]).Value = ((SwissAddonFramework.UI.Components.TextEdit) pVal.Form.Items["4"]).Value;
((SwissAddonFramework.UI.Components.TextEdit) ev.Form.Items["6"]).Value = Subject + " " + DocNum;
((SwissAddonFramework.UI.Components.TextEdit) ev.Form.UDFForm.Items["U_SWA_CT_SOe"]).Value = DocEntry;
((SwissAddonFramework.UI.Components.TextEdit) ev.Form.UDFForm.Items["U_SWA_CT_SOn"]).Value = ((SwissAddonFramework.UI.Components.TextEdit) pVal.Form.Items["8"]).Value;
*/
//MessageBox.Show("All values were set" , "OK");
};
SwissAddonFramework.UI.Components.Form.AddHandler_Load(formType, SwissAddonFramework.UI.Components.ModeComponent.FormModes.ALL, del);
SwissAddonFramework.UI.Components.MenuItem.GetFromUID(menuId).Activate();
}
}
/*
// STEP THROUGH MESSAGESLIST AND DELETE OLD ONES
Matrix m = Matrix.GetFromUID(ev.Form, "5");
for(int i = m.Rows.Count - 1;i >= 0;i--) //for(int i=0; i{
// CLICK ON ROW
m.Columns[0].Cells.Click(MatrixColumn.ClickTypes.Regular, MatrixColumn.Modifier.None);
string txt = ExtendedTextEdit.GetFromUID(ev.Form, "13").Value;
txt = txt.Substring(39, 9);
//MessageBox.Show(txt, "OK");
string queryDraftExist = "SELECT U_GP_UID FROM ODRF WHERE DocStatus = 'O' AND U_GP_UID=" + txt;
using(System.Data.SqlClient.SqlDataReader sdrDraftExist = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(queryDraftExist))
{
if(sdrDraftExist.Read())
{
// DRAFT STILL EXISTS, DO NOTHING
MessageBox.Show("Kundenprüfung (ID:" + txt + ") noch nicht abgeschlossen!", "OK");
}
else
{
//MessageBox.Show("gibts nicht mehr: " + txt, "OK");
// DELETE MESSAGE
Button.GetFromUID(alertForm, "16").Visible = true;
Button.GetFromUID(ev.Form, "16").Click(SwissAddonFramework.UI.Components.Item.ClickType.Regular);
Button.GetFromUID(alertForm, "16").Visible = false;
}
}
}
*/
}
catch(System.Exception ex)
{
MessageBox.Show("Error at generating stock transfer for consignation: " + ex.Message, "OK");
}
});
alertForm.Update();
}
}
catch(System.Exception ex)
{
//MessageBox.Show("Feg: " + ex.Message, "OK");
}
}
Im genauen Suche ich ähnlich dem folgenden Code den Code mit dem ich in der Artikelmatrix der Umlagerung eine Spalte mit einem Wert setzen kann und dannach eine neue Zeile erstelle.
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["3"]).Value = cardCode
Gruss Michael
Michael Egloff
Hallo Michael,eigentlich fügt es dir jedesmal eine neue Zeile ein, wenn du den Artikel der obigen Zeile gewählt hast (so wie es auch normal mit der Maus und Tastatur geht).
versuch mal beim delegate ein Try-Catch einzubauen. Dann bekommst du bessere Möglichkeiten rauszufinden, was nicht richtig funktioniert. Ich habe nämlich das Gefühl, dass da was nicht stimmt (Element 41 ist kein TextEdit, sondern ExtendedTextEdit
del = delegate (SwissAddonFramework.UI.EventHandling.ItemEvents.FormLoad ev2)
{
try{
SwissAddonFramework.UI.Components.Form.RemoveHandler(formType, SwissAddonFramework.UI.Components.ModeComponent.FormModes.ALL, del);
ev2.Form.Select();
ev2.Form.Mode = SwissAddonFramework.UI.Components.ModeComponent.FormModes.ADD;
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["3"]).Value = cardCode;
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["41"]).Value = ((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["41"]).Value + " - Konsignation";
}catch(System.Exception except)
{MessageBox.Show("Fehler im delegate: " + except.Message, "OK");}
};
Michael Hubenschmid
Hallo Michael,ich glaube das du mich etweder nicht ganz verstanden hast oder ich mein Problem nicht gut genug beschrieben habe.
Habe deswegen im angehängten Code das nicht notwendige herausgelöscht und das rot gekennzeichnet wo ich anstehe (Matrix Zeile befüllen).
Das Item 41 funktioniert ohne Problem, ist aber auch nicht ein Wert auf der Artikelmatrix, sondern das Feld Bemerkungen.
Hier der angepasste Quellcode:
public Helper()
{
try
{
// PLACE A BUTTON ON THE ALERT WINDOW
// ONLY WHEN ITS A USER FROM THE DEPARTEMENT
bool createButton = false;
string userName = SwissAddonFramework.B1Connector.GetB1Connector().Company.UserName;
string queryUser = @"SELECT USER_CODE FROM OUSR WHERE USER_CODE='" + userName + "'";
using(System.Data.SqlClient.SqlDataReader sdrUser = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(queryUser))
{
if(sdrUser.Read())
{
if(sdrUser["USER_CODE"].ToString().Equals("manager"))
{
createButton = true;
}
}
}
if(createButton)
{
Form alertForm = Form.GetFormFromType("198", 1);
Button btn = Button.CreateNew("MTF_B1");
btn.ButtonType = Button.ButtonTypes.Caption;
btn.Value = "Konsignation";
btn.SetSizeAndPosition(Button.GetFromUID(alertForm, "16"));
btn.Left += Button.GetFromUID(alertForm, "16").Width + 5;
btn.Width = Button.GetFromUID(alertForm, "16").Width;
alertForm.AddItem(btn);
//Button.GetFromUID(alertForm,"16").Enabled = false;
//Button.GetFromUID(alertForm, "16").Visible = false;
Button.GetFromUID(alertForm, "16").Refresh();
btn.AddHandler_ItemPressed(ModeComponent.FormModes.ALL, null, delegate(SwissAddonFramework.UI.EventHandling.ItemEvents.ItemPressed ev)
{
try
{
Matrix m = Matrix.GetFromUID(ev.Form, "5");
int rowCount = m.Rows.Count;
int selectedRows = 0;
int commonRow = 1;
string selectedRowIDs = "";
for (int i = 0; i < rowCount; i++)
{
bool isRowSelected = m.SelectedRows.IsRowSelected(commonRow);
if (isRowSelected == true)
{
//MessageBox.Show("Zeile: " + commonRow.ToString() + " selektiert!", "OK");
selectedRowIDs = selectedRowIDs.Insert(selectedRowIDs.Length, i.ToString() + ";");
selectedRows++;
}
commonRow++;
}
//MessageBox.Show("Anzahl selektierter Zeilen: " + selectedRows.ToString(), "OK");
if(selectedRows == 0)
{
MessageBox.Show("Bitte eine Alarmmeldung selektieren!", "OK");
return;
}
if(selectedRows > 1)
{
MessageBox.Show("Bitte nur eine Alarmmeldung selektieren!", "OK");
return;
}
if(selectedRows == 1)
{
//MessageBox.Show("Selektierte Zeile: " + selectedRowIDs, "OK");
string messSubj = m.GetValue("1", int.Parse(selectedRowIDs.Replace(";", "")));
if(!messSubj.StartsWith("PRÜFUNG KONIGNATIONSBESTAND"))
{
MessageBox.Show("Bitte Alarmmeldung einer Konsignationsprüfung selektieren!", "OK");
}
else
{
string cardCode = messSubj.Substring(messSubj.IndexOf("(")+1, messSubj.IndexOf("/") - messSubj.IndexOf("(")-1);
//MessageBox.Show(cardCode, "OK");
string whsCode = messSubj.Substring(messSubj.IndexOf("/")+1, messSubj.IndexOf(")") - messSubj.IndexOf("/")-1);;
//MessageBox.Show(whsCode, "OK");
string formType = "940";// Stock Transfer FormType
string menuId = "3080";// Stock Transfer MenuItemNumber
SwissAddonFramework.UI.EventHandling.ItemEvents.FormLoadEventHandler del = null;
del = delegate (SwissAddonFramework.UI.EventHandling.ItemEvents.FormLoad ev2)
{
SwissAddonFramework.UI.Components.Form.RemoveHandler(formType, SwissAddonFramework.UI.Components.ModeComponent.FormModes.ALL, del);
ev2.Form.Select();
ev2.Form.Mode = SwissAddonFramework.UI.Components.ModeComponent.FormModes.ADD;
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["3"]).Value = cardCode;
((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["41"]).Value = ((SwissAddonFramework.UI.Components.TextEdit) ev2.Form.Items["41"]).Value + " - Konsignation";
//((SwissAddonFramework.UI.Components.Matrix) ev2.Form.Items["23"]).Rows.Add(0);
//((SwissAddonFramework.UI.Components.Matrix).GetFromUID(ev2.Form, "23").Rows.Add(); //HIER IST DAS PROBLEM. WIE LEGE ICH ZEILE AN ODER BEFèLLE EINE ZEILE MIT WERTEN.
//MessageBox.Show("All values were set" , "OK");
};
SwissAddonFramework.UI.Components.Form.AddHandler_Load(formType, SwissAddonFramework.UI.Components.ModeComponent.FormModes.ALL, del);
SwissAddonFramework.UI.Components.MenuItem.GetFromUID(menuId).Activate();
}
}
}
catch(System.Exception ex)
{
MessageBox.Show("Error at generating stock transfer for consignation: " + ex.Message, "OK");
}
});
alertForm.Update();
}
}
catch(System.Exception ex)
{
//MessageBox.Show("Feg: " + ex.Message, "OK");
}
}
Vieleicht kannst du mir ja jetzt mein Probnlem besser lösen.
Gruss Michael.
Michael Egloff
Hallo Michael,du musst keine Zeilen hinzufügen, da du per UI die Zeilen befüllst. Du kannst einfach darauflos schreiben. Beginnend bei Zeile eins fügt dir SAP automatisch eine neue Zeile an, sobald du den ItemCode gesetzt hast.
Matrix.GetFromUID(ev2.Form, "23").SetValue("1", 0, "A1000");befüllt die erste Spalte mit dem Artikel A1000.
Um allfällige Fehler im delegate zu entdecken, empfehle ich dir im delegate drin ein try-catch-Statement zu platzieren, das 'globale' try-catch fängt die Fehler im delegate nicht ab.
Gruss
0
Please sign in to leave a comment.
Comments
0 comments