Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: hmarco am 10.07.02 - 09:03:26
-
Hallo,
ich arbeite immer noch an der Lizenzdatenbank.
In meiner Maske habe ich zwei wichtige Felder:
"Produkt" und "Version".
Ich möchte jetzt eine von mir erstellte Ansicht nach
folgenden Kriterien durchsuchen lassen:
a) "Produkt" und
b) "Version" < als die, die ich irgendwie in den PC eingebe.
Ich habe da leider keine Idee wie ich das am besten machen kann.
Aber ihr habt sicherlich wie immer eine
gute Idee.
Mfg Marco
-
Habe grade erfahren, dass ich
heute noch zum Kunden muss.
Ich hoffe ich komme nacher nochmal
in die Firma.
Mfg Marco
-
Hallo Marco!
In deiner Ansicht müsste in der ersten Spalte das Produkt stehen, und in der zweiten die Version - beide Spalten sortiert.
Nun setzt in einem Script einen StringArray zusammen.
zB
keyArray(0) = "Notes"
keyArray(1) = "5.0"
Es gibt nun folgende Funktion die anhand des Schlüssels alle Dokumente der Ansicht in eine DocumentCollection gibt.
Set notesDocumentCollection = notesView.GetAllDocumentsByKey( keyArray
[ ,exact ] )
zB
Set dc = view.GetAllDocumentsByKey(keyArray, True)
ciao,
mani
-
Hallo Manuel,
leider habe ich das Problem, dass
nur das Feld "Produkt" in der Ansicht auftaucht,
jedoch die "Installierte Version" steht nur in
der Maske.
Ich habe mal noch ein bisschen nachgedacht und mir
folgendes überlegt:
Ich erstelle eine Maske in der ich aus dem Profil einer
anderen Maske ein Feld abfrage, in dem alle möglichen
Produkte drinstehen. Nun soll die Maske beim Schließen
die Felder mit dem ausgewählten Produkt und der
neuen Versionsnummer mit allen Dokumenten
vergleichen und alle in einer Ansicht anzeigen.
Ich weiß jedoch nicht ob sowas überhaupt geht. ???
Ich hoffe ich habe mich dieses Mal etwas klarer ausgedrückt,
damit du oder jemand anderes mir
helfen kannst.
Mfg Marco
-
Hmmm,
soweit ich alles richtig verstanden habe, hast du in deiner Maske 2 Felder, "Produkt" und "Version". Erstelle einfach eine neue (versteckte) Ansicht, in der du alle notwendigen Dokumente anzeigen lässt, und in der ersten Spalte soll das Produkt stehen, und in der zweiten die Version, beide Spalten sind sortiert. Und dann machst du das, was ich vorher gepostet habe. Kennst du dich aus mit Script?
-
Hallo,
nein ich kenne mich nicht mit
Script aus.
Werde aber mal anfangen deine
Tipps auszuprobieren.
Mfg Marco
-
Fragen wir mal so:
Was willst du eigentlich genau machen mit Werten die du ausliest? Wie werden sie ausgelesen (über eine Schaltfläche oder automatisch beim öffnen einer Maske)?
Beschreib es einfach ein wenig, und vielleicht kann ich ein kleines Script oder eine Formel zusammenstellen.
-
Hallo,
ich habe vor, dass wenn ich in der Maske ein Produkt
und eine Versionsnummer eingebe, dass die Ansicht
"Versionsabfrage" mir nur alle Dokumente dieses
Produkts anzeigt, die eine niedrigere Versionsnummer
als die eingegebene haben.
Dieses sollte am besten geschehen wenn die Maske
geschlossen wird oder als irgendein extra Knopf.
Ich will mich ja nicht auf irgendeine Art festlegen.
Mfg Marco
-
Hi Marco
Noch eine Frage (ich weiß, ich nerv schon langsam ;D)
Wo sollen die Dokument dann angezeigt werden, in einer Ansicht, wo man diese dann weiter bearbeiten kann? Oder als reine Auflistung in einem Textfeld?
Wenn du's in einer Ansicht anzeigen willst ist das schon schwieriger, weil keine dynamischen Auswahlformeln erlaubt sind.
Mani
-
Hallo,
eine Ansicht währe mir lieber. Außerdem hat mein Chef
den Wunsch geäußert, dass er es in einer
Ansicht haben möchte. Es sollen dann in der Ansicht
drinstehen, "Kundenname", "Produkt" und "Version".
Außerden gehtst du mir nicht auf den Nerv, wenn du mir
helfen willst, musst du schließlich auch wissen was in
meinem kranken Hirn vorgeht. ;D Oder?
Mfg Marco
-
Oki,
ich muss jetzt noch was fertig machen für die Firma, weil sonst halte ich hier den ganzen Betrieb auf, und dann schau ich ob ich dir irgendwie helfen kann ....
-
Alles klar,
ich muss auch noch ein bisschen Arbeiten,
dann bis später.
Mfg Marco
-
Hi Marco!
Das mit der Ansicht wird ein Problem, denn wie gesagt kann man keine dynamischen Auswahlformeln verwenden. Du könntest aber in einer Maske eine eingebettete Ansicht erstellen (Erstellen/Eingebettetes Element/Ansicht...) . Deine Ansicht sollte ja ungefähr so aussehen (?):
Kundenname | Produkt | Version
Nun erstellst du eine Ansicht in der du diese Spalten so anzeigen lässt, aber vorher noch eine erste Spalte einfügst und in dieser nochmals das Produkt anzeigen lässt, und zwar kategorisiert! Diese Ansicht lässt du in der eingebetteten Ansicht anzeigen (Eingebettete Auswahl).
In dieser neuen Maske erstellst du ein Feld (zB 'Produkt'). Den Feldnamen schreibst du in die Eigenschaft (der eingeb. Ansicht) 'Einzelne Kategorie anzeigen'. In dieses Feld schreibt der User den gewünschten Produktnamen hinein, und wird das ganze refresht, und es müsste funktionieren.
Der Nachteil ist halt, dass deine gewünscht Funktion mit der Versionsnummer nicht funktioniert. Ich könnte dir schon auch sagen wie so etwas ungefähr funktionieren würde, aber es ist dann nicht mehr möglich es in einer Ansicht anzuzeigen, sondern nur mehr in einem statischen Feld. Also es ist kompliziert dann später auf so ein Dokument zuzugreifen, denn das wäre ja eigentlich der Sinn von dem ganzen, oder?
Achja, in der Maske könntest du noch ein verstecktes Feld 'SaveOptions' mit dem Vorgabewert 0 erstellen. Nun wird beim Schließen nicht mehr extra gefragt, ob gespeichert werden soll.
Hilft es dir irgendwie weiter, ist warscheinlich nicht das was du dir vorgestellt hast.
Manuel
-
Hallo,
leider muss ich das Feld Version sehen.
Mein Chef hat mir zwei Bücher genehmigt,
und dort habe ich etwas über programmierbare
Tabellen gelesen, diese war jedoch nur in einer Zeile
mal kurz erwähnt.
Da ist mir die Idee gekommen, dass man vielleicht mit
der programmierbaren Tabelle arbeiten kann. Was
hälst du davon? Geht sowas? Ich will mich jetzt
nicht unbedingt auf eine Ansicht als Lösung festbeißen.
Mfg Marco
-
Dynamische Tabellen, sicher, ist 'ne gute Idee.
Eknori hat eine Beispiel-Db auf seinem Server zum Download:
http://www.eknori.de/downloads/dynamic.zip
Hier die passende Diskussion dazu:
http://www.atnotes.de/cgi-bin/yabb/YaBB.pl?board=002-1;action=display;num=1017926609;start=5
Viel Glück beim Gelingen,
Manuel
-
So,
interessant, jetzt muss ich also meine drei Felder
aus der Datenbank auslesen und in der Tabelle anzeigen. Ich denke mal jeweils als einzelnde Zeile.
Ich werde gleich noch mal die Bücher lesen, jedoch
glaube ich nicht, dass dort drin steht, wie man die Werte
in ein Feld schreibt.
Mfg Marco
-
Hallo,
ich habe heute Nacht noch eine Idee gehabt:
Wie wärs damit, ich habe eine Maske, die als Profildokument behandelt wird.
Dies ist die Abfragemaske. Nun greife ich beim Klick auf einen Button auf das
Feld "Produkt" zu und vergleiche dieses mit dem Feld "Produktbeschreibung"
aller Datensätzen in meiner Datenbank wo der Vertragstyp = "TREND" AND
"InstallierteVersion" kleiner als das Feld "NeueVersion" ist und ersetze
im Feld "Alt" eine 0 durch eine 1.
Nun soll er eine Ansicht öffnen, die als Auswahlkriterium
"Alt ist gleich 1" hat. Und so könnte ich mir vorstellen wie es gehen könnte.
Jedoch habe ich ein kleines Problem, ich weiß nicht wie ich die Formeln schreiben kann. :-[
Würdest du mir dabei helfen?
Mfg Marco
-
Hi Marco!
Ist ja wirklich eine harte Nuss, dein Problem. Ich habe deinen anderen Beitrag von heute auch schon gelesen.
Das mit der Idee, einem Feld ("Alt") einen gewissen Wert zugeben, zB 1 oder 0, ist gar nicht so schlecht. Das würde klappen, auch ohne dem Profildokument. Man könnte alle Dokumente der Datenbank, die zu dem Produkt passen, durchforsten und wenn die Versionsnummer kleiner ist dem Feld "Alt" den Wert 1 geben, und dann die Ansicht mit der simplen Ansichtsauswahl "Alt = 1" aktualisieren.
Es gibt allerdings ein Problem: Wie viele Leute arbeiten auf dieser DB gleichzeitig? Wenn nämlich mehrere Leute gleichzeitig so eine Abfrage starten, hast ein Problem.
Manuel
-
Hallo,
es wird wahrscheinlich nicht so oft passieren.
Mich hat Pipsxx noch mal zurück auf die Idee mit der eingebetteten Ansicht gebracht.
Ich werde es jetzt auf dem Wege einmal probieren,
da natürlich meine Lösung von gestern Nacht noch
ein paar Probleme machen würde.
Wie z.B. das zurücksetzen der Werte, sowie die Anzahl der Dokumente, da es jede menge werden sollen.
Aber die Geschichte mit der Versionsnummer muss
unbedingt machbar sein. Mein Chef wartet auch schon
darauf.
Mfg Marco
-
Zurücksetzen der Werte wäre auch kein Problem. Dies könnte man zB durch das Ereignis 'QueryClose' (also kurz vor dem Schließen der Ansicht) machen. Es wird einfach bei allen Dokumenten in der Ansicht der Wert wieder auf 0 gesetzt.
Dass mit der Datenmenge ist natürlich das größere Problem.
Versuche es mit der eingeb. Ansicht. Natürlich wirst du die Lösung nicht so hinbekommen, wie es dein Chef gerne möchte, weil du eben in einer eingeb. Ansicht nicht einstellen kannst, dass die Ansicht nur die Dokumente anzeigen soll die vor einer bestimmten Versionsnummer liegen. Leider.
Ansonsten würde ich dir wirklich die Dynamische Tabelle empfehlen. Du musst dich halt vorher in den Code ein wenig einlesen, das bei diesem Code besonders schwierig ist.
Manuel
-
Obwohl, ... , wenn du vorerst mit einer einfachen Listung der Dokumente in einerm simplem Textfeld zufrieden bist, könnte ich dir schon weiterhelfen. Es gibt aber eben dann nicht mehr die Möglichkeit gleich auf die Dokumente zuzugreifen, sondern müsste sich diese wieder in einer anderen Ansicht suchen.
-
Wieso nicht, das wäre erstmal schon etwas, was ich dem Chef zeigen könnte.
Paralell dazu kann ich die Geschichte mit den dynamischen Tabellen
weiter ausknobeln.
Mfg Marco
-
Versuch mal dem folgenden Code. Er wird in einen Button eingefügt. Folgende Felder müssen in der Abfragemaske (ist kein Profildokument) vorhanden sein:
Produktbeschreibung
NeueVersion
Ergebnis (für die Liste die ausgegeben wird)
Ist vielleicht nicht die schönste Lösung, aber mal als vorläufiger Anhaltspunkt. Es kann sein, dass einiges nicht funktioniert, weil ich den Code nur getippt und nicht getesten habe. Also berichte wenn's nicht klappt. Ich hoffe ich habe ihn ausreichen kommentiert.
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim thisDoc As NotesUIDocument
Set thisDoc = ws.CurrentDocument 'aktuelles Dokument (Abfragemaske), um Werte aus Feldern auszulesen
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim dc As NotesDocumentCollection 'DocumentCollection für alle Dokumente dieses Produkts und Vertragstyp "TREND"
Dim doc As NotesDocument
Dim keyArray(1) As String 'Schlüssel für die Suche
Dim neueversion As Double, instversion As Double
Dim ergebnis As String 'dieser String wird nachher in das Feld Ergebnis geschrieben
Set db = s.CurrentDatabase
'die Ansicht (ich hab sie derweil 'ProjektSuchen' genannt) muss folgerndermaßen aussehen
'1. Spalte: Produkt, 2. Spalte: Vertragstyp, beide spalten sortiert (aufsteigend oder absteigend, egal)
Set view = db.GetView("ProjektSuchen")
keyArray(0) = thisDoc.FieldGetText("Produktbeschreibung") 'oder wie das Feld in der Abfragemaske auch immer heißen soll
keyArray(1) = "TREND"
'nun wird gesucht
Set dc = view.GetAllDocumentsByKey(keyArray, True) 'der letzte Parameter gibt an ob exakt gesucht werden soll, das musst du entscheiden
Set doc = dc.GetFirstDocument 'erstes Dokument der dc
'nun beginnt die Schleife die alle Dokumente mit der Versionsnummer vergleicht
While Not (doc Is Nothing)
neueversion = thisDoc.Document.GetItemValue("NeueVersion")
instversion = doc.GetItemValue("InstallierteVersion")
'Vergleich der beiden Versionen
If instversion < neueversion Then
'installierte Version ist kleiner, also werden Werte dieses Dokument dem String hinzugefügt
'ich bin davon ausgegangen, dass es in dem Dok. die Felder Kunde, Produkt, InstallierteVersion gibt
'Chr(9) ist ein Tabulator, Chr(10) eine Zeilenschaltung
ergebnis = ergebnis & doc.Kunde(0) & Chr(9) & doc.Produkt(0) & Chr(9) & doc.InstallierteVersion(0) & Chr(10)
End If
Set doc = dc.GetNextDocument(doc) 'nächstes Dokument der dc
Wend
Call thisDoc.FieldSetText("Ergebnis", ergebnis)
End Sub
Mahlzeit
Manuel
-
Hallo mein Freund,
ich habe das Script soweit am laufen, dass er mir nur noch Type Mismatch anzeigt. Was für ursachen könnte das haben?
Mfg Marco
P.S.:Hier mein etwas Modifizierter Code:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim thisDoc As NotesUIDocument
Set thisDoc = ws.CurrentDocument 'aktuelles Dokument (Abfragemaske), um Werte aus Feldern auszulesen
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim dc As NotesDocumentCollection 'DocumentCollection für alle Dokumente dieses Produkts und Vertragstyp "TREND"
Dim doc As NotesDocument
Dim keyArray(1) As String 'Schlüssel für die Suche
Dim neueversion As Double, instversion As Double
Dim ergebnis As String 'dieser String wird nachher in das Feld Ergebnis geschrieben
Set db = s.CurrentDatabase
'die Ansicht (ich hab sie derweil 'ProjektSuchen' genannt) muss folgerndermaßen aussehen
'1. Spalte: Produkt, 2. Spalte: Vertragstyp, beide spalten sortiert (aufsteigend oder absteigend, egal)
Set view = db.GetView("Versionsabfrage")
keyArray(0) = thisDoc.FieldGetText("Produktbeschreibung") 'oder wie das Feld in der Abfragemaske auch immer heißen soll
keyArray(1) = "TREND"
'nun wird gesucht
Set dc = view.GetAllDocumentsByKey(keyArray, True) 'der letzte Parameter gibt an ob exakt gesucht werden soll, das musst du entscheiden
Set doc = dc.GetFirstDocument 'erstes Dokument der dc
'nun beginnt die Schleife die alle Dokumente mit der Versionsnummer vergleicht
While Not (doc Is Nothing)
neueversion = thisDoc.Document.GetItemValue("NeueVersion")
instversion = doc.GetItemValue("InstallierteVersion")
'Vergleich der beiden Versionen
If instversion < neueversion Then
'installierte Version ist kleiner, also werden Werte dieses Dokument dem String hinzugefügt
'ich bin davon ausgegangen, dass es in dem Dok. die Felder Kunde, Produkt, InstallierteVersion gibt
'Chr(9) ist ein Tabulator, Chr(10) eine Zeilenschaltung
ergebnis = ergebnis & doc.Lizenznehmer(0) & Chr(9) & doc.Produktbeschreibung(0) & Chr(9) & doc.InstallierteVersion(0) & Chr(10)
End If
Set doc = dc.GetNextDocument(doc) 'nächstes Dokument der dc
Wend
Call thisDoc.FieldSetText("Ergebnis", ergebnis)
End Sub
-
Starte bitte bevor das Script ausgeführt wird den Debugger (Datei/Extras/Debug LotusScript) und schau in welcher Zeile er den Fehler findet!
-
Hallo,
und wo zeigt er mir ein Fenster an, in dem ich
die Debug Informationen sehen kann?
Sorry habe leider noch nie damit gearbeitet.
Mfg Marco
-
Bevor du deine Abfragemaske öffnest wählst du noch den Menüpunkt Datei->Extras->Debug LotusScript. Jetzt ist also 'n Haken dort. Notes öffnet jetzt automatisch wenn ein Script ausgeführt wird den Debugger.
Jetzt hast du folgende Möglichkeiten (die wichtigsten):
Fortfahren - er raselt das Script durch und stoppt bei einem Fehler
Schritt ausführen - Zeile für Zeile kannst du den Code nun durchführen. Das ist vor allem sehr praktisch wenn du während der Ausführung gewisse Variablenwerte überprüfen willst. Dafür kannst du ganz unten einen Rahmen hochziehen, in dem die nötigen Infos stehen.
Du klickst jetzt einfach mal Fortfahren. Bei dem Fehler bleibt er stehen und markiert diese Zeile. Dein Fehler wird warscheinlich dadurch verursacht, dass versucht wird einer Variable einen Wert zuzuweisen, der nicht ihren Typ entspricht.
-
Hallo,
hat funktioniert. :o
In dieser Zeile zeigt er die Fehlermeldung:
neueversion = thisDoc.Document.GetItemValue("NeueVersion")
Mfg Marco
-
Die Variable neueversion ist als Double deklariert, das Feld 'NeueVersion' ist warscheinlich ein Textfeld. Ordne diesem Feld den Typ 'Zahl' zu, dann müsste es klappen.
Noch ne Frage:
Wie schauen deine Versionsnummern eigentlich aus? Sind es ganz normale Zahlen (so wie 5,0) oder komplexe, wie 5.0.2?
-
Hallo,
ich habe schon beides ausprobiert,
NeueVersion macht egal als Text oder Zahl diesen
Fehler. ???
Mfg Marco
-
Oops, Sorry Marco!
Da hab' nicht richtig aufgepasst! Die Funktion NotesDocument.GetItemValue gibt nämlich folgende Werte zurück:
- Rich text String. The text in the item, rendered into plain text
- Text or text list (includes Names, Authors, and Readers item types) Array of strings
- Number or number list Array of doubles
- Date-time or range of date-time values Array of variants of type Date
Und in unserem Fall haben wir ein Zahlenfeld, daher trifft der dritte Punkt auf uns zu. Wir bekommen also einen Array of doubles zurück, und diesen können wir nicht einfach so einer normalen Double-Variable zuweisen, ausser es ist ein Array. Also müssen wir nun gezielt auf das erste Element (also das "nullte") zugreifen. Jetzt kannst du dich zwischen zwei Arten entscheiden:
[font=Verdana Color=blue]neueversion = thisDoc.Document.GetItemValue("NeueVersion")(0)
instversion = doc.GetItemValue("InstallierteVersion")(0)
... oder ...
neueversion = thisDoc.Document.NeueVersion(0)
instversion = doc.InstallierteVersion(0)[/font]
Welche du nimmst, ist egal, es müsste aber nun klappen (hoffe ich). Wenn noch weitere Fehler auftreten, berichte!
Gruß
Manuel
-
Hallo,
ich habs grade zum laufen gebracht.
Vielen Dank :-*
Die Versionsnummer werden dann in dieser Form
eingegeben: z.B. 5,02. Ich muss nur noch die entsprechenden Leute so erziehen, dass sie nicht irgendwelche komischen Nummern nehmen.
Mfg Marco
P.S.: Sorry habe grade meinen Führerschein bestanden und
durfte jetzt auch in einem Noteinsatz zum Kunden fahren.