Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Alexis am 08.01.08 - 11:41:17

Titel: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 11:41:17
Hallo Forum,

kann mir vielleicht jemand einen Fingerzeig geben, warum folgende beiden Searchformula nicht das selbe Ergebnis bringen:

searchformula$ = {Form = "Device" & Serialnumber = "}+SerialFrom+{" }
searchformula$ = {Form = "Device" & Serialnumber >= "}+SerialFrom+{" & Serialnumber <= "}+SerialTo+{"}

Die Variablen SerialFrom und SerialTo enthalten den Wert "GJR2394100R1210 81AA03A-E 9094   92", der tatsächlich exakt nur einmal in der DB vorkommt.

Im Debugger sieht alles korrekt aus:
Form = "Device" & Serialnumber = "GJR2394100R1210 81AA03A-E 9094   92"
Form = "Device" & Serialnumber >= "GJR2394100R1210 81AA03A-E 9094   92" & Serialnumber <= "GJR2394100R1210 81AA03A-E 9094   92"

Ergänze möchte ich, dass das Feld Serialnumber ein Mehrfachwert ist.

Danke für jeden Hinweis wo ich anzetzen könnte.

Alexis




Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Axel am 08.01.08 - 12:00:52
Meines Erachtes müsste das so aussehen:

searchformula$ = {Form = "Device" & (Serialnumber >= "}+SerialFrom+{" & Serialnumber <= "}+SerialTo+{")}


Axel

Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 12:04:31
Ich glaube die Klammern sind an der Stelle überflüssig bzw dürfte keinen Unterschied machen.

Das ist ja etwa so vom Wesen her:
a & b & c = a & (b & c)

Ich frage mich nur gerade, ob der größer bzw kleiner-Vergleich auch bei Strings geht? Könnte ja gehen, wenn man die lexikographische Ordnung zu Rate zieht.
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 12:14:41
Richtig Markus,

die Klammern haben keinen Einfluss, das Ergebnis ist exakt das gleiche.

Ob der größer bzw kleiner-Vergleich bei Texten greift erscheint mir eine sehr berechtigte Frage zu sein.

Ich versuche dem mal nachzugehen.

Danke zunächst.

Alexis
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Axel am 08.01.08 - 12:15:21
Ich glaube die Klammern sind an der Stelle überflüssig bzw dürfte keinen Unterschied machen.

Jain.  ;)

Mit den Klammern kannst du die Auswertungsreihenfolge der Formel steuern.

Ich frage mich nur gerade, ob der größer bzw kleiner-Vergleich auch bei Strings geht?

Das hab ich auf die Schnelle übersehen. Ich glaube, dass dieser Vergleich bei Strings nicht möglich ist. Zumindest bei der Search-Methode. Ich lasse mich aber gerne vom Gegenteil überzeugen.

Axel
 
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 12:20:33
Aber das Ergebnis sollte in dem Fall das gleiche bleiben.  ;) Zudem kann man mit Klammern die Lesbarkeit steigern, was aber in diesem Fall aber nicht unbedingt viel bringen würde, da "dynamisch ermittelte" Suchformeln meistens schlecht lesbar sind...

Leider kann ich das mit den Strings hier nicht selbst testen... Sonst hätte ich das auch noch schnell gemacht... ;)
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: koehlerbv am 08.01.08 - 12:20:57
Grösser und kleiner funktioniert natürlich bei Strings und auch im Zusammenhang mit dbSearch.

Unsicher wäre ich eher auf Grund der Tatsache, dass es Mehrfachwerte sind. Arrays mit einem skalaren Wert zu vergleichen ...

Bernhard
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 12:23:30
Da war ich mir gerade nicht sicher, ob das bei Notes geht mit Strings... Wie es gehen kann habe ich ja in meinem ersten Posting in diesem Thread geschrieben... Aber damit haben wir das schonmal geklärt... Danke Bernhard, wieder was gelernt!

Aber der Hinweis von Bernhard könnte schon zum Ziel führen... Denn mit der Abfrage hier erwischt man nur die Dokumente, bei denen die passende Seriennummer als Einzelwert drinnen steht. Evtl sollte man dann lieber mit @IsMember oder @Contains in der Suchformel arbeiten.
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 12:31:40
Super Eure Anregungen!

Habe getestet: Stringvergleich ist (natürlich) möglich.

Der Fehler liegt sehr wahrscheinlich bei den Mehrfachwerten. In meinem Skript ermittle ich später ein Array mit der gefundenen Seriennummer. Und siehe da, wo ich früher ein Vorhandensein des Kriteriums fand ist dieses nun nicht mehr der Fall.

Also werde ich das Skript umbauen.

Alexis
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 14:06:34
@ MadMetzger:

@IsMember etc. ist m.E. nicht anwendbar, denn ich möchte bei der Suche einen Seriennummern-Bereich auswerten, was durch direkten Vergleich praktisch unmöglich ist.

@ Bernhard:

Ich sehe leider keine andere Möglichkeit als den von mir beschrittenen Weg. Höchst unsauber ist meine ad hoc - Lösung: Ich durchforste die gefundenen Ergebnisse und überprüfe sie nochmals auf das gesuchte Intervall der Seriennummer, oder siehst Du einen anderen Ansatz?

Anbei: Ein Dokument (sprich Gerätetyp) kann einige hundert Seriennummern enthalten und in der Datenbank sind z.Z. mehr als 5000 Geräte vorhanden.

Bin leider etwas ratlos  ???

Alexis
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 14:18:52
Okay, da hast du natürlich recht... das geht so nicht.

Hm... Interessantes Design: Ein Dokument je Typ und die vorhandenen Seriennummern in einem Mehrfachwertefeld... Sollte man das nicht vielleicht nochmal überdenken? Evtl kann man ja die Geräte mit den Seriennummern in Antwortdokumente verlagern, so das die Verknüpfung eines Gerätes mit seinem Typ erhalten bleibt...
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 14:49:48
Hallo Marcus,

das Konzept ist bereits schon so kategorisiert, wie Du es vorschlägst: die Seriennummern sind in den Gerätedokumenten in einem Feld gespeichert.

Ziel der Suche ist es übrigens, bei Fehlern in einer Serie die entsprechenden Kunden herauszugekommen.

Bin aber unzufrieden, dass das nicht besser zu lösen ist. Bernhards Hinweis vermag ich nicht in einem konkreten Lösungsansatz umzusetzen.

Alexis

Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 14:58:52
Also gibt es pro Gerät schon ein Dokument, oder wie?
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 15:33:38
Ja
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: koehlerbv am 08.01.08 - 15:36:09
Aber warum stehen dann hunderte Seriennummern im Dokument? Und Du schreibst ja auch von "Gerätetyp" ...

Bernhard
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 15:44:18
Genau aus dem Grunde habe ich nachgefragt... Warum suchst du dann nicht direkt nach den Gerätedokumenten?
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: koehlerbv am 08.01.08 - 15:58:05
Ich denke, jetzt kommen wir vom Thema etwas ab - man kann das Problem ja auch allgemeiner sehen: Wie suche ich nach ranges in Strings in Mehrfachfeldern?

Die ideale Lösung wäre sicherlich:
1 Dokumenttyp "Gerätetyp"
1 Dokumenttyp "Gerät"
Dadurch auch nur eine Seriennummer pro Dokument, und man kann das einzelne Gerät zudem noch viel besser beschreiben (Auslieferung, Bemerkungen, Kunde, Standort, Historie). Aber auch das ist wieder zu konkret für das allgemeine Problem - siehe oben.

Ich sehe für das Kernproblem (wenn die Applikation nicht gerade gezogen werden kann oder soll) nur eine Möglichkeit (zumindest auf die Schnelle und so zwischendurch gepostet):
- Ermittlung der "Gleichteile" der Strings für "von" und "bis"
- Bilden einer DocumentCollection auf Basis des "Gleichteils" (mit dbSearch und @Contains oder mit einer kategorisierten Ansicht und GetAllDocumentsByKey (key, False))
- Und dann Loopings drehen ...

Bernhard
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 08.01.08 - 16:02:29
Bernhard Du warst schneller, trotzdem meine Erklärung:

Tut mir leid wenn ich mich nicht deutlich genug ausgedrückt habe:

Jedes Gerät wird in zig Anlagen eingesetzt und wird in der Datenbank als ein Antwortdokument pro Anlage einmal geführt mit der Stückzahl n. In diesem Dokument sind nun alle n Seriennummern gespeichert, die in der Anlage vorkommen.

Dieses wiederholt sich hundertfach entsprechend der Vielzahl von Geräten, die in der Anlage vertreten sind.

Ich hoffe es ist jetzt ausreichend klar.

Alexis
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: MadMetzger am 08.01.08 - 16:12:54
Ich glaube jetzt habe ich es verstanden... Ein Gerätetyp kann x-mal in einer Anlage verbaut sein und je Typ und Anlage gibt es ein Antwortdok mit allen Seriennummern der eingebauten Geräte?

Algorithmus hat ja Bernhard schon geliefert... Poste doch aber bitte hinterher, wie und ob du es hinbekommen hast... Einige sind bestimmt neugierig... ;)
Titel: Re: db.search liefert ungewollte Ergebnisse
Beitrag von: Alexis am 09.01.08 - 10:05:18
Hallo,

ich habe mich für folgenden Weg entschieden:

- User wählt Gerätetyp und Seriennummernbereich aus
- Baue aus ersterem eine Collection über alle erfassten Geräte in der DB
- Untersuche dann per Schleife das Array mit allen Seriennummern auf Übereinstimmung
- Bei Erfolg wird das/die Dokument(e) in ein Ordner gestellt
 
Dieser Weg macht wohl auch dadurch Sinn, dass ich nicht ausschließen kann, dass Gerätefamilien ev. sogar gleiche Seriennummernbereiche verwenden (bitte nicht fragen warum). Der Zeitfaktor dürfte bei dem Ziel (Rückrufaktion) keine zu große Rolle spielen.

Danke für Eure anregenden Beiträge. Bei Erfolg setze ich ein "Daumen hoch".

Alexis