Domino 9 und frühere Versionen > Entwicklung
travel datenbank - kleiner workflow
luna:
hallo,
ich muss grade eine travel datenbank machen, in der die manager IMMER genehmigen muessen, der director NUR, wenn einer vorhanden ist, und der president IMMER (falls er nicht schon director ist).
ich hab mir das jetzt mal mit folgender formel geschrieben:
@If (signature_manager_approval = "" & signature_manager_reject="";
@MailSend (manager;"Daniela Maurer/DE/SANYO-ENERGY-EU";"";"new travel request to approve by manager";"";"there has been created a new travel request for you to approve. please click here:";[IncludeDoclink]);
@If (signature_manager_approval != "" & signature_director_approval = "" & signature_manager_reject="" & signature_director_reject="" & director!="";
@MailSend ("Daniela Maurer/DE/SANYO-ENERGY-EU";"";"";"new travel request to approve by director";"";"please click on the link to open the document:";[IncludeDoclink]);
@If (signature_manager_approval != "" & signature_director_approval != "" & signature_manager_reject="" & signature_director_reject ="";
@MailSend ("Daniela Maurer/DE/SANYO-ENERGY-EU";"";"";"new travel request to approve by president";"";"please click on the link to open the document:";[IncludeDoclink]);
@If (signature_manager_reject !="" & signature_manager_approval="" & signature_director_approval ="";
@MailSend(employee_new;"";"";"your travel request has been rejected by manager";"";"please click here to open document:";[IncludeDoclink]);
@If (signature_director_reject !="" & signature_director_approval="" & signature_manager_approval!="" & signature_manager_reject="";
@MailSend(employee_new;"";"";"your travel request has been rejected by director";"";"please click here to open document:";[IncludeDoclink]);
@If (signature_president_reject !="" & signature_president_approval="" & signature_director_approval !="" & signature_director_reject="" & signature_manager_approval !="" & signature_manager_reject="";
@MailSend(employee_new;"";"";"your travel request has been rejected by president";"";"please click here to open document:";[IncludeDoclink]);
@If (signature_president_approval !="";
@MailSend(employee_new;"";"";"your travel request is ready";"";"please click here to open your travel request:";[IncludeDoclink]);
"")))))))
ich wuerde das gerne mit formel machen wenn geht, und nicht mit script oder so, weil ich muss das jederzeit selber schnell veraendern koennen. bis jetzt klappt das ganz gut, ich weiss, die formel sieht fuer euch wahrscheinlich wie eine geisterbahn aus, aber wenn sie funzen wuerde, waere sie fuer mich ideal.
mein erstes problem ist der vorletzte absatz. wenn der president rejected, dann sollte eine mail an den user gehen (in den schritten vorher klappt das, wenn der manager oder der director ablehnt), dass sein antrag abgelehnt wurde. leider aber bekommt der president einfach nochmal eine mail, dass er einen antrag zu genehmigen hat.
ich seh vor lauter baeume den wald nicht mehr. was mache ich da speziell in diesem absatz falsch?
vielen dank und gruss,
daniela
nachtrag:
hab grad festgestellt, dass mit dieser formel folgendes passiert an fehlern:
1.) wenn der president genehmigt, geht die mail mit doclink wieder an ihn selber, anstatt dass der user die nachricht bekommt, your travel request is ready.
2.) wenn der president ablehnt, passiert das gleiche.
es geht also nie eine email an den user, egal ob der president genehmigt oder ablehnt. bei allen anderen funktionien funzen diese emails.
ata:
... sieht toll aus die Formel, nur...
--- Zitat ---ich wuerde das gerne mit formel machen wenn geht, und nicht mit script oder so, weil ich muss das jederzeit selber schnell veraendern koennen.
--- Ende Zitat ---
... je länger du nicht mehr in die Formel geschaut hast, um so mehr Zeit wirst du brauchen, um wieder dahinter zu steigen, wie die Konditionen zu welchem Workflow sind... wie du ja bereits feststellt - der Kopf raucht...
ich würde das trotz-alledem in Script handeln, der Code ist übersichtlicher und besser zu kommentieren, denn wehe es ändert sich was, der Workflow wird umgestellt - dann stehst du jedes mal neu vorm Berg... - meine persönliche Erfahrung mit langen und verschachtelten Formeln - die übrigens eine Grenze haben...
... ich werde mir die Formel von dir vornehmen... vieleicht finde ich deinen Fehler...
ata
ata:
... ich habe verschiedene Fragen zu deinen Feldern. Kannst du mir kurz beschreiben, was die Felder bezwecken/beinhalten:
signature_president_approval
signature_president_reject
signature_director_approval
signature_director_reject
signature_manager_approval
signature_manager_reject
manager = Manager-Mailadresse
employee_new = neuer Mitarbeiter-Mail-Adresse
... zu deinem Code habe ich dir noch einen Tip. Ich habe ihn dir mal so strukturiert, daß man das besser lesen kann:
@If (
signature_manager_approval = "" &
signature_manager_reject="";
@MailSend (manager;"Daniela Maurer/DE/SANYO-ENERGY-EU";"";"new travel request to approve by manager";"";"there has been created a new travel request for you to approve. please click here:";[IncludeDoclink]);
@If (
signature_manager_approval != "" &
signature_director_approval = "" &
signature_manager_reject="" &
signature_director_reject=""
& director!="";
@MailSend ("Daniela Maurer/DE/SANYO-ENERGY-EU";"";"";"new travel request to approve by director";"";"please click on the link to open the document:";[IncludeDoclink]);
@If (
signature_manager_approval != "" &
signature_director_approval != "" &
signature_manager_reject="" &
signature_director_reject ="";
@MailSend ("Daniela Maurer/DE/SANYO-ENERGY-EU";"";"";"new travel request to approve by president";"";"please click on the link to open the document:";[IncludeDoclink]);
@If (
signature_manager_reject !="" &
signature_manager_approval="" &
signature_director_approval ="";
@MailSend(employee_new;"";"";"your travel request has been rejected by manager";"";"please click here to open document:";[IncludeDoclink]);
@If (
signature_director_reject !="" &
signature_director_approval="" &
signature_manager_approval!="" &
signature_manager_reject="";
@MailSend(employee_new;"";"";"your travel request has been rejected by director";"";"please click here to open document:";[IncludeDoclink]);
@If (
signature_president_reject !="" &
signature_president_approval="" &
signature_director_approval !="" &
signature_director_reject="" &
signature_manager_approval !="" &
signature_manager_reject="";
@MailSend(employee_new;"";"";"your travel request has been rejected by president";"";"please click here to open document:";[IncludeDoclink]);
@If (
signature_president_approval !="";
@MailSend(employee_new;"";"";"your travel request is ready";"";"please click here to open your travel request:";[IncludeDoclink]);
"")))))))
... abschließend kannst du dir das Leben mit Pseudocode leichter machen, den du dir mit Kommentaren in den Kopf der Formel schreiben kannst:
REM "Wenn kein Manager verfügbar ist und keiner zugestimmt hat,";
REM "... dann versende eine Mail an...";
REM "... ansonsten wenn....";
usw. usf...
... das macht zwar Arbeit, aber wenn du selbst nach einiger Zeit etwas verändern mußt, oder ein Kollege in deiner Abwesenheit was daran ändern soll, dann kann man sich besser einfinden - und dann spart das echt Zeit...
ata
Rob Green:
was zu empfehlen wäre, ist im voraus eine Art von "Matrix" möglicher Zustände zu bilden.
Hierbei bekommt
signature_manager_approval eine 1 für { !="" } bzw eine 0 für { ="" }
etc...
Auffallend ist, daß Du eine separate Abfrage für approved und für rejected hast. Das ist nicht schön, denn entweder ist eine Manager Anfrage noch
- offen,
- approved,
- rejected
aber nicht
- Manager_offen { !="" } oder { ="" }
- Manager_approved { !="" } oder { ="" }
- Manager_rejected { !="" } oder { ="" }
etc...
Da Du das zweite Verfahren gewählt hast, die Logik aufzufangen, kommt diese unnötige Kombinationsvielfalt zustande.
Daraus entsteht eine Kolonne möglicher Bedingungen
zb "1010010.." (0 oder 1 wenn es nur 2 Zustände gibt, in Deinem Fall wären es 3= offen, approved, rejected, also 0,1,2)
Diese kannst Du als inline Code bzw. auch in der Projektdoku ablegen.
Einen entscheidenden Vorteil hat dieses Vorgehen zusätzlich: man kommt nicht mehr wie beim Trial&Error Vorgehen durcheinander.
Oder nimm Dir MS Visio zur Hand, oder irgendein anderes Tool, daß alle möglichen Zustände in einer Baumstruktur visualisiert anzeigt (und mit den obigen Codes hinterlegt).
So sieht es momentan wirklich grauslig schwer aus dahinterzukommen, was da nicht klappt. Wenn schon ata nicht mehr klarkommt....
wflamme:
Ächz...
Vereinfachen wir doch mal:
not_seen=0
accepted=1
rejected=2
???=3
Also zB:
mgr:=@If(
signature_manager_approval != "" & signature_manager_reject!="";
3;
signature_manager_approval = "" & signature_manager_reject="";
0;
signature_manager_approval != "";
1;
2
);
So, jetzt sortieren und in 'WF-Pseudocode' darstellen:
@If (mgr=0;
"@mgr, new travel request to approve by manager";
@If (mgr=1 & dir=0 & director!="";
"@dir, new travel request to approve by director";
@If (mgr=1 & dir=0;
"@pre, new travel request to approve by president";
@If (mgr=2 & dir=0;
"@emp, your travel request has been rejected by manager";
@If (mgr=1 & dir=2;
"@emp, your travel request has been rejected by director";
@If (mgr=1 & dir=1 pre=2;
"@emp, your travel request has been rejected by president"
@If (mgr=1 & dir=1 & pre=1;
"@emp, your travel request is ready"
.....usw...
Aaaah jetzt ja! Genau diese Verwendung/Handhabung von Pseudocode (und das Debugging) ist der Grund, warum ich Workflow *immer* mit LS-OOP mache.
Block 3 ist die Ursache. Wenn der president auch director ist, dann kann er machen, was er will, an dieser Stelle bekommt er immer 'ne Nachricht... also
@If (mgr=1 & (dir=0 & director="") & pre=0;
"@pre, new travel request to approve by president";
Und dann fehlt vermutlich noch:
@If (mgr=1 & dir=1 & pre=0;
"@pre, new travel request to approve by president";
Kann man beides in einem Ausdruck zusammenziehen.
Es sind auch noch massig Redundanzen drin, zB
@If (mgr=1 & dir=2;
"@emp, your travel request has been rejected by director";
dir=2 sollte da eigentlich reichen,.... es sei denn, es ist was schiefgelaufen. Und das kriegst Du ohne Plausibilitätsprüfung kaum raus.
@If (mgr=2 & dir=0;
"@emp, your travel request has been rejected by manager";
...dito, oder kann der director approven, wenn der manager abgelehnt hat? das trifft dann aber auch auf den president zu.
Ob das alles (und alles 100%ig richtig) war, weiß ich nicht, soviel Zeit hab' ich leider nicht. Nochmal die Tips:
1) mit Symbolen/Variablen arbeiten
2) Plausibilitätsprüfung einbauen, Du hast nur recht wenig erlaubte Zustände
3) Nimm LS-OOP, das ist viel leichter wartbar.
4) Code entsteht auf dem Papier, nicht auf dem Rechner.
Viel Erfolg!
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln