Preis in Feld übernehmen
Rafael Stalder
Hallo,komme gerade nicht weiter mit bei einem Problem mit dem Customize-Tool.
Ich möchte das benutzerdefinierte Feld U_XXAPList mit einem Preis aus einer Preisliste füllen, welcher sich in der Artikelstamm-Tabelle befindet.
Via Customizing-Tool könnte müsste es doch jetzt möglich sein, dieses Feld zu füllen.
Ich habe dabei eine SQL-Abfrage verwendet, welche ausgeführt wird, wenn die Artikelnr geändert wird. (Ziel<->Auslöser,...)
SELECT T1.Price FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode WHERE T1.PriceList = '2' AND T0.ItemCode = '[%G;5;0]'
Nun aber geschieht gar nichts, wenn ich die Artikelnr ändere oder einfach zum nächsten Datensatz klicke.
Ist es möglich, dass die Abfrage nicht korrekt ist, oder muss da was anderes falsch sein?
Gruss Rafael
Rafael Stalder
ok, löse das ganze jetzt mit C#.Doch dazu muss ich meine SQL Abfrage trotzdem einbauen.
Weiss jemand, wie man ein SQL Statement in C# beim Field Optimizer verwendet und den Rückgabewert in ein Feld speichert?
Michael Egloff
Hallo Rafael,wenn die Regel nicht funktioniert kann das mehrere Gründe haben. Entweder ist der Auslöser nicht richtig, das Query gibt nichts zurück oder aber es kann ein Bug vom customize sein.
Wenn du es mit C# lösen willst, kann ich dir ein bisschen helfen.
Das Gerüst sieht etwa so aus:
// RÜCKGABEWERT
string val = "";
// DEFINIERE DAS QUERY
string query = "SELECT BLABLABLA";
using (System.Data.SqlClient.SqlDataReader sdr = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(query))
{
// LIEST WERTE VOM RESULTAT DES QUERYS
if (sdr.Read())
{
// ERSETZE "SPALTENNAME" DURCH DIE SPALTE ENTSPRECHEND DEM QUERY
val = sdr["SPALTENNAME"].ToString();
}
}
// ERSETZE "3" MIT DER UID DES FELDES ZUM ZURÜCKSCHREIBEN
((SwissAddonFramework.UI.Components.TextEdit)ev.Form.Items["3"]).Value = val;
{
Hoffe, das hilf dir weiter!
Gruss, Michael
Rafael Stalder
Hallo Michael,vielen Dank für den guten Tipp.
Momentan kommt bei meinem C# Script noch eine Fehlermeldung,
wenn ich vom einen Datensatz zum nächsten gehe.
Ich denke, die Abfrage könnte möglicherweise nicht korrekt sein, oder siehst Du einen anderen Fehler?
string rueckgabe = "";
string query = "SELECT T1.Price FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode WHERE T1.PriceList = '2' AND T0.ItemCode = '[%G;5;0]'";
using (System.Data.SqlClient.SqlDataReader sdr = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(query))
{
if (sdr.Read())
{
rückgabe zugewiesen.
rueckgabe = sdr["Price"].ToString();
}
}
((SwissAddonFramework.UI.Components.TextEdit)ev.Form.Items["U_XXAPList"]).Value = rueckgabe;
Vielen Dank.
Gruss Rafael
Rafael Stalder
Hallo Michael,vielen Dank für den guten Tipp.
Momentan kommt bei meinem C# Script noch eine Fehlermeldung,
wenn ich vom einen Datensatz zum nächsten gehe.
Ich denke, die Abfrage könnte möglicherweise nicht korrekt sein, oder siehst Du einen anderen Fehler?
string rueckgabe = "";
string query = "SELECT T1.Price FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode WHERE T1.PriceList = '2' AND T0.ItemCode = '[%G;5;0]'";
using (System.Data.SqlClient.SqlDataReader sdr = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(query))
{
if (sdr.Read())
{
rueckgabe = sdr["Price"].ToString();
}
}
((SwissAddonFramework.UI.Components.TextEdit)ev.Form.Items["U_XXAPList"]).Value = rueckgabe;
Vielen Dank.
Gruss Rafael
Rafael Stalder
Wahrscheinlich funktioniert der ganze Code nicht, da das zu füllende Feld nicht auf der gleichen Form ist, wie der Auslöser?Denn das zu füllende UDF Feld ist auf der Form "-150", der Auslöser ItemCode ist hingegen auf der Form "150".
Könnte dass das Problem sein?
Gruss Rafael
Michael Egloff
Hallo Rafael,wenn du Code benutzt, spielt es keine Rolle mehr, wo der Auslöser ist. Du kannst direkt auf das Feld zugreifen und nicht mit der Parameterauslese von SQL.
Das sieht dann etwa so aus:
string itemCode = SwissAddonFramework.UI.Components.TextEdit.GetFromUID(pVal.Form, "5").Value;
string rueckgabe = "";
string query = "SELECT T1.Price FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode WHERE T1.PriceList = '2' AND T0.ItemCode = '" + itemCode + "'";
using (System.Data.SqlClient.SqlDataReader sdr = SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(query))
{
if (sdr.Read())
{
rueckgabe = sdr["Price"].ToString();
}
}
((SwissAddonFramework.UI.Components.TextEdit)pVal.Form.UDFForm.Items["U_XXAPList"]).Value = rueckgabe;
return true;
Wichtig für später:
- Bei Codesequenzen am Schluss angeben, ob alles geklappt hat (dann macht SAP normal weiter) oder nicht. Das macht man mit "return true" für alles OK, "return false" für etwas ist schiefgelaufen.
- Ist der Auslöser auf dem Hauptform und man will aufs UDF Form, erreicht man das mit "pVal.Form.UDFForm"
- Parameterauslese im Stil vom [%G;5] funktioniert nur, wenn man als Regeltyp SQL ausgewählt hat.
Viel Erfolg!
Rafael Stalder
Hallo Michael,ah ja, hört sich logisch an, da man mit C#ja direkt auf die Formen zugreift.
Ich war mir nicht ganz sicher, wie das mit den beiden unterschiedlichen Formen gehandhabt wird, aber deine Erklärung hat mir weiter geholfen.
Dankeschön für die grossartige Hilfe!
Gruss Rafael
0
Please sign in to leave a comment.
Comments
0 comments