Autor Thema: LS Common Names von mehreren Einträgen  (Gelesen 7923 mal)

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
LS Common Names von mehreren Einträgen
« 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



nobody is perfect but i'm pretty close 

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: LS Common Names von mehreren Einträgen
« Antwort #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.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: LS Common Names von mehreren Einträgen
« Antwort #2 am: 14.06.11 - 14:33:11 »
Oder Du machst ein Evaluate über Dein Empfänger-Array mit @Username ([CN]; ...).

Bernhard

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: LS Common Names von mehreren Einträgen
« Antwort #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
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: LS Common Names von mehreren Einträgen
« Antwort #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  ;)
« Letzte Änderung: 14.06.11 - 17:17:43 von koehlerbv »

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: LS Common Names von mehreren Einträgen
« Antwort #5 am: 14.06.11 - 17:42:55 »
Hi there,

You are still the best!
:)

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

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  ;)
Ich hatte bloß auf eine mögliche Verbesserung meines Codes durch einen Profi gehofft... ;)

Gruß
Leo
« Letzte Änderung: 14.06.11 - 17:45:45 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: LS Common Names von mehreren Einträgen
« Antwort #6 am: 14.06.11 - 22:38:57 »
Ich hatte bloß auf eine mögliche Verbesserung meines Codes durch einen Profi gehofft... ;)

Конечно, я знаю  ;)

Бернхард

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.

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: LS Common Names von mehreren Einträgen
« Antwort #7 am: 14.06.11 - 23:11:10 »
Hi Bernhard,

ALL Deine Kenntnisse sind umwerfend!  ;D

...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
nobody is perfect but i'm pretty close 

Offline Frankonian

  • Frischling
  • *
  • Beiträge: 4
  • Geschlecht: Männlich
Re: LS Common Names von mehreren Einträgen
« Antwort #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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz