Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Formelsprache TO LotusScript Code-generierer schreiben

(1/20) > >>

flaite:
Hallo,

hat jemand dafür vielleicht irgendwelche verwertbaren Ansätze, Artikel, ähnlich geartete openSource Projekte oder Literatur?
Damit ich das direkt ein bischen schlauer anfange.
Oder gibt es sowas schon?
Da ich das relativ häufig machen muß, hab ich mir überlegt, dass eventuell zumindest teilweise zu automatisieren.
Naiv würde ich sagen, dass ich den Formelsprache rekursiv in immer kleinere Tokens zerlege und daraus mir dann LotusSkriptcode zusammenschreibe.
Ziemlich rekursiv und dann State Maschine und Command Pattern (das kann jetzt total danebenliegen, fiehl nur eben so ein).
Muß ja nicht direkt jeder Formelsprachen-Befehl umgewandelt werden. 
Aber schon allein die DB-Lookups wären eine echte Arbeitserleichterung.
Falls jemand Lust hat. In C# oder in Java.
Wenn Interesse, dann yes or no. Keine "Ich weiss nicht ob ich das kann"-Meldungen. Dann lache ich immer so hämisch. Das macht Falten im Gesicht...

Axel

Gandhi:
Evaluate  ;D ?

Im Ernst: Mit Evaluate müssten wenigstens die Lookups funktionieren.
Aber: Was ist denn das Ziel? Der User gibt @Formulas ein und Du wandelst diese dann um? Dann wären meine nächste Frage "wozu" und mein Statement zu den Usern: "Das müssen ziemlich fortgeschrittene User sein"
Oder geht es um eine Möglichkeit @Formulas in Deinen Skripten zu verwenden (Library?)

Mit Evaluate habe ich mal gearbeitet um einen Excel Import/Export Agenten zu schreiben (benutze Excel Zeile X mit Formel Y und berechne daraus Feld Z). Das hat bei wenigen Formeln gut und bei den meisten gar nicht funktioniert.

Gandhi:
OK, ich glaube ich beginne zu verstehen. Du willst KOMPLEXE Formulas in Skripten ausführen.

Dazu wäre mein Ansatz erst mal die Funktionen wenigstens zu wrappen.
Dann benötigt man einen Parser, der die Funktionen tranchiert. So erhält man einen Tokenarray, der dann an die Subfunktionen übergeben würde....

Habe leider gar keine Ahnung von Compilerbau - beim ersten Punkt wäre ich aber definitiv dabei.

flaite:
Doch so ungefähr. Mit den Tokens und Tranchieren sehe ich genauso.
Dann müssen die Tokens eben gruppiert, umsortiert und in LotusScript konvertiert werden.
Ich möchte Formelsprachencode reinkopieren und unten kommt Skriptcode raus.
Wenn ich an bestehenden Notes-Datenbanken arbeite, kommt es des öfteren vor, dass ich Formelsprachen-Code durch Skriptcode ersetzen zu müssen. Ich glaub Glombi hat sich einmal ähnlich ausgedrückt.
Ich hab nix gegen Formelsprache. Es ist einfach nur so, dass es Sinn macht, um eine Anwendung zu "konsolidieren", d.h. halbherzig implementierte Features rausschmeissen oder User-fähig zu machen. Es kommt dann oft vor, dass ich Skriptcode brauche. Z.B. ein Fall wo ein Feld des öfteren die 32-K (oder whatever) Grenze überschreitet. Dieses Feld wird leider von ca. 9 verschiedenen Skripten in Formelsprache oder LotusScript gefüllt (nicht übertrieben). Ich möchte das Feld ab einer bestimmten Größe auf 2 oder mehr Felder aufteilen (Adressen, Adressen_1, etc.). Dafür muss ich aber den Prozess managen und dafür möchte ich erstmal allen Code, der dieses Feld füllt oder verändert in Skript umwandeln.
Ein anderer Fall für diesen Formelsprache-zu-Skcript-Prozess ist RichText-Handling. Das wurde früher oft mit Formelsprache gemacht. Aber seid Domino6 gibt es da offenbar stabil funktionierende Klassen. Dort wäre ich mit Skript auch flexibler.

Ziel ist es so ein (ein bischen anonymisiertes) Skript einzugeben:

--- Code: ---_A := @DbLookup("Notes":"NOCACHE";"":"";"($aaa)";"AToc";"ATitle");
_Application:=@If(@IsError(_A); @Failure("Fehler Meldung !"); _A);
_B := @DbLookup("Notes":"NOCACHE";"":"";"($AVIEW)";"ADOC";"Admin");
_Server := @Name([Abbreviate];@Subset(@DbName;1));
_DB := @ReplaceSubstring( _B;"@CurrentServer";_Server);
_DbView := "($Server)";
_DbKey := _Application + "@CurrentServer";
_Res:= @DbLookup("": "NoCache"; "":_DB; _DbView; _DbKey; 2);
_Server1 := @Subset(@DbName;1);
_Fields := @ReplaceSubstring( _Res;"@CurrentServer";_Server1);

_SerienbrDB := @Left(@Right(_Fields;"||aDB#"); "||");

_DataFormulare := @DbLookup("": "NoCache"; "": _DB; "(aView)"; "A DB" ; "DataBerichte");

@If(@IsError(_DataFormulare) | _DataFormulare = "";@Do(
@Prompt([OK];"Fehler";"a meldung.");
@Return("")
);
"");
_EleFormular := @Sum(@DbLookup("": "NoCache"; "": _DB; "(aView)"; "AnDB" ; 2));
@If(_EleFormular > 1; @Do(
@Prompt([OK];"Fehler";"kind of meldung.");
@Return(""));
"");

_SerienFormulare := @Explode(@Left(@Right(_DataFormulare;"||BerichteFormulare#"); "||"); "$");

_a1 := @Left(@Right(_DataFormulare;"||Name1#"); "||");
_a2 := @Left(@Right(_DataFormulare;"||Name2#"); "||");

_SerienFormulare3 := @Explode(@Left(@Right(_DataFormulare;"||BerichteFormulare3#"); "||"); "$");

_Maske_1 := _Maske_1;
_Maske_2 := _Maske_2;

_Aktionen := _SerienFormulare3;
_antwort := @If( @Elements( _Aktionen ) = 1; _Aktionen; @Prompt([OKCANCELLIST] : [NoSort]  ; "Ausführen von" ; "Bitte wählen sie ..." ; @Subset(_Aktionen ;1) ; _Aktionen ) ) ;
@If(_antwort = _a1;
     @Do(
             @Set("_Maske_1";@Left(@Right(_DataFormulare;"||Maske1#"); "||"));
             @PostedCommand([FileOpenDatabase]; "" : _SomeDB ; "(Mainnavigator)" ; "" ; "" ; "");
             @PostedCommand([Compose];  "" : _SomeDB ; _Maske_1)
                );
_antwort = _a2;
     @Do(
             @Set("_Maske_2";@Left(@Right(_DataFormulare;"||Maske2#"); "||"));
             @PostedCommand([FileOpenDatabase]; "" : _SomeDB ; "(Mainnavigator)" ; "" ; "" ; "");
             @PostedCommand([Compose];  "" : _SomeDB ; _Maske_2)
                );
"")

--- Ende Code ---
Und daraus LotusScript Code erzeugen.
Oder zumindest Teile davon übersetzen. Der Rest bleibt in Formelsprache stehen. Da ich das sowieso übertragen muß. Wäre zumindest eine Arbeitserleichterung.

Ich find das eine interessante Aufgabe.
Axel

flaite:
Die Tokens einsammeln und daraus einen Tree aus Command Objekts bauen. (Composite-Pattern + Command Pattern). 
http://www.dofactory.com/Patterns/Patterns.aspx

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln