Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: my head am 04.02.03 - 13:52:46

Titel: suche
Beitrag von: my head am 04.02.03 - 13:52:46
wie kann ich in ner ansicht in vier spalten suchen lassen, wenn die ansicht folgendermassen aussieht:
name       abt        zimmer                 tel-nr
                             (alpha-num.)        (num.)

hat jmd schon mal ein ähnliches problem gehabt??
ich hab keine ahnung, wie's lösen soll, da die "normale" notes-suche keine reinen zahlen findet!!!
Titel: Re:suche
Beitrag von: Performance am 04.02.03 - 14:09:33
laut Notes Hilfe:

Set notesDocumentCollection = notesView.GetAllDocumentsByKey( keyArray
[ ,exact ] )
Parameters
keyArray
String, integer, long, single or double value, or array of strings, number, DateTime, or DateRange objects. Each element in the array is compared to a sorted column in the view. The first element in the array is compared to the first sorted column in the view; the second element is compared to the second sorted column; and so on.
exact
Boolean. Optional. Specify True if you want to find an exact match. If you specify False (the default) or omit this parameter, a partial match succeeds.
Return value
notesDocumentCollection
All documents in the view whose column values match each of the strings in keyArray. If no documents match, the collection is empty and the count is zero.


cu
Titel: Re:suche
Beitrag von: my head am 04.02.03 - 16:57:34
muss ich mit ner collection dann für drei spalten in vier verschiedenen ansichten suchen?? und dann über das dokument in der eigentlichen ansicht ausgeben lassen??
oder kann ich damit in vier spalten einer ansicht??
Titel: Re:suche
Beitrag von: Performance am 04.02.03 - 17:01:06
du kannst in einer view nach vier Spalten suchen - oder mehr je nachdem wie du deinen array aufbaust.


cu
Titel: Re:suche
Beitrag von: my head am 04.02.03 - 17:18:29
versteh im moment nicht ganz wie ich das array deklarieren muss...

ich möchte eine maske haben mit eingabefeld und button... möchte dort den suchtext eingeben... und in anschließend in einem ordner oder einer ansicht abspeichern...
Titel: Re:suche
Beitrag von: my head am 05.02.03 - 14:02:53
so... hab nochmal nachgedacht, bin in mich gegegangen usw.

mit getdocumentsbykey kann ich doch nur immer werte aus der ersten geordneten spalte suchen, oder...?

demzufolge bräuchte ich für die vier spalten meiner ansicht, vier ansichten mit je einer spalte und könnte die dokumente dann einen ordner kopieren!!!

geht das??
oder einfacher???
Titel: Re:suche
Beitrag von: wflamme am 05.02.03 - 15:05:25
so... hab nochmal nachgedacht, bin in mich gegegangen usw.

mit getdocumentsbykey kann ich doch nur immer werte aus der ersten geordneten spalte suchen, oder...?

demzufolge bräuchte ich für die vier spalten meiner ansicht, vier ansichten mit je einer spalte und könnte die dokumente dann einen ordner kopieren!!!

geht das??
oder einfacher???

Zitierst Du doch oben selber aus der Hilfe:
"The first element in the array is compared to the first sorted column in the view; the second element is compared to the second sorted column; and so on."

Also brauchst Du ein array x(0) bis x(3) und setzt das mit GetAllDocumentsByKey() auf Deine Ansicht mit sortierten Spalten an.
Titel: Re:suche
Beitrag von: my head am 05.02.03 - 15:30:28
hab das jetzt so gemacht...


Sub Click(Source As Button)
   Dim workspace As New NotesUIWorkspace
   Dim thisdoc As NotesUIDocument   
   
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim view As Notesview
   Dim dc As NotesDocumentCollection   
   Dim keyarray(3) As String
   
   
   Set db = s.CurrentDatabase
   Set thisdoc = workspace.CurrentDocument
   Set view = db.getview("alle")
   keyarray(0)=thisdoc.fieldgettext("name")
   keyarray(1)=thisdoc.fieldgettext("abt")
   keyarray(2)=thisdoc.fieldgettext("zimmer")
   keyarray(3)=thisdoc.fieldgettext("tel")
   
   Set dc= view.getalldocumentsbykey(keyarray)
   
   Call dc.putallinfolder("erg")
   
End Sub


wie kann ich es jetzt aber verwirklichen, dass er wenn nur ein wert (z.b. name) eingegeben ist, die anderen ignoriert??
Titel: Re:suche
Beitrag von: wflamme am 05.02.03 - 15:46:30
Wenn Du keine Werte überspringen mußt, kannst Du das array mit Redim Preserve entspr. verkleinern.
Ansonsten mußt Du leider mit .Search() arbeiten, wenn zB 'abt' leer ist.
Titel: Re:suche
Beitrag von: Performance am 05.02.03 - 16:01:51
indem du den Parameter exact auf false setzt

Set dc= view.getalldocumentsbykey(keyarray, false)



cu
Titel: Re:suche
Beitrag von: wflamme am 05.02.03 - 16:05:45
indem du den Parameter exact auf false setzt

Set dc= view.getalldocumentsbykey(keyarray, false)

Hups, das geht?
Ich dachte immer, Notes braucht zumindest einen Teilstring:

"For non-exact matches, returns only those documents that match the initial characters. For example, "T" matches "Tim"."

Wieder was gelernt! Danke!
Titel: Re:suche
Beitrag von: my head am 05.02.03 - 16:39:26
indem du den Parameter exact auf false setzt

Set dc= view.getalldocumentsbykey(keyarray, false)

aber bei mir ist er ja auf false (standardmässig??)!!

geht aber nicht!!
Titel: Re:suche
Beitrag von: Performance am 05.02.03 - 17:08:36
@wflamme

du hast recht, ich hatte mich auf "partial match" bezogen.

@my head
das genauso wie es wflamme beschrieben hat - d.h. wenn du den ersten und den letzten Wert eines arrays hast nutzt dir das wenig, du kannst dann im Prinzip nur nach dem ersten Wert suchen
- ansonsten eine db.search oder view.ftsearch mit deinen Kriterien - wobei der search string dann dynamisch sein kann.


cu
Titel: Re:suche
Beitrag von: wflamme am 05.02.03 - 18:07:09
@wflamme

du hast recht, ich hatte mich auf "partial match" bezogen.

Schade, und ich dachte, ich wäre wieder mal klüger geworden  :'(
Titel: Re:suche
Beitrag von: my head am 10.02.03 - 16:06:18
wenn's jemanden interessiert, hab's so gelöst:


Dim workspace As New NotesUIWorkspace
   Dim thisdoc As NotesUIDocument   
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim view As Notesview
   
   Dim switch As Integer
   Dim suchtext As String
   
   Dim person As String
   Dim abt As String
   Dim zimmer As String
   Dim tel As String
   
   Set db =  s.CurrentDatabase
   Set view = db.getview("alle")
   Set thisdoc = workspace.CurrentDocument
   suchtext = thisdoc.fieldgettext("suchtext")
   Set doc = view.getfirstdocument
   switch=0
   
   Do Until (doc Is Nothing)
      If Not Instr(doc.getitemvalue("name")(0) , Strconv(suchtext,3)) = 0 Then
         switch=1      
      Elseif Not Instr (doc.getitemvalue("abt")(0), Ucase(suchtext)) = 0 Then
         switch=1      
      Elseif Not Instr (doc.getitemvalue("zimmer")(0) , Ucase(suchtext)) = 0 Then
         switch=1      
      Elseif Not Instr (doc.getitemvalue("tel")(0) , suchtext) = 0 Then
         switch=1         
      End If
      If switch = 1 Then
         person = person + doc.getitemvalue("name")(0) + Chr(10)
         abt = abt +doc.getitemvalue("abt")(0) + Chr(10)
         zimmer = zimmer + doc.getitemvalue("zimmer")(0) + Chr(10)
         tel = tel +Cstr(doc.getitemvalue("tel")(0)) + Chr(10)
         switch = 0
      End If      
      Set doc=view.getnextdocument(doc)
   Loop
   
   Call thisdoc.fieldsettext("suchname",person)
   Call thisdoc.fieldsettext("suchabt",abt)
   Call thisdoc.fieldsettext("suchzimmer",zimmer)
   Call thisdoc.fieldsettext("suchtel",tel)