Einstieg in das Skripting - Automatisiertes erstellen von Notizen, Aufgaben per Regel aus Vorlage

  • Liebe Greyhound Entwickler Gemeinde,


    Versuche mich seit neuestem in der Regelerstellung und stosse hierbei auf das ein oder andere Problem.


    Ausgangssituation:


    Ich brauche eine Regel, die mir (ersteinmal manuell ausgeführt) prüft, ob ein Benutzerdefiniertes Feld einen Wert enthält und dann eine neue Aufgabe und eine neue Notiz aus entsprechenden Vorlagen erstellt.


    Bei Email funktioniert das ja relativ einfach über den Regelassistenten - Leider nicht für Aufgaben und Notizen.
    Meine Frage nun: Wie mache ich das?


    Das Skript im Forum zum automatischen Anlegen von Kontakten habe ich schon gefunden - jedoch hilft mir das nicht wirklich weiter, da dort ja der komplette Teil des laden der Vorlage fehlt.


    Darüberhinaus frage ich mich ob es in der Skriptsprache Möglichkeiten zur Ausgabe von Informationen (alert, debug Konsole oder ähnliches gibt). Oder anders gefragt, wie debugge ich Skripte abseits des Überprüfen Buttons?


    Vielen Dank schon einmal für Eure Hilfe und Mühe.


    Gruß
    Sven

  • Hallo,


    grundsätzlich funktioniert das genauso wie bei E-Mails. Der einfachste Startpunkt ist die "automatische Antwort" einzufügen (mindestens ein Entwurf von E-Mail/Fax/Brief/Kurzmitteilung sollte vorhanden sein) und dann entsprechend die gewünschten Anpassungen vorzunehmen. Die Prüfung des benutzerdefinierten Feldes kannst du über den ensprechenden Regelknoten generieren.



    Die beste Möglichkeit für die Ausgabe in Skripts ist


    Code
    1. Item.AddToProtocol('debug Nachricht');


    Der Eintrag erscheint dann im Systemprotokoll des Urspungselements. Eine direkte Ausgabe im Client ist nicht möglich, weil das Skript serverseitig ausgeführt wird.

  • Hallo,


    vielen Dank für die Antwort und Informationen.


    Soweit konnte ich das schonmal runterbrechen, sodass nun automatisch eine Aufgabe erstellt wird.

    Code
    1. varNewItem: TFbmItem;DraftItem: TFbmItem;
    2. begin DraftItem := TFbmItem.Create(ikTask, 0); try DraftItem.DbQuery := DbQuery; DraftItem.LoadAttachmentsContent; DraftItem.Load(10465); // Die ID des Entwurfselements muss hier angegeben werden (Basis für neue Aufgabe/Notiz) begin NewItem:= TFbmItem.Create(DraftItem.Kind, 0); try NewItem.Assign(DraftItem, [iaoAttachments, iaoProperties, iaoUserFields, iaoNowAsCreated], iasNew); NewItem.TaskNumber.Assign(Item.TaskNumber); NewItem.Classified.Assign(Item.Classified); NewItem.Save; Item.AddToProtocol('Neue Aufgabe Projektstatus erfolgreich erstellt'); finally NewItem.Free; end; end;
    3. finally DraftItem.Free; end;end.


    Es hakt allerdings nun daran, dass er den Kontakt, von dem aus ich die Aufgabe erstellen möchte, nicht übernommen wird.
    Mit welchen Eigenschaften könnte ich denn nun den Kunden übernehmen, ein Thema oder eine Gruppe setzen?


    Was das schreiben ins Systemprotokoll angeht - das funktioniert mit normalen Texten ganz gut.
    Wie mache ich es aber, wenn ich zum Beispiel den Inhalt einer Variable zu Debuggingzwecken ausgeben möchte?


    Code
    1. Item.AddToProtocol('Variable x hat wert:' + Item.Eigenschaft);



    produziert bei mir immer den Fehler Type Mismatch. Muss ich da die Variable irgendwie casten oder wie würde ich sowas machen?


    Für Deine nochmalige Hilfe wäre ich Dir echt dankbar.


    Schönen Abend
    Gruß
    Sven

  • Hallo,


    dein Quelltext ist leider nicht lesbar. Kannst du den bitte nochmal posten?


    Mit Kontakt meinst du die Klassifizierung? Wenn Item der Kontakt ist, kannst du mit NewItem.Classified.Add(Item.ID); den Kontakt als klassifizierten Kontakt in der neuen Aufgabe bzw. dem neuen Termin zuweisen. Das ganze hinter NewItem.Assign(...);


    Die Variablen sind abhängig vom Typ und müssen jeweils entsprechend umgewandelt werden. Bei Integers geht das z.B. mit IntToStr(Item.Eigenschaft); und bei Datumsfeldern mit DateTimeToStr(Item.Eigenschaft);.

  • Hallo,


    zu diesem Thema habe ich noch eine Frage:


    Ich erstelle eine Auto-E-Mail aus einer Regel, welche durch eine Notiz getriggert wird. Innerhalb dieser Regel extrahiere ich bestimmte Inhalte aus der Notiz und schreibe diese in Lokale Variablen. Kann ich den Inhalt dieser Variablen irgendwie in den Inhalt der E-Mail einfließen lassen ohne über die Benutzerdefinierten Felder zwischenspeichern zu müssen?


    Beispiel:


    Wir legen per externem Skript Notizen im Greyhound an die den DHL-Status eines Pakets an einen Kunden wieder spiegeln. Ist das Paket letztendlich angekommen so findet sich in den Anmerkungen "Empfänger: Max Müller". Diesen Namen extrahiere ich per RegEx und schreibe ihn in eine Lokale Variable.


    In der zu erstellenden Auto-E-Mail soll dann drin stehen: [...] wurde das Paket an Max Müller abgegeben. [...]


    Klar kann ich entsprechende Benutzerdefinierte Felder sowohl für Notizen als auch für E-Mails zum zwischenspeichern anlegen, aber das wären dann 5 weitere Felder die der Übersichtlichkeit nicht dienlich sind.


    Lieben Gruß und allen einen schönen Feierabend.

  • Hallo,


    ja das geht.


    Code
    1. var
    2. Variable: TFbmVariableItem;
    3. begin
    4. Variable := TFbmVariableItem.Create;
    5. Variable.Name := 'Name';
    6. Variable.Value := 'Max Mustermann';
    7. AutoReplyItem.Variables.Add(Variable);
    8. end.


    Die Variable $Name steht dann in der Name drin und kann in der Vorlage verwendet werden. Die Variable wird nur für dieses Element angelegt und unterstützt auch nur Zeichenketten. Das heißt Datumswerte oder Zahlen musst du für Variable.Value entsprechend mit zum Beispiel IntToStr umwandeln.

  • Moin Oliver,


    super das das geht. Leider bekomme ich es nicht hin. Vielleicht hast du Zeit dir mal anschauen was ich hier falsch gemacht habe?


    Problem 1: Die Variable [$Zugestellt_an] wird in der Automail nicht gefüllt. Ich verstehe ehrlich gesagt auch nicht die Technik hinter deiner zuvor genannten Lösung. Muss der Quelltext an einer bestimmten Stelle stehen? Kann ich das TFbmVariableItem innerhalb meiner Regel wie eine normale Stringvariable verwenden?


    Ab Zeile 16 ziehe ich mir Infos aus den Anmerkungen und schreibe diese in "normale" Stringvariablen. Lediglich den Empfänger will ich später an die Automail übergeben und schreibe diesen Wert in die TFbmVariable. Ich kann den Wert aber weder ausgeben (Zeile 35 - Unknown identifier), noch wird dieser in der generierten Automail ausgefüllt.


    Problem 2: Ich bekomme nicht den Empfänger aus dem klassifizierten Kontakt in das Automail-Feld. In allen Beispielen die ich gefunden habe wird immer der Absender der E-Mail auf die automatisch geantwortet werden soll als Empfänger eingesetzt. Mein triggerndes Element ist ja aber eine Notiz die keinen Absender hat. Mein Versuch die Mailadresse aus dem Kontakt zu nehmen kannst du im Quelltext sehen. (Zeile 49)


    Problem 3: Wenn ich mehrere Variablen habe die ich in meiner Automail befüllen will, muss ich dann mehrere Variablen vom Typ TFbmVariableItem anlegen, erstellen benennen, hinzufügen und am Ende wieder freimachen oder geht das in einem Rutsch?


  • Hallo,


    die Variable muss mit AutoReplyItem.Variables.Add(...) hinzugefügt werden. Sonst steht die Variable nur dem aktuellen Element der Regel zur Verfügung.


    Für jede Variable muss ein neues Objekt vom Typ TFbmVariableItem erzeugt werden und anschließend Name und Value gefüllt werden. Du kannst die lokale Variable mehrfach verwenden, zum Beispiel:



    Freigeben darfst du die Variable aber nicht, wenn sie dem AutoReplyItem bereits übergeben wurde. Mit dem Add(...) übergibst du die Kontrolle quasi an die Liste der Variablen des Elements. Auch ist eine Zuweisung gleichzeitig an z.B. das Item und das AutoReplyItem nicht möglich (jedes Create erzeugt einen "Gegenstand", welcher nicht zwei Besitzern gleichzeitig gehören kann).


    Zeile 49 sieht abenteuerlich aus. :D So geht es richtig:



    Ich habe den Code jetzt aber nur mal eben runtergetippt, bitte testen und melden, falls etwas noch nicht funktioniert.

  • Hey Oliver,


    erst einmal tausend Dank für deine Zeit und die Codezeilen! 8o


    Nachdem ich gestern schier verzweifelt bin und schon kapitulieren wollte fange ich heute an zumindest die Logik einigermaßen zu verstehen. Es ist deutlich komplizierter als ich mir das vorgestellt hatte.


    Inzwischen bin ich auch soweit das die Variablen übernommen werden. So weit, so gut.


    Allerdings kommt die E-Mailadresse noch nicht bei dem AutoReplyItem an. Kann es sein das du in Zeile 29 nur den Namen (Max Mustermann) statt der E-Mailadresse aus dem Kontakt ausliest und in das AdressItem schreibst? Muss man sich nicht Eigenschaften "LocalPart" und "DomainPart" die Mailadresse zusammenbauen und dann in das Pendant zu AdressItem.Name reinschreiben?


    Lieben Gruß

  • Hallo,


    mit "Assign" werden alle Daten des TFbmAddressItem übernommen. Das heißt der Identifier wird automatisch übernommen. Anschließend wird noch der Name des AdressItems auf den Kontakt geändert, weil dieser in den ComLinks (Kontaktadressen), nicht drin steht.


    Wenn die Adresse nicht gesetzt wird, wird aus irgendwelchen Gründen die E-Mail Adresse nicht gefunden. Da ist noch ein Fehler im Code sehe ich grade. Habe den Code mal korrigiert. Die Suche nach der Adresse wurde auch abgebrochen, wenn die Standard Briefadresse gefunden wird.

  • Hallo Oliver,


    falls du noch Lust hast ;-)


    Die erstellten E-Mails haben Absender, ausgefüllte Variablen und sind auch korrekt klassifiziert, aber sie haben nach wie vor keinen Absender.


    Ich habe zum debuggen mal den Inhalt von AdressItem.Name ins Protokoll geschrieben, und dort steht der Name - also beispielsweise Max Mustermann - des klassifizierten Kontakts.



    PS: Im Übrigen weiß ich nicht warum beim Zitieren von Code die Einrückung nicht mit rüberkommt. Bei mir sieht alles gut aus. Firefox?

  • Hallo,


    du musst auf Quelltext umschalten. Das Forum hat einen Bug was die Einrückung angeht, wenn man den "Editor" verwendet. Woltlab ist informiert. ;)


    Zum Problem: AddressItem.Name enthält den Namen und AddressItem.Identifier die Adresse. In AddressItem.Text steht "Name <Adresse>". Wenn du also den Absender setzen möchtest, verwendest du AddressItem.Text. Alternativ kannst du auch Assign verwenden:


    Code
    1. if Assigned(AutoReplyItem.From) then
    2. AutoReplyItem.From.Assign(AddressItem);


    Was mir gerade noch so auffällt, wie soll das mit dem Absender eigentlich funktionieren? Der Absender richtet sich ja nach der ausgewählten Gruppe.


    Ich verstehe den Satz "Die erstellten E-Mails haben Absender, ausgefüllte Variablen und sind auch korrekt klassifiziert, aber sie haben nach wie vor keinen Absender." auch ehrlich gesagt nicht. Haben sie nun einen Absender oder nicht? ?( :whistling:

  • Sorry Oliver, ich meinte "haben keinen Empfänger"


    Und danke für den entscheidenden Hinweis. Ich habe in dem Code unten nun die Zeile 59 gegen


    Code
    1. AutoReplyItem.Recipients.Text := AddressItem.Text;


    ausgetauscht. Und nun geht's!


    Was für ein Unterfangen! Wenn ich doch nicht so verdammt ehrgeizig wäre, dann hätte ich jetzt nicht insgesamt 9 Stunden für so ein paar Regelzeilen reingesteckt ;-)


    Lieben Gruß