Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Lorenz am 20.07.03 - 13:28:54
-
hallo
hier mal so drei fragen...
wie kann ich, mittels script in einem button, in einer view eine spalte durchsuchen. das ziel ist es nur die in der spalte angezeigten werte zu durchsuchen.
wie kann ich die in einem folder angezeigten dokumente aus dem folder mittels script löschen (das dokument sollte aber nicht in der datanbank gelöscht werden.
das $v2AttachmentOptions feld sollte berechnet und mit wert 0 versehen sein, wenn man nicht möchte, dass es einem attachments anzeigt. funktioniert dies unter r6 auch so?
vielen dank für antworten.
-
Zu 1: Gar nicht. Zumindest nicht im Frontend. Mit ein paar Tricks dann im Backend. Hängt davon ab wie gut du Script kannst.
Zu 2: Such mal nach RemovefromFolder (NotesDocument Klasse) bzw. RemoveAllFromFolder (NotesDocumentCollection Klasse)
Zu 3: Keine Ahnung. Musst du ausprobieren.
Thomas
-
zu 1. kann leider nicht sehr gut scripten. :-\ aber, was ja noch eine möglichkeit wäre, ist nach feldinhalten in einem definierten feld zu suchen.
also z.b. beim ftsearch nicht db.ftsearch sondern dann ein db.Feldname.ftsearch. würde das gehen?
(db gleich NotesDatabase)
so könnte man das ganze mit der ansichtsauswahl etc. weglassen.
wie würdest du das problem lösen?
-
mal so aus dem Bauch raus und ohne Funktionsgarantie:
Der FTSearch hat zuviele Tücken um ihn da vernünftig einsetzen zu können. Zum Beispiel ist da die Frage der letzten Aktualisierung die nicht ganz unerheblich ist. Performance und die Anzahl der Zurückgegebenen Werte spielen auch noch eine Rolle.
Das Grundproblem ist, das du eine View hast und mit dieser View in der Regel schon einmal eine Vorauswahl getroffen wurde. Also kannst du zwei Wege gehen:
1. du schnappst dir in Script die View, und benutzt zusätzlich die Column Klasse Dann gehst du her und hast daraus den Feldnamen der verwendet wurde (vorausgesetzt es wurde ein Feldname verwendet, wenn nicht hast du ein problem aber das kannst du auch in der Hilfe nachlesen). Jetzt kannst du mit der Viewentrycollection oder auch im View direkt jedes Dokument des Views durchgehen und anschließend deine Vergleiche auf dem Feldnamen machen. Ist ein bischen Tricky aber funktioniert.
2. Du nimmst db.search (näheres siehe Online Hilfe) Das Teil baut den Search direkt zur Laufzeit auf und wird häufig von Entwicklern unterschätzt. Da kann man nämlich, was z.B. mit FTSearch nicht richtig funktioniert Datumsvergleiche von - bis anstellen. Das Ding erstellt eine DocumentCollection und zwar zur Laufzeit über alle Dokumente. Damit ist es soweit ich weiss immer aktuell. Der Haken dabei ist, Performance (Das Teil frisst sie förmlich) und Speicher (den frisst es auch). Der zweite Teil des Hakens, die Collection ist unsorted, wenn du also eine bestimmte Reihenfolge brauchst muss sie erst noch sortiert werden.
Thomas
-
in einem meiner script bücher hats ein beispiel wie man durch view spalten suchen kann (mit search). ich werde das beispiel einfach anpassen und hoffen, dass es funktioniert.
hier mein code für de ftsearch. jedoch habe ich noch zwei offene punkte, die ich in den code einbauen möchte. und zwar, das automatische removen der dokumente aus dem folder und das automatische aktualisieren des folders bzw. dann der view.
Sub Click(Source As Button)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As notesdocument
Dim dc As NotesDocumentCollection
Dim uiw As New NotesUIWorkspace
Dim uidoc As notesuidocument
Dim art As String /wird gebraucht um den suchstring zu ergänzen
Dim vts As String /der suchstring
Set uidoc = uiw.CurrentDocument
art = uidoc.FieldGetText("suchart") /einlesen der suchart *wert oder *wert* etc
hier die abfrage wie gesucht werden soll.... (gibt sicher schönere varianten)
If ( art = "Festwert") Then
vts = uidoc.fieldgettext("erf_volltext")
Else
If (art = "Fragment") Then
vts = "*" & uidoc.fieldgettext("erf_volltext") & "*"
Else
vts = uidoc.fieldgettext("erf_volltext") & "*"
End If
End If
Set db = s.CurrentDatabase
Set dc = db.FTSearch(vts,0)
1. hier würde ich gerne den folder ergebnis leeren aber wie?
Call dc.PutAllInFolder("ergebnis")
2. und hier sollte noch ein autoupdate der view (bzw. des folders) hinkommen die ich einem unteren frame anzeige.
End Sub
du würdest mir sehr helfen, wenn du mir ein tipp geben könntest wie ich die probleme 1 und 2 lösen könnte. vielen dank
-
zu 1. Folder sind wie Views, man kann sie mit den gleichen Klassen behandeln
also:
dim foldercollection as notesdocumentcollection
dim folderview as notesview
dann
Set folderview = db.GetView("ergebnis")
Set vc = folderview.AllEntries
Call foldercollection.RemoveAllFromFolder( "ergebnis" )
zu 2. Aber da musst du schauen ob es funktioniert, das geht nämlich nur wenn du im "richtigen" UIWorkspace bist.
Call folderview.Refresh
Call UIworkspace.folderViewRefresh
Du hast ja leider nicht erzählt in welchem Kontext du das brauchst. Warscheinlich gibt es eine andere, wesenlich einfachere Lösung.
Thomas
-
vielen dank!!!
zu eins...
hat funktioniert!!!
zu zwei
hat funktioniert!!!
zum kontext
also ich programmiere ein einfacheres adressbuch.
so nach dem schema: oberes frame suche durch kopierte names dokumente, mittleres frame eine view mit den ergebnissen und unteres frame eine detailanzeige.
-
wenn du fertig bist kannst du es ja mal herzeigen.
Klingt interessant. Es kommen zumindest nicht viele auf den Gedanken ein eigenes Adressbuch zu konstruieren.
Thomas
-
haha :D wäre ich auch nie, würde nicht mein chef das so wollen.
das adressbuch soll für unsere 4000 user weltweit verfügbar sein. und mein chef meint man könne den usern die notesstandardsuche nicht zumuten...
momentan kämpfe ich noch mit dem suchen in spalten. hast du da ein beispiel zu verfügung?
aja was ich noch los werden wollte. vielen dank für deine hilfe!
-
Suchen in Spalten? Draufklicken und einfach das Schreiben anfangen. Dann sucht er automatisch in dieser Spalte und stellt sich auf den ersten Treffer, vorausgesetzt die Spalte ist sortiert.
Davon abgesehen. Ich würde mich wirklich mal mit den WhoIsWho von Haitec beschäftigen. Ich hoffe nämlich, das ihr nicht vorhabt das Adressbuch komplett zu ersetzen. Und dafür Mitarbeiter entsprechend Ihrer Qualifikation zu suchen und eine entsprechende Synchronisierung mit dem/den "echten" Adressbuch(büchern) herzustellen ist es ganz gut geeignet.
Thomas
-
die variante mit einfach auf die spalte drücken und anfangen zu schreiben ist sicher eine variante.
ich frag mal meinen auftraggeber ob ihm das genügt.
das adressbuch werden wir selbstverständlich nicht ersetzen. die idee dahinter ist eher einfach so eine alternative anzeige zum normalen names anzubieten. mir ist der sinn auch nicht ganz schlüssig. da ich aber der lehrling bin, habe ich da nicht all zu viel zu sagen. :-\
aja, weisst du wie ich es fertig bringe, ein dokument automatisch anzuzeigen wenn ich es in einer view selektiert habe?
die synchronisierung habe ich so gelöst, dass es immer um miternacht alle einträge in meiner db löscht und dann die neuen vom names herkopiert. sehr einfach und äusserst performance intensiv, aber dafür einfach.
-
aja, weisst du wie ich es fertig bringe, ein dokument automatisch anzuzeigen wenn ich es in einer view selektiert habe?
Wie definierst du selektiert? Wenn du im UI bist und manuell drauf klickst oder mit Script?
Mit Script ist es uiworkspace.Editdocument
Manuell geht es nur dann wenn du API Programmierst. Viel Spaß dabei.
die synchronisierung habe ich so gelöst, dass es immer um miternacht alle einträge in meiner db löscht und dann die neuen vom names herkopiert. sehr einfach und äusserst performance intensiv, aber dafür einfach.
Autsch ::) das ist jetzt wirklich hart. Weisst du überhaupt auf was du dich da einlässt? Erst einmal glaube ich nicht, daß bei 4000 Mitarbeitern deine DB nur auf einem Server laufen wird. Dann gibt es da bestimmt auch welche, die offline arbeiten (Notebook), Außerdem bläst jede Runde die Datenbank auf. Es bedeutet unter anderem auch Gigabyteweise Verkehr im Netzwerk. Jedesmal verlieren die Benutzer z.B. Ihre Gelesen Markierungen, Replikation muss immer mit einem Vollen Set laufen und vergisst jemand mal auf seinem Notebook für 3 Monate diese Datenbank zu replizieren, sind plötzlich die alten Dokumente wieder in der Datenbank! Sorry wenn ich das so sage, aber dieses Design ist krank!
N.B. beim Gespräch mit deinem Vorgesetzen kannst du ihm/ihr? ja dieses Posting zeigen. Wenn er dann noch Fragen hat kann er ja mal anrufen.
Thomas
-
hallo
zu 1.. ich verschiebe die thematik auf relase 2 meines adressbuchs...
zu 2 danke für deine offene ehrlichkeit.
die problematik ist mir bekannt und bewusst. ist auch nicht für immer so gedacht, nur zum testen.
im produktiven einsatz werde ich dann die in unserer workflow lösung verwendeter abgleichs - agent verwenden. der überprüft nur nach änderungen und verändert dann nur diese dokumente.
da ich aber noch einiges am adressbuch zu tun habe konnte ich mich noch nicht darum kümmern.
n.b.: mein chef ist in den ferien! nur ich darf hier meinen sommer mit diesem ding verbringen. herrlich.
hier noch mein versuch nur ein feld in der db zu durchsuchen.
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim nn As String
Dim uiw As New NotesUIWorkspace
Dim uidoc As notesuidocument
nn = uidoc.fieldgettext("vorname")
Set uidoc = uiw.CurrentDocument
Set db = session.CurrentDatabase
//Hier gibts immer ein Fehler. Warum?
Set dc = db.Search("@Contains(FirstName;nn)", 0)
Set doc = dc.GetFirstDocument()
While Not(doc Is Nothing)
Messagebox doc.Subject(0)
Set doc = dc.GetNextDocument(doc)
Wend
End Sub
das ding ist so aus der hilfe kopiert und leicht verändert.
-
Hi,
versuch's mal so:
Set dc = db.Search("@Contains(FirstName; '" & nn & '")", Nothing, 0)
Zum einen hast du einen Parameter vergessen, zum anderen, war ein Fehler beim einbinden der Variable nn in deiner Zeile.
Axel
-
hat leider nicht funktioniert.
kommt ein fehler so in etwa "unexepted end of line exepted expression"
hmmm.... ?
aja...
wie kann ich in diesem string angeben, dass eine verfügbare names.nsf db verwendet werden soll?
Set db = s.CurrentDatabase
-
Hi,
sorry, "Fehler vom Amt".
So sollte es gehen:
Set dc = db.Search("@Contains(FirstName; """ & nn & """)", Nothing, 0)
Welche names.nsf ist denn gemeint? Das öffentliche Adressbuch oder das persönliche?
Es gibt in der NotesDatabase-Klasse die Eigenschaften IsPublicAddressBook und IsPrivateAddressBook. Schau mal in die Designer-Hilfe.
Axel
-
grandios! jetzt funktionierts!!!
womit ich jetzt diese drei fragen (oder warens mehr) schliesse.
@axel
das öffentliche. ich werd mal in der hilfe suchen.
-
Hi,
wenn's das öffentliche sein soll, dann hab ich viellecit was für dich.
Das ist Code aus einem Hotspot, der den Adressauswahldialog anzeigt, und anhand des gewählten Namens das Kurzzeichen ausliest und in ein Feld schreibt.
Sub Click(Source As Button)
Dim view As NotesView
Dim picklist As Variant
Dim namesdoc As NotesDocument
Dim item As NotesItem
Dim vTmp As Variant
Dim i As Integer
Dim books As Variant
Dim done As Integer
Dim iMaxValue As Integer
'Suchen des öffentlichen Adressbuches und Zugriff auf die entspr. Ansicht
done = False
books = session.AddressBooks
Forall b In books
If (b.IsPublicAddressBook) And (Not done)Then
Call b.Open( "", "" )
Set view = b.GetView("($VIMPeople)")
done = True
End If
End Forall
If done Then
picklist = ws.Pickliststrings(0, False)
If Isempty(picklist) Then Exit Sub
iMaxValue = Ubound(picklist)
For i = 0 To iMaxValue
macrostr$ = | @Name([Abbreviate]; "|+ picklist(i) +|")|
vTmp = Evaluate(macrostr$)
Set namesdoc = view.GetDocumentByKey(vTmp(0))
'Separierung des Kurzzeichens aus der Internetadresse
If Not (namesdoc Is Nothing) Then
If (namesdoc.InternetAddress(0) <> "") And (Instr(namesdoc.InternetAddress(0), "@") > 0) Then
vTmp = Evaluate(| @ProperCase("| + Left$(namesdoc.InternetAddress(0), Instr(namesdoc.InternetAddress(0), "@") - 1) + |")|)
Set item = doc.ReplaceItemValue("Betreuer",Cstr(vTmp(0)))
Else
Messagebox "Das Kurzzeichen für " & vTmp(0) & " kann nicht ermittelt werden" & Chr$(10) & _
"Der Eintrag wird übersprungen", 48, "Adressen"
End If 'If namesdoc.InternetAddress(0) <> "" And ... Then
Else
Messagebox "Der Eintrag für " & vTmp(0) & " kann im Adressbuch nicht gefunden werden", 48, "Adressen"
End If
Next
Else
Messagebox "Funktion bei lokalem Betrieb nicht verfügbar.", 48, "Adressen"
End If
End Sub
Es ist nicht genau was du suchst, aber es zeigt die Verwendung der Eigenschaft IsPublicAdressBook.
Axel