Textzeile in einem Belegformular anlegen
Frank Romeni
Ich verwende das Coresuite Function Buttons-Sample um ein neues Angebot zu öffen. Dieses habe ich soweit erweitert, daß ich auch Artikel in die Angebotsmatrix schreibe, was prima funktioniert:
...
// Kunden in Angebot eintragen
//
((SwissAddonFramework.UI.Components.TextEdit)ev.Form.Items["4"]).Value = bpCode;
// Artikel in die Angebotsmatrix eintragen
//
for(int i=0; i ((SwissAddonFramework.UI.Components.Matrix)ev.Form.Items["38"]).SetValue("1", i+1, itemsTable.itemCode); // itemCode in die Angebotsmatrix schreiben
((SwissAddonFramework.UI.Components.Matrix)ev.Form.Items["38"]).SetValue("11", i+1, (itemsTable.quantity).ToString()); // Anzahl
// etc. ...
}
...
Jetzt möchte ich aber auch eine Zeile vom Typ 'Text' in die Matrix eintragen.
Mein erster Versuch hat nicht viel gebracht:
...
((SwissAddonFramework.UI.Components.Matrix)ev.Form.Items["38"]).SetValue("257", i+1, "T"); // Zeile als Textzeile markieren (Col 257: Spalte 'Typ')
Sobald ich eine Zeile als Textzeile eintrage (Spalte 'Typ' == "T"), öffnet sich sofort ein Texteditor.
Würde dieser sich nicht öffnen, wüßte ich zudem nicht, wie ich dann den Text in die Zeile eintragen könnte.
Wie kann ich trotzdem erreichen, eine Textzeile in mein Angebot einzutragen?
Vielen Dank für Eure Hilfe!
Gruß
Frank Romeni
Sascha Balke
Hallo Frank,möchtest du einen bereits vorhandenen Text einfügen oder gleich in der ersten Zeile einen Text eingeben?
VG
Sascha
Frank Romeni
Grüß Dich Sascha!Zu Deinen Fragen:
1. Der Text ist nicht vorhanden, sondern wird in meinem Code erst erzeugt.
2. Der Text wird nicht in der ersten Zeile angelegt, sondern in einer der folgenden Zeilen, wobei die Zeile in der eine Textzeile eingetragen werden soll, sich auch erst in meinem Code ergibt.
Gruß
Frank Romeni
Michael Egloff
Hallo Frank,UI Steuerung bei SAP B1 ist der blanke Horror! Ich kenn dein Problem, habe aber dazumals einen anderen Weg eingeschlagen (mittels DI und geparkten Beleg).
Ich leite deine Anfrage an Marco Schweighauser weiter, soweit ich weiss, hat er mal was gemacht in dieser Beziehung.
Gruss,
Michael
Frank Romeni
Hallo Michael,Deine letzte Antwort hat mich einigermaßen hoffnungsvoll in den Urlaub fahren lassen - leider ist von Marco Schweighauser nichts angekommen, wie ich jetzt nach meinem Urlaub sehe.
Du erwähnst aber auch, daß Du bereits einmal einen anderen Lösungsweg gegangen bist - kannst Du mir dazu vielleicht etwas sagen. Vielleicht hilft es mir ja weiter.
Vielleicht fragst Du auch nochmals bei Marco Schweighauser nach - vielleicht hat er ja einfach vergessen zu antworten. Oder kann ich ihn selbst irgendwo fragen?
Gruß
Frank Romeni
Frank Romeni
So, ich habe jetzt selbst eine Lösung für mein Problem gefunden!(Funktioniert aber erst mit SAP B1 2007! Das Document_SpecialLines Objekt wurde in 2007 neu hinzugefügt)
Ich lege das Angebot nicht mehr über das Formular an, sondern nutze die DI-API, lege also dort ein neues Angebotsobjekt an. In diesem Objekt steht mir dann auch die Eigenschaft SpecialLines zur Verfügung, ie eben genau meine gewünschten Textzeilen erzeugt (bzw. Zwischenergebnisse aufsummiert, je nach gewähltem Typ.
Das neu angelegte Angebot kann ich dann anschließend als Formular auf den Bildschirm holen (dafür gibt's hier irgendwo separate Beispiele).
Hier mein Code, der ein Angebot mit drei Artikeln erzeugt, wobei hinter Artikel "A1000" zwei Textzeilen und hinter "A1001" eine Textzeile folgen.
int nextDocNum = 0;
string query = "SELECT MAX(DocNum) FROM OQUT";
using(System.Data.SqlClient.SqlDataReader reader =
SwissAddonFramework.B1Connector.GetB1Connector().ExecuteQuery(query)){
if(!reader.Read()){
myErrorMsg();
goto abort;
}
if(reader.IsDBNull(0)){
nextDocNum = 1;
}else{
nextDocNum = reader.GetInt32(0);
nextDocNum++;
}
}
SAPbobsCOM.Documents oQuot =
(SAPbobsCOM.Documents)SwissAddonFramework.B1Connector.
GetB1Connector().Company.GetBusinessObject
(SAPbobsCOM.BoObjectTypes.oQuotations);
oQuot.CardCode = "C1000";
oQuot.DocNum = nextDocNum;
oQuot.Lines.ItemCode = "A1000";
oQuot.Lines.Add();
oQuot.SpecialLines.AfterLineNumber = 0;
oQuot.SpecialLines.LineType = SAPbobsCOM.BoDocSpecialLineType.dslt_Text;
oQuot.SpecialLines.LineText = "after A1000 Special Line No. 1";
oQuot.SpecialLines.Add();
oQuot.SpecialLines.AfterLineNumber = 0;
oQuot.SpecialLines.LineType = SAPbobsCOM.BoDocSpecialLineType.dslt_Text;
oQuot.SpecialLines.LineText = "after A1000 Special Line No. 2";
oQuot.SpecialLines.Add();
oQuot.Lines.ItemCode = "A1001";
oQuot.Lines.Add();
oQuot.SpecialLines.AfterLineNumber = 1;
oQuot.SpecialLines.LineType = SAPbobsCOM.BoDocSpecialLineType.dslt_Text;
oQuot.SpecialLines.LineText = "after A1001 Special Line No. 1";
oQuot.SpecialLines.Add();
oQuot.Lines.ItemCode = "A1002";
oQuot.Lines.Add();
if((rc = oQuot.Add()) != 0){
myErrorMsg();
}
abort: ;
Gruß
Frank Romeni
-
Hallo ich habe ein sehr ähnliches Problem.
Ich habe für das Form: 133 (Ausgangsrechnung) eine optimizer Regel angelegt. Über diese Regel füge ich beim Form.Load einen Button hinzu.
Wird dieser Button ausgelöst, sollen zur Ausgangsrechnung automatisch Zeilen hinzugefügt werden, und zwar:
1x Textzeile (diese dient quasi als Überschrift für die vier folgenden Artikelzeilen)
4x Artikelzeilen
1x ZwischensummeJetzt ist es jedoch genau wie oben bereits beschrieben.
Eine Zeile mittels:matrix.SetValue("257", rowCount, "T");
...hinzuzufügen, resultiert darin, das sich unmittelbar darauf ein Texteditor öffnet.
Ein direktes editieren dieser Textzeile z.B.:matrix.SetValue("1", rowCount, "Test 1, 2, 3");
...ist leider nicht möglich und resultiert in einem Fehler.
Ich habe dann über die in diesem Thread beschriebene 'SAPbobsCOM' (SAP Business One DI API COM library) versucht das Problem zu Lösen und diesen Texteditor zu umgehen, allerdings funktioniert das nicht. Was wohl daran liegt, dass diese library dazu gedacht ist, von außerhalb auf SAP zuzugreifen. Ich bin aber bereits in einem generierten Form in SAP und möchte lediglich einer Ausgangsrechnung mittels Button.Click einen vordefinierten Baustein hinzufügen.Hat hier jemand eine Idee, wie man eventuell diesen Texteditor anspricht der sich unweigerlich öffnet? Eventuell ist es ja möglich, diesem Editor eine Textzeile in sein Textfeld zu injizieren und einen Event auszulösen, welcher den Klick auf den OK Button zum übertragen des Textes an die Textzeile simuliert?
Hier ist mein derzeitiger Versuch, eventuell weiß ja jemand eine Lösung:
string matrixUID = "38";string referenceUID = "222";string buttonValue = "Montageleistung einfügen";string nameSpace = "COR_";try{StatusBar.WriteWarning("DEBUG - Rule: " + pVal.RuleInfo.RuleName + " was triggered.");// Use reference item to set size and position of the add buttonItem referenceItem = Item.GetFromUID(pVal.Form, referenceUID);// Create buttonButton button = Button.CreateNew(nameSpace + "B1");button.Value = buttonValue;button.SetSizeAndPosition(referenceItem);button.Height = 22;button.Top = button.Top + 18;pVal.Form.AddItem(button);pVal.Form.Update();// Add click event to buttonSwissAddonFramework.UI.EventHandling.ItemEvents.ItemPressedEventHandler eventHandler = null;eventHandler = delegate (SwissAddonFramework.UI.EventHandling.ItemEvents.ItemPressed e){try{// Get Matrix...Matrix matrix = Matrix.GetFromUID(pVal.Form, matrixUID);// Get current row countint rowCount = matrix.Rows.Count;int newRowIndex = rowCount + 1;SAPbobsCOM.Documents document = (SAPbobsCOM.Documents) SwissAddonFramework.B1Connector.GetB1Connector().Company.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oInvoices);document.SpecialLines.SetCurrentLine(0);MessageBox.Show(document.SpecialLines.LineNum.ToString(), "OK");document.SpecialLines.LineType = SAPbobsCOM.BoDocSpecialLineType.dslt_Text;document.SpecialLines.AfterLineNumber = 0;document.SpecialLines.LineText = "<b>Datum // Monteur & Monteur</b>";document.SpecialLines.Add();matrix.SetValue("1", rowCount, "03-001-000011");matrix.SetValue("1", rowCount + 1, "03-001-000012");matrix.SetValue("1", rowCount + 2, "03-001-000013");matrix.SetValue("1", rowCount + 3, "03-001-000008");matrix.SetValue("257", rowCount + 4, "S");}catch (Exception ex){StatusBar.WriteError(ex.Message);}};button.AddHandler_ItemPressed(SwissAddonFramework.UI.Components.ModeComponent.FormModes.ALL, null, eventHandler);}catch (Exception ex){string errorMessage = string.Format("Error in {0} Rule '{1}': {2}", pVal.RuleInfo.RuleType, pVal.RuleInfo.RuleName, ex.Message);MessageBox.Show(errorMessage, "OK");StatusBar.WriteError(errorMessage);Debug.WriteMessage(errorMessage, Debug.DebugLevel.Exception);}return true;Gruß
Manuel0
Please sign in to leave a comment.
Comments
1 comment