Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: schroederk am 24.09.10 - 08:53:08

Titel: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 08:53:08
Hallo,

ich bräuchte mal Eure Hilfe bei einer Formel in einem Listenfeld.

Ich habe mehrere (theoretisch beliebig viele) Profildokumente.
Benannt sind diese bspw. test_1, test_2, test_3 usw.
In diesem Profildokument liegt unter anderem das Feld "adressfeld"

In der Auswahl soll nun für alle test_* das adressfeld zur Auswahl stehen.
Erschwerend noch dazu, dass wenn das Feld adresfeld leer ist (" "), dann soll ein Feld aus dem Globalen Adressbuch gezogen werden.

Ist das überhaupt so ohne weiteres möglich? Muss ich eventuell diese Werte irgendwo vorher ermitteln und im Listenfeld dann ranziehen?





Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: Axel am 24.09.10 - 09:04:44
Ich habe mehrere (theoretisch beliebig viele) Profildokumente.

 ???  ???

Aber nur theoretisch.

In der Regel kann es nur ein datenbankbezogenes Profildokument und eines pro User geben.

Axel

Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: Peter Klett am 24.09.10 - 09:08:33
Mit einer Schleife müsstest Du das hinbekommen. Sinngemäß so (habe die Befehle nicht im Kopf, deshalb umschreibe ich sie)
 
_liste := "";
_nr := 1;
@Do...
   Hole Schlüsselfeld aus Profil "test" + @Text (_nr)
   Wenn Schlüsselfeld = leer -> Ende der Schleife (Profildokument gibt es nicht)
   Wenn Adressfeld leer -> hole anhand Schlüssel das Feld aus dem globalen Adressbuch
   _liste := _liste : Adressfeld
   _nr := _nr + 1;

@Trim (_liste)

Es könnte sein, dass bei einer Abfrage eines nicht existierenden Profildokuments dieses angelegt wird, das wäre nicht schön. Vielleicht gibt es einen Befehl, mit dem man die Existenz eines Profildokuments abfragen kann? Ich mag keine Profildokumente, deshalb nutze ich die nicht

Nachtrag:

@Do ist natürlich falsch, es muss irgendeine Schleife sein, aber nicht @For, da Du die Anzahl nicht weißt, @While ist wohl richtig
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 09:11:37
In der Regel kann es nur ein datenbankbezogenes Profildokument und eines pro User geben.

Axel

Wenn ich mir mit NotesPeek z.b. meine Datenbank anschaue, dann sehe unter Profiles eine große Anzahl von Einträgen:

archive database profile
archive profile
breakpoints
calendarprofile
calcolorprofile
calendarsettings
colorprofile
...
inotesprofile
ownercontact1
...

und eben auch schon meine test_1 und test_2

Und mit @GetProfileField("test_1";"addressfeld") greife ich darauf zu.


Vielleicht verwende ich ja nicht die richtige Terminilogie.   :-:

Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 09:17:15
Mit einer Schleife müsstest Du das hinbekommen. Sinngemäß so (habe die Befehle nicht im Kopf, deshalb umschreibe ich sie)
 
_liste := "";
_nr := 1;
@Do...
   Hole Schlüsselfeld aus Profil "test" + @Text (_nr)
   Wenn Schlüsselfeld = leer -> Ende der Schleife (Profildokument gibt es nicht)
   Wenn Adressfeld leer -> hole anhand Schlüssel das Feld aus dem globalen Adressbuch
   _liste := _liste : Adressfeld
   _nr := _nr + 1;

@Trim (_liste)

Es könnte sein, dass bei einer Abfrage eines nicht existierenden Profildokuments dieses angelegt wird, das wäre nicht schön. Vielleicht gibt es einen Befehl, mit dem man die Existenz eines Profildokuments abfragen kann? Ich mag keine Profildokumente, deshalb nutze ich die nicht


Vielen Dank... das ist schonmal ein guter Ansatz für mich.
Ich hatte befürchtet, dass in diesem Formelfeld für das Listenfeld jede Zeile einem Eintrag entspricht und mir war nicht klar, wie ich so die Einträge dynamisch aufbauen kann.
Die Syntax der Befehle werde ich mir schon erarbeiten können (Die Hoffnung stirbt zuletzt ;) )

Sicherlich sehr sinnvoll, dass es eine Möglichkeit gibt, zu prüfen, ob ein Profildokument existiert, ohne es anzulegen. Sonst würde mit jedem Aufruf ein weiteres Dokument entstanden sein.
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: Peter Klett am 24.09.10 - 09:23:26
Falls Du meinen Nachtrag nicht gelesen hast: @Do ist quatsch (dachte an Script: Do ... Loop), @While sollte es sein.
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 09:35:27
Falls Du meinen Nachtrag nicht gelesen hast: @Do ist quatsch (dachte an Script: Do ... Loop), @While sollte es sein.
hab ich schon gemerkt, aber danke für den Hinweis.

In der Hilfe steht leider nicht, was passiert, wenn ich bei @GetProfileField ein nicht existierendes angebe.
Vielleicht wird einfach nichts zurückgegeben. Muss ich wohl testen  :-\

Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 10:05:50
Hier mein erster Grobentwurf für das Script:
Zitat
_liste := "";
_nr := 0;
_fertig := 0;
@While (_fertig = 0;
   _name = @GetProfileField("test_"+@Text(_nr);"NAME");
   @If( @IsNull(_name);
      _fertig := 1;
      @Do(
         _addy = @GetProfileField("test_"+@Text(_nr);"ADRESSFELD");
         @If(_addy = " ";
            _addy := "TODO: hole aus GAL";
         )
         _liste := _liste : _addy;
         _nr := _nr + 1;
      )
   )
)
@Trim(_liste);

Würde das soweit funktionieren?

Kann mir noch jemand einen Tip geben, wie ich auf den Adressbucheintrag des Benutzers aus diesem Formula-Script heraus zugreifen kann?

Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: Peter Klett am 24.09.10 - 10:51:42
@If(_addy = " "; ist falsch, richtig -> @If(_addy = "";

Eine leere Adresse wird kein Leerzeichen einthalten, sondern nichts.

Wenn Du im Adressbuch eine Ansicht hast, die in der ersten Spalte den Namen sortiert anzeigt (probier mal $Users, falls es die gibt), holst Du Dir die Daten mittels @DBLookup

Server und Dateiname des Adressbuches würde ich nicht hart eintragen, sondern irgendwie errechnen. Ist es names.nsf auf dem Server?

Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 11:00:05
@If(_addy = " "; ist falsch, richtig -> @If(_addy = "";

Eine leere Adresse wird kein Leerzeichen einthalten, sondern nichts.

Laut NotesPeek ist in dem Feld ein Leerzeichen enthalten. Daher das " ". Aber das sind ja Kleinigkeiten ;)


Wenn Du im Adressbuch eine Ansicht hast, die in der ersten Spalte den Namen sortiert anzeigt (probier mal $Users, falls es die gibt), holst Du Dir die Daten mittels @DBLookup

Server und Dateiname des Adressbuches würde ich nicht hart eintragen, sondern irgendwie errechnen. Ist es names.nsf auf dem Server?

Richtig. Die names.nsf auf dem Server, auf dem sich auch der User befindet.
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 12:40:54
Da scheint es noch einen syntaktischen Fehler zu geben, da mir Notes meldet, es würden noch Argumente für die Funkion fehlen und stellt sich auf das Ende vom @Do.

So sieht das Teil im Moment aus:

Zitat
_liste := "";
_nr := 0;
_fertig := 0;
_server := @Subset(@DbName; 1);

@While (_fertig = 0;
   _name = @GetProfileField("test_"+@Text(_nr);"NAME");
   @If( @IsNull(_name);
      _fertig := 1;
      @Do(
         _addy = @GetProfileField("test_"+@Text(_nr);"ADRESSFELD");
         @If(_addy = " ";
            _addy := @DbLookup("";_server:"names.nsf";"People"; @Name([CN];Name);"InternetAddress");
         );
         _liste := _liste : _addy;
         _nr := _nr + 1;
      )
   )
)
@Trim(_liste);

Glaubt er nun, dass ihm der Else-Zweig vom @If fehlt oder ist die Syntax vom @Do falsch?
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: koehlerbv am 24.09.10 - 12:49:02
Auf jeden Fall fehlt hier schon mal der Else-Zweig:
@If(_addy = " ";
            _addy := @DbLookup("";_server:"names.nsf";"People"; @Name([CN];Name);"InternetAddress");
         );

Bernhard
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 13:12:57
Ups, den hatte ich schon korrigiert gehabt:

@If(_addy = " ";
            _addy := @DbLookup("";_server:"names.nsf";"People"; @Name([CN];Name);"InternetAddress");
            @Nothing
         );
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: koehlerbv am 24.09.10 - 13:18:25
@Nothing kannst Du dort nicht verwenden. Ersetze das durch einen Leerstring.

Bernhard
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 13:21:53
Rein syntaktisch hatte er diese Stelle nicht mehr angemeckert.

Habs jetzt mal so geschrieben, schreit aber immer noch an der Klammer zu vom @Do.

@If(_addy = " ";
            _addy := @DbLookup("";_server:"names.nsf";"People"; @Name([CN];Name);"InternetAddress");
            _addy := "nicht gefunden!"
         );

Meldung: Argumente für @Funktionen erwartet aber nicht vorhanden: ")"
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: koehlerbv am 24.09.10 - 13:37:04
Das ist noch falsch, weil keine Zuweisung:
_addy = @GetProfileField("test_"+@Text(_nr);"ADRESSFELD");

Das hier steht jetzt innerhalb der @Do-Anweisung, was sicherlich auch nicht gewollt ist:
 _nr := _nr + 1;
Und das dort abschliessende Semikolon führt zu Deiner Fehlermeldung - Du kündigst mehr Code an, der aber gar nicht kommt.

HTH,
Bernhard

Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 13:45:13
Das ist noch falsch, weil keine Zuweisung:
_addy = @GetProfileField("test_"+@Text(_nr);"ADRESSFELD");
Dieser miese kleine Fehlerteufel. Wäre mir wohl nie aufgefallen. Und der Designer hat auch nichts gesagt  :(

Das hier steht jetzt innerhalb der @Do-Anweisung, was sicherlich auch nicht gewollt ist:
 _nr := _nr + 1;
Und das dort abschliessende Semikolon führt zu Deiner Fehlermeldung - Du kündigst mehr Code an, der aber gar nicht kommt.

Das ist eigentlich schon so gewollt, da er ja nur hochzählen muss, wenn noch ein Profil-Dokument gefunden wurde. Würde aber auch nicht stören, wenn nicht.
Wenn ich das Semikolon weglasse, dann lautet die Fehlermeldung so:

Ein Operator oder Semilkolon wurde erwartet, aber nicht gefunden: ")" und stellt sich diesmal auf das @Trim


Edit: Ich habs, der @While benötigte auch noch ein Semikolon am Klammerende. Muss mich echt noch an diese Strukturen von Lotus Formula gewöhnen  :-[
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 15:25:29
Das Script sieht jetzt so aus und funktioniert schonmal soweit:

Zitat
_liste := "";
_nr := 0;
_fertig := 0;
_server := @Subset(@DbName; 1);

@While (_fertig = 0;
 _name := @GetProfileField("test_"+@Text(_nr);"NAME");
 @If( @IsNull(_name);
  _fertig := 1;
  @Do(
   _addy := @GetProfileField("test_"+@Text(_nr);"ADRESSFELD");
   @If(_addy = " ";
    _addy := @DbLookup("";_server:"names.nsf";"($Users)"; @DbTitle;"InternetAddress");
    ""
   );
   _liste := _liste : _addy;
   _nr := _nr + 1
  )
 )
);
@Trim(_liste)

Ändern musste ich noch die Suche im Globalen Adressbuch. Die View People funktionierte nicht, mit ($Users) gehts.

Ich suche nach @DBTitel, um die Internet Adresse des Datanbank-Eigentümers herauszubekommen.
@UserName sucht mir ja nach dem aktuellen Benutzer der Datenbank, der nicht der Eigentümer sein muss.

Allerdings geht die Sache sicherlich schief, wenn mal der DB-Name geändert werden sollte. Kann ich sonst noch wie den Namen des DB-Owners herausbekommen?
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: koehlerbv am 24.09.10 - 15:35:39
Was sind denn das für Datenbanken? Mail-DBs?

Bernhard
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: schroederk am 24.09.10 - 15:48:24
Korrekt. Ausschließlich Mail-DBs.

Frage am Rande. Gibt es denn nicht bei jeder Datenbank sowas wie einen Owner?
Titel: Re: Hilfe bei Formel im Listenfeld
Beitrag von: koehlerbv am 24.09.10 - 15:50:10
Nein, das gibt es nicht.
Aber Mail-DBs brauchen das für ihre Funktionalität. Der Owner ist im ProfileDocument "CalendarProfile" gespeichert und kann daraus von Dir gelesen werden.

Bernhard