Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: FrankLU am 15.11.18 - 19:04:56

Titel: DBLookup mit Key-Liste
Beitrag von: FrankLU am 15.11.18 - 19:04:56
'nabend!

Vielleicht sehe ich den Wald vor lauter Bäumen nicht mehr, aber ich habe folgendes Problem:

Wenn ich mit einem @DBLookup und einer Keyliste arbeiten möchte, bekomme ich immer Werte mehrerer Dokumente zurück.

Ich habe einen Lieferantenstamm-Dokument (LIF) und als Antwortdokumente mehrere Bankverbindung-Dokumente (BV).
Zur Bezahlung von Eingangsrechnungen müssen diese zuerst einer Rechnungsprüfung (Rep) unterzogen und dazu erfasst werden. Dabei soll nach der Auswahl des Lieferanten eine Auswahl der Bankverbindung erfolgen, wenn es für den Lieferanten mehrere gibt.

Es gibt eine Ansicht viewLIF15 mit den Bankverbindungen zu LIF, die folgenden Aufbau hat:
Spalte 1: LIFUID (DocUID von LIF); kategorisiert, sortiert, versteckt
Spalte 2: BVUID (DocUID von BV); sortiert, versteckt
Spalte 3: Feld Bank
Spalte 4: Feld KTO
...

Dazu habe ich folgende Schaltfläche gebastelt:

Code
// Ort der Lieferantenstammdaten herausfinden
Serv := @Subset(@DbName; 1);
Db := @DbLookup("Notes":"NoCache";"";"ViewStm";"MCStm";"StmLif");

BVUID :=  @PickList([Custom]:[Single];Serv:Db; "viewLIF15";"TEO - Auswahl Bankverbindung";"Bitte wählen Sie einen Datensatz aus!"; 2; LIFUID);
@If(BVUID != "";
	@Do(
		Key1 := LIFUID + ";" + BVUID;
		Key2 := @Explode(Key1);
		@SetField("Bank"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF15";Key2;3;[FailSilent]));
		@SetField("KTO"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF15";Key2;4;[FailSilent]));
		@SetField("IBAN"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF15";Key2;5;[FailSilent]));
		@SetField("Inhaber"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF15";Key2;6;[FailSilent]));
		@Command([ViewRefreshFields])
	);
"")

Wenn zwei Bankverbindungen existieren, werden auch die Felder Bank, KTO usw. mit zwei Werten gefüllt. Ok, das kommt von der Kategorisierung der Ansicht viewLIF15, dachte ich.

Also habe ich eine zweite Ansicht viewLIF16 gebaut (was ich eigentlich vermeiden wollte), gleich aufgebaut, wie viewLIF15, nur mit dem Unterschied, dass die erste Spalte LIFUID nun nicht mehr kategorisiert ist, sondern nur noch sortiert.

Code
// Ort der Lieferantenstammdaten herausfinden
Serv := @Subset(@DbName; 1);
Db := @DbLookup("Notes":"NoCache";"";"ViewStm";"MCStm";"StmLif");

BVUID :=  @PickList([Custom]:[Single];Serv:Db; "viewLIF15";"TEO - Auswahl Bankverbindung";"Bitte wählen Sie einen Datensatz aus!"; 2; LIFUID);
@If(BVUID != "";
	@Do(
		Key1 := LIFUID + ";" + BVUID;
		Key2 := @Explode(Key1);
		@SetField("Bank"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF16";Key2;3;[FailSilent]));
		@SetField("KTO"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF16";Key2;4;[FailSilent]));
		@SetField("IBAN"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF16";Key2;5;[FailSilent]));
		@SetField("Inhaber"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF16";Key2;6;[FailSilent]));
		@Command([ViewRefreshFields])
	);
"")

Leider ist das Ergebnis das gleiche: Zwei Werte in jedem Maskenfeld, wenn zwei BV-Dokumente existieren.

Wie funktioniert das mit zwei Schlüsselwerten beim @DbLookup? Oder muss ich da bei der Definition der Ansicht was beachten? Ist eine Option (nicht) gesetzt?

 :-:

Vielleicht kann mir jemand meinen Fehler zeigen.

Danke im voraus.
Titel: Re: DBLookup mit Key-Liste
Beitrag von: Peter Klett am 15.11.18 - 19:49:05
Vielleicht ist es ja nur ein Tippfehler, aber ich kenne die Funktion @Explore nicht, probier doch mal @Explode

Noch einfacher ist es ohne

Key2 := LIFUID : BVUID

Ich habe noch nie DBLookup mit zwei Sortierspalten benutzt, kenne daher nicht die Fallen, in die man dabei treten kann. Daher hätte ich eine Ansicht gebaut, in der die erste Spalte die Formel LIFUID + "#" + BVUID enthält, und dann sucht der DBLookup mit genau diesem einfachen Schlüssel.
Titel: Re: DBLookup mit Key-Liste
Beitrag von: FrankLU am 16.11.18 - 09:21:34
Guten Morgen Peter,

Danke für die schnelle Antwort. Ja, es war ein Schreibfehler. Es muss natürlich @Explode heißen. Ich hab's korrigiert. Ich hatte diesen Befehl schon aus der aktuellen Codierung entfernt und für die Anfrage hier wieder eingefügt. Da hatte ich schon neun Stunden des Programmierens hinter mir, war etwas müde.  ;)

Das mit der Kombination der beiden UIDs ist eine gute Idee, ist in diesem Fall aber nicht praktikabel, weil ich die viewLIF15 als eingebette Ansicht in der LIF-Maske verwende. Da brauche ich die LIFUID alleine. Deswegen ist sie auch kategorisiert.

Kannn es sein, dass sich kategorisierte Ansichten generell nicht für @DBLookups eignen? Steht das irgendwo? Habe nix gefunden.
Titel: Re: DBLookup mit Key-Liste
Beitrag von: Peter Klett am 16.11.18 - 09:44:25
Du benutzt die Ansicht sowohl als eingebettete sichtbare Ansicht als auch für das Lookup? Das würde ich NIEMALS machen. Technischer Zugriff auf sichtbare Ansichten ist bei uns verboten. Jeder Änderungswunsch bzgl. der Gestaltung der Ansicht führt zu Fehlern im Lookup. Da pflegt und testet man sich einen Wolf.

@SetField("KTO"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF15";Key2;4;[FailSilent]));
@SetField("IBAN"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewLIF15";Key2;5;[FailSilent]));
   
Dein Lookup holt die Daten auch noch aus Spalten. Wenn Deine Anwender jetzt sagen, sie wollen erst die IBAN und dann die Kontonummer in der Ansicht sehen, dann übernimmst Du die IBAN in die Kontonummer und umgekehrt.

Die BVUID ist die UniversalID des Bankverbindungsdouments? Dann erstelle Dir doch eine (zusätzliche) Ansicht mit einer einzigen sortieren Spalte @Text (@DocumentUniqueID). Diese Ansicht ist allgemeingültig für alle Dokumente in der Datenbank. Und dann holst Du Dir, nachdem die BVUID bekannt ist, aus dieser Ansicht die Werte über die Felder, nicht über die Spalten

@SetField("KTO"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewIDs";BVUID;"FeldnameKTO";[FailSilent]));
@SetField("IBAN"; @DbLookup("Notes":"NoCache"; Serv:Db;"viewIDs";BVUID;"FeldnameIBAN";[FailSilent]));

Die Ansicht kannst Du für alle Zugriffe dieser Art auf Dokumente, von denen die UniversalID bekannt ist, verwenden