Position in Archive.dat ermitteln?

  • Hallo,


    ich habe mir für meinen Desktop ein Progrämmchen geschrieben, welches per DvAPI die kommenden Termine der nächsten zwei Wochen ermittelt und mir diese "auf dem Desktop" anzeigt. Geschrieben in Delphi.


    So weit, so gut. Klappt auch prima. Nun möchte ich diese Termine jedoch noch anklickbar machen um dvwin32 damit aufzurufen; also das das IC direkt diesen termin anzeigt, wenn ich drauf klicke.


    Dazu muss ich dvwin32 mit den folgenden Parametern aufrufen...


    "C:\Programme\Tobit InfoCenter\DVWIN32.EXE" \\server\david\archive\user\10024000\cal /POS=3


    Um dieses POS=3 geht es. WOHER bekomme ich diese "3"??


    Hier mal ein grober Code zum ermitteln aller Termine...



    Die hier entstehende "Reihenfolge" (i) ist aber leider nicht der Wert, den ich für /POS=x nehmen kann.


    oMsg._ID ist auch nicht richtig...


    Jeglicher Hinweis wird dankend entgegen genommen ;)


    PS: Anbei ein paar Screenshots von dem Tool.
    1. Termine im windowed-mode
    2-4 Termine im Transparent-mode (verschmelzung mit dem Desktop)

  • Hallo Manfred,


    mal mit dem Field 'RecNo' probiert?

    Zitat

    The Field_RecNo value is from Type VARIANT (VT_I4). The returned value is the RecNo (ID) from the current message.


    Note:
    After the autom. Archive Purge the RecNo can have another RecNo (ID). The RecNo isn't fixed.

    Woher hast Du diesen Befehl mit dem Parameter /POS?
    Geht das nicht einfach indem Du das Item selbst (also mit _ID) direkt ansprichst?


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Zitat

    mal mit dem Field 'RecNo' probiert?

    Würde ich liebend gerne. Ich finde bisher nur keinen Weg den Wert zu bekommen.
    In Delphi scheinen manche Dinge anders als in der Doku beschrieben, was Methoden usw angeht. Manche Methoden gibt es so gar nicht (innerhalb Delphi´s VCL), andere Werte kann ich irgendwie nicht ermitteln. Ich bräuchte halt nur mal ein Beispielcode in Delphi


    Zitat

    Woher hast Du diesen Befehl mit dem Parameter /POS?

    Q-106.693 Aufrufparameter für das InfoCenter (DVWIN32.EXE)

    Zitat

    Geht das nicht einfach indem Du das Item selbst (also mit _ID) direkt ansprichst?

    Scheinbar nicht, Mit _ID hab ich es in diversen Variationen probiert.



    Den Eintrag zu RecNo hab ich auch gefunden und wollte ja auch daran kommen. Bisher jedoch ohne Erfolg ;(
    Ich werde das heute aber weiter austesten.

  • Habs rausbekommen...


    Mit


    Code
    oFields := oMessageItem2.Fields AS Fields;
    for o := 0 to oFields.Count - 1 do begin
      oField :=  oFields.Item(o);
      if oField.Name = 'RecNo' then
        recno := VarToStr(oField.Value);
    end;


    bekomme ich die korrekte RecNo aus der Archive.dat


    Diese lässt sich dann auch im Aufruf verwenden und der Zeit mir nun auch direkt den angeklickten Termin im IC an :D


    Na, geht doch! :D

  • Hi Manfred,


    hab keine Ahnung von Delphi, aber mit PHP (und auch .NET) kann man die Fields direkt ansprechen


    Code
    PHP:
    $item->Fields('JobID')->value


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • hab keine Ahnung von Delphi, aber mit PHP (und auch .NET) kann man die Fields direkt ansprechen


    Code
    PHP:
    $item->Fields('JobID')->value

    Yo, eigentlich hätte ich ja auch erwartet das sowas in der Art existiert. Aber eine native Unterstützung für Delphi gibt es leider nicht. Ich kann nur die TLB von Delphi "übersetzen" lassen und das dann nutzen. Manche Dinge sind halt nicht wie in der Doku beschrieben. Wie ich schon erwähnte fehlen mit da ein paar Methoden die ich eigentlich als vorhanden angesehen hätte wenn ich mir so die VBS und Javascriptbeispiele anschaue. Mit dem Wissen aus den Videocast habe ich mich dann mit Delphi an die Sache rangewagt und wollte das dann meist auch so umsetzen.


    Vielleicht liegt es auch einfach nur an meiner veralteten Delphi-Version :) (2006)


    An manchen Stellen jedoch stosse ich auf Unterschiede. Leider. Aber im Grunde ist es auch egal. Ich habs ja rausbekommen ;) Das ganze nimmt auch nicht viel Last auf dem Rechner in Anspruch.


    Wenn da aber mal einige Termine im Kalender sein werden dann könnte das im gesammten langsamer werden da ich ja irgendwie immer alle Einträge hole...


    Code
    oMessageItems := oArchive.AllItems;


    Bei ner Kollegin, die sich alles mögliche als Termin legt brauchts schonmal nen moment bis Das Tool die Termine ermittelt und aufbereitet hat. Wenn ich hier mittels Filter das ganze von der API direkt eingrenzen könnte würde das sicher nochmal Zeit sparen.


    Kann man die Liste der zu ermittelnden Elemente per API auch direkt Filtern lassen? Im Grunde brauche ich ja nur die Einträge in der Zukunft (Programm zeigt die Termine der nächsten zwei Wochen an)

  • Hi Manfred

    Kann man die Liste der zu ermittelnden Elemente per API auch direkt Filtern lassen? Im Grunde brauche ich ja nur die Einträge in der Zukunft (Programm zeigt die Termine der nächsten zwei Wochen an)

    nicht das ich wüsste. Man kann immer nur mit der _ID direkt auf das Item zugreifen. Bei allem anderen muss man immer jedes Item vergleichen so wie Du es gemacht hast.


    Was manche machen ist, direkt die archive.dat auszuwerten, also ohne API. Das ist oftmals schneller.


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Hallo,


    ist es auch möglich die Anzahl der Items in Archive.dat zu ermitteln? Mein Ziel ist es die Anzahl der Mails des jeweiligen User's zu erhalten.
    Wenn ich auf objMessageItems (Set objMessageItems = objArchive.AllItems) einen COUNT mache bekomme ich ja nur die Mails die ich im Info Center liegen habe.

  • Hallo Janosch,


    das verstehe ich jetzt nicht. Wo ist für Dich der Unterschied zwischen den Mails des Users (in der Archive.dat) und den Mails im InfoCenter?!?!?


    Die Archive.dat ist die Indexdatei eines Archives im David. Das was Du über den Count von Allitems bekommst, sollte identisch sein mit der Anzahl der Einträge im Archive.


    Das kannst Du z.B. auch so prüfen (und damit prüfen ob eine archive.dat ggf. defekt ist):
    Teile die Größe der archive.dat in Byte durch 430 Byte. Das Ergebnis welches Du erhälst, entspricht der Anzahl der Einträge im Archive - sofern nichts defekt ist.


    ...


    Nach 4x lesen habe ich noch eine Idee was Du meinen könntest. Wenn es darum geht, die Einträge eines _anderen_ Users statt des _eigenen_ zu bekommen, gibt es zwei Möglichkeiten über die API. Entweder Du gibst bei der Connection den entsprechenden Username an oder Du arbeitest einfach mit ArchiveFromID statt mit PersonalIn - ich würde letzteres machen.


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Hallo Jens,


    Danke für deine Antwort

    Die Archive.dat ist die Indexdatei eines Archives im David. Das was Du über den Count von Allitems bekommst, sollte identisch sein mit der Anzahl der Einträge im Archive.

    Davon bin ich eigentlich auch ausgegangen. Jedoch wenn ich einen Count auf Allitems mache bekomme ich die Anzahl der eMails die im Verzeichnis "Out" liegen (wenn: Set objArchive = objAccount.GetSpecialArchive(DvApi32.DvArchiveTypes.DvArchivePersonalOut).
    Jedoch habe ich festgestellt das unter "David\Archive\USER\10004000\out\Archive.dat" (objArchive.ID) auch noch die gelöschten eMails vorhanden sind (Was ja nicht unbedingt verkehrt ist, da Geschäftsmails aufbewahrungspflichtig sind).


    Mein eigentliches Problem ist ähnlich wie das von DonManfred war, ich möchte die Position nach dem generieren einer eMail wissen.
    DonManfred hat ja diesbezüglich eine Lösung vorgestellt, die ich übernommen habe.


    Code
    For i = 0 To objFields.Count - 1
       Set objField = objFields.Item(i)
       If objField.Name = "RecNo" Then
     recno = CStr(objField.Value)
       End If
     Next i


    Leider bekomme ich immer, wenn ich den Wert vom Feld "RecNo" abrufe, den Fehler "Methode 'Value' für das Objekt 'Field' fehgeschlagen" Was mich ziemlich verwundert hat, zum Test habe ich einfach mal ein anderes Feld der 138 Felder gewählt z.B. "MessageID". Bei dem Feld mir sogar die komplette Entwicklungsumgebung flöten geht.


    Deswegen bin ich auf die Idee gekommen einfach mal zu fragen ob es möglich ist alle Items in \Out\Archive.dat zu ermitteln, da ich dann mit einem Shell Befehl mit Hilfe der DVWIN32 Parameter


    DVWIN32.EXE \\SERVER\DAVID\archive\user\10004000\out /SA=34 /POS= hier die höchste Stelle von Archive.dat



    das eben generierte eMail auf den Bildschirm anzeigen kann. Was ich manuell schon getestet habe, in dem ich einfach per Schleife POS hochgezählt habe bis es zur Fehlermeldung des InfoCenter kam weil die POS nicht bekannt ist. Mit dieser POS konnte ich dann das nächste generierte eMail auf dem Bildschirm anzeigen.


    Ich möchte ein generiertes eMail das noch nicht gesendet wurde auf dem Bildschirm anzeigen um es gegebenenfalls zu bearbeiten. objMailItem.Options.UserHold = True hilft mir in dem Fall leider nicht weiter da, dass eMail nicht angezeigt wird sondern nur im Wartemodus im jeweiligen Verzeichnis liegt.


    Gruß Janosch

  • Hallo Janosch,

    Jedoch habe ich festgestellt das unter "David\Archive\USER\10004000\out\Archive.dat" (objArchive.ID) auch noch die gelöschten eMails vorhanden sind (Was ja nicht unbedingt verkehrt ist, da Geschäftsmails aufbewahrungspflichtig sind).


    Ja, genau bis 3 Uhr Nachts bei einer standardmäßigen David Installation. Dann läuft die Datenbereinigung und die Infos sind weg.
    Beim löschen im Client werden die Nachrichten nur als gelöscht geflaggt und die nächtliche Datenbereinigung löscht die Dateien dann tatsächlich.


    Womit programmierst Du? Hast Du mitbekommen, dass Manfred mit Delphi programmiert und sich hier eine Krücke bauen musste? Mein PHP Beispiel zeigt, wie es normalerweise geht, so gehts auch mit .NET (mit der entsprechenden Syntax natürlich).


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Ich habe das RecNo NUR in oMessageItems2 := oArchive.GetArchiveEntries('default');
    bekommen... in oMessageItems := oArchive.AllItems; finde ich die anderen infos...
    Ich greife also quasi BEIDES ab. oMessageItems2 benutze ich um die Position zu ermitteln, oMessageItems um die eMailinfos zu ermitteln...


    Anders hab ich das hier auch nicht gelöst bekommen.

  • Wenn möglich sollte man immer das MessageItem2 nutzen, dass ist ca. um den Faktor 10 schneller als das MailItem/MessageItem.


    Welche Infos bekommt man aus dem MessageItem2 nicht, die man aus dem MailItem bekommt?


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Ja, genau bis 3 Uhr Nachts bei einer standardmäßigen David Installation. Dann läuft die Datenbereinigung und die Infos sind weg.

    Ok da ich in meiner Entwicklungsumgebung Client & Server gleichzeitig am laufen habe und ich Nachts um 3 Uhr im Bett liege ;) erklärt das natürlich einiges.


    Zitat

    Womit programmierst Du?

    VB6

    Zitat

    Mein PHP Beispiel zeigt, wie es normalerweise geht, so gehts auch mit .NET (mit der entsprechenden Syntax natürlich).

    So klappt es auch (wie in der API-Doku beschrieben), dass war ja auch mein erster Ansatz.


    Zitat

    Beim löschen im Client werden die Nachrichten nur als gelöscht geflaggt und die nächtliche Datenbereinigung löscht die Dateien dann tatsächlich.

    Damit habe ich leider noch ein Problem. Wenn ich eine Nachricht lösche, zählt objArchive.AllItems.Count diese Nachricht nicht mit. Und dadurch bekomme ich das falsche eMail auf dem Bildschrim angezeigt.


    Gruß Janosch

  • Hallo Janosch,

    VB6

    uff...schau Dir doch mal .NET an. Kenne einige Umsteiger die nie umsteigen wollten und schon nach 30 Minuten VB.NET absolut begeistert waren. ;)

    Wenn ich eine Nachricht lösche, zählt objArchive.AllItems.Count diese Nachricht nicht mit.

    Das ist ja auch vollkommen korrekt so. Was gelöscht ist, sollte auch nicht gezählt werden. ;)


    So ganz verstehe ich Dein Problem aber immer noch nicht. Wenn ich es richtig verstanden habe, willst Du mit Deinem Programm eine E-Mail erzeugen und diese dann zum bearbeiten öffnen, richtig?


    Wie wäre es mit Erzeugen,Speichern,Öffnen? Da Du mit dem Save ja immer noch das gleiche ItemObject hast, solltest Du es einfach wieder öffnen können wenn ich mich nicht irre.


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Wenn ich es richtig verstanden habe, willst Du mit Deinem Programm eine E-Mail erzeugen und diese dann zum bearbeiten öffnen, richtig?

    Richtig


    Zitat

    Wie wäre es mit Erzeugen,Speichern,Öffnen? Da Du mit dem Save ja immer noch das gleiche ItemObject hast, solltest Du es einfach wieder öffnen können wenn ich mich nicht irre.

    Genau das versuche ich doch :D Leider klappt es mit den Öffnen bis jetzt nicht. Mit AllItems werde ich wohl nicht weit kommen da ich nach jedem löschen einer Nachricht, keine Datenbereinigung durchführen kann. Zuvor hatte ich noch die Idee die Nachricht als EML zu speichern und diese wieder über die DVWIN32 Parameter zu öffnen. Das laut Tobit KB-Artikel so funktionieren soll:


    DVWIN32 /EML C:\TEMP\PRICELIST.EML


    Um diese EML auch noch im Bearbeitenmodus zu öffnen muss man laut Tobit ein /I anhängen.


    Zitat

    /I Ignoring Received Status of the mail (Open in Edit Mode)

    Leider klappt das nicht, anstatt die Nachricht im Bearbeitenmodus zu öffnen bekommt man ein leeres Mail angezeigt. Das Problem ist bekannt, ich habe in einen anderen Forum gelesen das sich Tobit zwar dessen bewusst ist jedoch nichts dagegen unternommen hat.


    Ich habe zwar das ItemObject, jedoch kann ich es nicht über die Methode eines Objektes öffnen. Mir ist zumindestens keine bekannt. Ich bin aber für jeden Hinweis dankbar :D

  • Hallo Janosch.

    Genau das versuche ich doch :D Leider klappt es mit den Öffnen bis jetzt nicht. Mit AllItems werde ich wohl nicht weit kommen da ich nach jedem löschen einer Nachricht, keine Datenbereinigung durchführen kann.

    ich verstehe nicht so ganz, was die gelöschten Nachrichten damit zu tun haben - außer Du willst weiterhin direkt auf die archive.dat zugreifen. In diesem Falle solltest Du doch die ID vom gesavten Item haben und kannst nach dieser dann in der archive.dat direkt suchen...

    Ich habe zwar das ItemObject, jedoch kann ich es nicht über die Methode eines Objektes öffnen. Mir ist zumindestens keine bekannt.

    Da musst Du wieder über die FileEbene gehen, wie Du es eingangs ja auch versucht hast. Hast Du immer noch das Problem, dass Dir RecNo nicht zurückgegeben wird? Ohne diese wirst Du dann vermutlich nicht weit kommen.
    Hast Du es mal über das MessageItem2 probiert wie Manfred und ich es empfohlen haben? Da hast Du noch nichts zu geschrieben.


    In der KnowledgeBase findest Du (falls noch nicht bekannt) unter der Artikel ID Q-106.693 die Parameter für die dvwin32.exe.


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Hast Du es mal über das MessageItem2 probiert wie Manfred und ich es empfohlen haben? Da hast Du noch nichts zu geschrieben.

    Habe ich so eben getestet


    Set objMessageItem2 = objArchive.GetArchiveEntryByID(objArchive.AllItems.Count)
    RecNo = objMessageItem2.RecNo


    Das kuriose ist das die RecNo mir den gleichen Wert liefert wie AllItems.Count - 1 !


    Ich glaube ich schilder mein Problem noch einmal im Detail.


    Ich möchte ein generiertes eMail zum bearbeiten automatisch anzeigen lassen.


    Weil es keine Möglichkeit gibt ein MailItem über eine Methode zu öffnen muss man wie Du schon richtig vermutet hast das ganze über die File Ebene machen


    Da gibt es laut meinen Erkenntnissen 2 Möglichkeiten


    1. eMail als EML speichern und öffnen.


    Wie ich jedoch in meinem vorherigen Post erwähnt habe ist dies nicht möglich, da Tobit in der Hinsicht einen Bug hat(der seit 2007 bekannt ist), der es nicht ermöglicht ein EML File im Bearbeitenmodus zu öffnen.



    2. eMail nach speichern aus Archive.DAT öffnen


    Syntax: DVWIN32.EXE [PATH] /POS=n /SA=n [*]POS = Position in Archive.DAT[*] SA = Typ (9 = Job, 34 = Archive)


    Hier ist mein Problem das es mir nicht möglich ist POS zu ermitteln, wenn ein eMail gelöscht wird.



    Gruß Janosch

  • Ich zitiere einfach mal das Post von Manfred:

    Ich habe das RecNo NUR in oMessageItems2 := oArchive.GetArchiveEntries('default');
    bekommen... in oMessageItems := oArchive.AllItems; finde ich die anderen infos...
    Ich greife also quasi BEIDES ab. oMessageItems2 benutze ich um die Position zu ermitteln, oMessageItems um die eMailinfos zu ermitteln...


    Anders hab ich das hier auch nicht gelöst bekommen.

    Gemerkt? Über AllItems ging es bei Ihm auch nicht beim MessageItem2, nur über GetArchiveEntries.


    Gruß Jens

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

  • Set objMessageItem2 = objArchive.GetArchiveEntryByID(objArchive.AllItems.Count)

    Vor allem übergibst Du hier ja auch die Anzahl und nicht die ID...oder sehe ich das falsch? Er erwartet aber den Pfad und den Dateinamen ohne Endung (ID) von Dir.

    Es wäre schön, Deinen Vornamen zu kennen. Bitte beachte unsere Forenregeln und die Netiquette.

    ----------

    Bitte teilen/weitersagen: STARFACE Module Databasewww.sfm-db.com


    STARFACE Excellence PartnerSTARFACE Module CreatorTobit.Software Authorized Partner (Mailserver/Unified Messaging)work4all! Solution Partner (CRM/ERP)Securepoint Professional Partner (Firewall/UTM)


    1 Qubit - J.Suingwww.1qubit.deSoftware - Service - Coding

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!