AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
07.12.21 - 05:08:13
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Domino 9 und frühere Versionen
| |-+  ND8: Entwicklung (Moderatoren: Axel, Thomas Schulte, koehlerbv)
| | |-+  LS Common Names von mehreren Einträgen
« vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: LS Common Names von mehreren Einträgen  (Gelesen 5310 mal)
Bruce Willis
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1002


Wer nicht wagt...


« am: 14.06.11 - 14:15:16 »

Hallo,

ein Agent läuft periodisch über bestimmte Dokumente und sendet eine Email an die Empfänger, die dort in dem Feld NW stehen.

Code:
Dim AnWen As Variant
AnWen = doc.NW
Message.SendTo=AnWen

Die 2. Email sendet der Agent, um jemanden über die Empfänger der 1. Email zu informieren:

Code:
Call rtitem.AppendText("Die Nachricht wurde an die folgenden Empfänger verschickt: " +  Implode (AnWen, ", ") & Chr(13) )

Sieht etwa so und leider nicht ganz schön aus:

CN=mein user02/O=Welt, CN=my user03/O=Welt

Ich würde gerne Common Name benutzen.
Bei der folgenden Variante wird nur der erste Name genommen aber nicht alle, die im Feld NW eingetragen sind:

Code:

Dim nam As NotesName
Dim AnWenString As String
AnWenString = Implode(AnWen, ", ")
Set nam = session.CreateName(AnWenString)
Call rtitem.AppendText("Die Nachricht wurde an die folgenden Empfänger verschickt: " + nam.Common & Chr(13) )

Was muss ich hier ändern?

Gruß
Leo



Gespeichert

nobody is perfect but i'm pretty close 
Peter Klett
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 2704



« Antworten #1 am: 14.06.11 - 14:28:04 »

Du musst die Empfänger erst in ein Array übernehmen, dann jeden Arrayeintrag (Stichwort Forall) in Common übersetzen und erst dann in einen String implodieren.
Gespeichert
koehlerbv
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 20460



« Antworten #2 am: 14.06.11 - 14:33:11 »

Oder Du machst ein Evaluate über Dein Empfänger-Array mit @Username ([CN]; ...).

Bernhard
Gespeichert
Bruce Willis
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1002


Wer nicht wagt...


« Antworten #3 am: 14.06.11 - 16:51:02 »

VIELEN DANK
für die schnelle Unterstützung!

Scheint zu funktionieren:

Code:
ForAll value In AnWen   
Dim nam As NotesName
Set nam = session.CreateName(value)
Dim AnWenCN As String
AnWenCN = nam.Common + ", " + AnWenCN
End ForAll
'Print AnWenCN 'zum Testen

Gruß
Leo
Gespeichert

nobody is perfect but i'm pretty close 
koehlerbv
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 20460



« Antworten #4 am: 14.06.11 - 17:13:22 »

Lieber Brucie, das sinnfreie Deklarieren der Variablen / Objekte nam und AnWenCN ist kontraproduktiv, weil es eben immer wieder innerhalb der Schleife passiert.

Besser wäre es so:
Code:
Dim nam As NotesName
Dim AnWenCN As String
ForAll value In AnWen    
Set nam = session.CreateName(value)
AnWenCN = nam.Common + ", " + AnWenCN
End ForAll
'Print AnWenCN 'zum Testen

Knackiger ist aber:
Code:
Dim docCurrent As NotesDocument
dim vNamesCommon As Variant

Set docCurrent = ....
vNamesCommon = Evaluate ("@Name ([CN]; NW)", docCurrent)

Messagebox Implode (vNamesCommon, Chr$ (10))     'zum testen

Massgabe: NW ist wie von Dir beschrieben Dein Item, in dem die bisherigen Empfänger im Dokument (docCurrent) gelistet sind.

HTH,
Bernhard

PS: Zweifelsohne ist die Forall-Schleife in LotusScript wie prinzipiell von Peter und Dir aufgemalt die lesbarere Variante, zu der ich auch eher neige. Das nativere Evaluate sollte eingesetzt werden, wenn es tatsächlich auf Performance ankommt.

PPS: Was heisst eigentlich "scheint zu funktionieren"?? In der Programmierung gibt es nur zwei Zustände für solch simple Aufgaben: Tut oder tut eben nicht. Natürlich hast Du keine Fehler- oder Ausnahmebedingungen-Behandlung eingebaut. Wenn Du gar kein Item zum Füllen von AnWen hast oder AnWen nur einen Leerstring enthält, dann fällst Du natürlich auf die Nase oder erhältst Nonsens. Aber das gehörte natürlich nicht zu Deiner Frage  Wink
« Letzte Änderung: 14.06.11 - 17:17:43 von koehlerbv » Gespeichert
Bruce Willis
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1002


Wer nicht wagt...


« Antworten #5 am: 14.06.11 - 17:42:55 »

Hi there,

You are still the best!
Smiley

das sinnfreie Deklarieren der Variablen / Objekte nam und AnWenCN ist kontraproduktiv
Cooool!
Muss mir den Wortlaut merken. Wink

Besser wäre es so...
Danke, hatte mir auch überlegt und gleich nach dem Posten schon geändert.


Knackiger ist aber:
Code:
Dim docCurrent As NotesDocument
dim vNamesCommon As Variant

Set docCurrent = ....
vNamesCommon = Evaluate ("@Name ([CN]; NW)", docCurrent)

Messagebox Implode (vNamesCommon, Chr$ (10))     'zum testen

Massgabe: NW ist wie von Dir beschrieben Dein Item, in dem die bisherigen Empfänger im Dokument (docCurrent) gelistet sind.

...Zweifelsohne ist die Forall-Schleife in LotusScript wie prinzipiell von Peter und Dir aufgemalt die lesbarere Variante, zu der ich auch eher neige. Das nativere Evaluate sollte eingesetzt werden, wenn es tatsächlich auf Performance ankommt.
Super!
Vielen Dank!!

Was heisst eigentlich "scheint zu funktionieren"?? In der Programmierung gibt es nur zwei Zustände für solch simple Aufgaben: Tut oder tut eben nicht.
...Aber das gehörte natürlich nicht zu Deiner Frage  Wink
Ich hatte bloß auf eine mögliche Verbesserung meines Codes durch einen Profi gehofft... Wink

Gruß
Leo
« Letzte Änderung: 14.06.11 - 17:45:45 von Bruce Willis » Gespeichert

nobody is perfect but i'm pretty close 
koehlerbv
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 20460



« Antworten #6 am: 14.06.11 - 22:38:57 »

Ich hatte bloß auf eine mögliche Verbesserung meines Codes durch einen Profi gehofft... Wink

Конечно, я знаю  Wink

Бернхард

PS: Spass beiseite - hast Du Beziehungen zu Leuten, die Beziehungen zu РЖД haben? Ich plane für kommenden oder übernächstes Jahr eine Tour mit meinem Sohn Moskau - Irkutsk (nur sehr vielleicht weiter bis Wladiwostok). Mir geht es um Tickets 1. Klasse (wenn das eine gute Idee ist, wenn man sich nicht abgrenzen will - aber das sollte heutzutage funktionieren) in Zügen mit einstelliger Zugnummer (!) und frei gewählten Unterbrechungen (aber mit fixen Terminen). Klar geht sowas über spezialisierte Reisebüros, aber herrjeh - wofür hat man Freunde bei AtNotes?
Wenn Du was weißt - Du hast ja meine Mailadresse, sonst PM.
Gespeichert
Bruce Willis
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1002


Wer nicht wagt...


« Antworten #7 am: 14.06.11 - 23:11:10 »

Hi Bernhard,

ALL Deine Kenntnisse sind umwerfend!  Grin

...Beziehungen zu Leuten, die Beziehungen zu РЖД haben?..
Ich hab einen Schulfreund in Kiew, dessen Schwiegervater dort früher ein großes Tier war. Ob er aber noch lebt...
Und noch ein paar Freunde in Moskau...
Dein Vorhaben ist allerdings etwas ungewöhnlich...
Sollte ich was Gutes erfahren, melde ich mich.

Gruß
Leo
Gespeichert

nobody is perfect but i'm pretty close 
Frankonian
Frischling
*
Offline Offline

Geschlecht: Männlich
Beiträge: 4



« Antworten #8 am: 18.08.21 - 17:27:58 »

Auch wenn der obige Beitrag schon Jahre alt ist, hat er mir sehr geholfen.

Wenn ich beispielsweise alle möglichen Feldtypen zu exportieren hatte, dann habe ich jedes benötigte Dokumentfeld und Attribute zur Verarbeitiung in ein string array gespeichert (sFldArr).
Code:
  %REM ---
    sFldArr(n,1) -> field name
    sFldArr(n,2) -> flag for data type
    sFldArr(n,3) -> flag for multi-value field (0 = single value, 1 = multi-value)
    sFldArr(n,4) -> flag for check required on field containing CRLF / text qualifier, separator if no text qualifier is chosen
    sFldArr(n,5) -> field content
  %END REM 

Ein EXPORTCSV subroutine (library) Aufruf
Code:
Sub NotesViewExportCSV (server As String, dbpath As String, sView As String,_
    ExpFilePath As String, sSep As String, tq As String, replStr As String, mvfSep As String,_
    sFldName As Variant, sChkFldVal As Variant)
%REM subroutine for export of view documents where field names are provided in an array
  * single-/multi-value flag added, if multi-value then array is imploded to a string with mvfSep as separator.
  * replace string for unwanted characters
  * if field value contains text qualifier mask it (according to RFC 4180)
Description:
  subroutine goes through view and exports defined list of fields document by document, applies given filter
  for skipping records and transforms field values as requested
  server     server name
  dbpath     database path
  sView      view name (alias name preferred)
  ExpFilePath  full file path for export file
  sSep       separator for CSV file
  tq         quote character
  replStr    replace string
  mvfSep     multi-value field separator for implode
  sFldName   array of field names (1), data types (2), single-/multi-value flags (3), check flags (4), values (5)
  sChkFldVal array with field names, valid values separated by tilde and actual value to check
exportiert die Daten in ein CSV File.
Hierbei wird das Dokumentfeld in ein Feld vom Typ Variant gelesen. Das hat den Vorteil, dass man Mehrfachwertfelder ebenfalls damit behandeln kann.
Code:
...
    For i = LBound(sFldName,1) To UBound(sFldName,1)
        If doc.Hasitem(sFldName(i,1)) Then
          vfldvalue = doc.GetItemValue(sFldName(i,1))
          Select Case sFldName(i,2)
          Case "T":
            If sFldName(i,3) = "0" Then
              sfldvalue = vfldvalue(0)
            Else
              sfldvalue = Implode(vfldvalue, mvfSep)
            End If
          Case "I":
            sfldvalue = CStr(vfldvalue(0))
            If sFldName(i,3) = "1" Then
              For j = LBound(vfldvalue)+1 To UBound(vfldvalue)
                sfldvalue = sfldvalue & mvfSep & CStr(vfldvalue(j))
              Next
            End If
...

Inzwischen habe ich den Anspruch erweitert und wollte noch ein Attribut im Array sFldArr aufnehmen: Formatierung bzw Konvertierung. Für Felder vom Typ DateTime gibt man zum Beispiel den Formatierungsstring an (z.B. "YYYY-MM-DD hh:nn:ss") und mit den Formatbefehl angewendet, wird der Wert entsprechend in den String zur Ausgabe gespeichert.

Wenn man aber nun Namensfelder mit Mehrfachwerten hat (z.B. $UpdatedBy) und diese als konkatenierten String OHNE die OU und O Hierarchie ausgeben will, so muss man auf das NotesName item die Funktion 'Common' anwenden. Und das geht nicht wenn man den das Variant Array verwenden will und es geht auch nicht auf einzelne Variant Arraywerte.
Man muss ein NotesItem Objekt zuweisen und über dieses arbeiten.
Weiter unten habe ich meinen vollständigen Code hinzugefügt und habe den nicht funktionierenden Code auskommentiert und gekennzeichnet wo der immer gleiche / selbe Fehler auftritt.

Code:
Option Public
Option Declare

%Include "lsconst.lss"
Sub Initialize
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim i As Integer, j As Integer
Dim s_val As String
Dim v_val As Variant
Dim Nam As NotesName

Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments

%REM if you like to process all selected documents
For i = 1 To collection.Count
Set doc = collection.GetNthDocument(i)
...
Next
%ENDREM
%REM if you like to process only the first of selected documents
Set doc = collection.GetFirstDocument
If Not doc Is Nothing Then
' execution statements
End If
%ENDREM

Set doc = collection.GetFirstDocument
If Not doc Is Nothing Then

' without .Common you can work with variants - no error will occur
v_val = doc.GetItemValue("NameField01")
s_val = v_val(0)
For i = LBound(v_val)+1 To UBound(v_val)
s_val = s_val + ";" + v_val(i)
Next i
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) from v_val(i)"

' with .Common you first have to get the NotesName Items to a NotesName and from there apply .Common and add it to string - version 1
Set Nam = session.CreateName(doc.NameField01(0))
s_val = Nam.Common
For i = LBound(doc.NameField01)+1 To UBound(doc.NameField01)
Set Nam = session.CreateName(doc.NameField01(i))
s_val = s_val + ";" + Nam.Common
Next
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) from For LBound .. UBound Nam.Common - version1"

' with .Common you first have to get the NotesName Items to a NotesName and from there apply .Common and add it to string - version 2
s_val = ""
ForAll value In doc.GetItemValue("NameField01")   
Set Nam = session.CreateName(value)
If s_val = "" Then
s_val = Nam.Common
Else
s_val = s_val + ";" + Nam.Common
End If
End ForAll
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) from For LBound .. UBound Nam.Common - version2"



%REM    below code is not working the row is marked where ERROR pops up

s_val = doc.GetItemValue("NameField01")(0)
For i = LBound(doc.NameField01)+1 To UBound(doc.NameField01)
s_val = s_val + ";" + doc.GetItemValue("NameField01")(i).Common     'ERROR: object variable not set
Next i
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) doc.GetItemValue(""NameField01"")(i).Common"

s_val = doc.GetItemValue("NameField01")(0)
For i = LBound(doc.NameField01)+1 To UBound(doc.NameField01)
s_val = s_val + ";" + doc.NameField01(i).Common      'ERROR: object variable not set
Next i
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) from doc.NameField01(i).Common"

v_val = doc.GetItemValue("NameField01")
s_val = v_val(0).Common 'ERROR: object variable not set
For i = LBound(v_val)+1 To UBound(v_val)
s_val = s_val + ";" + v_val(i).Common
Next i
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) From v_val(i).Common"

s_val = Implode(doc.GetItemValue("NameField01").Common,";") 'ERROR: object variable not set
MessageBox s_val, MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "s_val (String) from Implode doc.GetItemValue(""NameField01"").Common"

%ENDREM

Else
MessageBox "You did not select any document in view", MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON1 + MB_APPLMODAL, "Document Selection"
End If
End Sub
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: