Beiträge von Homer

    Hallo Gemeinde,


    ich stehe gerade vor der Aufgabe für einen Kunden eine Massenmail zu versenden (nein kein Spammer, eine Bank 8-) )


    Den Text habe ich ich als Vorlage in einer Mail-DB gespeichert.
    Im Text befinden sich zwei Platzhalter für Anrede und Name.


    Die Platzhalter wollte ich über NotesRichTextRange.FindandReplace mit Werten aus einer Liste füllen.


    Scheinbar entspricht eine RichtTextRange in einem RichText Feld einem Absatz, so dass ich, um an die richtige Stelle zu kommen einen RichTextNavigator brauche.


    Blöderweise ist die Phrase "Sehr geehrte...bla.bla" nicht der erste Absatz.


    Eigentlich ganz einfach, mit:
    (sDoc ist die Vorlage)
    Set sDoc = sView.GetFirstDocument
    Set memo = db.CreateDocument
    Call sDoc.CopyAllItems(memo,True)
    Call memo.RemoveItem("MailStationeryName")
    Call memo.RemoveItem("IsMailStationery")
    set rtItem = memo.GetFirstItem("Body")
    Set rtn = rtItem.CreateNavigator


    ...sollte ich einen RichTextNavigator kriegen mit dem ich das Feld beackern kann.
    Nur ist rtn anschließend immer leer und ein anschließendes
    Set rtr = rtItem.CreateRange
    Call rtr.SetBegin(rtn)


    Bringt einen Fehler.


    Was mache ich falsch? :cry:


    Viele Grüße


    Ron

    Zitat


    Steve_O. schrieb:
    Nur, dass mein "erstmal" sich dann auch ein paar Jährchen hinziehen kann.. :)


    Das wird wohl "erstmal" bis zur nächsten Migration so sein :lol:


    Was mich an so Geschichten immer nervt ist dass ich wahrscheinlich niemals erfahren werde warum der Indexer jetzt ausgerechnet diese Datenbanken indizieren wollte.
    Das soll jetzt keine Kritik an den Forumsteilnehmern sein sondern ist eher ein philosophisches Problem.

    Na Ja, ursprünglich war der Server ja eine Neuinstallation von Domino 7.0.2. Dann Language Pack-De installiert, danach FP1+2.


    Dann hätten die iNotes Hilfedateien ja schon da sein müssen.


    Aus dem iNotes-Verzeichnis des alten Servers habe ich überhaupt nichts rüberkopiert, weil ich davon ausgegangen bin dass schon alles drin ist was drin sein muss.


    Da die deutschen Hilfedateien nicht da sind, habe ich die vage Vermutung dass bei der Installation des Language Packs etwas schief gegangen ist.


    In der catalog.nsf habe ich übrigens auch nichts gefunden.


    Damit ich meine Ruhe hab, hab ich die vermissten Datenbanken erstmal von einem anderen Server rübergeholt.


    Das geht mir in letzter Zeit leider öfter so mit dem Notes: Ich bin zwar in der Lage einen Fehler abzustellen, aber wieso der Fehler überhaupt aufgetaucht ist weiss kein Mensch. :-?


    P.S Natürlich darf mir jeder antworten :lol: [size=xx-small][color=00FFFF]War schon blöd formuliert von mir[/color][/size]

    Hallo zusammen,


    zum Zwecke der Dokumentation und falls es jemanden interessiert hier die Lösung meines Problems:


    Auslöser war die folgende Zeile in den Declarations des Datenbank-Scripts:
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, Byval hpvSource As Long, Byval cbCopy As Long)


    Dazu muss man bemerken, dass dieser Code Jahrelang, in 5er und 6er Mailschablonen, unabhängig von der Client Version funktioniert hat.


    Heute habe ich nochmal bei IBM Developer Works gesucht und dabei in der Support Datenbank einen Beitrag gefunden in dem exakt der von mir verwendete Code zum Herausfinden der IP-Adresse eines Rechners vorgestellt wurde.
    Mit einer klitzekleinen Abweichung:
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, Byval hpvSource As [size=large][color=FF0099]Any[/size][/color], Byval cbCopy As Long)


    Die Änderung des Datentyps von "Long" nach "Any" habe ich übernommen und jetzt läufts. :strike:


    Aber warum der alte Code überall läuft nur in der 7er Mailschablone nicht, wird wohl auf ewig im Dunkeln bleiben.

    Zitat


    maestro schrieb:


    Im Frontend konnte ich die Datei temporär im Dateisystem ablegen und Sie wieder abholen, nur is es sererseitig nicht möglich.


    Wieso soll das auf dem Server nicht möglich sein?
    Codemäßig ist das doch sehr einfach.
    Gibt es andere Gründe die dagegen sprechen?


    Die Perfekte Lösung deines Problems gibt's glaub ich nicht.
    Mir würden schon mehrere Lösungsansätze einfallen, aber alle haben irgendwo einen Schönheitsfehler.


    Wenn du genügend Plattenplatz auf dem Notebook hast, könntest du für jeden Standort einen eigenen Notes-Client installieren, mit eigener Bookmark.nsf und Desktop.ndk.
    Die Replikatorseite wäre dann je nach Standort auf den entsprechenden Server eingestellt. Die Datenbanken die du replizieren willst könntest du einmal in ein zentrales Verzeichnis stellen und aus den Data-Verzeichnissen darauf verlinken.
    Ist ziemlich aufwendig, wäre aber für den Endbenutzer am einfachsten.

    Ja, im Postopen.


    Der Code ist ganz einfach:
    'Tägliches sammeln von Systeminformationen
    'Erstmal das Tagesdatum bestimmen wegen dem Timestamp
    Set thisday = New NotesDateTime(Today)
    'Dann prüfen ob das Script heute schonmal gelaufen ist
    If CheckRunCondition("DailySysInfo", thisday.DateOnly) Then Exit Sub
    'Systeminformationen sammeln
    ipadr = GetIP
    hostname = GetMachineName
    osversion = GetOSInfo
    notesversion = session.NotesVersion
    counter = Instr(notesversion,"|")
    If Not counter = 0 Then notesversion = Left$(notesversion,counter-1)
    notesbuild = session.NotesBuildVersion
    'String zum versenden zusammenstellen
    parsestr = hostname+"~"+ipadr+"~"+osversion+"~"+notesversion+"~"+notesbuild+"~"+thisday.DateOnly
    'Versand einer Mail mit den erhobenen Daten
    Set db = session.CurrentDatabase
    Set message = db.CreateDocument
    message.Form = "Memo"
    message.Subject = "SysInfo " + thisday.DateOnly
    message.SendTo = "Inventory@myDomain"
    message.Principal = session.UserName
    Set rtitem = New NotesRichTextItem(message, "Body")
    Call rtitem.AppendText(parsestr)
    Call message.Send(False)
    'Flag setzen dass das Script heute schon gelaufen ist
    Call session.SetEnvironmentVar("DailySysInfo",thisday.DateOnly)

    Du hast Glück dass ich so ein alter Schrottler bin und nichts wegwerfen kann.
    Letztes Jahr hab ich zwar einen ganzen Stapel alte Notes CD's an den Kindergarten verschenkt zum Mobile basteln, aber die 5.0.13a für OS/400 (V5R1 or V5R2) gammelt immer noch in unserem Büroschrank rum.


    Schick mir eine persönliche Mitteilung an welche Adresse ich die CD schicken soll.


    Gruß


    Ron

    Da wir in unserer Mailschablone noch eine Reihe von Anpassungen drin haben habe ich jetzt zum Testen eine Originalschablone genommen.


    Zuerst die normale mail7.ntf. Code eingebaut --> Peng
    Dann die mail7ex.ntf mit gleichem Ergebnis.


    Die entsprechenden 6er Schablonen funktionieren hingegen einwandfrei.


    Irgendetwas muss in den 7er Schablonen drin sein ???

    Gibt es irgendwelche Fehlermeldungen beim Versand an die Domain?


    Verwendet ihr TLS?


    Eventuell solltet ihr mal mit SMTPDebug=3 (evtl. auch 4) und
    SMTPDebugIO=3 den Loglevel hochschrauben und mal genauer nachsehen was da passiert.

    taurec

    Zitat


    Denn wenn man dein Posting im Zusammenhang mit seinen Postings liest, dann klingt es als ob die Variante Replizierung mit Optionen im Hintergrund gehen würde.


    Ich habe explizit geschrieben:
    Mit Datei/Replizierung/Replizieren... Dann "Replizierung mit Optionen" und den passenden Server aussuchen. Man braucht dann nichts zu Coden, aber die Replikation läuft im Vordergrund

    Zitat


    Vor allem da du beim zweiten Teil deiner Antwort explizit darauf hinweist daß es dort so ist


    Ich habe geschrieben:
    Die läuft dann nicht im Hintergrund.


    Ich frag mich was da missverständlich sein soll?

    Zitat


    taurec schrieb:
    Homer


    Bei Replizierung mit Optionen blockiert die Replizierung allerdings auch den Client und genau das will der Fragesteller ja nicht.


    Ist mir schon klar, ich geb ihm nur einige Kröten zur Auswahl von denen er dann eine schlucken muss :)

    Zitat


    Die Replizierung wird über das Bookmark Replizierung und "Jetzt replizieren" angestossen.


    Dann wird es jetzt leider etwas weniger komfortabel.
    Wenn es nur wenige Datenbanken zu replizieren sind und es sich um einigermaßen fitte User handelt, dann würde ich sie wirklich
    komplett manuell replizieren lassen. Mit Datei/Replizierung/Replizieren... Dann "Replizierung mit Optionen" und den passenden Server aussuchen. Man braucht dann nichts zu Coden, aber die Replikation läuft im Vordergrund.


    Zitat


    Wie ist es, wenn ich das per Script anstosse, läuft die Replizierung denn auch im hintergrund, wie bei der Standard replizierung?
    Es geht mir halt darum das der Client nicht "gesperrt" ist für die Zeit der Replizierung!


    Die läuft dann nicht im Hintergrund.


    Gruß


    Ron

    Wie wird denn die Replikation angestoßen, automatisch oder manuell?


    Wenn manuell, dann kann er doch per rechtsklick auf die DB, über Replizieren mit Optionen den gewünschten Server aussuchen.


    Automatisches replizieren müsste dann in der Arbeitsumgebung abgeschaltet sein.


    Außerdem ist es auch möglich eine Replikation per Script anzustoßen.
    Das könnte man dann in eine kleine Anwendung einbauen. Die kann der User öffnen und hat für jeden Standort einen Button der die Replikation mit dem entprechenden Server startet.


    Sollte garnicht so schwierig sein.

    Vielen Dank für deine Anregungen!


    Zunächst einmal zu den Rechten: Es gibt in unserer Firma niemanden der mehr Rechte (in Notes :D ) hat als ich.
    Fast jeder Code ist mit meiner ID signiert und die Signatur ist in allen ECL's drin. ECL kann es eigentlich nicht sein, da diese soweit ich weiß auf den lokalen Client bezogen arbeitet, und nicht auf die Datenbank.


    Ich habe dann mal angefangen rumzuexperimentieren wie sich der Code in anderen Datenbanken verhält.
    Zuerst mal habe ich eine ältere Testanwendung, noch mit ODS 41, genommen, den Code dort eingebaut und getestet.
    --> läuft


    Dann eine komplett neue, leere DB angelegt, Code eingebaut
    --> läuft


    Dann aus der 7er Schablone den Code wieder rausgenommen und alles Script neu kompiliert. Über die Mail-DB drübergebügelt und alles ist normal gelaufen.
    Dann wieder den Code in die Schablone rein und Design-Update gemacht
    --> Peng


    Morgen probier ich mal aus was passiert wenn ich den Code in die extended Mail Schablone einbaue.

    Hallo zusammen,


    ich habe mal wieder ein Problem das ich überhaupt nicht kapiere und muss dazu etwas weiter ausholen.


    Vor einigen Jahren habe ich in den PostOpen jeder Maildatenbank ein Script eingebaut das mir einmal am Tag, beim ersten öffnen der Mail-DB Informationen über den Client in eine Mail-In DB sendet. Und zwar: Maschinenname, IP-Adresse, Betriebssystem-Version und Notes-Client Version.
    Damals haben wir das gebraucht um vor dem Rollout von Win-XP und Notes 6 erstmal einen Überblick zu bekommen wer überhaupt welche Versionen installiert hat.
    Heute ist es immer noch sehr nützlich um schnell die IP-Adresse zu bekommen um mich dann per Fernsteuerung im Supportfall aufzuschalten.


    Den Code habe ich über irgendein Forum gefunden und ihn, ehrlich gesagt, übernommen ohne ihn wirklich zu verstehen.


    In den Declarations des Datenbank-Script ist folgender Code:


    Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
    End Type


    Type HOSTENT
    hName As Long
    hAliases As Long
    hAddrType As Integer
    hLen As Integer
    hAddrList As Long
    End Type


    Declare Private Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long


    Declare Function gethostname Lib "WSOCK32.DLL" (Byval szHost As String, Byval dwHostLen As Long) As Long


    Declare Function gethostbyname Lib "WSOCK32.DLL" (Byval szHost As String) As Long


    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, Byval hpvSource As Long, Byval cbCopy As Long)


    Verwendet werden diese Deklarationen dann in folgendem Code:
    Function GetIP() As String
    Dim HostName As String * 256
    Dim HostPointer As Long
    Dim HostStruct As HOSTENT
    Dim HostAddressPointer As Long
    Dim HostAddress As Long
    Dim AddressNum As String
    Dim Address As String

    gethostname HostName, 256
    HostName = Trim(HostName)
    HostPointer = gethostbyname(HostName)

    CopyMemory HostStruct, HostPointer, Len(HostStruct)
    CopyMemory HostAddressPointer, HostStruct.hAddrList, 4
    CopyMemory HostAddress, HostAddressPointer, 4

    AddressNum = Trim(Hex(HostAddress))
    AddressNum = String(8-Len(AddressNum), Asc("0")) & AddressNum

    Address = Cstr(Cint("&H" & Mid(AddressNum, 7))) & "." & Cstr(Cint("&H" & Mid(AddressNum, 5, 2))) & "." & Cstr(Cint("&H" & Mid(AddressNum, 3, 2))) & "." & Cstr(Cint("&H" & Left(AddressNum, 2)))

    GetIP = Address
    End Function


    Function GetMachineName() As String
    Dim HostName As String * 256
    Dim HostName2 As String
    Dim counter As Integer

    gethostname HostName, 256
    HostName = Trim(HostName)

    counter = Instr(HostName, Chr(0))
    Hostname2 = Left$(HostName, counter-1)
    GetMachineName = HostName2
    End Function



    Function GetOSInfo() As String
    'Deklarationen
    Dim osinfo As OSVERSIONINFO
    Dim counter As Integer
    Dim losinfo As Long
    Dim osys As String
    Dim spack As String
    'Startwerte setzen
    osinfo.dwOSVersionInfoSize = 148
    'Version auslesen
    losinfo = GetVersionEx(osinfo)
    'Daten auswerten
    Select Case osinfo.dwMajorVersion
    Case 3
    Select Case osinfo.dwMinorVersion
    Case 51
    osys = "Windows NT 3.51"
    Case Else
    osys = "Unbekanntes Betriebssystem"
    End Select
    Case 4
    Select Case osinfo.dwMinorVersion
    Case 0
    If osinfo.dwPlatformID = 2 Then
    osys = "Windows NT 4.0"
    Else
    osys = "Windows 95"
    End If
    Case 10
    osys = "Windows 98"
    Case 90
    osys = "Windows Me"
    Case Else
    osys = "Unbekanntes Betriebssystem"
    End Select
    Case 5
    Select Case osinfo.dwMinorVersion
    Case 0
    osys = "Windows 2000"
    Case 1
    osys = "Windows XP"
    Case 2
    osys = "Windows Server 2003"
    Case Else
    osys = "Unbekanntes Betriebssystem"
    End Select
    End Select
    counter = Instr(osinfo.szCSDVersion, Chr(0))
    spack = Left$(osinfo.szCSDVersion, counter-1)
    If spack = "" Then
    GetOSInfo = osys
    Else
    GetOSInfo = osys + " - " + spack
    End If

    End Function


    Das Ganze wurde eingebaut in die 6er Mailschablone und funktioniert seit Jahren einwandfrei.
    Mittlerweile habe ich, und viele Andere auch, die Client-Version 7.0.2. Also hab ich mich drangemacht unsere Anpassungen auf die 7er Schablone zu portieren.


    Anschließend die Schablone meiner Maildatenbank auf die neue 7er gewechselt und siehe da: Beim Aufruf der CopyMemory Funktion bekomme ich die Fehlermeldung "Cannot find external name: **einige Sonderzeichen**"
    Anschließend stellt der Notes-Client jede Funktion ein und lässt sich nur noch per ZapNotes beenden.


    Zurückgewechselt auf die 6er Schablone läuft wieder alles einwandfrei.


    Dann habe ich wieder auf die 7er Gestaltung gewechselt, alle Scripte neu kompiliert woraufhin sich die Fehlermeldung ein wenig geändert hat: "Cannot find external name: $ $DBSCRIPT"
    Abstürzen tut er allerdings weiterhin.


    Der Client ist in beiden Fällen der Selbe. Der Code ist absolut identisch.
    Fällt irgendjemandem eine Erklärung dafür ein?
    :-?

    Es gibt doch auch Tools mit denen man alle Attachments in den Maildatenbanken Zippen kann.
    Wir haben noch das alte nd.zip im Einsatz. Notes Development gibt es zwar nicht mehr, aber etwas entsprechendes sollte es schon noch geben.


    Damit kann man auch eine Menge Platz sparen.