David.fx Kalendersynchronisation in C#

  • Hallo Communtiy


    Ich bin was David.fx angeht ein echter Anfänger.
    Kenne mich nur sehr wenig aus.
    Und verzweifle etwas an meinen Projekt


    Ich muss folgendes in C# programmieren:
    Ich soll die Kalendereinträge jeden Nutzer nacheinander synchronisieren, über den Administartor.
    (nutze die 12er Version vom David)
    und würe es gerne über die DavidAPI dll lösen


    AM besten wäre es wenn ich die Termine pro User in einer Listen von CalendarItem
    --> List<CalendarItem>
    gespeichert werden. Weil ändern,neuen hinzufüen und löschen kann ich die einzelnen CalenderItems


    Ich beginne folgenderweise um mich als Admin einzulogen:
    DavidAPI dvapi = new DavidAPI();
    Account account;
    account = dvapi.Logon("192.168.xxx.xxx", "Administrator", "12345", "", "", "AUTH"); (hier wird der Admin angemeldet)


    Das Einloggen klappt auch wunderbar.
    Und ich gehe auch davon aus, dass der Admin genug Rechte hat um Termine im Kalender für jeden "normalen"
    anderen Nutzer einzutragen.


    Nun steh ich auf dem Schlauch...
    WIe komme ich nun auf die ganzen Terminen pro Nutzer
    damit ich diese nacheinander synchroniseren kann?


    Könntet ihr mir ein Beispielcode in C# hier zeigen.
    weil mir einfach das Fachwissen von Tobit fehlt...und mir nicht die Zeit gegeben wird es zu verstehen.
    und mir ein Beispiel sehr helfen würde.



    Ich bedanke mich jetz schon ganz herzlich und freue mich auf
    zahlreichen und hilfreiche Antwprten :)



    Gruß,
    Alexander

  • Hallo Alexander,


    was die Berechtigungen angeht, haben die erstmal nichts mit der API Anmeldung zu tun. Diese kommen über die Windowsanmeldung. D.h. das Du prüfen musst, ob der ausführende Benutzer Deines Programmes die entsprechenden Rechte hat.


    Wenn das gegeben ist, kannst Du einfach für jeden User das Kalenderarchive öffnen und die Items einlesen. Eine Liste aller Items aller User gibt es nicht, da musst Du mit einigen Schleifen arbeiten.


    Was genau ist denn Deine Aufgabe? Mit was musst Du synchronisieren?


    Gruß Jens


    PS: Das Thema mit den Berechtigungen und der Anmeldung habe ich Dir schonmal erklärt. ;)
    Verbindung zu einem Server erstellen mit API (zu Tobit)

    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 und Community


    Der Programmnutzer, muss den Adminaccount in einer XML-angeben + das passende Passwort.
    Und ich setze voraus, dass dieser Nutzer die Rechte hat, die Termine der "normalen" Nutzer zu ändern.



    Ich synchronisiere die Daten mit den Terminen aus unserer Datenbank, die von unseren eigenen Programm entstammen.


    Also kein Exchange, oder etc. sondern ein eigenständiges Projekt.


    Da funktioniert das synchronieren mit Exchange...Und ich bin nun zuständig für David..
    Es wird als Windowsdienst laufen...der jede 5 Minuten die Kalendereinträge synchronisiert.


    Wenn ich nun den Dienst direkt am David.fx Server laufen lasse.
    muss da ein Client installiert sein, da die DavidAPI über COM zugreift, oder reicht der Server aus?
    Nein, das will ich ja gerade, dass ich die Kalenderarchive pro Nutzer haben will...und nicht alle von allen auf einmal :).



    Account account;


    account = dvapi.Logon("192.168.xxx.xxx", "Administrator", "12345", "", "", "AUTH"); (hier wird der Admin angemeldet)


    So sagen wir mal nun bin ich mit dem Admin angemeldet, der die rechte hat termine zu ändern.
    account bseitzen ja User und Users


    Wie bekomme ich nun die Termine vom User "MaxMustermann" mit dem Account



    Falls ich scheitere kann ich dann nach ein kleinen Codebeispiel fragen,
    oder ist es hier nicht gestattet?
    (versuche es morgen den ganzen tag, wenn es mir auf dee Arbeit gestattet wird)



    Also danke für die schnelle Antwort :)

  • Hallo Alexander,


    wie ich schon vorher geschrieben habe, die Anmeldung an der API ist nicht relevant. Die Berechtigungen kommen über die Windows Anmeldung, nicht über die API Anmeldung. Die kannst Du einfach leer lassen.
    Ich denke hier fehlen Dir vor allem Windows-Grundlagen...


    Wie ebenfalls schon erwähnt, sollte es reichen, wenn Du die dvapi32.dll mitlieferst, dann muss der Client normalerweise nicht installiert sein. Allerdings installieren wir den Client immer auf dem Davidserver, allein zu Administrationszwecken.


    Generell bin ich auch bereit ein paar Codebeispiele bei zu steuern, allerdings nur, wenn Du vorher auch mal zeigst was Du probiert hast. Da es für mich ein entsprechende zeitlicher Aufwand ist, werde ich hier keine komplette Code-Vorlage posten. Dann könntest Du auch gleich bei uns um ein Angebot für die Programmierung bitte. ;)


    Du hast doch die API Doku, da steht eigentlich alles drin was man wissen muss. Da gibt es sogar Beispiele wie man CalendarItems bearbeitet und speichert. Um ein Item zu bearbeiten, musst Du zunächst das Archive öffnen und alle Items durchlaufen. Das ist genau der Code den Du brauchst. Den musst Du nur entsprechend anpassen.


    Gruß Jens


    P.S.: Die Kalenderarchive befinden sich im Pfad \\server\david\archive\user\10004000\cal - die entsprechend UserID musst Du über das User2 Objekt herausfinden. Diese ist als Dezimalwert gespeichert und muss in Hex umgewandelt werden.


    Und über das LocalAddressBook findest Du die internen David Benutzer.

    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,


    ahh, Danke!
    Ja da hast du recht bin kein Crack in Windows...vorallem nicht was Server anbelangt *mich schämen*.
    Glaub daher tu ich mir da etwas schwer.
    Also denke mal das mit dem Anmelden müsste passen :), hab mich vllt etwas falsch ausgedrückt^^
    Ob ich mich über API anmelde oder etc. war mir egal....hauptsache der Admin ist angemeldet :D.
    Und das ist er ja..


    Hmm...also das mit der dvapi32.dll ist glaub nicht ganz ausreichend.
    Ich hab mal das Programm auf einen Computer ohne Client laufen lassen, die die Dll im Verzeichnis dabei hatte.
    Aber als ich eine Instanz erzuegen wollte.


    DavidAPI dvapi = new DavidAPI();


    kam gleich eine COM-Fehlermeldung.
    Und bei den, die den Client hatten, kam keine Fehlermeldung.
    Aber gut, dass ist ein ich sag mal kleineres Problem, ich kann ja ja sagen
    dass der Client auf dem Server installiert sein muss, als Anforderung.


    Hmm...Also die API-Doku hab ich jetzt bei meinen gegeben Unterlagen nicht gefunden..
    Und laut meinen Kollegen ist oft die Hilfe offline...
    Was gerade das Thema David.fx sehr schwer macht.
    Daher versuche ich es über Foren, und wurde hier fündig :)


    Also CalenderItems bearbeiten kann ich, kann sie ändern, löschen, einen neuen hinzufügen :)
    Das sollte für mich kein Problem darstellen.


    Also muss gluab noch etwas genauer das Projekt beschreiben.
    In unseren großen eigenen Projekt (Warenwirtschaftssystem-Tool)...Da gibt es Abteilungen mit den zugeteilten Arbeiter.
    Die Arbeiter haben einiges an Informationen + den Email-Account.
    Und man kann bei den Abteilungen mit einer Checkbox setzen ob alle Arbeiter in der Abteilung synchronisiert werden sollen mit meinem Tool.
    Es sollen dann, also nur diese Nutzer der Abteilung synchronisiert werden und nicht alle.
    Und ich weiß von vornherein nicht, wer synchronisert werden soll. Sondern nur innerhalb der Laufzeit meines Tools.
    (Methode die mir die Liste von den EMail-Accounts liefert).


    Gut, abgemacht, sehe ich so ein.
    Dann versuche ich jetzt bis 17 Uhr. mit dem Wissen was ich von dir bekommen, es umzusetzen
    Und sag dann Bescheid wie weit ich gekommen bin und was ich genau getan/versucht habe :)



    Danke dir.



    Alex

  • Ach eine Sache noch...
    ich hab ja alle Email-Accounts als Liste
    und werden den Dienst auf dem Server laufen lassen...


    Hab dann zum Beispiel die Accounts:
    Lala
    Test
    Mustermann



    Klappt dann folgender Aufruf:
    dvapi = new DavidAPI();
    account = dvapi.Logon("", "Lala", "", "", "", "AUTH");


    Hole die ganzen Termine folgendermaßen:


    MessageItems oMessageItems;
    List<CalendarItem> calendars = new List<CalendarItem>();
    CalendarItem
    item;


    Archive oArchiv;
    oArchiv = account.GetSpecialArchive(DvArchiveTypes.DvArchivePersonalCalendar);
    oMessageItems = oArchiv.AllItems;
    foreach (MessageItem msgitem in oMessageItems)
    {
    if (msgitem.Type == DvItemTypes.DvCalendarItem)
    {
    item = (CalendarItem)msgitem;
    calanders.Add(item);
    }
    }
    return calanders;



    Bearbeite sie entsprechend.
    Hab dann die alle Synchronisiert.
    Gehts dann weiter mit:


    account = dvapi.Logon("", "Test", "", "", "", "AUTH");
    ...Termine holen, synchronisieren


    Dann:
    account = dvapi.Logon("", "Mustermann", "", "", "", "AUTH");



    Also auf unserem Server klappt die Variante.
    Problem nur, bei uns ist der Server eventuell nicht sauber eingerichtet und hat eventuell einige
    Sicherheitslücken.
    Da fehlt mir das wissen über COM und wie du ja erwähnt hast
    das Wissen über Windows allgemein mit den ganze Rechten.


    Was meinst du dazu?
    Würde das so funktionieren? Da ich ja kein Password verwende beim Einloggen nutze


    Und tut mir leid, falls du es in den anderen Posts mir die ganze Zeit schon erklärst.
    Und ich es nicht kapiere :S



    Alex

  • Hallo Alex,


    ich würde, wie bereits erwähnt, keine Anmeldung an der API verwenden, einfach leer lassen.
    Dein Dienst läuft standardmäßig mit dem SYSTEM-Konto, dadurch wird im David auch ein User SYSTEM angelegt (es sei denn das David.ini Flag Autovalidation steht auf FALSE, dann bekommst Du einen Fehler). Dieser Benutzer belegt eine Lizenz, das ist also suboptimal.
    Du solltest den Dienst daher über das lokale Adminkonto laufen lassen, da der Admin vermutlich sowieso als David User existiert.


    Wenn der Dienst nun also als Admin ausgeführt wird, dann hat er auch dessen Windows Berechtigungen und kann - wenn es korrekt eingerichtet ist - auf die gesamte Struktur zugreifen.


    Ein Archive-Objekt kann man nicht nur mit der Methode "GetSpecialArchive" erzeugen, sondern z.B. auch mit der Methode "ArchiveFromID" (ebenfalls eine Methode des Account Objektes). Hier übergibst Du als Parameter den UNC Pfad zum Archive (wie in meinem vorigen Beitrag geschrieben).


    Übrigens, ohne Doku würde ich mich weigern das zu programmieren. Ohne die Doku hast Du doch keine Möglichkeit herauszufinden, welche Methoden und Klassen es gibt - bzw. nur sehr umständlich über die IDE.
    Die API Doku ist eine sehr ausführliche CHM-Hilfe Datei. Es gibt sogar ein Objektdiagramm dem Du die Vererbung der Klassen entnehmen kannst, was auch sehr hilfreich ist, um z.B. herauszufinden was Du casten kannst.


    Welche Hilfe soll oft Offline sein? Die Tobit KnowledgeBase? Alles was bei Tobit online verfügbar ist, ist immer online. Ich habe noch keine Ausfälle erlebt. Allerdings gibt es keinen offiziellen Support für die API Programmierung, es sei denn man ist Tobit Solution Partner (TSP - TARs und TPPs bekommen keinen API Support).
    Die API Hilfe kann man sich im Downloadbereich von Tobit herunterladen, wenn man im Partner Account oder im TSSM (Account der David Lizenz) eingeloggt ist.


    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


    Also habe mir mal die Klasse User2 und User angeschaut
    Worin unterscheiden sich beide?


    Jetzt hab ich mal deine vorgeschlagende Variante ausprobiert
    Also ich melde mich an
    Account account = dvapi.Logon("", "", "", "", "", "AUTH");


    Mein eigener Nutzer hat die ID "1001000".


    Archive archiv = account.ArchiveFromID("\\\\192.168.xxx.xxx\\david\\archive\\user\\10010000\\cal");
    MessageItems items = archiv.AllItems;


    und Voila, ich hab tatsächlich alle meine Termin-Items.


    Kann man davon ausgehen dass der UNC-PFad gleich ist
    oder besteht die Möglichkeit beim Einrichten dass er woander liegen kann?
    (Wäre aber kein Problem, muss der Anfangspfad in die XML-Datei eingeztragen werden worauf mein Tool zugreift)



    Soweit so gut...
    So ich weiß nun den Accountnamen: "MaxMustermann"
    wie komme ich mit dem Namen auf die ID des User.
    Das wäre mir noch sehr wichtig.


    Natürlich hab ich auch was ausprobiert :)
    und funktionerit es so?:


    Users user = account.Users; (Also als Admin angemeldet)


    DavidUser usertest = user.Item("MaxMustermann");
    string iD = usertest.UID


    damit hab ich sogar direkt die ID und muss es nicht umwandeln
    dann kann ich ja mit der UNC mit der passende ID an die CalendarItems kommen
    und das pro User


    Archive archiv = account.ArchiveFromID("\\\\192.168.xxx.xxx\\david\\archive\\user\\"iD"\\cal");
    MessageItems items = archiv.AllItems;


    Müsste doch so gehen?




    Glaub das meinte mein Kollege.
    Unsere Firma nutzt Exchange und kein Tobit.
    Aber wir haben Tobit-Kunden...und sie wünschen sich so ein Tool
    ALso glaub nicht dass wir Solution Partner sind.
    Mir wurde zumindest nichts gesagt.
    Ich hab ein paar PDF-Dokumente....aber da sind die Code-Beispiele in VB
    da tu ich mir sehr schwer sie zu verstehen...
    Und meiner Meinung nach, ist es nicht die Doku die du meinst.
    Sie heißt "David Client Scripts" und dann noch eine namens "Getting Started Guide"

  • Hallo Alex,


    ich fange mal hinten an.
    Die David Clients Scripts sind etwas (vollkommen) anderes. Du kannst mit Hilfe von VBS oder JavaScript entsprechende Scripte programmieren, die sich dann direkt in den David Client integrieren.
    Zur API gibt es da nur ein paar Ähnlichkeiten was die Namen angeht. Übernehmen kannst Du davon nicht viel.


    Du hast doch sicher eine Davidinstallation zum testen dort, oder?
    Dann starte mal den David Administrator, klicke oben links in der Baumstruktur auf den obersten Punkt "David". Rechts sollte sich dann eine Übersichtsseite laden (sofern die Firewall das nicht blockiert, Port 80 ausgehend muss auf sein).
    Dort klickst Du dann auf den Link "Tobit Software Site Management", dann auf "Kundendienst" (oben im Menü der Webseite die sich dann öffnet) und anschließend in der Liste auf "Aktuelle Downloads".
    Wenn Du dort ganz nach unten scrollst, findest Du "DvAPI32 und Dokumentation für David®fx12™". Das ist was Du brauchst. In der ZIP Datei gibt es dann die CHM Hilfe Datei.


    ---


    Zu Deinen Fragen:
    Ja, so kannst Du prinzipiell vorgehen.


    Das User2-Object ist eine Erweiterung des User-Object.


    Der Pfad kann anders lauten, Du bekommst den Installationsroot auch über die API raus, indem Du die Methode get_DavidRoot vom Accout-Object nutzt.


    Die UserID bekommst Du wie erwähnt über das User2-Object.
    Eine Liste aller internen Benutzer bekommst Du über Account.LocalAddressBook.


    Code
    Users user = account.Users; (Also als Admin angemeldet)
    
    
    DavidUser usertest = user.Item("MaxMustermann");
    string iD = usertest.UID



    Und das soll funktionieren? Mir ist kein "DavidUser" Object bekannt, steht auch nichts davon in der Doku. Ebenso gibt es kein "Users" Object, nur ein "User" und eben ein "User2" Object.
    Die Klasse User hat aber kein Methode Namens Item.


    Hast Du das wirklich lauffähig getestet? Oder ist das aus der Scripts-Doku?


    Bei User.ID war ich der Meinung, dass diese als Dezimalzahl zurückgegeben wird. Kann mich aber auch täuschen, irgendwo in der API ist das jedenfalls so.


    Schau Dir auf jeden Fall den oben beschriebenen Weg an um an die API Doku zu kommen. Ohne die ist es ein Wahnsinn und Du musst Dir alles erfragen, das kostet Dich viel Zeit. Mit der Doku hättest Du vermutlich keine Fragen oder nur sehr wenige gehabt.


    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,


    ja wir haben tatsächlich eine Api-Doku....
    danke dir, ich hätte sie sonst nie gefunden und neimand hat mir was gesagt... :(
    Gut möglich dass ich eine neuere Dll hab.
    In der Doku steht auch nichts über die DavidUser


    Also mit der "Users"
    zum Beispiel mit "account.Users" bekomme ich eine ganze Liste von User



    Users
    user = account.Users;


    Und ich nutze die DavidUser...
    aber es würde auch mit "User" oder "User2" gehen...ok getestet ich kann den doch nicht in "User/2" casten..
    die "User" und "User2" haben die ID...und die muss ich dann umwandeln wie du gesagt hast.
    Aber die "DavidUser" hat eine UID...da muss ich es nicht umwandeln, sondern hab direkt die richtige ID.
    Also bei meinen bisherigen Test hat es funktioniert.
    Aber der größere und genauere Test muss ich noch machen...um es bestätigen zu können.
    Kann dir dann Bescheid geben, sobald ich soweit bin.


    Also hab mal die Varinate mit dem AddressBook angeschaut.
    Ist doch etwas umständlich um an den Nutzer zu kommen, den ich gerade benötige...
    aber machbar :D


    Und die Root-Methode um an den Pfad zu kommen...die hab ich sogar mal unbewusst genutzt :D



    Sooo
    dann hoff eich mal dass ich mit dem Wissen
    und der Doku jetzt selbständig arbeiten kann


    Also vielen vielen Danke für die geduld mit mir :)
    Und bekommst dann noch ein Feedback wegen DavidUser und Users
    eventuell nutze ich eine neuere Dll.



    Alex

  • Heyhey


    Also hab doch noch ein Problem :(
    Es geht darum ein Termin zu updaten, falls er sich in unserer Datenbank geändert hat.
    Leider klappt das nicht wie ich gedacht hab.
    Er legt immer einen neuen an, und lässt den wo ich ändern möchte gleich.
    Und an der Doku hab ich nichts passendes gefunden...




    CalendarItem item //Hier hab ich den passenden Termin mir geholt
    Archive
    archiv = GetUserCalendarArchiv(user.UID, _server); //hier greife ich auf das Archiv vom User zu


    if (item != null) //Hier fülle ich dann neue Daten dem Termin zu
    {
    item.Subject = subject;
    item.BodyText.PlainText = body;
    item.StartTime = start;
    item.StopTime = end;
    item.AllDayEvent = fullday;
    item.Options.Priority = DvMessagePriority.DvMsgPriorityNormal;
    item.ShowAs = DvShowAsType.DvShowAsBusy;
    item.Private = privat;
    item.Location = location;
    item.LabelIndex = 3;



    item.Save(archiv);
    }


    Hier speichere ich dann den geupdateten Termin
    Problem eben: es wird ein neuer Termin angelegt, und der alte auch gelassen.
    Ja ich könnten den alten dann einfach löschen, wäre kein Thema...aber das will ich nicht.
    Er sollte geupdatet werden und kein neuer sein


    Alexander

  • Hallo Alex,


    wg. DavidUser solltest Du auch bedenken, dass eure Kunden vielleicht nicht die neueste David Version einsetzen und es dann dort vielleicht nicht funktionieren könnte...?


    Beim Save darfst Du das Archive-Object nicht angeben. Klingt komisch, ist aber so. ;)
    Wenn Du dort das Archive Object mit angibst, denkt die API, Du hättest ein neues Archive ausgewählt und erzeugt einen neuen Termin. Einach NULL übergeben oder DBNull.Value (bin mir grad nicht sicher) und dann wirds klappen wie gewünscht.


    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

  • Guten Morgen Jens,


    Also ich setze auch hier voraus, dass die Anwender
    David.fx12 haben müssen.
    Kann es ja nicht jedem Recht machen :D.
    Aber bin dir für jede Info dankbar, hilft mir sehr Tobit zu verstehen.
    Und wie es aufgebaut ist :)


    Ja, ich glaube ich hatte auch Null übergeben..
    Obowhl nein ich hab einfach nur calendarItem.Save()
    ausgeführt...selbes Phänomen.
    Update: Nein, ich bekomme da sogar eine Com-Excpetion--> "Beim Aufruf einer COM-Komponente wurde ein HRESULT E_FAIL-Fehler zurückgegeben"


    Dann teste ich es noch mit den beiden anderen Varianten (DBNull.Value, null).
    Da bekomme ich auch dieselbe Com-Exception.


    Also einen neuen Termin abspeichern mit :


    item.Save();


    klappt wunderbar.
    Aber wenn ich mir einen bestimmten raussuche simples Beispiel
    List<CalendarItem> items = GetUserCalendarItems(GetUserCalendarArchiv(user.UID, _server));
    CalendarItem item = items[0];
    dieses item nun mit meiner Methode (vorigen Post) ändere


    kann ich diesem item
    mit der Save()-Methode nicht mehr speichern und bekomme einen Com-Fehler
    Woran kann das liegen?




    Gruß,
    Alexander

  • Hallo Alex,


    vielleicht liegt das Problem schon beim erzeugen der Archive-Objects? Dazu hast Du den Code nicht gepostet.
    Was passiert denn, wenn Du versuchst Daten aus dem Item auszulesen?


    In der API Doku gibt es ein Beispiel "Edit and Save a CalendarItem" für C#. Hier wird bei der Save-Methode "DBNull.Value2 (für beide Parameter) übergeben.
    Des Weiteren steht dort der Hinweis:


    //First, it's always necessary for any changes to access the bodytext


    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

  • Hey Jens,



    Ja, die hab ich auch in der Doku gesehen.
    aber mit dem DBNull.value und "normalen" null,
    erscheint immer die COM-Exception.


    Einen neuen Termin anlegen klappt
    einen bestimmten Termin löschen klappt auch.
    Nur das Updaten will nicht :(


    Alo sich geh folgendermaßen vor
    melde mich mit dem Admin an


    Account account = dvapi.Logon("", "", "", "", "", "AUTH");


    Bin angemeldet.
    dann hole ich den User "Mustermann" aus den Users


    Users user = account.Users;
    DavidUser davidUser = user.Item("Mustermann")


    Hab den auch gefunden.
    hab dann die ID vom User..
    und geh dann über dem UNC-Pfade..auf das Archiv der Kalendereinträge


    Archive archiv = account.ArchiveFromID("UNCPfad");


    klappt auch...
    List<CalendarItem> items
    hab ich dann die ganzen Termine


    filtere mir den bestimmten aus.
    und dann den aufruf den ich beschroieben hab...
    wo ich dieses Item mit dem neuen Termindaten versehen will.
    klappt auch...nur die


    Item.save(null, null) mit allen möglichen varianten
    weigert sich mitzuspielen...
    und die COMException tretet auf :(


    Mein Kollege meint,
    ich muss das CalendarItem loslassen, da es vom Com gesperrt ist.
    Aber genaueres weiß er nicht.
    Und verwirrt mich eher noch mehr.



    Gruß,
    Alex

  • Hallo Alex

    //First, it's always necessary for any changes to access the bodytext

    hast Du das gelesen und auch gemacht?
    Du musst einmal lesend auf den Bodytext zugreifen, also z.B. eine Zuweisung einer Variablen machen, bevor Du speicherst.


    Der Aufruf der Save Methode dann per


    Code
    item.Save(DbNull.Value, DbNull.Value);


    Mit einer Sperre hat das übrigens nichts zu tun.


    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,


    ja, die hab ich auch gelesen
    hab mich gewundert warum man das machen muss,
    aber im Endeffekt gehts trotzdem nicht.


    schon bei dem Aufruf nach dem Beispiel


    DavidAPIClass oApp;
    oApp = new DavidAPIClass();


    gehts nicht, da steht in der ErrorList:
    Interop type 'DvApi32.DavidAPIClass' cannot be embedded. Use the applicable interface instead.



    Daher gebe ich dir Variante auf...sonst kostet es zu viel Zeit
    und gehe den umgekehrten Weg.
    neuen Termin anlegen und den alten löschen
    und dann das aktualisieren der ID.


    aber danke dir für die Geduld und Hilfe :)
    Ich hoffe ich hab ich jetzt alles, damit ich den Synch jetzt vollständig programmieren kann.


    Danke dir vielmals


    Falls doch noch was kommt.
    Wirst du von mir hören :D

  • Hallo Alex,


    wenn in der Doku solche Hinweise stehen, dann haben die schon einen Grund. Man sollte sich auch daran halten. ;)


    Denk daran, dass das neu schreiben des Termins gerade bei Anbindung von mobilen Endgeräten an David einen ziemlichen Traffic erzeugen kann.


    Das Problem das Du jetzt hast, hat nichts mit dem Speichern zu tun. Und das Problem hattest Du doch vorher nicht. Was genau hast Du geändert?


    Wir benutzen in unserem Connector nur eine Methode zum schreiben UND updaten der Einträge. Anhand eines Parameters sagen wir der Methode, ob sie updaten oder neu erzeugen soll.
    Der Unterschied besteht lediglich in der Art wie das Item erzeugt bzw. aufgerufen wird. Genau diesen Codeabschnitt hast Du aber bisher auch nicht gepostet sondern nur den Aufruf Deiner eigenen Methode. Vielleicht liegt hier irgendwo schon der Fehler.


    Wenn Du also mal den vollständigen Code zum updaten posten würdest, könnten wir das sicher lösen.


    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 Alex,


    hab mich mal hingesetzt und ein kleines Beispiel gecoded:



    Der zu ändernde Eintrag ist hier zwar fest verdrahtet, aber es sollte für Dich kein Problem sein, die MessageItems in einer Foreach Schleife aufzurufen. In dem Falle erzeugst Du das CalenderItem dann nicht über die Archive-Object-Methode "ItemFromID" sondern indem Du es castest.


    Code
    oCalendarItem = (CalendarItem)oMessageItem


    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

  • Guten Morgen Jens,


    Bei mir geht nun auch das verschieben,
    also auch mit meiner Variante, das Problem war was ganz anderes.
    Es lag am Server selber, er war falsch konfiguriert...
    Daher auch immer die Exception.


    Der Server-Name wurde geändert.
    und anscheinend ist David.fx empfindlich bei sowas.
    weil vieles noch auf den alten Server-Namen verwiesen hat.
    Und das hat zu vielen Fehler geführt, die jetzt bei mir behoben worden sind -.-
    *YEAHHH*


    Und das war das Problem gewesen,
    hab danach die Methode wieder aufgerufen, und siehe da es funktioniert alles wieder.


    Gruß
    Alexander

Jetzt mitmachen!

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