Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: MarkusL am 24.01.12 - 16:19:22
-
Hallo zusammen,
ich möchte gerne eure Ratschläge berücksichtigen und kein Profildokument sondern ein normales anderes Dokument nutzen.
Die Feldinhalte im Profildokument habe ich bisher mit @GetProfileField ausgelesen.
Wie kann ich die Felder in einem "normalen" Dokument auslesen, welches mir als Konfigurationsdokument dient?
Ich habe im neuen Konfigurationsdokument bereits ein Feld "Ansicht" eingebaut, nach dem ich suchen könnte. Sofern dies der richtige Ansatz ist.
Wäre nett, wenn mir jemand auf die Sprünge hilft, nach welchem Begriff ich in der Hilfe suchen könnte bzw. wie die dieses Thema angehen könnte.
Danke für eure Hilfe.
Gruss Markus
-
Meinst du sowas wie @GetField?
Wie oder was genau willst du suchen?
Chris
-
Hallo Chris,
Ja - oder sowas meinte ich. @GetField funktioniert doch nur im gleichen Dokument, oder? Zumindest habe ich das so verstanden.
Ich möchte aber in einem neuen Dokument ein Feld automatisch mit einem Wert aus dem "Konfigurationsdokument" befüllen lassen.
Markus
-
@DbLookUp bzw. @DbColumn.
In dem Fall müsstest du eine Ansicht für deine Konfig-Doks haben. Über die genannten Befehle kannst du dann beliebige Items aus den Dokumenten bzw. Spalten aus der Ansicht auslesen.
Gruß,
Mitch
-
So oder so (auch vor dem @GetDocField, was Chris sicherlich meinte) braucht es ein @dbLookup, um das Konfigurationsdokument zu holen und den Wert auszulesen (oder seine UNID aus einer entsprechenden Ansicht, um @GetDocField nutzen zu können).
Bernhard
-
Danke für die Ansätze.
Werde ich testen und dann morgen berichten.
Schönen Feierabend.
Markus
-
Nicht testen, sondern machen. Das von uns beschriebene funktioniert nämlich garantiert. ;)
Bernhard
-
Man könnte die UNID des Konfigurationsdokument (welche sich nie ändern sollte, wenn es nur ein Konfiig-Dok gibt) wiederrum in einem Profildokument abspeichern (oder gar hart codieren, wenn man mutig ist ;D ), dann spart man sich den (etwas langsameren) DBLookup/DBColumn.
Wenn man die UNID hat, dann wie bereits beschrieben mit @GetDocField darauf zugreifen
Gruß
Roland
-
Das halte ich aber für die schlechteste aller Ideen, Roland (vom hardcoden rede ich jetzt gar nicht). Es gibt soviel Gründe, warum sich die UNID ändern könnte (Datenbankreparatur, Speicher- oder Replizierkonflikt, def. Dokument etc.). Dann kommen weitere Konfigurationsdokumente hinzu und das ganze wird ein Flöhehüten ohne Ende.
Um einen hinreichend schnellen Zugriff auf das oder die Konfigurationsdokumente zu erhalten, gibt es probatere Mittel ;)
Bernhard
-
Tag zusammen,
habe jetzt gemacht, getestet und für meine Bedürfnisse für gut empfunden.
Hier mein Code (der bestimmt von euch verbessert werden kann und wird, aber für meine Bedürfnisse reicht es. Und man wächst mit der Zeit.):
Server := "";
DB := "";
Ansicht := "Konfiguration";
Auswahl := "Konfiguration";
Feldauswahl := "team01_wann_1";
Feldfertig :=@DbLookup("":"ReCache";Server:DB;Ansicht;Auswahl;Feldauswahl;[PartialMatch]);
@If(team01_wann_1="";Feldfertig;team01_wann_1:=team01_wann_1)
Die Begriffe Server, DB, Ansicht, Auswahl und Feldauswahl habe ich vorher definiert, damit es für mich erklärender wird und ich dies ggfls. auch in anderen DBs verwenden kann.
Feldfertig fragt dann halt das entsprechende Feld ab.
Und die letzte Zeile füllt das Feld in der aktuellen Maske. Es soll aber nicht neu befüllt werden, sofern es bereits gefüllt ist.
Ich finde es gut und es funktioniert.
Danke für die Hilfe.
Markus
-
Soweit, sogut.
Aber: Lookups sollte man immer abfangen, also den Fehler-Fall bedenken.
Das könnstest du z.B. tun, indem du die Rückgabe vor der Weiterbearbeitung mit @IsError überprüfst. Alternativ kannst - wenn unkritisch - dem DbLookUp auch ein [FailSilent] mitgeben, dann liefert er im Fehlerfall einfach nichts zurück.
Gruß,
Mitch
-
Hallo Mitch,
danke für den Hinweis. Habe ich mit [FailSilent] umgesetzt.
Gruß
Markus
-
Sehe ich das richtig, dass die Formel in der Berechnungsformel des Feldes "team01_wann_01" steht? Falls ja:
Diese Zeile
@If(team01_wann_1="";Feldfertig;team01_wann_1:=team01_wann_1)
könntest Du auch so schreiben
@If(team01_wann_1="";Feldfertig;team01_wann_1)
-> wenn Feld = leer, dann neuer Wert, sonst alter Wert
Dieser Hinweis gilt generell für solche Formeln. Um die Anwendung performanter zu machen, solltest Du die Reihenfolge umstellen.
Du ermittelst im Moment den Wert mittels @DBLookup, den Du eintragen willst
Dann erst prüfst Du, ob der Wert überhaupt eingetragen werden soll
Da ein @DBLookup Zeit kostet, würde ich das umstellen
@If(team01_wann_1!="";@Return (team01_wann_1); "");
Server := "";
DB := "";
Ansicht := "Konfiguration";
Auswahl := "Konfiguration";
Feldauswahl := "team01_wann_1";
team01_wann_1 :=@DbLookup("":"ReCache";Server:DB;Ansicht;Auswahl;Feldauswahl;[PartialMatch]);
Ist das Feld bereits gefüllt, gibst Du den Feldwert zurück und beendest die Funktion, nur wenn es leer ist, berechnest Du es. Da Dein Feld berechnet ist, wird es bei jedem F9 und jedem Speichern neu gerechnet. Da solltest Du auf unnötige Berechnungen verzichten.
-
Hallo Peter,
danke für den Tipp.
Leider funktiniert das nicht, da das Feld aufgrund deiner Formel geleert wird. Und dann auch beim nächsten Öffnen nicht mehr gefüllt wird.
???
Gruss Markus
-
Wo steht die Formel?
-
Hast Du das Ausrufezeichen gesehen?
@If(team01_wann_1!="";@Return (team01_wann_1); "");
-
Hallo Peter,
die Formel steht in einem berechnetem Feld (von denen es viele gibt). Daher ist deine Idee gut.
Das Ausrufezeichen habe ich gesehen. Ich habe deine Formel mit copy & paste eingefügt.
Meines Erachtens kommt das leere Feld nach der Berechnung durch das
@If(team01_wann_1!="";@Return (team01_wann_1); "");
in deiner Formeld.
Müsste hier nicht ebenfalls team01_wann_1 stehen?
-
Steht die Formel in dem berechneten Feld team_01_wann_1?
@If(team01_wann_1!="";@Return (team01_wann_1); "");
Die Formel bedeutet folgendes:
Wenn team01_wann_1 nicht leer ist, gib den Inhalt von team01_wann_1 zurück und beende die Formel
sonst mache nichts
Danach wird die Formel fortgesetzt, falls nicht durch @Return abgebrochen wurde.
-
Hab den Fehler gefunden (kommt davon, wenn man das so nebenbei macht). In der letzten Zeile streiche team01_wann_1, das ist völliger Quatsch. team01_wann_1 ist auf diese Weise eine temporäre Variable, die nur in der Formel gültig ist. In der Formel des gleichen Feldes muss es nicht expliziet zugewiesen werden, steht solch eine Formel in einem anderen Feld, müsste es heißen FIELD team01_wann_1 := ...
Sorry
@If(team01_wann_1!="";@Return (team01_wann_1); "");
Server := "";
DB := "";
Ansicht := "Konfiguration";
Auswahl := "Konfiguration";
Feldauswahl := "team01_wann_1";
team01_wann_1 :=@DbLookup("":"ReCache";Server:DB;Ansicht;Auswahl;Feldauswahl;[PartialMatch]);
EDIT: natürlich musst Du auch noch Dein FailSilent mitnehmen (oder irgendeine andere Fehlerbehandlung)
-
Hallo Peter,
die Formel steht in dem berechneten Feld.
Ich habe das jetzt so gelöst:
Server := "";
DB := "";
Ansicht := "Konfiguration";
Auswahl := "Konfiguration";
Feldauswahl := "team01_wann_1";
@If(team01_wann_1="";@DbLookup("":"ReCache";Server:DB;Ansicht;Auswahl;Feldauswahl;[FailSilent]);team01_wann_1)
Somit wird nach meinem Verständnis der @DBLookup nur ausgeführt, wenn das Feld team01_wann_1 leer ist.
Die Variablen der ersten Zeilen könnte ich entfernen und direkt das @DBLookup nehmen, aber ich nehme sie für die Übersichtlichkeit in Kauf.
Gruss
Markus
-
Ja, die Lösung ist auch gut.
@Return ist dann sinnvoll, wenn die Formel sehr lang ist. Dadurch schafft man Übersichtlichkeit.
-
... und wenn du noch "copy&paste-bareren" Code haben willst, kannst du auch den Feldnamen durch @ThisValue ersetzen, das gibt in einem Feld immer den Inhalt desselben zurück, so musst du das nicht für andere Felder ändern. :)