#
#		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 "<code>END</code>" erkannt wird.</p>
	=== TSTEP ===
	Der kleinste Baustein, der einzeln abgearbeitet wird, ist ein <i>Transaction-Step</i> (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 <a href="TABALLTSTPARAM">Tabelle Parameter für alle TSTEP-Typen</a>.
	|-
	| SQL || SQL-Statement ausführen || Führt ein SQL-Statement in einer Datenbank aus.</p>
		Parameter:
	{|
	! Parameter-Name !! Default-Wert (wenn nicht angegegeben) !! Bedeutung
	|-
	| <code>sql</code> || &nbsp; || SQL-Statement, das ausgeführt werden soll. Kann durch <code>::</code>...<code>::</code> markierte Platzhalter-Namen enthalten. Diese werden bei der Ausführung als SQL-Bind-Variable aus den Kontext-Variablen gleichen Namens ersetzt
	|-
	| <code>cfgname</code>, <code>dbconfigname</code> oder <code>cfgname_varname</code>
	| Aktuelle CCDB-Instanz
	| Gibt an, in welcher Datenbank-Konfiguration das SQL ausgeführt werden soll
	|-
	| <code>named_params</code> || (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 <code>qexpression</code> angegeben, so wird das darin enthaltene Javascript <strong>SYNCHRON</strong> ausgeführt.
		+
		Ist der Parameter <code>aexpression</code> angegeben, so wird das darin enthaltene Javascript <strong>ASYNCHRON</strong> ausgeführt.
		+
		<strong>ASYNCHRON</strong> bedeutet, dass das Javascript mit einem <i>Callback</i> abgeschlossen werden muss.
		+
		Als Callback muss im Fragment <code>this(err,res)</code> aufgerufen werden, wobei <code>err</code>, wenn nicht <code>null</code> einen Fehler signalisiert.
		+
		<code>res</code>kann das Ergebnis der Verarbeitung transportieren. Es wird in der Kontext-Variable <code>stepresult</code> 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 <code>query</code> angegeben. Dieser ist jedoch ein Objekt mit weiteren Attributen, die alle Attributen der DQUERY entsprechen.
		+
		Die Namen der Attibute von <code>query</code> sind daher spezifisch bis auf jede DQUERY-Attribute, die in allen DQUERYs gleich sind. Diese sind in der <a href="TABQUERYPARAM">Tabelle Parameter für TSTEPs der Type SUBQUERY</a>  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 <code>goto</code> oder <code>target</code> angegeben wird.
		Wird das TSTEP-Attribut <code>if</code> oder <code>unless</code> angegeben, so ist der Sprung bedingt: 
		Der Inhalt des TSTEP-Attributs <code>if</code> oder <code>unless</code> wird als Javascript-Ausdruck ausgewertet.
		* Ist das Ergebnis <code>TRUE</code> und das Attribut <code>if</code>, so gilt die Bedingung als gegeben und der Sprung erfolgt.
		* Ist das Ergebnis <code>TRUE</code> und das Attribut <code>unless</code>, so gilt die Bedingung als NICHT gegeben und der Sprung unterbleibt.
		* Ist das Ergebnis <code>FALSE</code> und das Attribut <code>if</code>, so gilt die Bedingung als NICHT gegeben und der Sprung unterbleibt.
		* Ist das Ergebnis <code>FALSE</code> und das Attribut <code>unless</code>, so gilt die Bedingung als gegeben und der Sprung erfolgt.
	|-
	| GOSUB
	| Arbeitet eine TSTEP-Subroutine ab
	| <code>GOSUB</code> funktioniert wie <code>GOTO</code>, nur wird die Rückkehr-TSTEP-Nummer auf einem Stack gespeichert.
	+
	Mit <code>RETURN</code> kann zur Aufrufstelle der Subroutine zurückgekehrt werden.</p>
	+
	<code>GOSUB</code> legt auch einen eigenen Variablen Kontext <code>this.local</code> 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 <code>this.local</code> angelegt werden.
	+
	In  <code>this.local</code> werden auch im Unterbereich <code>this.local.params</code> 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 <code>END</code> erkannt, so wird die Bearbeitung des aktuellen Datensatzes beendet und die Bearbeitung des nächsten Datensatzes mit dem TSTEP mit dem Index 0 begonnen. 
	|}
	+
	==== <a name="TABALLTSTPARAM">Parameter für alle TSTEP-Typen</a> ====
	+
	{|
	! Parameter-Name !! Bedeutung !! Default-Wert (wenn nicht angegegeben)
	|-
	| <code>tstype</code> || Der Typ des TSTEP
	| Wird kein <code>tstype</code> angegeben, so wird er aus eventuell vorhandenen anderen Attributen nach den Regeln in <a href="#TABTSTYPE">Tabelle Regeln für tstype</a> abgeleitet
	|-
	| <code>label</code> || Ist der Parameter <code>label</code> definiert, so hat dieser TSTEP ein Label mit dem Namen des Inhalts des Parameters || Kein Label an diesem TSTEP
	|-
	| <code>pre_qexpression</code> || Ein Javascript-Fragment, das VOR der eigentlichen Durchführung der Aktion des TSTEP ausgeführt wird || kein ausgeführtes Javascript-Fragment
	|-
	| <code>post_qexpression</code> || Ein Javascript-Fragment, das NACH der eigentlichen Durchführung der Aktion des TSTEP ausgeführt wird || kein ausgeführtes Javascript-Fragment
	|-
	| <code>result_varname</code> || Name der Kontext-Variable, in der das Ergebnis der SQL-Abfrage gespeichert werden soll || last_result
	|-
	| <code>then_goto</code>
	| Wenn dieses Attribut gesetzt ist, soll nach der Abarbeitung des TSTEPs zu dem TSTEP mit dem Label gesprungen werden, das als Inhalt von <code>then_goto</code> angegeben wird.
	|-
	| <code>and_then_goto</code>
	| Wenn dieses Attribut gesetzt ist, soll nach der Abarbeitung des TSTEPs zu dem TSTEP mit dem Label gesprungen werden, 
						das als Inhalt von <code>and_then_goto</code> angegeben wird, 
						aber (zum Unterschied zu <code>then_goto</code>) nur, wenn die Bedingung des Schrittes (<code>if</code> oder <code>unless</code>) erfüllt war.
	|}
	+
	==== <a name="TABQUERYPARAM">Parameter für TSTEPs der Type SUBQUERY</a> ====
	+
	{|
	|-
	| <code>dataname</code> || Eindeutige ID der DQUERY, wie in der CCDB konfiguriert
	|-
	| <code>chain_query</code> || Definitions-Objekt eines DQUERY, das nach der Ausführung des aktuellen DQUERY aufgerufen wird
	|
	|}
	+
	==== <a name="TABTSTYPE">Regeln für '''''tstype'''''</a> ====
	+
	{|
	! Ist dieser Parameter vorhanden !! Dann wird als <code>tstype</code> angenommen !! was bedeutet
	|-
	| <code>sql</code></td><td>SQL || Ein SQL-Statement ausführen 
	|-
	| <code>qexpression</code> oder <code>aexpression</code> || JS || Ein Javascript-Fragement ausführen 
	|-
	| <code>query</code> || SUBQUERY || Ein untergeordnetes DQUERY (CCDB-Abfrage) ausführen 
	|-
	| <code>noop</code> || NOOP || Keine Aktion ausführen 
	|-
	| <code>let</code> || LET || (Derzeit nicht definiert) 
	|-
	| <code>goto</code> oder <code>target</code> || GOTO || Zu einem anderen TSTEP (Label) springen 
	|-
	| <code>gosub</code> || GOSUB || Eine Unter-Sequenz von TSTEPs ausführen 
	|-
	| <code>return</code> || RETURN || Aus einer Unter-Sequenz zurückkehren 
	|-
	| <code>end</code> || 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 <code>seqtrans</code>-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 || <code>this</code> || Der Kontext, in dem die ganze transaction sequence ausgeführt wird. Attribute dieses Objekts bleiben über die gesamte Transaktion (alle records) erhalten
	|-
	| Variable || <code>this.act_pending</code> || Interne Steuerungsvariable. Wenn <code>true</code>, dann ist eine asynchrone Aktion aktiv. Erst danach kann die transaction sequence weiterlaufen.
	|-
	| Variable || <code>this.aexpression</code> || 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 <code>this.aexpression_index</code>.
													Die jeweils aktuelle Expression wird dabei in <code>this.current_aexpression</code> gehalten.
													Die Information, ob es eine einzelne oder eine Menge von aexpressions ist, wir in <code>this.multi_aexpression</code> gespeichert.
	|-
	| Variable || <code>this.attributes_to_log</code> || Interne Steuerungsvariable. Ein Attribut für jedes Attribut von <code>this</code>, das im DEBUG-Modus geloggt werden soll.
	|-
	| Variable || <code>this.callback</code> || Interne Steuerungsvariable. FUNCTION, die aufgerufen wird, wenn die <code>seqtrans</code> zu Ende ist.
	|-
	| Variable || <code>this.cdata</code> || 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 || <code>this.cfgname</code> || Interne Steuerungsvariable. Name der zuletzt verwendeten Datenbank-Zugriffskonfiguration.
	|-
	| Variable || <code>this.cond</code> || Interne Steuerungsvariable. Speichert den letzten Stand der Auswertung einer TSTEP-Bedingung ("if" oder "unless")
	|-
	| Variable || <code>this.condition</code> || Interne Steuerungsvariable. Javascript-Text der letzten TSTEP-Bedingung ("if", "unless").
	|-
	| Variable || <code>this.configdata</code> || Interne Steuerungsvariable. OBJECT mit Konfigurationsdaten.
	|-
	| Variable || <code>this.connectionBundle</code> || Interne Steuerungsvariable. Das Datenbank-<code>ConnectionBundle</code> in dem alle Datenbank-Verbindungen gehalten werden.
														Am Ende der transaction sequence werden entweder alle Datenbank-Verbindungen COMMITted oder ROLLBACKed.
	|-
	| Variable || <code>this.current_action</code> || Interne Informationsvariable. Kurzbeschreibung der aktuell bearbeiteten Aktion innerhalb des aktuellen TSTEPs
	|-
	| Variable || <code>this.dataname</code> || Die ID der Abfrage, in der "seqtrans" verwendet wird.
	|-
	| Variable || <code>this.datasets</code> || Interne Steuerungsvariable. Sammelt alle (Result-)Datensätze, die von der <code>seqtrans</code> verwendet werden.
	                                            Zumindest das <code>this.inputresult</code> ist enthalten.
												Ist der <code>this.outputmode</code>="<code>datasets</code>" wird dieses ARRAY als Ergebnis der <code>seqtrans</code> geliefert.
	| Variable || <code>this.dbconn</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.dbconnection</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.dbr</code> || Interne Steuerungsvariable. CCDB-DB-Request-Objekt.
	|-
	| Variable || <code>this.debug</code> || Interne Steuerungsvariable. Wenn <code>true</code>, dann werden Debug-Informationen im CCDB-Log ausgegeben.
												Ist dann gesetzt, wenn in der CCDB Session-Debugging eingeschaltet wird.
												Kann auch von eigenen <code>expressions</code> verwendet werden.
	|-
	| Variable || <code>this.default_cfgname</code> || Name der DB-Zugriffs-Konfiguration, die bei Datenbank-DB-TSTEPS verwendet werden soll, wenn nichts anderes angegeben wird.
														Diese wird zu Beginn der <code>seqtrans</code>  aus dem CCDB-kontext gelesen.
														Kann durch eigene Expression mit Vorsicht(!) verändert werden.
	|-
	| Variable || <code>this.description_title</code> || Wenn am Beginn der <code>seqtrans</code> diese Variable existiert, wird sie
															in <code>this.outputmfiledescription</code> übernommen.
	|-
	| Variable || <code>this.do_not_rewind</code> || Interne Steuerungsvariable. Wenn <code>true</code>, dann wird die Abarbeitung der transaction sequence verlassen.
	|-
	| Variable || <code>this.ds</code> || Interne Steuerungsvariable. 
	|-
	| Variable || <code>this.dsname</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.errcoll</code> || Ein <code>ErrorCollector</code>-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 || <code>this.final</code> || OBJECT, das bestimmt, was in der "final"-Phase geschehen soll. Wird aus <code>this.query.final</code> übernommen.
	|-
	| Variable || <code>this.finalres</code> || Ergebnis der Abarbeitung von <code>this.final</code>
	|-
	| Variable || <code>this.fname</code> || Interne Steuerungsvariable. <code>seqtrans</code> setzt diese normalerweise auf <code>"seqtrans"</code>, um kompatibel mit anderen 
											 CCDB-Abfrage-Funktionen zu sein.
	|-
	| Variable || <code>this.force_rollback</code> || wenn gesetzt, werden am Ende der Verarbeitung alle Datenbank-Transaktionen zurückgerollt, egal, ob Fehler in <code>this.errcoll</code>
	                                                  sind oder nicht.
	| Variable || <code>this.global_pre_result</code> || Ergebnis der letzten Auswertung der Javascript-Expression aus <code>this.query.global_pre_qexpression</code> 
	|-
	| Variable || <code>this.gosub_target</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.goto_target</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.have_cond</code> || Interne Steuerungsvariable. Ist <code>true</code>, wenn der aktuelle TSTEP eine Bedingung hat ("if" oder "unless")
	|-
	| Variable || <code>this.have_data</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.init</code> || OBJECT, das bestimmt, was in der "init"-Phase geschehen soll. Wird aus <code>this.query.init</code> übernommen.
	|-
	| Variable || <code>this.initres</code> || Ergebnis der Abarbeitung von <code>this.init</code>
	|-
	| Variable || <code>this.inputresult</code> || Ein <code>Result</code>-Objekt, das den Eingabebestand, der von der transaction sequence abgearbeitet wird, beinhaltet.
	                                               Der jeweils aktuelle Datensatz wird durch <code>this.current_record</code> angezeigt, 
												   die Inhalte des aktuellen Datensatzes sind in <code>this.cdata</code>
	|-
	| Variable || <code>this.input_mode</code> || Interne Steuerungsvariable. Gibt an, woher das <code>inputresult</code> gelesen werden soll.
	|-
	| Variable || <code>this.input_options</code> || Optionen, die zur Steuerung der Verarbeitung des Eingabe-Bestands dienen. Werden aus dem Query-Attribut iput_options übernommen:
														<ul>
														<li><code>headersInFirstLine</code>, BOOL, erwartet Spaltennamen in erster Zeile</li>
														<li><code>fieldsep</code>, STRING, Trennzeichen zwischen Feldern</li>
														<li><code>quotechar</code>, 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.</li>
														<li><code>csv_readoptions</code>, OBJECT,  Spezielle Optionen für das Lesen von CSV-Dateien:
															<ul>
															<li><code>encoding</code> Name des Eingabe-Zeichen-Encodings</li>
															</ul></li>
														<li><code>rep_function</code>, FUNCTION, Eine Javascript-Funktion, die aufgerufen wird, wenn eine Eingabezeile nicht valide ist</li>
														<li><code>process_startline</code>, NUMBER, Nummer des Datensatzes im <code>inputresult</code>, mit dessen Verarbeitung begonnen wird
														 (von 0 beginnend)</li>
														</ul>
	|-
	| Variable || <code>this.isdbr</code> || Interne Steuerungsvariable. Wird für DB-Abfrage bei input_mode="SELECT" verwendet.
	|-
	| Variable || <code>this.jobdata</code> || Interne Steuerungsvariable. Beinhaltet alle Information über einen auszuführenden Batch-Job
	|-
	| Variable || <code>this.jtmfileid</code> || Interne Steuerungsvariable. Managed-File ID der beschreibungsdatei der aktuellen Batch-Job-Type.
	|-
	| Variable || <code>this.keepresults</code> || Konfigurationsparameter. Wenn <code>true</code>, werden alle TSTEP-Ergebnisse  in <code>this.kept_results</code> aufgehoben und
	                                               am Ende der <code>seqtrans</code> in der Ergebnisdatei als Arbeitsplatt "KEPT_RESULTS" ausgegeben.
	|-
	| Variable || <code>this.labels</code> || Interne Steuerungsvariable. Ein Javascript-OBJECT, ein Attribut für jedes in der <code>seqtrans</code> vorkommende Label.
	|-
	| Variable || <code>this.last_result</code> || Ergebnis des letzten TSTEPs. Kann auch in <code>post_qexpression</code> für das Ergebnis der Aktion des aktuellen TSTEPs verwendet werden.
	|-
	| Variable || <code>this.last_sql_result</code> || Ergebnis der letzten SQL-Abfrage in einem TSTEP.
	|-
	| Variable || <code>this.local</code> || Ein Kontext-Objekt für die aktuelle Abarbeitung einer Subroutine mit <code>GSUB</code>
	|-
	| Variable || <code>this.local.params</code> || Parameter, die beim Aufruf von <code>GOSUB</code> der aktuell laufenden Subroutine übergeben wurden
	|-
	| Variable || <code>this.maxticksperslice</code> || 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 <code>this.tickcounter</code> gezählt.
	|-
	| Variable || <code>this.mfileid</code> || Interne Steuerungsvariable. Wird aus <code>this.query.mfileid</code> abgeleitet, wenn <code>inputresult</code> aus einenm MFILE gelesen werden soll.
	|-
	| Variable || <code>this.modulename</code> || Interne Informationsvariable. Ist im Allgemeinen "seqtrans", kompatibel mit anderen Modulen der CCDB.
	|-
	| Variable || <code>this.named_params</code> || Interne Steuerungsvariable. Temporäre Speicherung von SQL-Parametern.
	|-
	| Variable || <code>this.options</code> || Optionen zur Steuerung der Verarbeitung abseits der TSTEPs:
												<ul>
												<li><code>this.options.maxrecsteps</code> Anzahl der TSTEPs, die pro Record ablaufen dürfen. Vorgabewert in 1000</li>
												<li><code>this.options.maxgosubdepth</code>Maximale Tiefe von GOSUB-Aufrufebenen. Wird diese überschritten,
															so wird die Verarbeitung abgebrochen. Vorgabewert ist 10.</li>
												</ul>
	|-
	| Variable || <code>this.outputmfiledescription</code> || In diesem STRING wird am Anfang der <code>seqtrans</code> ein Beschreibungstext für den Gesamt-Outout erstellt.
	                                                          Kann innerhalb der <code>seqtrans</code> geändert werden.
															  Wird am Ende, falls ein Ausgabe-Managed-File erzeugt wird. in dessen DESCRIPTION-Attribut geschrieben.
	|-
	| Variable || <code>this.outputresult</code> || Interne Variable.
	|-
	| Variable || <code>this.post_result</code> || Ergebnis der letzten Ausführung von <code>this.query.global_post_expression</code>
	|-
	| Variable
	| <code>this.populated_sql</code><br/><code>this.populated_sql_oracledb</code><br/><code>this.populated_sql_mysql</code><br/><code>this.populated_sql_postgresql</code><br/>
	| Interne Steuerungsvariable. SQL-Statements der letzten SQL-Abfrage mit ersetzten Platzhaltern
	|-
	| Variable || <code>this.protocol</code> || Array, das Protokoll-Ereignisse sammelt. Wenn kein anderes Ergebnis existiert, wird das Protokoll am Ende
												als Ergebnis der <code>seqtrans</code> geliefert.<br/>
												Die Funktion <code>this.ppush()</code> schreibt sequentiell in dieses Protokoll.
	|-
	| Variable || <code>this.qexpression</code> || letzte/aktuelle abgearbeitete <code>qexpression</code>
	|-
	| Variable || <code>this.recnum</code> || Nummer des aktuell bearbeiteten Datensatzes (Index in <code>this.inputresult</code>), beginnend mit 0.
	|-
	| Variable || <code>this.recordinfo</code> || Information, die im Log bei verschiedenen Gelegenheiten ausgegeben wird.
	|-
	| Variable || <code>this.records_to_process</code> || Anzahl von Datensätzen im Eingabebestand (<code>this.inputresult</code>), die zu verarbeiten sind.
                                                          Wird am Beginn der Abarbeitung aus <code>this.inputresult</code> ermittelt.	
	|-
	| Variable || <code>this.recstepcount</code> || Anzahl von TSTEPs, die bisher für den aktuellen Datensatz abgearbeitet wurden.
	                                                Überschreitet diese den Maximalwert, der in <code>this.options.maxrecsteps</code> festgelegt wird,
													So wird die Verarbeitung abgebrochen, da eine Endlosschleife vermutet wird.
													In speziellen Fällen kann diese Schwelle zu niedrig sein, dann muss <code>this.options.maxrecsteps</code>
													erhöht werden.
	|-
	| Variable || <code>this.req</code> || Das ''ExpressJS'' ''Request''-Objekt der aktuellen Abfrage
	Dieses beinhaltet unter anderem:
	* <code>this.req.session</code> das ''ExpressJS'' ''Session''-Objekt, unter dem der Benutzer aktuell angemeldet ist
	|-
	| Variable || <code>this.resinfo</code> || Interne Variable.
	|-
	| Variable || <code>this.result</code> || Wird diese von einem Script gesetzt, so muss sie ein <code>aux.Result</code> sein und wird als Ergebnis der <code>seqtrans</code> geliefert.
	|-
	| Variable || <code>this.retctx</code> || Interne Steuerungsvariable. Zwischenspeicher für Inhalte, die von GSUB-STack (this.substack) geholt werden.
	|-
	| Variable || <code>this.rev_cond</code> || Interne Steuerungsvariable. Ist <code>true</code>, wenn die letzte TSTEP-Bedingung eine Umkehrung war ("unless")
	|-
	| Variable || <code>this.rquid</code> || Eindeutige Kennung genau dieser Durchführung genau dieser <code>seqtrans</code>.
	|-
	| Variable || <code>this.runnable</code> || Interne Steuerungsvariable. Wenn <code>true</code>, dann kann die transaction sequence fortgesetzt werden.
	|-
	| Variable || <code>this.session</code> || Session-Objekt der Session, in er das aktuelle DQUERY in Form eines transaction sequence ausgeführt wird.
												In der <code>Session</code> können Informationen über Abfragen hinweg aufgehoben werden
	|-
	| Variable || <code>this.setup</code> || OBJECT, das bestimmt, was in der "setup"-Phase geschehen soll. Wird aus <code>this.query.setup</code> übernommen.
	|-
	| Variable || <code>this.sqlparams</code> || Interne Steuerungsvariable. STRING. Liste von SQL-Parameter-Platzhaltern.
	|-
	| Variable || <code>this.sql_varname</code> || interne Steuerungsvariable. Name der Variablen, aus der das SQL-Statement gelesen werden soll.
	|-
	| Variable || <code>this.sql_select</code> || Interne Steuerungsvariable. Wird aus <code>this.query.sql_select</code> gelesen, wenn <code>inputresult</code> aus einer Datenbank gelesen werden soll.
	|-
	| Variable || <code>this.stepresult</code> || Ergebnis des letzten ausgeführten TSTEPs
	|-
	| Variable || <code>this.stepstate</code> || Interne Steuerungsvariable. Gibt den Zustand an, in dem der aktuelle TSTEP gerade ist.
	|-
	| Variable || <code>this.subquery</code> || Interne Steuerungsvariable. Aktuelles/Letztes <code>query</code> Objekt, wenn ein TSTEP vom Typ SUBQUERY abgearbeitet wurde.
	|-
	| Variable || <code>this.subquery_endtime</code> || Javascript-Date()-Objekt mit der absoluten Zeit, zu der das letzte SUBQUERY zu Ende gegangen ist.
	|-
	| Variable || <code>this.subquery_starttime</code> || Javascript-Date()-Objekt mit der absoluten Zeit, an der das letzte SUBQUERY gestartet wurde.
	|-
	| Variable || <code>this.substack</code> || Interne Steuerungsvariable. In diesem Array, das als Stack verwendet wird, 
												werden die lokalen Variablen (<code>this.local</code>) und Rückkehr-TSTEP-Nummern gespeichert.
	                                            <code>this.local</code> wird bei GOSUB auf diesem Stack gesichert.
	|-
	| Variable || <code>this.targetstate</code> || Interne Steuerungsvariable. gibt den TSTEPSTATE an, der nach der Abarbeitung der nächsten <code>aexpression</code> eingenommen werden soll.
	|-
	| Variable || <code>this.tickcounter</code> || Anzahl der Ticks (Teil-Schritte von TSTEPs) die schon ohne Unterbrechung durchgeführt wurden.
													Überschreitet diese Zahl den Schwellwert aus <code>this.maxticksperslice</code>, so wird die
													Abarbeitung der transaction sequence unterbrochen und nach Bediennug anderer Vorgänge in der CCDB
													wieder fortgesetzt.
	|-
	| Variable || <code>this.timing</code> || Interne Steuerungsvariable. Gibt Laufzeit des letzten SUBQUERY an
	|-
	| Variable || <code>this.tstep</code> || Der gerade ausgeführte TSTEP mit allen (aktuellen) Attributen.
	|-
	| Variable || <code>this.tstepnum</code> || Nummer des gerade ausgeführten TSTEPs
	|-
	| Variable || <code>this.tsteps</code> || Array mit allen TSTEPs der aktuell abgearbeiteten TSTEP-Sequence
	|-
	| Variable || <code>this.tsteps_mfileid</code> || Interne Steuerungsvariable. Managed FIle ID, in dem TSTEPs definiert sind.
	|-
	| Variable || <code>this.txstate</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.wb</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.ws</code> || Interne Steuerungsvariable.
	|-
	| Variable || <code>this.is_last_record</code> || TRUE, wenn der aktuelle record der letzte im inputresult ist
	|-
	| Variable || <code>this.protocol</code> || 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 || <code>this.ppfx</code> || Log/Protokoll-Präfix. Kennzeichnet die aktuell abgearbeitete DQUERY. Wird am Beginn der Abarbeitung von "seqtrans" auf den Wert
					<code>&lt;funktionsname&gt;(&lt;dataname&gt;)</code> gesetzt und z.B. von <code>phead()</code> oder den Log-Ausgaben der CCDB-App verwendet.
	|-
	| Variable || <code>this.progstat</code>
	| Ein Objekt, dessen Inhalt im Progress-Status der gerade ausgeführten Abfrage in der CCDB-GUI angezeigt wird
	+
	Alle Attribute von <code>this.progstat</code> werden angezeigt. Eine "seqtrans"-Konfiguration kann eigene Informations-Felder einfügen
	+
	Bereits vorhandene Informations-Felder in <code>this.progstat</code>, die von "seqtrans" aktuell gehalten werden, sind in der Tabelle <a href="#TABPROGSTAT">Attribute von progstat</a> aufgeführt.
	|-
	| Variable || <code>this.uparams</code> || interne Steuerungsvariable. ARRAY von Parametern für SQL-Statements.
	|-
	| Funktion || <code>this.ppush(&lt;Protokoll-Objekt&gt;</code> || Erstellt einen neuen Eintrag im Verarbeitungsprotokoll
	|-
	| Funktion || <code>this.phead(<i>&lt;Kurztext&gt;</i>)</code> || Erzeugt einen String mit der Information, welche CCDB-Funktion mit welchem DQUERY gerade in Abarbeitung ist
	|-
	| Funktion || <code>this.getcvar(<i>&lt;VarName&gt;</i>)</code> || Liefert den Inhalt der Kontext-Variable <code><i>&lt;VarName&gt;</i></code>. 
			Die Variable wird in der Suchreihenfolge des Kontexts (Siehe auch <a href="#CHAPCTX">Kontext und Kontext-Variablen</a>) gesucht.
	|-
	| Funktion || <code>this.copycvars(<i>&lt;NamList&gt;</i>)</code> || Kopiert den Inhalt der Attribute aus dem <a href="#CTXSTACK">Kontext-Stapel</a>, deren Namen in <code><i>&lt;NamList&gt;</i></code> angegeben sind, in den Kontext <code>this</code>.
	|-
	| Funktion || <code>this.copyqvars(<i>&lt;NamList&gt;</i>)</code> || Kopiert den Inhalt der Query-Attribute aus <code>this.query</code>, deren Namen in <code><i>&lt;NamList&gt;</i></code> angegeben sind, in den Kontext <code>this</code>.
	|}
	+
	==== <a name="TABPROGSTAT">Attribute von <code>progstat</code></a> ====
	+
	{|
	|-
	! Attribut von <code>this.progstat</code> !! Bedeutung
	|-
	| <code>this.progstat.ccdb_function</code> || Ist immer <code>seqtrans</code>
	|-
	| <code>this.progstat.fname</code> || Ist immer <code>seqtrans</code>, wenn "seqtrans" normal verwendet wird
	|-
	| <code>this.progstat.dataname</code> || Die ID der Abfrage, in der "seqtrans" verwendet wird.
	|-
	| <code>this.progstat.records_to_process</code> || Die Anzahl der Datensätze im <code>inputresult</code>, die zu bearbeiten sind
	|-
	| <code>this.progstat.current_record</code> || Die laufende Nummer des Datensatzes, der gerade bearbeitet wird. Diese beginnt bei 1 und ist immer um 1 höher als <code>this.recnum</code>
	|-
	| <code>this.progstat.current_action</code> || Die gerade durchgeführte Aktion in der Bearbeitung des laufenden Datensatzes. Dieses hat im Normalfall 2 Unter-Attribute:
	+
	* <code>description</code>: Beschreibungstext, kommt aus <code>this.current_action</code></li>
	* <code>status</code>: Ein Status-Objekt, dass von Progress-Status der gerade ausgeführten Aktion geliefert wird.</li>
	|}

	
wikitext
	=== <a name="CHAPCTX"> Kontext und Kontext-Variablen, die von Sequenzen in TSTEPs verwendet werden </a> ===
	+
	==== 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:
	+
	<a name="TABCTXLIST">Tabelle: bekannte Kontexte in <code>seqtrans</code></a>
	{|
	! Kontext !!Inhalt !! Lebensdauer
	|-
	| <code>this</code> || der gesamte Kontext der Sequenz-Ausführung || gesamte Ausführung der Sequenz, über alle records hinweg
	|-
	| <code>this.local</code> || lokaler Kontext einer Subroutine || Ausführung einer Subroutine. Jede Ausführung hat ihren eigenen lokalen Kontext, auch rekursiv
	|-
	| <code>this.local.params</code> || Aufruf-Parameter der aktuellen Subroutine || Ausführung der Subroutine
	|-
	| <code>this.cdata</code> || Daten des aktuell bearbeiteten records || Bearbeitung eines Records; wird bei jedem Record neu angelegt
	|}
	+
	==== <a name="CTXSTACK">Kontext-Stapel</a> ====
	+
	Die in der <a href="#TABCTXLIST">Tabelle</a> 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 <code>@@</code>...<code>@@</code>
	* in der Funktion <code>this.getcvar()</code>
	* in der Funktion <code>this.copycvars()</code>
	