ChooseFromList

Sebastian Wieland

Hallo
Gibt es eine Dokumentation oder Beispiele zur Funktion ChooseFromList (SwissAddonFramework.UI.ChooseFromList)?
Gruss.
Sebastian

Marco Schweighauser

Hallo Sebastion,

die SwissAddonFramework.UI.ChooseFromList ist als obsolete merkiert. Bitte verwende die SwissAddonFramework.UI.Dialogs.ChooseFromList.

Verwendungsbeispiel:


SwissAddonFramework.UI.Dialogs.ChooseFromList cfl = new SwissAddonFramework.UI.Dialogs.ChooseFromList(new SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery("SELECT CardCode, CardName FROM OCRD ORDER BY [%ordercolumn] [%order]"), "CardCode", true, true, (TextEdit)f.Items["txt"]);


Dieser Code abschnitt erzeugt eine CFL, welche die CardCodes anzeigt. Die beiden Parameter ( [%ordercolumn] und [%order] ) in der SQL Query sind optional und bewirken, dass sich die CFL sortieren lässt. Beim Parameter "CardCode" wird der Primarschlüssel definiert. Dieser Wert wird dann anschliessend zurück in das spezifizierte Textfeld geschrieben. Mit dem beiden Boolean Parameter kann du einstellen ob der Primarschlüssel angezeigt werden soll und ob der Wert im Textfeld zwingend korrekt sein muss. Statt einer Textbox kannst du übrigens auch ein Grid verwenden.

Wenn du die CFL nicht an eine Textbox oder Grid binden willst, kannst du auch einfach den Event manuel abfangen.


SwissAddonFramework.UI.Dialogs.ChooseFromList cfl = new SwissAddonFramework.UI.Dialogs.ChooseFromList(new SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery("SELECT CardCode, CardName FROM OCRD ORDER BY [%ordercolumn] [%order]"), "CardCode", true, false);
cfl.ChooseFromListEvent += new SwissAddonFramework.UI.Dialogs.ChooseFromList.ChooseFromListHandler(cfl_ChooseFromListEvent);

cfl.ShowInstance(true, ""); // CFL öffnen, muss manuel gemacht werden wenn sie nicht an eine Textbox oder Grid gebunden ist.

void cfl_ChooseFromListEvent(ChooseFromListEvent e)
{
// Über den Eventparameter kannst du die ausgewählten Werte abfragen.
}

Andreas Eugster

Hallo zusammen

Ich hätte zur ChooseFromList noch eine Frage:

Wie binde ich die ChooseFromList direkt an eine TextBox?

Danke schon im Voraus für die Antwort

Freundliche Grüsse

Andreas Eugster

Marco Schweighauser

Hallo Andreas,

beim Konstruktor der ChooseFromList kannst du weitere Parameter angeben, unter anderem auch eine TextEdit.


TextEdit txt;
... = new SwissAddonFramework.UI.Dialogs.ChooseFromList(new SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery("SELECT CardCode, CardName FROM OCRD ORDER BY [%ordercolumn] [%order]"), "CardCode", true, false, txt);


Sobald die CFL an eine Textbox gebunden ist, wird die CFL automatisch geöffnet und der Wert wieder zurückgeschrieben.

Andreas Eugster

Hallo Marco

Ich habe leider noch eine Frage zur ChooseFromList.

Ich weise sie wie folgt einer TextBox zu.



//Aufruf der Funktion AddBind
AddChooseFromList(edtSpedAus, TypeList.Spediteur);



///
/// Anbinden einer ChooseFromList an eine TextBox
///
///Textfeld angeben, bei der die ChooseFromList angebunden werden soll
///Typ der ChoooseFromList angeben: Spediteur, Muster, Lieferungsempfänger, LieferantenOAct, ArtikelOAct
private void AddChooseFromList(SwissAddonFramework.UI.Components.TextEdit TextField, TypeList type)
{

try
{
//Switch - Anweisunhg für das Testen des Typs
switch (type)
{
#region Spediteur
case TypeList.Spediteur:
SwissAddonFramework.UI.Dialogs.ChooseFromList cflSped = new SwissAddonFramework.UI.Dialogs.ChooseFromList(new SwissAddonFramework.UI.Dialogs.ChooseFromList.SQLQuery("Select CardCode, CardName from OCRD where CardType = S order by CardCode"), "CardCode", true, true, TextField);
break;
#endregion
}


}
catch (Exception e1)
{
SwissAddonFramework.B1Connector.GetB1Connector().Application.SetStatusBarMessage(e1.Message, SAPbouiCOM.BoMessageTime.bmt_Short, true);
}

}


Doch leider passiert nichts, wenn ich in der TextBox * eingebe und anschliessend Tab drücke.

Mache ich etwas falsch? Die CFL sollte doch automatisch aufgerufen werden, oder nicht?

Gruss
Andreas

Marco Schweighauser

Hallo Andreas,

geht die CFL auf wenn du nichts eingbist und bloss TAB drückst ? Der code scheint eigentlich korrekt zu sein.


Gruss

Marco

Andreas Eugster

Hallo Sebastian

Nein, leider geht sie nicht auf.

Gruss

Andreas

Alexander Friesen

Hallo Marco,

wir haben inzwischen das gleiche Problem. An einigen Stellen wird das ChooseFromListEvent gar nicht ausgeführt und zwar in einer unseren Form, merkwürdigerweise funktioniert der ChooseFromList nur da nicht. Ich bin mir sicher, dass es nicht an dem Code liegt, weil wir ChooseFromList schon mehrmals eingebaut haben.
Ich wollte mal testen und ich habe ein Paar neue EventHandler angefügt. Doch beim Debbugen geht der Compiler gar nicht rein. Hast du irgendwelche Vorschläge.

Danke im Voraus,

Alexander Friesen

Alexander Friesen

Hallo Marco,

wollte noch was sagen. Vor ein Paar Monaten hat das wurderbar funktioniert. Jetzt nicht mehr, und keiner hat was im Code geändert.

Gruß, Alexander

Marco Schweighauser

Hallo Alexander,

benutzt du einen ähnlichen Code zu öffnen, wie Andreas ?

Ich werde mir das ganze übers WE anschauen. Funktionieren sollte aber auf jedenfall, schliesslich wird die CFL in all unseren Produkten verwendet. Ich nehme an irgendwo fehlt noch ein Detail.


Gruss

Marco

Andreas Eugster

Hallo zusammen

Ich habe nun herausgefunden wie es funktioniert. Unten ist der gesamte Code dargestellt:


//Aufruf der Funktion AddBind
AddChooseFromList(edtSpedAus, TypeList.Spediteur);




private void AddChooseFromList(SwissAddonFramework.UI.Components.TextEdit TextField, TypeList type)
{
try
{
//Switch - Anweisunhg für das Testen des Typs
switch (type)
{
#region Spediteur
case TypeList.Spediteur:
SwissAddonFramework.UI.Dialogs.ChooseFromList cflSped = new SwissAddonFramework.UI.Dialogs.ChooseFromList(new SwissAddonFramework.UI.Dialogs.ChooseFromList.SQLQuery("Select CardCode, CardName from OCRD where CardType = 'S' order by CardCode"), "CardCode", true, true, TextField);
cflSped.ChooseEntry("{TAB]");
cflSped.Title = "Spediteur auswählen";
cflSped.OrderAscend = true;
cflSped.OrderColumn = "CardCode";
cflSped.DeactivatedInSearchMode = true;
TextField.ChooseFromListAlias = cflSped.Title;
TextField.ChooseFromListUID = "CardCode";
break;
#endregion
//[...mehr cases..]
}
}
catch (Exception e1)
{
SwissAddonFramework.B1Connector.GetB1Connector().Application.SetStatusBarMessage(e1.Message, SAPbouiCOM.BoMessageTime.bmt_Short, true);
}
}


Ich habe nun noch das Problem, dass wenn ich einen Wert eingebe z.B. 01* möchte ich ja die cfl auch sehen, jedoch nur diejenigen, welche diese Einschränkung zusätzlich berücksichtigt. Geht das? Denn im Moment wird diese nicht geöffnet (natürlich nur dann nicht, wenn ich bereits einen Wert eingetragen habe), egal wie ich das SQL-Query anpasse.

Weiter ist noch, dass wenn ich bei der cfl auf Auswählen drücke, wird der Wert nicht in die TextBox übernommen.

Ich könnte ja nun noch ein ChooseFromListEvent erstellen, doch wenn ihr sagt es müsste automatisch funktionieren weiss ich nicht ob dies jetzt wirklich sinnvoll ist.
Denn ich habe mir das ganze schon angeschaut und müsste da mehrere Sachen berücksichtigen. Das eine wäre, dass wenn der CardCode existiert, soll ja die cfl nicht geöffnet werden sondern den wert übernehmen.

Ich habe da schon bisschen ausprobiert, doch leider kam ich auf keine schlaue Lösung. Auf den ItemPressed -Event auf der cfl könnte ich hören und dann das selected Item auslesen und diesen Wert dann in meine TextBox schreiben. Wobei ich dann aber wieder das Problem habe, dass ich die TargetItem-Variable der clf nicht zur Verfügung habe und dies sinnlos ist, wenn ihr dies bereits implementiert habt (mann soll das Rad ja nicht 2x erfinden :)).

Hoffe du verstehst was ich meine. Ansonsten schreib mir eine Mail. Ich weiss nicht, ob und wie oft ich am Wochenende an die Arbeit denken kann :).
Gruss

Andreas

Andreas Eugster

Hallo Marco

Ich habe noch eine weitere Frage, welche jedoch nichts mit der cfl zu tun hat, jedoch genau so wichtig ist für mich.

Es geht um den LinkedButton:


SwissAddonFramework.UI.Components.LinkedButton lkbSpediteur = SwissAddonFramework.UI.Components.LinkedButton.CreateNew("lkbSped");
lkbSpediteur.LinkedObject = LinkedButton.ObjectType.BusinessPartner;
lkbSpediteur.LinkedObjectType = "2";

//Position setzen
lkbSpediteur.Width = 13;
lkbSpediteur.Top = 117;
lkbSpediteur.Height = 14;
lkbSpediteur.Left = 105;
lkbSpediteur.LinkTo = "SpedAus";
lkbSpediteur.FromPane = 5;
lkbSpediteur.ToPane = 5;


Was muss ich noch zusätzlich tun, damit der GP aufgeht, wenn ich einen Wert in der TextBox habe?

Marco Schweighauser

Hallo Andreas,

folgender Code funkioniert bei mir. Ausgeführt wird er nach dem Form.Load().

SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery sql = new SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery("SELECT CardCode, CardName FROM OCRD WHERE CardCode LIKE '[%constraint]' ORDER BY [%ordercolumn] [%order]");
SwissAddonFramework.UI.Dialogs.ChooseFromList cfl = new SwissAddonFramework.UI.Dialogs.ChooseFromList(sql, "CardCode", true, false, txt);


Beachte noch den "constraint" Abschnitt. Mt Hilfe dieses Parameters kann die CFL während dem Start Einschränkungen berücksichtigen.

Folgender Code erzeugt einen Link-Button

SwissAddonFramework.UI.Components.LinkedButton lkbSpediteur = SwissAddonFramework.UI.Components.LinkedButton.CreateNew("lkbSped");
lkbSpediteur.LinkedObjectType = "13";
lkbSpediteur.LinkTo = txt.UniqueID; // Wichtig!
frm.AddItem(lkbSpediteur);


Der Linkbutton erscheint erst wenn ein Wert in die Textbox geschrieben wurde und die Textbox nicht mehr aktiv (nicht mehr gelb) ist. Der Linkbutton erscheint direkt, wenn du beim Laden einen Wert in das Textfeld schreibst.



Gruss

Marco

Andreas Eugster

Hallo Marco

Welche SwissAddonFramework-Version nutzt du? Ich habe die DLL-Version 2.33.0.0

Gruss

Andreas

Marco Schweighauser

Hallo Andreas,

ich nutze Version 2.36 (bislang nur intern veröffentlicht). Zwischen der Version 2.33 und 2.36 wurden aber im Bereich CFL keine Änderungen gemacht.


Gruss

Marco

Andreas Eugster

Hallo Marco

Ich habe zur ChooseFromList noch eine Frage...

Wenn ich auf einem Textfeld, auf dem eine ChooseFromList hinterlegt ist, Tab drücke um die CFL zu öffnen, geht der Focus im Hintergrund auf das nächste Feld in der Tabreihenfolge.

Das heisst:
Sobald ich einen Wert aus der CFL ausgewählt habe, wird dieser im Feld zwar eingetragen, aber der LostFocus wird nicht ausgeführt. Nun die Frage:

Kann ich beeinflussen, dass der Fokus auf dem Feld bleibt und danach der Event "LostFocus" ausgeführt wird?

Gruss

Andreas

Marco Schweighauser

Hallo Andreas,

im ChooseFromListInstance Event kannst du den Fokus wieder auf das alte Objekt zurücksetzen.

Zu diesem Zweck kannst du auf dem Formular das Property "Active" (oder ähnl.) auf die entsprechenden Unique Id setzen.


Gruss

Marco

Andreas Eugster

Hallo Marco

leider funktioniert das nicht ganz. Ich kann zwar den Fokus auf das Objekt zurücksetzten, doch dann wird die Tab - Funktion welche zum aufruf der CFL genutzt wird ausgeführt. Kann ich diese auch unterbinden oder abbrechen?


Gruss

Andreas

Andreas Eugster

Hallo zusammen


Ich habe zu diesem Thema noch eine Frage.
In der zwischenzeit habe ich es mit einer anderen Variante als Übergangslösung behoben.

Ich bin nun so weit das alles einwandfrei funktioniert. Doch leider kann ich keine UDS auf das Feld legen. wenn ich das mache, wird die CFL nicht ausgeführt (Per mail mit Marco besprochen).

Wenn ich nun aber keine UDS auf dieses Feld lege, werden die Werte ja anschliessend nicht in der Datenbank gespeichert. Meine UDS sieht so aus:


private DataBind AddBind(Form form, UserDatasource uds, string Table)
{

form.AddUserDatasource(uds);

SwissAddonFramework.UI.Components.DataBind dtBind = SwissAddonFramework.UI.Components.DataBind.CreateNew(uds.UniqueID);
dtBind.DataBound = true;
dtBind.TableName = Table;
return dtBind;

}


Das Problem ist ja eigentlich die Tabelle. Doch dort gebe ich nur SAP Haupttabellen an (z.B. ORDR). Muss ich dort eine andere Variante der UDS anwenden? Oder wie kann ich das lösen?

Gruss

Andreas

Adrian Meier

Hallo Andreas

Wenn Du das Feld auf einem Systemformular oder auf einem Formular verwendest, welches an ein UDO gebunden ist, sollte das Binding folgendermassen aussehen:

it
m_combo_shipTo.DataBind = SwissAddonFramework.UI.Components.DataBind.CreateNew("U_SWA_CT_ShipToCo");
itm_combo_shipTo.DataBind.DataBound = true;
itm_combo_shipTo.DataBind.TableName = "OSCL";



HTH, Adrian

Andreas Eugster

Hallo Adrian

Den Namen der neuen UDF kann ich selber nach belieben vergeben?

Oder muss ich mich da auf spezielle Richtlinien achten?

Denn eigentlich mache ich ja genau das selbe wie du, nur habe ich es in eine Funktion gepackt.

Gruss

Andreas

Adrian Meier

Hallo Andreas

Beim Anlegen des UDF's würde ich bei der Namensvergebung Deinen Namespace vorne dran hängen.

Gruss, Adrian

Andreas Eugster

Hallo Adrian

Leider wird aber dadurch mein Problem nicht behoben...

Wenn ich die tabelle bei der uds nicht angebe wird die CFL ausgeführt.

Falls ich aber die Tabelle angebe, wird die CFL nicht ausgeführt...

Hättest du da eine Lösung? Soll ich dir das Addon mal zukommen lassen, damit du das genauer anschauen kannst?

gruss
Andreas

Adrian Meier

Hallo Andreas

Du bindest ja das Textfeld an ein Feld in der Tabelle. Funktioniert das, auch mit dem Speichern?

Poste doch mal schnell den Code der Registration der ChooseFromList. Auf welchem Form hast du diese registriert?


Gruss, Adrian

Andreas Eugster

Da ich gestern extern war, konnte ich den Code nicht mehr Posten:

Die CFL binde ich via Funktion an die TextBox.

Code für die TextBox:





//Feld für Auswahl des Spediteurs (GP-Code von CFL auslesen)
SwissAddonFramework.UI.Components.TextEdit edtSpedAus = SwissAddonFramework.UI.Components.TextEdit.CreateNew("SpedAus");
SwissAddonFramework.UI.Components.UserDatasource udsSpedAus = SwissAddonFramework.UI.Components.UserDatasource.CreateNew("U_XXSped");
udsSpedAus.DataSourceType = UserDatasource.DataType.ShortText;
udsSpedAus.Length = 20;
edtSpedAus.Type = Item.ItemType.ExtendedTextEdit;

//form ist meine aktuelle form
//udsSpedAus ist die Datasource des Feldes
//m_strTable ist die Tabelle, an die das Feld gebunden wird (z.B. ORDR)
//Funktion AddBind ist weiter oben definiert
edtSpedAus.DataBind = AddBind(form, udsSpedAus, m_strTable);

form.AddItem(edtSpedAus);

if (e.FormType.ToString() != m_FRM_RECHNUNG && e.FormType.ToString() != m_FRM_AUSGANGSGUTSCHRIFT)
{
//ChooseFromList hinzufügen
AddChooseFromList(edtSpedAus, TypeList.Spediteur);
}



Code der Funktion:


#region ChooseFromList

///
/// Anbinden einer ChooseFromList an eine TextBox
///
///Textfeld angeben, bei der die ChooseFromList angebunden werden soll
///Typ der ChoooseFromList angeben: Spediteur, Muster, Lieferungsempfänger, LieferantenOAct, ArtikelOAct
private void AddChooseFromList(SwissAddonFramework.UI.Components.TextEdit TextField, TypeList type)
{

try
{
//Switch - Anweisunhg für das Testen des Typs
switch (type)
{
#region Spediteur
case TypeList.Spediteur:
SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery sqlSped = new SwissAddonFramework.UI.Dialogs.ChooseFromList.DefaultSQLQuery("Select CardCode, CardName from OCRD where CardType = 'S' AND CardCode LIKE '[%constraint]' ORDER BY [%ordercolumn] [%order]");
SwissAddonFramework.UI.Dialogs.ChooseFromList cflSped = new SwissAddonFramework.UI.Dialogs.ChooseFromList(sqlSped, "CardCode", true, false, TextField);
cflSped.ChooseFromListEvent += new SwissAddonFramework.UI.Dialogs.ChooseFromList.ChooseFromListHandler(cflSped_ChooseFromListEvent);
break;
#endregion
}
}
catch (Exception e1)
{
SwissAddonFramework.B1Connector.GetB1Connector().Application.SetStatusBarMessage(e1.Message, SAPbouiCOM.BoMessageTime.bmt_Short, true);
}

}
///
/// Für das automatische Auswählen des TargetFields nach der Auswahl des GP's
///
/// EventObj für die Abhandlung
void cflSped_ChooseFromListEvent(SwissAddonFramework.UI.Dialogs.ChooseFromListEvent e)
{
Form frm = Form.GetFormFromType(e.TargetItem.Form.Type, e.TargetItem.Form.TypeCount);
frm.Select();
frm.ActiveItem = e.TargetItem.UniqueID;
}

#endregion


Wobei der Übergabeparameter Type vom Typ TypeList ein enum ist:


private enum TypeList {Spediteur, Muster, Lieferungsempfänger, LieferantenOAct, ArtikelOAct};


Hoffe das Hilft dir weiter.

Gruss

Andreas

Adrian Meier

Hallo Andreas

Erst mal nochmals die Frage "Du bindest ja das Textfeld an ein Feld in der Tabelle. Funktioniert das, auch mit dem Speichern?" Wenn nein, dann musst Du dies zuerst angehen.

Wenn ja:
Probier mal ohne diese Zeile:
edtSpedAus.Type = Item.ItemType.ExtendedTextEdit;


Wenn es dann auch nicht funktioniert, schlage ich vor, dass Du den Validate-Event des Textfeldes abfängst und die ChooseFromList selber aufrufst:
cflSped.ShowInstance(...);


HTH, Adrian

Andreas Eugster

Hi Adrian

Ja das Speichern funktioniert.

Ich werde das andere gleich Versuchen und gebe danach hier wieder bescheid.


Gruss

Andreas

Andreas Eugster

Hi Adrian

Hab die Zeile nun entfernt

edtSpedAus.Type = Item.ItemType.ExtendedTextEdit;


Doch leider funktioniert es immer noch nicht richtig. Die CFL wird zwar geöffnet, doch wird, wenn ich im textFeld z.b. 031* eingebe, nichts in die CFL übernommen. Wenn ich anschliessend einen GP auswählen möchte, dann wird die CFL geschlossen, ohne einen Wert in die TextBox zu schreiben.

Ich nehme nicht an, dass sich daran was ändert wenn ich die cfl manuell mit cflSped.ShowInstance(); öffne?

Weisst du noch etwas anderes, was falsch sein könnte?

Gruss

Andreas

Marco Schweighauser

Hallo Andreas,

das Problem liegt wohl am Databinding.
Kannst du einmal versuchen mit edtSpedAus.Value Werte auszulesen und zu schreiben ? Dies wird nähmlich intern in der CFL gemacht.



Gruss

Marco

Andreas Eugster

Hallo Marco

Meinst du jetzt nachdem ich die CFL + Datasource an das Feld gebunden habe via code?


Gruss

Andreas

Marco Schweighauser

Hallo Andreas,

nach dem du das Feld an die Datasource gebunden hast. Die CFL funktioniert nur wenn der Feldwert über Code ausgelesen werden kann. Sollte ein Auslesen mit Code nicht funktionieren, dann funktioniert auch die CFL nicht richtig.


Gruss

Marco

Andreas Eugster

Hallo Marco

Ja ich kann via Code Werte eintragen und ausgeben.

Hättest du denn eine Vermutung?


Gruss

Andreas

Marco Schweighauser

Hallo Andreas,

besteht das Problem noch ? Ich denke am besten währe es wenn das Problem versucht wird in einem kleineren Projekt zu reproduzieren.

Im CFL Event lassen sich die Ausgewählten Werte überprüfen, sind diese dort verfügbar ?

Gruss

Marco

Andreas Eugster

Hallo Marco

Ja das Problem ist immer noch Vorhanden. Ich habe ja schon länger mal um eine Webex gebenten. :) Oder vlt wäre es auch möglich, wenn ich dir das Projekt schicke und du es dir anschaust?


Ich werde mal den CFL Event noch genauer untersuchen und geben dir dann wieder bescheid.

Gruss

Andreas
0

Comments

0 comments

Please sign in to leave a comment.

Didn't find what you were looking for?

New post