# # ITSV GmbH # CCDB - Command and Control Database # # FILE: dquerymfile_seqtransdocdemo.txt # DESCRIPTION: this is the DQUERY-Definition for the DQUERY "seqtransdocdemo" # # "seqtransdocdemo" is a DQUERY of type "seqtrans". # It is intended to demonstrate and document the DQUERY-type "seqtrans". # # VERSION: 0.1 # STATUS: V 0.1 complete # AUTHOR: WSC - Wolfgang Scherer # CREATED: 08.01.2020 # LAST_CHANGE: 08.01.2020 # HISTORY: # Version | Author | Date | Description # ----------+--------+------------+--------------------------------------------- # 0.1 | WSC | 08.01.2020 | created # ----------+--------+------------+--------------------------------------------- # 0.2 | WSC | 13.10.2020 | complete context fields (this.xxxx) # | | | # | | | # ----------+--------+------------+--------------------------------------------- # | | | # | | | # | | | # ----------+--------+------------+--------------------------------------------- # @querytitle "seqtrans" Demo und Dokumentation @querydescription Diese Abfrage dokumentiert und zeigt die Leistungsmerkmale der query-type "seqtrans" @group TEST @attributenames option:seqtransdemooption:{{optionopts}},verbose:noyes:{{verboseopts}} @optionopts { type: {structure: "scalar.enum", vlist: "doc:Dokumentation:Zeige Dokumentation,demo:Demonstation:Funktions-Demonstration"}, labeltext: "Modus", typedesc: "Dokumentations- oder Demonstrations-Modus" } @verboseopts { labeltext: "Gesprächig", typedesc: "Verbose(Gesprächig): Yes, um Zusatz-Informationen auszugeben, ansonsten werden keine zusätzlichen Informationen ausgegeben" } @querytype function @function seqtrans.seqtrans @init.qexpression this.wiki = require("./wiki.js")(logger,"seqtransdocdemo",prefs); this.query.verbose = aux.boolFromString(this.query.verbose); this.query_setup_doc = aux.objTxt(this.query,99,999999); this.options.maxgosubdepth = 100; this.psrc = function() { return this.mark("TSTEP "+this.tstepnum+" (Zeit: "+aux.nowsvtime()+"):","p")+this.pre(aux.objTxt(this.tsteps[this.tstepnum])); }; this.mark = function(txt,mrk) { return "<"+mrk+">"+txt+""; }; this.pre = function(txt) { return this.mark(txt,"pre"); }; this.strcode = function(txt) { return this.mark(this.mark(txt,"code"),"strong"); }; @global_pre_qexpression if (this.query.option=="demo" && this.query.verbose) { this.ppush([this.phead("DEMO_TSTEP_"+this.tstepnum+"_PRE"),"",this.psrc()]); } @global_post_qexpression if (this.query.option=="demo" && this.query.verbose) { this.ppush([this.phead("DEMO_TSTEP_"+this.tstepnum+"_POST"),"",this.pre(aux.objTxt({stepresult: this.stepresult}))]); } ~query.tsteps # # 0: decide modus # if (this.query.option!="doc") goto chknotdoc # # 1: modus is doc # qexpression this.docrec = 0; this.query.title = "Dokumentation der CCDB-Query-Type \"seqtrans\""; # # 2: check if any more documentation chunk # nextdocchunk: pre_qexpression logger.debug(this.phead("NEXTDOCCHUNK")+".DOCREC="+this.docrec+".DOCTEXTLENGTH="+this.query.doctexts.length+".RECSTEPCOUNT="+this.recstepcount+".MAXRECSTEPS="+this.options.maxrecsteps); if (this.docrec>=this.query.doctexts.length) goto docdone # # 3: present one documentation chunk # qexpression this.docchunk = this.query.doctexts[this.docrec]; if (!this.docchunk.type) { if (this.docchunk.text) { this.docchunk.type = "paragraph"; } else if (this.docchunk.htext) { this.docchunk.type = "html"; } else if (this.docchunk.wikitext) { this.docchunk.type = "wikitext"; } else { this.new_docchunk = { type: "objTxt", object: this.docchunk }; this.docchunk = this.new_docchunk; } } # # 4: check for simple doc chunk (all except wikitext) and process it if so # if (this.docchunk.type!="wikitext") qexpression this.ppush(this.docchunk); this.docrec++; and_then_goto nextdocchunk # # 5: wikitext doc chunk # aexpression /* this.debug = true; */ this.wiki.parsePage(this,null,this.docchunk.wikitext,this); result_varname wpres post_qexpression this.ppush({ type: "html", htext: this.wpres }); this.docrec++; then_goto nextdocchunk # # 6: all doc chunks presented # docdone: pre_qexpression logger.debug(this.phead("ALLDOCPROC")+".PROTOCOL: "+aux.objTxt(this.protocol,99,99999)); goto end # # ------------------------------------------------------------------------------ # # # 7: check if modus is demo # chknotdoc: if (this.query.option!="demo") goto chknotdemo # # 8: modus is demo # qexpression this.query.title = "Demonstration der CCDB-Query-Type \"seqtrans\""; this.ppush([phead(this,"DEMO"),"Alle TSTEPS dieser Demonstration zeigen ihre Definition in einem Protokoll-Eintrag an",new Date(),this.psrc()]); # # 9: demo: JS TSTEP with aexpression # aexpression this.ppush([phead(this,"DEMO_PRE_AEXPRESSION_TIMEOUT"), "Dieser TSTEP führt eine "+this.strcode("aexpression")+" mit einem Timeout aus",new Date(),this.psrc()]); this.timeout = setTimeout(function(rfunc,result) { rfunc(null,result); },5000,this,"Timeout of 5000ms in DEMO expired"); result_varname tores post_qexpression this.ppush([phead(this,"DEMO_POST_AEXPRESSION_TIMEOUT"),"Protokoll-Eintrag nach vorhergehendem Timeout (Zeitstempel beachten)",new Date(), this.mark("Ergebnis:","p")+this.pre(aux.objTxt(this.tores))]); # # 10: demo: GOSUB, recursive for fibonacci sequence # gosub fiblist params.start 1 params.end 20 # # 11: demo finished # pre_qexpression this.ppush({ type: 'html', htext: this.mark("DQUERY-Definition:","h3")+"\r\n"+this.pre(aux.escapeCharEntities(this.query_setup_doc)) }); goto end # # 12: not demo # chknotdemo: qexpression this.errcoll.collect(null,"Illegal modus \""+this.query.option+"\"",this.query); # # 13: end # end: end # # ------------------------------------------------------------------------------ # # 12: subroutine fib(x), calculates Fibonacci Function value # # see also: https://de.wikipedia.org/wiki/Fibonacci-Folge # Fibonacci-Sequence determines each element as the sum of its 2 predecessors (fib(x-1)+fib(x-2)). # For the first 2 Elements the value is fixed as 1 # fib: if (this.local.params.x<=2) return 1 # # 13: calculate fib(x-1) # pre_qexpression this.local.px1 = this.local.params.x-1; if (this.query.verbose) this.ppush([this.phead("PX1="+this.getcvar("px1")),"","",""]); gosub fib params.x @@px1@@ result_varname rx1 post_qexpression if (this.query.verbose) this.ppush([this.phead("RX1="+this.getcvar("rx1")),"","",""]); # # 14: calculate fib(x-2) # pre_qexpression this.local.px2 = this.local.params.x-2; if (this.query.verbose) this.ppush([this.phead("PX2="+this.getcvar("px1")),"","",""]); gosub fib params.x @@px2@@ result_varname rx2 post_qexpression if (this.query.verbose) this.ppush([this.phead("RX2="+this.getcvar("rx2")),"","",""]); # # 15: return fib(x-1)+fib(x-2) # pre_qexpression this.local.rx = Number(this.local.rx1) + Number(this.local.rx2); return @@rx@@ # # ------------------------------------------------------------------------------ # # subroutine fiblist(start,end) # write list of fib(x) from start to end to protocol # # 16: set up loop control # fiblist: qexpression this.local.cx = this.local.params.start; # # 17: check loop exit # fiblist_next_cx: if (this.local.cx>this.local.params.end) return # # 18: produce next list item and repeat # gosub fib params.x @@cx@@ result_varname lfx post_qexpression this.ppush([this.phead("DEMO: Fibonacci-Folge:"),"FIB("+this.getcvar("cx")+")="+this.getcvar("lfx"),new Date(),this.psrc()]); this.local.cx++; then_goto fiblist_next_cx # # ------------------------------------------------------------------------------ # ~query.doctexts %SET linesep=%0a wikitext "seqtrans" ist eine Abfragetype in der {{CCDB}}, wobei "seqtrans" für "Sequence Transaction" steht. + Das Grundkonzept von "seqtrans" ist: * Es gibt einen Eingangs-Datenbestand (inputresult). Dieser besteht aus einer Anzahl von Datensätzen (RECORDs) * Das inputresult wird RECORD für RECORD sequentiell abgearbeitet * Für die Abarbeitung ist eine Anzahl von Schritten definiert. Für jeden RECORD werden alle Schritte nacheinander abgearbeitet. * Alle Verarbeitungsschritte für alle RECORDs sind in einer Transaktionsklammer zusammengefasst. Passiert in einem Schritt ein nicht-korrigierbarer Fehler, so wird die Abarbeitung beendet und die gesamte Transation zurückgerollt. wikitext == Konzepte und Begriffe in "seqtrans" == === Sequenced Transaction ("seqtrans") === Das Ziel von "seqtrans" ist: * Einen Datenbestand, der aus mehreren Datensätzen besteht, abzuarbeiten * Die Bearbeitung eines Datensatzes in Form von eiiner Folge (SEQUENCE) von hintereinander abgearbeiteten Einzelschritten (TSTEPs) konfigurieren zu können * Für oft verwendete Abarbeitungsschritte vordefiniterte Funktionen bereitzustellen: ** SQL-Statements in verschiedenen Datenbanken durchführen ** Beliebige synchrone und asynchrone Javascript-Fragmente ausführen ** Veränderung der Reihenfolge der Abarbeitung der Schritte (GOTO) ** Teile der Sequence als Subroutine wiederverwenden (GOSUB) ** Bedingte Ausführung von TSTEPs (IF/UNLESS) * Die gesamte Verarbeitung in EINER Transaktion durchzuführen: Wenn ein Fehler in einem Schritt auftritt, kann die gesamte Verarbeitung zurückgerollt werden === SEQUENCE === Eine SEQUENCE ist eine Menge von Einzel-Schritten (TSTEPs), die im Normalfall hintereinander ausgeführt werden. + Eine SEQUENCE wird intern als ein Javascript-Array gespeichert. + Die SEQUENCE wird von "seqtrans" einmal für jeden Datensatz im Eingabe-Datenbestand vom ersten Schritt an durchlaufen. + Die Abarbeitung der SEQUENCE endet, wenn das Ende der SEQUENCE erreicht wird oder ein TSTEP mit der speziellen Type "END" erkannt wird.

=== TSTEP === Der kleinste Baustein, der einzeln abgearbeitet wird, ist ein Transaction-Step (TSTEP). wikitext === TSTEP-Typen === Jeder TSTEP hat einen Typ, der bestimmt, was in dem TSTEP getan wird. + {| ! Type-ID !! Type !! Beschreibung |- | Alle || Alle Step-Typen || Für alle Step-Typen gelten die in dieser Zeile aufgeführten Parameter gleichermaßen, siehe Tabelle Parameter für alle TSTEP-Typen. |- | SQL || SQL-Statement ausführen || Führt ein SQL-Statement in einer Datenbank aus.

Parameter: {| ! Parameter-Name !! Default-Wert (wenn nicht angegegeben) !! Bedeutung |- | sql ||   || SQL-Statement, das ausgeführt werden soll. Kann durch ::...:: markierte Platzhalter-Namen enthalten. Diese werden bei der Ausführung als SQL-Bind-Variable aus den Kontext-Variablen gleichen Namens ersetzt |- | cfgname, dbconfigname oder cfgname_varname | Aktuelle CCDB-Instanz | Gibt an, in welcher Datenbank-Konfiguration das SQL ausgeführt werden soll |- | named_params || (Leere Liste) || Komma-separierte Liste von Platzhalternamen, die als Variable in das SQL-Statement eingefügt werden sollen |} |- | JS || Ein Javascript-Fragment ausführen || Führt ein Javascript-Fragment aus. + Ist der Parameter qexpression angegeben, so wird das darin enthaltene Javascript SYNCHRON ausgeführt. + Ist der Parameter aexpression angegeben, so wird das darin enthaltene Javascript ASYNCHRON ausgeführt. + ASYNCHRON bedeutet, dass das Javascript mit einem Callback abgeschlossen werden muss. + Als Callback muss im Fragment this(err,res) aufgerufen werden, wobei err, wenn nicht null einen Fehler signalisiert. + reskann das Ergebnis der Verarbeitung transportieren. Es wird in der Kontext-Variable stepresult gespeichert und kann von nachfolgenden TSTEPs verwendet werden. |- | SUBQUERY || Führt eine CCDB-Abfrage (DQUERY) aus || Führt eine CCDB-Abfrage aus + Als einziger spezifischer Parameter wird query angegeben. Dieser ist jedoch ein Objekt mit weiteren Attributen, die alle Attributen der DQUERY entsprechen. + Die Namen der Attibute von query sind daher spezifisch bis auf jede DQUERY-Attribute, die in allen DQUERYs gleich sind. Diese sind in der Tabelle Parameter für TSTEPs der Type SUBQUERY beschrieben. |- | GOTO || Springt zu einem anderen TSTEP | Statt mit dem nächsten TSTEP in der Sequence wird mit dem TSTEP fortgesetzt, dessen Label im Attribut goto oder target angegeben wird. Wird das TSTEP-Attribut if oder unless angegeben, so ist der Sprung bedingt: Der Inhalt des TSTEP-Attributs if oder unless wird als Javascript-Ausdruck ausgewertet. * Ist das Ergebnis TRUE und das Attribut if, so gilt die Bedingung als gegeben und der Sprung erfolgt. * Ist das Ergebnis TRUE und das Attribut unless, so gilt die Bedingung als NICHT gegeben und der Sprung unterbleibt. * Ist das Ergebnis FALSE und das Attribut if, so gilt die Bedingung als NICHT gegeben und der Sprung unterbleibt. * Ist das Ergebnis FALSE und das Attribut unless, so gilt die Bedingung als gegeben und der Sprung erfolgt. |- | GOSUB | Arbeitet eine TSTEP-Subroutine ab | GOSUB funktioniert wie GOTO, nur wird die Rückkehr-TSTEP-Nummer auf einem Stack gespeichert. + Mit RETURN kann zur Aufrufstelle der Subroutine zurückgekehrt werden.

+ GOSUB legt auch einen eigenen Variablen Kontext this.local an, der dem aktuellen Aufruf der Subroutine zur Verfügung steht. + Damit ist es auch möglich, Subroutinen rekursiv aufzurufen, in dem lokale Variablen in this.local angelegt werden. + In this.local werden auch im Unterbereich this.local.params Parameter, die an die Subroutine übergeben werden, abgelegt |- | END | Ende der Arbeitsschritte für den aktuellen Datensatz | Wird bei der Abarbeitung der TSTEPs zu einem Datenstz der TSTEP-Typ END erkannt, so wird die Bearbeitung des aktuellen Datensatzes beendet und die Bearbeitung des nächsten Datensatzes mit dem TSTEP mit dem Index 0 begonnen. |} + ==== Parameter für alle TSTEP-Typen ==== + {| ! Parameter-Name !! Bedeutung !! Default-Wert (wenn nicht angegegeben) |- | tstype || Der Typ des TSTEP | Wird kein tstype angegeben, so wird er aus eventuell vorhandenen anderen Attributen nach den Regeln in Tabelle Regeln für tstype abgeleitet |- | label || Ist der Parameter label definiert, so hat dieser TSTEP ein Label mit dem Namen des Inhalts des Parameters || Kein Label an diesem TSTEP |- | pre_qexpression || Ein Javascript-Fragment, das VOR der eigentlichen Durchführung der Aktion des TSTEP ausgeführt wird || kein ausgeführtes Javascript-Fragment |- | post_qexpression || Ein Javascript-Fragment, das NACH der eigentlichen Durchführung der Aktion des TSTEP ausgeführt wird || kein ausgeführtes Javascript-Fragment |- | result_varname || Name der Kontext-Variable, in der das Ergebnis der SQL-Abfrage gespeichert werden soll || last_result |- | then_goto | Wenn dieses Attribut gesetzt ist, soll nach der Abarbeitung des TSTEPs zu dem TSTEP mit dem Label gesprungen werden, das als Inhalt von then_goto angegeben wird. |- | and_then_goto | Wenn dieses Attribut gesetzt ist, soll nach der Abarbeitung des TSTEPs zu dem TSTEP mit dem Label gesprungen werden, das als Inhalt von and_then_goto angegeben wird, aber (zum Unterschied zu then_goto) nur, wenn die Bedingung des Schrittes (if oder unless) erfüllt war. |} + ==== Parameter für TSTEPs der Type SUBQUERY ==== + {| |- | dataname || Eindeutige ID der DQUERY, wie in der CCDB konfiguriert |- | chain_query || Definitions-Objekt eines DQUERY, das nach der Ausführung des aktuellen DQUERY aufgerufen wird | |} + ==== Regeln für '''''tstype''''' ==== + {| ! Ist dieser Parameter vorhanden !! Dann wird als tstype angenommen !! was bedeutet |- | sqlSQL || Ein SQL-Statement ausführen |- | qexpression oder aexpression || JS || Ein Javascript-Fragement ausführen |- | query || SUBQUERY || Ein untergeordnetes DQUERY (CCDB-Abfrage) ausführen |- | noop || NOOP || Keine Aktion ausführen |- | let || LET || (Derzeit nicht definiert) |- | goto oder target || GOTO || Zu einem anderen TSTEP (Label) springen |- | gosub || GOSUB || Eine Unter-Sequenz von TSTEPs ausführen |- | return || RETURN || Aus einer Unter-Sequenz zurückkehren |- | end || END || Die Abarbeitung der Sequenz für diesen record beenden (auch wenn noch nicht alle TSTEPs abgearbeitet sind |} wikitext === Variable und Funktionen, die in TSTEP-Expressions verwendet werden können === Diese Aufstellung beschreibt die Attribute des seqtrans-Kontexts. Eigene Expressions dürfen keine eigenen Variablen/Attribute mit diesen Namen anlegen! Änderungen der Attribute in dieser müssen mit großer Vorsicht durchgeführt werden. {| ! Art !! Name !! Beschreibung |- | Variable || this || Der Kontext, in dem die ganze transaction sequence ausgeführt wird. Attribute dieses Objekts bleiben über die gesamte Transaktion (alle records) erhalten |- | Variable || this.act_pending || Interne Steuerungsvariable. Wenn true, dann ist eine asynchrone Aktion aktiv. Erst danach kann die transaction sequence weiterlaufen. |- | Variable || this.aexpression || Interne Steuerungsvariable. STRING oder ARRAY. aktuell abzuarbeitende Asynchrone Javascript-Expression. Wenn ARRAY, werden alle Einträge der Reihe nach abgearbeitet. Die Nummer des aktuell abgearbeiteten Aintrags ist dabei in this.aexpression_index. Die jeweils aktuelle Expression wird dabei in this.current_aexpression gehalten. Die Information, ob es eine einzelne oder eine Menge von aexpressions ist, wir in this.multi_aexpression gespeichert. |- | Variable || this.attributes_to_log || Interne Steuerungsvariable. Ein Attribut für jedes Attribut von this, das im DEBUG-Modus geloggt werden soll. |- | Variable || this.callback || Interne Steuerungsvariable. FUNCTION, die aufgerufen wird, wenn die seqtrans zu Ende ist. |- | Variable || this.cdata || Datenobjekt des aktuellen records im inputresult. Dieses Objekt hat ein Attribut für jede Spalte im aktuellen Record. Der Name des Attributs ist der Spaltenname aus dem inputresult |- | Variable || this.cfgname || Interne Steuerungsvariable. Name der zuletzt verwendeten Datenbank-Zugriffskonfiguration. |- | Variable || this.cond || Interne Steuerungsvariable. Speichert den letzten Stand der Auswertung einer TSTEP-Bedingung ("if" oder "unless") |- | Variable || this.condition || Interne Steuerungsvariable. Javascript-Text der letzten TSTEP-Bedingung ("if", "unless"). |- | Variable || this.configdata || Interne Steuerungsvariable. OBJECT mit Konfigurationsdaten. |- | Variable || this.connectionBundle || Interne Steuerungsvariable. Das Datenbank-ConnectionBundle in dem alle Datenbank-Verbindungen gehalten werden. Am Ende der transaction sequence werden entweder alle Datenbank-Verbindungen COMMITted oder ROLLBACKed. |- | Variable || this.current_action || Interne Informationsvariable. Kurzbeschreibung der aktuell bearbeiteten Aktion innerhalb des aktuellen TSTEPs |- | Variable || this.dataname || Die ID der Abfrage, in der "seqtrans" verwendet wird. |- | Variable || this.datasets || Interne Steuerungsvariable. Sammelt alle (Result-)Datensätze, die von der seqtrans verwendet werden. Zumindest das this.inputresult ist enthalten. Ist der this.outputmode="datasets" wird dieses ARRAY als Ergebnis der seqtrans geliefert. | Variable || this.dbconn || Interne Steuerungsvariable. |- | Variable || this.dbconnection || Interne Steuerungsvariable. |- | Variable || this.dbr || Interne Steuerungsvariable. CCDB-DB-Request-Objekt. |- | Variable || this.debug || Interne Steuerungsvariable. Wenn true, dann werden Debug-Informationen im CCDB-Log ausgegeben. Ist dann gesetzt, wenn in der CCDB Session-Debugging eingeschaltet wird. Kann auch von eigenen expressions verwendet werden. |- | Variable || this.default_cfgname || Name der DB-Zugriffs-Konfiguration, die bei Datenbank-DB-TSTEPS verwendet werden soll, wenn nichts anderes angegeben wird. Diese wird zu Beginn der seqtrans aus dem CCDB-kontext gelesen. Kann durch eigene Expression mit Vorsicht(!) verändert werden. |- | Variable || this.description_title || Wenn am Beginn der seqtrans diese Variable existiert, wird sie in this.outputmfiledescription übernommen. |- | Variable || this.do_not_rewind || Interne Steuerungsvariable. Wenn true, dann wird die Abarbeitung der transaction sequence verlassen. |- | Variable || this.ds || Interne Steuerungsvariable. |- | Variable || this.dsname || Interne Steuerungsvariable. |- | Variable || this.errcoll || Ein ErrorCollector-Objekt, in dem hintereinander Fehlerinformationen gesammelt werden. Wenn bei der Abarbeitung eines TSTEPs Fehler im ErrorCollector sind, wird die verarbeitung abgebrochen und alle Datenbank-Transaktionen zurückgerollt. |- | Variable || this.final || OBJECT, das bestimmt, was in der "final"-Phase geschehen soll. Wird aus this.query.final übernommen. |- | Variable || this.finalres || Ergebnis der Abarbeitung von this.final |- | Variable || this.fname || Interne Steuerungsvariable. seqtrans setzt diese normalerweise auf "seqtrans", um kompatibel mit anderen CCDB-Abfrage-Funktionen zu sein. |- | Variable || this.force_rollback || wenn gesetzt, werden am Ende der Verarbeitung alle Datenbank-Transaktionen zurückgerollt, egal, ob Fehler in this.errcoll sind oder nicht. | Variable || this.global_pre_result || Ergebnis der letzten Auswertung der Javascript-Expression aus this.query.global_pre_qexpression |- | Variable || this.gosub_target || Interne Steuerungsvariable. |- | Variable || this.goto_target || Interne Steuerungsvariable. |- | Variable || this.have_cond || Interne Steuerungsvariable. Ist true, wenn der aktuelle TSTEP eine Bedingung hat ("if" oder "unless") |- | Variable || this.have_data || Interne Steuerungsvariable. |- | Variable || this.init || OBJECT, das bestimmt, was in der "init"-Phase geschehen soll. Wird aus this.query.init übernommen. |- | Variable || this.initres || Ergebnis der Abarbeitung von this.init |- | Variable || this.inputresult || Ein Result-Objekt, das den Eingabebestand, der von der transaction sequence abgearbeitet wird, beinhaltet. Der jeweils aktuelle Datensatz wird durch this.current_record angezeigt, die Inhalte des aktuellen Datensatzes sind in this.cdata |- | Variable || this.input_mode || Interne Steuerungsvariable. Gibt an, woher das inputresult gelesen werden soll. |- | Variable || this.input_options || Optionen, die zur Steuerung der Verarbeitung des Eingabe-Bestands dienen. Werden aus dem Query-Attribut iput_options übernommen: |- | Variable || this.isdbr || Interne Steuerungsvariable. Wird für DB-Abfrage bei input_mode="SELECT" verwendet. |- | Variable || this.jobdata || Interne Steuerungsvariable. Beinhaltet alle Information über einen auszuführenden Batch-Job |- | Variable || this.jtmfileid || Interne Steuerungsvariable. Managed-File ID der beschreibungsdatei der aktuellen Batch-Job-Type. |- | Variable || this.keepresults || Konfigurationsparameter. Wenn true, werden alle TSTEP-Ergebnisse in this.kept_results aufgehoben und am Ende der seqtrans in der Ergebnisdatei als Arbeitsplatt "KEPT_RESULTS" ausgegeben. |- | Variable || this.labels || Interne Steuerungsvariable. Ein Javascript-OBJECT, ein Attribut für jedes in der seqtrans vorkommende Label. |- | Variable || this.last_result || Ergebnis des letzten TSTEPs. Kann auch in post_qexpression für das Ergebnis der Aktion des aktuellen TSTEPs verwendet werden. |- | Variable || this.last_sql_result || Ergebnis der letzten SQL-Abfrage in einem TSTEP. |- | Variable || this.local || Ein Kontext-Objekt für die aktuelle Abarbeitung einer Subroutine mit GSUB |- | Variable || this.local.params || Parameter, die beim Aufruf von GOSUB der aktuell laufenden Subroutine übergeben wurden |- | Variable || this.maxticksperslice || Anzahl von Ticks (Teil-Schritte in TSteps), die ohne Unterbrechung durchgeführt werden können (wird diese Anzahl überschritten wird die Abarbeitung unterbrochen und nach der Bedienung anderer Vorgänge in der CCDB fortgesetzt). Die Anzahl der Ticks wird in this.tickcounter gezählt. |- | Variable || this.mfileid || Interne Steuerungsvariable. Wird aus this.query.mfileid abgeleitet, wenn inputresult aus einenm MFILE gelesen werden soll. |- | Variable || this.modulename || Interne Informationsvariable. Ist im Allgemeinen "seqtrans", kompatibel mit anderen Modulen der CCDB. |- | Variable || this.named_params || Interne Steuerungsvariable. Temporäre Speicherung von SQL-Parametern. |- | Variable || this.options || Optionen zur Steuerung der Verarbeitung abseits der TSTEPs: |- | Variable || this.outputmfiledescription || In diesem STRING wird am Anfang der seqtrans ein Beschreibungstext für den Gesamt-Outout erstellt. Kann innerhalb der seqtrans geändert werden. Wird am Ende, falls ein Ausgabe-Managed-File erzeugt wird. in dessen DESCRIPTION-Attribut geschrieben. |- | Variable || this.outputresult || Interne Variable. |- | Variable || this.post_result || Ergebnis der letzten Ausführung von this.query.global_post_expression |- | Variable | this.populated_sql
this.populated_sql_oracledb
this.populated_sql_mysql
this.populated_sql_postgresql
| Interne Steuerungsvariable. SQL-Statements der letzten SQL-Abfrage mit ersetzten Platzhaltern |- | Variable || this.protocol || Array, das Protokoll-Ereignisse sammelt. Wenn kein anderes Ergebnis existiert, wird das Protokoll am Ende als Ergebnis der seqtrans geliefert.
Die Funktion this.ppush() schreibt sequentiell in dieses Protokoll. |- | Variable || this.qexpression || letzte/aktuelle abgearbeitete qexpression |- | Variable || this.recnum || Nummer des aktuell bearbeiteten Datensatzes (Index in this.inputresult), beginnend mit 0. |- | Variable || this.recordinfo || Information, die im Log bei verschiedenen Gelegenheiten ausgegeben wird. |- | Variable || this.records_to_process || Anzahl von Datensätzen im Eingabebestand (this.inputresult), die zu verarbeiten sind. Wird am Beginn der Abarbeitung aus this.inputresult ermittelt. |- | Variable || this.recstepcount || Anzahl von TSTEPs, die bisher für den aktuellen Datensatz abgearbeitet wurden. Überschreitet diese den Maximalwert, der in this.options.maxrecsteps festgelegt wird, So wird die Verarbeitung abgebrochen, da eine Endlosschleife vermutet wird. In speziellen Fällen kann diese Schwelle zu niedrig sein, dann muss this.options.maxrecsteps erhöht werden. |- | Variable || this.req || Das ''ExpressJS'' ''Request''-Objekt der aktuellen Abfrage Dieses beinhaltet unter anderem: * this.req.session das ''ExpressJS'' ''Session''-Objekt, unter dem der Benutzer aktuell angemeldet ist |- | Variable || this.resinfo || Interne Variable. |- | Variable || this.result || Wird diese von einem Script gesetzt, so muss sie ein aux.Result sein und wird als Ergebnis der seqtrans geliefert. |- | Variable || this.retctx || Interne Steuerungsvariable. Zwischenspeicher für Inhalte, die von GSUB-STack (this.substack) geholt werden. |- | Variable || this.rev_cond || Interne Steuerungsvariable. Ist true, wenn die letzte TSTEP-Bedingung eine Umkehrung war ("unless") |- | Variable || this.rquid || Eindeutige Kennung genau dieser Durchführung genau dieser seqtrans. |- | Variable || this.runnable || Interne Steuerungsvariable. Wenn true, dann kann die transaction sequence fortgesetzt werden. |- | Variable || this.session || Session-Objekt der Session, in er das aktuelle DQUERY in Form eines transaction sequence ausgeführt wird. In der Session können Informationen über Abfragen hinweg aufgehoben werden |- | Variable || this.setup || OBJECT, das bestimmt, was in der "setup"-Phase geschehen soll. Wird aus this.query.setup übernommen. |- | Variable || this.sqlparams || Interne Steuerungsvariable. STRING. Liste von SQL-Parameter-Platzhaltern. |- | Variable || this.sql_varname || interne Steuerungsvariable. Name der Variablen, aus der das SQL-Statement gelesen werden soll. |- | Variable || this.sql_select || Interne Steuerungsvariable. Wird aus this.query.sql_select gelesen, wenn inputresult aus einer Datenbank gelesen werden soll. |- | Variable || this.stepresult || Ergebnis des letzten ausgeführten TSTEPs |- | Variable || this.stepstate || Interne Steuerungsvariable. Gibt den Zustand an, in dem der aktuelle TSTEP gerade ist. |- | Variable || this.subquery || Interne Steuerungsvariable. Aktuelles/Letztes query Objekt, wenn ein TSTEP vom Typ SUBQUERY abgearbeitet wurde. |- | Variable || this.subquery_endtime || Javascript-Date()-Objekt mit der absoluten Zeit, zu der das letzte SUBQUERY zu Ende gegangen ist. |- | Variable || this.subquery_starttime || Javascript-Date()-Objekt mit der absoluten Zeit, an der das letzte SUBQUERY gestartet wurde. |- | Variable || this.substack || Interne Steuerungsvariable. In diesem Array, das als Stack verwendet wird, werden die lokalen Variablen (this.local) und Rückkehr-TSTEP-Nummern gespeichert. this.local wird bei GOSUB auf diesem Stack gesichert. |- | Variable || this.targetstate || Interne Steuerungsvariable. gibt den TSTEPSTATE an, der nach der Abarbeitung der nächsten aexpression eingenommen werden soll. |- | Variable || this.tickcounter || Anzahl der Ticks (Teil-Schritte von TSTEPs) die schon ohne Unterbrechung durchgeführt wurden. Überschreitet diese Zahl den Schwellwert aus this.maxticksperslice, so wird die Abarbeitung der transaction sequence unterbrochen und nach Bediennug anderer Vorgänge in der CCDB wieder fortgesetzt. |- | Variable || this.timing || Interne Steuerungsvariable. Gibt Laufzeit des letzten SUBQUERY an |- | Variable || this.tstep || Der gerade ausgeführte TSTEP mit allen (aktuellen) Attributen. |- | Variable || this.tstepnum || Nummer des gerade ausgeführten TSTEPs |- | Variable || this.tsteps || Array mit allen TSTEPs der aktuell abgearbeiteten TSTEP-Sequence |- | Variable || this.tsteps_mfileid || Interne Steuerungsvariable. Managed FIle ID, in dem TSTEPs definiert sind. |- | Variable || this.txstate || Interne Steuerungsvariable. |- | Variable || this.wb || Interne Steuerungsvariable. |- | Variable || this.ws || Interne Steuerungsvariable. |- | Variable || this.is_last_record || TRUE, wenn der aktuelle record der letzte im inputresult ist |- | Variable || this.protocol || Verarbeitungsprotokoll. In dieses können mit ppush() (siehe dort) Protokoll-Einträge geschrieben werden. Am Ende der Transaktion wird dann aus dem Protokoll ein lesbares Ergebnis (CCDB-Result) erzeugt und dem Benutzer angezeigt. |- | Variable || this.ppfx || Log/Protokoll-Präfix. Kennzeichnet die aktuell abgearbeitete DQUERY. Wird am Beginn der Abarbeitung von "seqtrans" auf den Wert <funktionsname>(<dataname>) gesetzt und z.B. von phead() oder den Log-Ausgaben der CCDB-App verwendet. |- | Variable || this.progstat | Ein Objekt, dessen Inhalt im Progress-Status der gerade ausgeführten Abfrage in der CCDB-GUI angezeigt wird + Alle Attribute von this.progstat werden angezeigt. Eine "seqtrans"-Konfiguration kann eigene Informations-Felder einfügen + Bereits vorhandene Informations-Felder in this.progstat, die von "seqtrans" aktuell gehalten werden, sind in der Tabelle Attribute von progstat aufgeführt. |- | Variable || this.uparams || interne Steuerungsvariable. ARRAY von Parametern für SQL-Statements. |- | Funktion || this.ppush(<Protokoll-Objekt> || Erstellt einen neuen Eintrag im Verarbeitungsprotokoll |- | Funktion || this.phead(<Kurztext>) || Erzeugt einen String mit der Information, welche CCDB-Funktion mit welchem DQUERY gerade in Abarbeitung ist |- | Funktion || this.getcvar(<VarName>) || Liefert den Inhalt der Kontext-Variable <VarName>. Die Variable wird in der Suchreihenfolge des Kontexts (Siehe auch Kontext und Kontext-Variablen) gesucht. |- | Funktion || this.copycvars(<NamList>) || Kopiert den Inhalt der Attribute aus dem Kontext-Stapel, deren Namen in <NamList> angegeben sind, in den Kontext this. |- | Funktion || this.copyqvars(<NamList>) || Kopiert den Inhalt der Query-Attribute aus this.query, deren Namen in <NamList> angegeben sind, in den Kontext this. |} + ==== Attribute von progstat ==== + {| |- ! Attribut von this.progstat !! Bedeutung |- | this.progstat.ccdb_function || Ist immer seqtrans |- | this.progstat.fname || Ist immer seqtrans, wenn "seqtrans" normal verwendet wird |- | this.progstat.dataname || Die ID der Abfrage, in der "seqtrans" verwendet wird. |- | this.progstat.records_to_process || Die Anzahl der Datensätze im inputresult, die zu bearbeiten sind |- | this.progstat.current_record || Die laufende Nummer des Datensatzes, der gerade bearbeitet wird. Diese beginnt bei 1 und ist immer um 1 höher als this.recnum |- | this.progstat.current_action || Die gerade durchgeführte Aktion in der Bearbeitung des laufenden Datensatzes. Dieses hat im Normalfall 2 Unter-Attribute: + * description: Beschreibungstext, kommt aus this.current_action * status: Ein Status-Objekt, dass von Progress-Status der gerade ausgeführten Aktion geliefert wird. |} wikitext === Kontext und Kontext-Variablen, die von Sequenzen in TSTEPs verwendet werden === + ==== Was ist ein Kontext ==== + Ein Kontext im Sinne von "seqtrans" ist ein Javascript-Objekt, in dem benannte Variablen in Form von Javascript-Attributen des Kontext-Objects gespeichert werden + ==== Welche verschiedenen Kontexte gibt es ==== + Während der Ausführung einer "seqtrans"-Sequenz existieren mehrere Kontexte mit unterschiedlicher Lebensdauer: + Tabelle: bekannte Kontexte in seqtrans {| ! Kontext !!Inhalt !! Lebensdauer |- | this || der gesamte Kontext der Sequenz-Ausführung || gesamte Ausführung der Sequenz, über alle records hinweg |- | this.local || lokaler Kontext einer Subroutine || Ausführung einer Subroutine. Jede Ausführung hat ihren eigenen lokalen Kontext, auch rekursiv |- | this.local.params || Aufruf-Parameter der aktuellen Subroutine || Ausführung der Subroutine |- | this.cdata || Daten des aktuell bearbeiteten records || Bearbeitung eines Records; wird bei jedem Record neu angelegt |} + ==== Kontext-Stapel ==== + Die in der Tabelle angeführten Kontexte sind in einem ''Kontext-Stapel'' zusammengefasst und werden bei der automatischen Suche nach Kontext-Variablen in der umgekehrten Reihenfolge ihres Auftretens in der Tabelle durchsucht. + Eine solche Suche findet statt: + * bei der Auflösung von Platzhaltern @@...@@ * in der Funktion this.getcvar() * in der Funktion this.copycvars()