#
# 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+""+mrk+">";
};
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.
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.
+
res
kann 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
|-
| sql
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:
headersInFirstLine
, BOOL, erwartet Spaltennamen in erster Zeilefieldsep
, STRING, Trennzeichen zwischen Feldernquotechar
, STRING, Zeichen, das zum Quoting von Strings in CSV-Dateien erwartet wird.
Wenn es nicht angegeben wird, wird kein Quotung erwartet. Eingabedateien, die trotzdem Quotng verwenden werden so verarbeitet,
dass die Quoting-Zeichen in den Daten aufscheinen.csv_readoptions
, OBJECT, Spezielle Optionen für das Lesen von CSV-Dateien:
encoding
Name des Eingabe-Zeichen-Encodingsrep_function
, FUNCTION, Eine Javascript-Funktion, die aufgerufen wird, wenn eine Eingabezeile nicht valide istprocess_startline
, NUMBER, Nummer des Datensatzes im inputresult
, mit dessen Verarbeitung begonnen wird
(von 0 beginnend)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:
this.options.maxrecsteps
Anzahl der TSTEPs, die pro Record ablaufen dürfen. Vorgabewert in 1000this.options.maxgosubdepth
Maximale Tiefe von GOSUB-Aufrufebenen. Wird diese überschritten,
so wird die Verarbeitung abgebrochen. Vorgabewert ist 10.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
this.protocol
|| Array, das Protokoll-Ereignisse sammelt. Wenn kein anderes Ergebnis existiert, wird das Protokoll am Ende
als Ergebnis der seqtrans
geliefert.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()