Domino 9 und frühere Versionen > Entwicklung

Harte Nuss

(1/3) > >>

Don Pasquale:
Hallo Leute,

ich habe folgendes Problem :

Ich habe ein Dokument mit den Feldern "Nummer" und dem Feld "Bearbeiter"und möchte feststellen, ob
es vielleicht in der Datenbank ein anderes Dokument mit der gleichen "Nummer" gibt und falls ja, den Bearbeiter von dort in mein aktuelles Dokument kopieren.

Ich bin noch nicht so firm mit Collections, deswegen hier nur ein erster schwacher versuch.


--- Code: ---
Dim ws As New NotesUIWorkspace  
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument  
Dim stringArray As String  
Dim composed As String  
Dim temp As Variant                  
Dim Gesucht As String
Set db = session.CurrentDatabase
Set collection = db.AllDocuments
Set doc = collection.GetFirstDocument
     
While Not (doc Is Nothing)
     
If doc.Nummer(0) = "" Then  
Gesucht = doc.Besitzer(0)
End If  

' ??? doc.Nummer = Gesucht
Set doc = notescoll.getnextdocument(doc)       
Wend

--- Ende Code ---

Don Pasquale:
Hallo Leute,
ich habe es jetzt erstmal so gelöst:
Ich habe aber noch 2 Fragen :

Wieso findet meine Collection ungefähr 2~3 mal soviele Dokumente wie die Ansicht (@All)

und wie kann ich ihm das
"Wollen sie die Änderungen speichern"
abgewöhnen ?

Don Pasquale


--- Code: ---
Dim ws As New NotesUIWorkspace  
Dim Doc1 As NotesDocument
Dim uidoc As NotesUIDocument  
Set uidoc = ws.CurrentDocument  
Set doc1 = uidoc.Document  
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument  
Dim stringArray As String  
Dim composed As String  
Dim temp As Variant                  
Dim Anzeigetext As String
Dim Suchnummer As String
Set db = session.CurrentDatabase
     
Set collection = db.AllDocuments
Set doc = collection.GetFirstDocument
Messagebox Collection.Count
While Not (doc Is Nothing)

Anzeigetext = doc.pe_Identnummer(0)
    If doc.pe_Identnummer(0) = doc1.pe_Identnummer(0)      Then
         Messagebox " Ja, ID sind gleich "
         Suchnummer = doc.pe_Name(0)
     End If
     
     Set doc = collection.getnextdocument(doc)       Wend
     
Set uidoc = ws.EditDocument( True )
Call uidoc.FieldSetText( "pe_Name", Cstr( Suchnummer) )
Set uidoc = ws.EditDocument( False )
     
Call uidoc.Close
     

--- Ende Code ---

Rob Green:
1. Performance
das Script ist nicht besonders performant, nutze daher besser den Veiwindex über die Methode GetAllDocumentsByKey, wobei der Key in Deinem Fall die Nummer ist und die Ansicht, in der zu suchen ist, diese Nummern ab/aufsteigend in der ersten sortierten Spalte enthält.

--- Code: ---
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim dc As NotesDocumentCollection
Set db = session.CurrentDatabase
Set view = db.GetView( "By Category" )
Set dc = view.[b]GetAllDocumentsByKey[/b]("Spanish leather", False)

hierbei (aus der Notes help obiges Bsp) ist "dc" die Document Collection, die gefunden wurde.

[b]2. Wie gefundene Docs durchgehen?[/b]
Eine Collection kannst Du mit
getfirstdocument und getnextdocument zB durchwandern.

Hierzu

dc = haste bereits
....
Dim item As NotesItem
Dim nameList As Variant
Dim frontenddoc as Notesdocument
frontenddoc = uidoc.document

set doc = dc.getfirstdocument
'dann erstes Doc aus Coll holen

while not (doc is nothing)

Set item = doc.GetFirstItem("Ersteller")
'man erhält alle Einträge aus Ersteller
namelist = item.Values
frontenddoc.Ersteller = namelist
'diese werden in das aktuelle Backenddoc des in Berabeitung befindlichen Frontendocs gesetzt

Set doc = dc.GetNextDocument(doc)

Call uidoc.Reload
und das Frontenddoc wird anhand des eigenen Backenddocs reloaded, um die Einträge aller Bearbeiter anzuzeigen

--- Ende Code ---

So im Prinzip müßte es gehen. Habs net getestet jetzt.

Edit
sehe gerade, daß Du es anders machst...wenn ich es richtig geblickt habe, willst Du die Nummern und nicht die Bearbeiter in ein Feld ABC eintragen? Wie auch immer, dann eben in meinem Codebeispiel die Suchangabe und das zu übergebende Feld einfach entsprechend eintragen.

Don Pasquale:
Hi Rob,

hört sich gut an, ich kann mir schon vorstellen, dass mein Skript nicht besonders performant ist.
Ich habe nun folgenden Code, bei der leider die
Schleife NIE durchlaufen wird.

Ich habe die Vermutung, dass ich vielleicht an der View ($All) noch etwas einstellen muss, da der Debugger
in der Zeile
     Set dc = view.GetAllDocumentsByKey("pe_Identnummer", False)
ein false ausgibt.

Hat wer eine Idee ?

Gruß
Don Pasquale


--- Code: ---
     Dim ws As New NotesUIWorkspace  
     Dim uidoc As NotesUIDocument  
     Set uidoc = ws.CurrentDocument  
     Dim session As New NotesSession
     Dim db As NotesDatabase
     Dim view As NotesView
     Dim dc As NotesDocumentCollection
     Set db = session.CurrentDatabase
     Set view = db.GetView( "($All)" )
     Set dc = view.GetAllDocumentsByKey("pe_Identnummer", False)
     Dim item As NotesItem
     Dim nameList As Variant
     Dim frontenddoc As Notesdocument
     Set frontenddoc = uidoc.document
     
     Set doc = dc.getfirstdocument
     
     While Not (doc Is Nothing)
           
           Set item = doc.GetFirstItem("pe_Identnummer")
           
           namelist = item.Values
           frontenddoc.Ersteller = namelist
           
           Set doc = dc.GetNextDocument(doc)
           Call uidoc.Reload
     Wend      
End Sub

--- Ende Code ---

Rob Green:
DOOON....hrhrhrrr ;D

starr mal genau auf die Zeile:

Set dc = view.GetAllDocumentsByKey("pe_Identnummer", False)  

a.) mit den "" ist der Key "pe_Identnummer"....ein Literal also... ??? Ein Literal ist zB "Baum", "Haus", "Don"
b.) wenn Du schon Felder ansprechen möchtest, deren Inhalt als Key dienen soll, mußt Du das mit einer Backendmethode oder Frontendmethode auch tun...
so wie Du es zB weiter "unten" im Code getan hast:
Set item = doc.GetFirstItem("pe_Identnummer")  

Heißt: mußt vorher pe_identnummer auslesen, bevor Du die Collection bildest. Und nicht mehr mit "" arbeiten!

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln