Domino 9 und frühere Versionen > ND8: Entwicklung

Agent zum ändern von Feldwerten bestimmter Maske: Beispiel gesucht

<< < (2/4) > >>

ata:

--- Zitat ---Ich behelfe mir ganz gerne mit der Ansicht, um vorm Lauf des Agenten mal einen Überblick zu haben, um welche Dokumente (und um welche Menge an Dokumenten) es geht.
--- Ende Zitat ---

... da hast du sicher recht - für einen Überblick zu Beginn recht gut, um zu sehen, ob der Select sauber ist. Ansonsten belastet jede Ansicht in der DB auch die Performance und macht es teils unübersichtlich. Daher hätte ich solch eine Ansicht bei komplexen Selects auch drin, würde sie aber bei so einfachen Operationen wie hier wieder aus dem System nehmen...

Toni

reraru:
Hi,

ich hatte gehofft das jemand vielleicht ein Beispiel hat an dem ich mich orientieren kann.

Der Agent soll hinterher täglich laufen (nachts) und bei den Firmendokumenten mit einer Kundennummer
per ODBC die Umsatzwerte (Jahr, Vorjahr, Vor-Vorjahr) in die entsprechenden Felder schreiben. Das Beschreiben der Felder ist kein Problem.

Ich habe mir das mit den einfachen Aktionen mal angesehen. Bei der Auswahl kann ich "nach Formular" anwählen und auch "nach Beispielmaske" was muss ich denn im Feld eintragen wenn ich nur die Kunden mit Kundennummer rausfiltern will. ">0" klappt scheinbar nicht.

Ich habe mir ja schon Gedanken gemacht. Genauer gesagt ein paar Formeln. Mir fehlt aber noch die Logik.

/ Alle Dokumente des Forms "Kunde" durchlaufen und die Abfrage der Variable "Kunde" /

Bei einem Formelagenten kann ich die Auswahl nur über einfache Aktionen machen, oder?


Hier meine Bausteine:


--- Code: ---'Jahre zweistellig zusammenbauen';
JahrJJ:= @Right(@Text(@Year(@Now));2);
VorjahrJJ:= @TextToNumber(JahrJJ)-1;
VVorjahrJJ:= @TextToNumber(JahrJJ)-2;


"Hier müsste wohl ne Schleife hin, oder";

"Kundennummer ermitteln";
Kunde:= @GetField("com_Kundennummer");

@If(@IsNull(Kunde);"";

"SQL-Strings bilden";

sqlJ:= "SELECT SUM(UXNWEF) AS SUM FROM SRVAS01.ANCRADTA.UMSSTAL1 WHERE UXKDNR = " + @Text(Kunde) + " AND UXERJJ = " + @Text(JahrJJ);
sqlVJ:= "SELECT SUM(UXNWEF) AS SUM FROM SRVAS01.ANCRADTA.UMSSTAL1 WHERE UXKDNR = " + @Text(Kunde) + " AND UXERJJ = " + @Text(VorjahrJJ);
sqlVVJ:= "SELECT SUM(UXNWEF) AS SUM FROM SRVAS01.ANCRADTA.UMSSTAL1 WHERE UXKDNR = " + @Text(Kunde) + " AND UXERJJ = " + @Text(VVorjahrJJ);

"Umsatz ermitteln aktuelles Jahr";
xRes:=@DbCommand("ODBC" ; "DSN" ; "dbreader" ; "dbreader" ; sqlJ);

ergJ := @If(
@IsError(xRes);
     "Keine Berechnung möglich";
     xRes);
ergJ;

@SetField("com_sales_UL"; ergJ);


"Umsatz ermitteln Vorjahr";
xRes:=@DbCommand("ODBC" ; "DSN" ; "dbreader" ; "dbreader" ; sqlVJ);

ergVJ := @If(
@IsError(xRes);
     "Keine Berechnung möglich";
     xRes);
ergVJ;

@SetField("com_sales_UVJ"; ergVJ);


"Umsatz ermitteln Vor-Vorjahr";
xRes:=@DbCommand("ODBC" ; "DSN" ; "dbreader" ; "dbreader" ; sqlVVJ);

ergVVJ := @If(
@IsError(xRes);
     "Keine Berechnung möglich";
     xRes);
ergVVJ;

@SetField("com_sales_UVVJ"; ergVVJ)
);

--- Ende Code ---

Driri:
Also bei etwas komplexeren Themen neige ich persönlich dazu, das dann lieber in Script zu realisieren. Ein fertiges Script wird Dir aber vermutlich niemand hier liefern können.

Ich halte es auch nicht für sonderlich geschickt, jeden Wert einzeln per ODBC-Zugriff abzufragen. Das dürfte aus Performancesicht der schlechteste Weg sein.

Ich muß aber auch gestehen, daß ich noch nie mit direkten ODBC-Zugriffen gearbeitet habe. Entweder machen wir hier solche Dinge über eine Datenpumpe oder ich erhalte die Daten als CSV und lese die Textdatei dann via Script aus.

Schnubbel:
Hallo René,
ich hab jetzt einfach mal aus meinen Fundus ein bisschen Script kopiert. Evtl. kannst du dich ja daran orientieren. Aber Vorsicht, da ist keinerlei Fehlerroutine drin. Am Ende sind alle Dokumente der Form "Person" in der dc. Hoffe, dass es dir ein wenig hilft.

--- Code: ---Dim s As New NotesSession
Dim db As NotesDatabase
Dim dc As Notesdocumentcollection
Dim doc as Notesdocument
set db = s.currentdatabase

Dim Formel As String

Formel = {Form="Person"}

Set dc = db.Search( Formel, Nothing, 0)
--- Ende Code ---

Tode:
Ein gutgemeinter Rat: Du als Programmierer wirst für die Daten die da stehen verantwortlich gemacht werden (eigene Erfahrung)... Und evtl. werden sogar Entscheidungen / der Verlauf von Kundengesprächen von den Inhalten dieser Felder abhängen...

Dein Formel- Agent macht vermutlich (so rein vom drüberfliegen) schon das richtige, aber Du hast keinerlei Logging (wenn ODBC- Zugriffe schief gehen), keinerlei Erfolgsmeldungen und keinerlei Informationen darüber, wie aktuell / korrekt die Werte sind...

Und wehe, Dein Wert weicht nur um wenige Euro von dem ab, was im zugrundeliegenden System steht, dann musst Du Dich rechtfertigen können, was Du mit einer solchen Lösung nicht kannst...

Von Performance / Sicherheit / etc. will ich gar nicht reden.

Du solltest das in LotusScript machen (lassen) und ein anständiges ErrorHandling / Reporting / Logging drumrum machen, sonst schnappt Dir das früher oder später ins Gesicht...

Zur Frage: Du kannst im Formelagenten einfach ein SELECT- Statement vorneweg schreiben, um die Auswahl der Dokumente einzuschränken...

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln