Ermittlung der Anzahl bestimmter Dokumente in einer sortierten Ansicht

  • Hallo miteinander,
    ich bin schon langsam am verzweifeln. Die Folgende Function bringt mich noch um den verstand da sie mir nicht das richtige Ergebnis (anzteilnehmer ist immer 0) zurückliefert. Dazu siehe Anhangbild aus dem Debugger.


    Function ErmittleAnzahlTeilnehmer(ByVal view As String, ByVal key As String, ByVal datum As String) As Integer
    Dim anzteilnehmer As Integer
    Dim docdatum As Variant
    Dim ddatum As String


    Set ss = New NotesSession
    Set db = ss.Currentdatabase
    Set vw = db.Getview(view)
    Set dcdoc = vw.GetAllDocumentsByKey(key, True)
    Set doc = dcdoc.Getfirstdocument()
    anzteilnehmer = 0
    While Not doc Is Nothing
    docdatum = doc.Getitemvalue("anm_Teilnahmedatum")
    ddatum = docdatum(0)
    If docdatum(0) = datum Then
    anzteilnehmer = anzteilnehmer + 1
    End If
    Set doc = dcdoc.Getnextdocument(doc)
    Wend
    ErmittleAnzahlTeilnehmer = anzteilnehmer
    End Function


    Dies ist der letzte Stand der Function. Angefangen habe ich mit einem KeyArray und den Einträgen keyarray(1) = key und keyarray(2) = datum. Ich war der Meinung das dann dcdoc.Count mir die gewünschte Anzahl liefert. Die Ansicht ($Seminarteilnehmer) enthält in der ersten Spalte den Seminartitel und in der 2. Spalte das Datum. Beide Spalten sind aufsteigend sortiert. Ich habe es auch schon mit Kategorisieren versucht. Ich bekomme nie das bisher einzige Dokument zurück geliefert.
    Client und Designer schließen hat auch nicht geholfen. Die Variable ddatum ist nur zumTesten um zu sehen ob ein umkopieren hilft. Leider aber auch nicht.


    So wie es oben gemacht ist, ist es irgendwie umständlich. Aber wenn es wenigstens funktionieren würde wär mir das egal.
    Ich hoffe mich schubst jemand in die richtige Richtung und gibt mir einen Tipp was ich hier falsch mache.


    Vielen Dank
    Klaus Dewald


    Client 8.5.2 FP3

  • hallo taurec,
    ja, ich denke die Typen sind gleich. In der angehängten Grafik "debugger_1.jpg" kannst Du sehen das datum als String und docdatum als variant deklariert wurden. Zum Testen habe ich docdatum dann auch noch in eine StringVariable ddatum geschrieben. Der Inhalt für datum stammt aus einer Dialogliste die Mehrfachwerte zulässt. Hier kann man meines Wissens nicht den Datentyp "Date" verwenden sondern nur String. Die Inhalte sind mit CRLF getrennt eingegeben worden. Diese Liste wird extrahiert und je Eintrag (datum) einmal die Function aufgerufen um zu ermitteln wieviele Dokumente es bereits für das Seminar zu dem Datum gibt. docdatum wiederum wird aus einem Textfeld "anm_anmeldedatum" aus dem gelesenen Dokument ermittelt.
    Noch eine Idee?
    Danke
    Klaus Dewald

  • das verstehe ich jetzt nicht. Wenn ich die lokal als String deklarierte Variable "ddatum" verwende und aus "docdatum" den Inhalt dort hinein schreibe (ddatum = docdatum(0)) dann habe ich doch einen String. Diesen habe ich auch mit dem Funktionsparameter "datum", der im Kopf als String deklariert ist, verglichen. Auch wenn die Inhalte identisch sind ich erhalte nie True und der Zähler wird nicht erhöht. In der Function ist der letzte Zustand enthalten. Und der war Vergleich zwischen Variant(0) = String. Die vielen anderen Möglichkeiten habe ich aber auch probiert.

  • Ich kann nur von dem ausgehen was du als Code gepostet hast und da hast du das eben nicht getan.
    Wenn dann nie True rauskommt dann sind sie nicht identisch, z.B. könnten da nicht angezeigte Sonderzeichen drin sein.


    Das ist mit den aktuellen Infos aber hier nicht beantwortbar

  • Servus Klaus,


    kannst Du eigentlich Einfluss auf die verwendete View nehmen? Wenn ja, dann baue diese "suchgerecht auf:
    - eine Spalte mit dem Seminartitel
    - eine mit dem String des Seminar-Starttags *in normierter Form" (@Right ("0000" + @Text (@Year (DeinDatum)); 4) + .... etc.)


    Dann kannst Du ganz einfach als Parameter den Seminarnamen und das *genau so* normierte Datum übergeben und daraus Deinen SearchKey aufbauen, dann ein GetAllDocumentsByKey und Dein NotesCollection.Count ist schon das gewünschte Ergebnis.


    Wenn nicht, kannst Du nur nach dem Seminarnamen suchen, über die Collection dann interieren und auf den Parameter Datum als NotesDateTime (!) vergleichen.


    Damit bist Du zukünftig auch ganz fein heraus, wenn auf einmal ein deutscher Client einen englischen Domino abfragt!


    HTH,
    Bernhard

  • Hallo Bernhard,
    da ich die View selbst gestrickt habe, kann ich natürlich Einfluss darauf nehmen. Dein Ansatz mit dem ISO Datum finde ich gut. Das werde ich da mal so einbauen und mich dann wieder melden.
    Ansonsten iteriere ich derzeit über den Seminartitel und lese aus den Dokumenten das Datum (meines Wissens als String s. Debugger-Bild) aus und vergleiche mit dem gewünschten Datum (Parameter der Function - auch als String) und genau da scheiterts eigenartigerweise. Der Parameter scheint mir im Moment das Problem zu sein denn wenn ich docdatum(0) gegen einen festen String "04.02.2012" vergleiche, dann funktioniert der Zähler. Dies auch nur weil die GetAllDocumentsByKey mit 2 Parametern (Seminartitel und Datum) nicht funktioniert hat. Bis jetzt. Mal sehen wie das mit dem ISO-Datum wird.
    Vielen Dank einstweilen.
    Gruß
    Klaus

  • Vielen Dank an die Helfer,
    es hat funktioniert. Ich habe eine View gebaut die den Seminartitel mit dem Datum verknüpft und die benutze ichnun zum Suchen.
    Ein Danke auch an taurec. Der Hinweis mit dem fehlerhaften Vergleich war auch goldrichtig. Beim Aufbereiten des Datums aus der Liste wurde das CR weg Replaced, aber nicht das LF. Dadurch wurde datum+LF verglichen mit datum was natürlich nicht identisch ist.
    Vielen dank an alle
    Klaus Dewald

  • Hi,


    Entweder habe ich es auf dei Schnelle ueberlesen.


    Aber die baust Dir eine Collection zusammen. Und dann laeufts Du mittels einer Schleife durch alle Dokumente der Collection um diese
    zu zaehlen.
    Warum?


    In Collection.Count habe ich doch die Anzahl an Dokumenten in der Collection. Oder habe ich hier etwas nicht ganz richtig verstenden.



    Andreas