Auflösung des Themas, im doppelten Sinne...
Käpsele hat mir seine Auftragsbestätigung per
PN zukommen lassen und ich habe mir 3 Tage (naja Abende...) die Zähne daran ausgebissen, die notwendigen
SetVar() und
GetVar() Konstrukte aus meiner Vorlage auf seine nur leicht anders strukturierten Tabellen anzupassen, dass es "tut". Ich bin aber am laufenden Band gegen die Wand gelaufen, weil
SetVar() und
GetVar() in List & Label derart erratisch implementiert sind, dass es schlicht nicht hinzubiegen war. Ich will hier nicht in Details gehen, es war einfach die Hölle...
Da ich aber nicht dazu neige, aufzugeben, habe ich mich nach einer anderen Lösung umgeschaut und habe eine viel bessere und elegantere Lösung gefunden, die ich deshalb hier als Prototyp vorstellen möchte, einerseits für den Fall, dass jemand das gleiche Anliegen wie
@Käpsele hat, oder aber selbst etwas Ähnliches basteln will. - Here we go...
1. Alles, was das SetVar/GetVar Ding tun sollte, war zu prüfen, ob eine Artikelnummer schon einmal vorgekommen ist. Etwas anders ausgedrückt könnte man sagen "gehört eine in der Liste gefundene Artikelnummer zur aktuellen Position".
2. Das kann man aber auch anders prüfen, und zwar, indem man aus der Datenbank einfach eine Tabelle mit allen Artikelpositionen, ihren Artikelnummern und der Sortierfolge in der Bestellung holt und als Grundlage für den Test benutzt.
3. Das kann man mit einer
JTL_DirectTableQuery() machen, also der Spezialform der
JTL_DirectQuery(), die ganze Tabellen zurückliefern kann.
- Was man hierbei nur erreichen muß, ist die zurückgelieferte Tabelle schon in der SQL Query so zu formatieren, dass man sie später in einem ganz normalen
Alias$() Befehl verwenden kann und das geht dann so ...
Code:
JTL_DirectTableQuery("SELECT cArtNr, '=', nSort FROM tbestellpos JOIN tBestellung on tbestellpos.tBestellung_kBestellung=tBestellung.kBestellung WHERE cArtNr<>'' AND tBestellung.cBestellNr='"+ToString$(Vorgang.Auftragsnummer)+"' ORDER BY nSort","","|")
... hier werden also alle nicht leeren (keine Versandpositionen) Artikelnummern und deren Sortierfolge aus der DB gelesen und dazwischen wird jeweils ein "=" gesetzt. Und innerhalb des
JTL_DirectTableQuery() Befehls legen die letzten beiden Parameter fest, wie der Spaltentrenner (hier leer "") und wie der Zeilentrenner (hier "|") aussehen soll.
4. Damit resultiert aus dem, was eben noch eine Tabelle war, ein einzeiliger String mit der
Alias$() Syntax
"ArtNr1=1|ArtNr2=2|..." und falls
ArtNr1 doppelt vorkommt, z.B. als dritte Position, dann lautet der resultierende
Alias$() String
"ArtNr1=1|ArtNr2=2|ArtNr1=3|...". Die Artikelnummer ArtNr1 kommt also an erster und an dritter Stelle vor, aber die zugehörigen Alias-Werte unterscheiden sich!
5. Diese
JTL_DirectTableQuery() legt man jetzt in L&L in einer Benutzervariable (Bereich
"Projekt") namens
@Artikelnummern ab und das führt dazu, dass beim Aufruf der Vorlage automatisch die JTL_DirectTableQuery() ausgeführt und der
Alias$() String geladen wird.
6. Frage ich dann in meiner Artikelschleife z.B. bei der dritten Artikelposition mit
Alias$(ArtNr1,@Artikelnummern) ab, wie der Alias, also das allererste (!) Auftreten von
ArtNr1 war, dann wird der nicht zur aktuellen Artikelposition "3" passende Wert "1" zurückgeliefert. - Bingo!
7. Also muß ich in meinen Darstellungsbedingungen nur noch prüfen, ob meine aktuelle Artikelposition dem ersten Auftreten dieses Artikels entspricht und wenn das nicht der Fall ist, dann wird der Artikel eben nicht ausgegeben.
8. Die Prüfung darauf ist ein bißchen komplexer als eigentlich nötig geworden, weil die Variable für die aktuelle Artikelposition erst NACH dem ersten Durchlauf inkrementiert wird und damit dieser Wert bei der ersten Position = 0 und nicht =1...
Code:
(Count(Auftragspositionen.InterneAuftragspositionnummer,False)=0) OR (Count(Auftragspositionen.InterneAuftragspositionnummer,False)=Val(Alias$(Auftragspositionen.Artikelnummer,@Artikelnummern)))
... aber trotzdem ist das Ganze immer noch um Längen klarer und durchsichtiger als das Hantieren mit SetVar() und GetVar().
Fazit: Summa summarum braucht es also nur 1x SQL Abfrage und dann nur noch die die Festlegung der Darstellungsbedingung wie gerade gezeigt. Und das Beste ... es funktioniert einwandfrei und wie erwartet...
Gruß,
Ingmar