diff --git a/aliasDefinition/Data_alias/indexsearchgroups/org/query.js b/aliasDefinition/Data_alias/indexsearchgroups/org/query.js index 8bbe4d9089995e3e5e9058f1032c487a9ad440e9..9d0a11b8f66b5ae37ee94f54dad666fca6cf94d0 100644 --- a/aliasDefinition/Data_alias/indexsearchgroups/org/query.js +++ b/aliasDefinition/Data_alias/indexsearchgroups/org/query.js @@ -11,7 +11,7 @@ if (vars.exists("$local.idvalue")) { queryCondition = "where RELATION.RELATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')"; //TODO: refactor this for incremental indexer (injections?) } -sqlHelper = new LegacySqlUtils(); +sqlHelper = new SqlMaskingUtils(); sqlQuery = "select RELATION.RELATIONID " + "," + sqlHelper.concat(["ORG.NAME", "ORG.CUSTOMERCODE"]) + " as TITLECOLUMN " diff --git a/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js b/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js index 5a04df238226750feec62189ff427cdfded43419..6e9f395aeaa859d1920d18b34b5b6721d63417fe 100644 --- a/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js +++ b/aliasDefinition/Data_alias/indexsearchgroups/pers/query.js @@ -10,7 +10,7 @@ if (vars.exists("$local.idvalue")) { queryCondition = "where RELATION.RELATIONID in ('" + affectedIds.map(function (v){return db.quote(v);}).join("', '") + "')"; //TODO: refactor this for incremental indexer (injections?) } -sqlHelper = new LegacySqlUtils(); +sqlHelper = new SqlMaskingUtils(); sqlQuery = "select RELATION.RELATIONID " + "," + sqlHelper.concat(["PERS.SALUTATION", "PERS.FIRSTNAME", "PERS.LASTNAME", "ORG.NAME"]) + " as TITLECOLUMN " diff --git a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod index 594d4d983fab74ae08569fd401fba390cb79bdf5..be50f629bd7f79c7a9bb99ae7856c715e174db2e 100644 --- a/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod +++ b/aliasDefinition/_____SYSTEMALIAS/_____SYSTEMALIAS.aod @@ -221,6 +221,7 @@ </entityDb> <entityDb> <name>ASYS_BINARIES</name> + <idColumn>ID</idColumn> <auditSyncConfig> <name>auditSyncConfig</name> </auditSyncConfig> @@ -230,9 +231,9 @@ <dbName></dbName> <primaryKey v="false" /> <columnType v="2004" /> - <size v="0" /> + <size v="2147483647" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -245,7 +246,7 @@ <columnType v="12" /> <size v="31" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -256,9 +257,9 @@ <dbName></dbName> <primaryKey v="false" /> <columnType v="-5" /> - <size v="0" /> + <size v="19" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -269,9 +270,9 @@ <dbName></dbName> <primaryKey v="false" /> <columnType v="93" /> - <size v="0" /> - <scale v="0" /> - <notNull v="true" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -282,9 +283,9 @@ <dbName></dbName> <primaryKey v="false" /> <columnType v="93" /> - <size v="0" /> - <scale v="0" /> - <notNull v="true" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -297,7 +298,7 @@ <columnType v="12" /> <size v="127" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -310,7 +311,7 @@ <columnType v="12" /> <size v="127" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -323,9 +324,9 @@ <columnType v="1" /> <size v="36" /> <scale v="0" /> - <notNull v="false" /> + <notNull v="true" /> <isUnique v="true" /> - <index v="true" /> + <index v="false" /> <title></title> <description></description> </entityFieldDb> @@ -336,7 +337,7 @@ <columnType v="12" /> <size v="255" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -349,7 +350,7 @@ <columnType v="12" /> <size v="127" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -362,7 +363,7 @@ <columnType v="12" /> <size v="1024" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -373,9 +374,9 @@ <dbName></dbName> <primaryKey v="false" /> <columnType v="2004" /> - <size v="0" /> + <size v="2147483647" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -388,7 +389,7 @@ <columnType v="1" /> <size v="36" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="true" /> <title></title> @@ -401,7 +402,7 @@ <columnType v="12" /> <size v="127" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -414,7 +415,7 @@ <columnType v="12" /> <size v="63" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> @@ -427,7 +428,7 @@ <columnType v="12" /> <size v="63" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <title></title> diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..d13fd870d73963389cb4e43531a032746547adde --- /dev/null +++ b/entity/Document_entity/Document_entity.aod @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> + <name>Document_entity</name> + <title>Document</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <recordContainerType>JDITO</recordContainerType> + <caption>Document</caption> + <iconId>VAADIN:FILE</iconId> + <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias> + <fields> + <element>UID</element> + <element>FILENAME</element> + <element>UPLOAD</element> + </fields> + <contentProcess>%aditoprj%/entity/Document_entity/contentProcess.js</contentProcess> + <onInsert>%aditoprj%/entity/Document_entity/onInsert.js</onInsert> + <onUpdate>%aditoprj%/entity/Document_entity/onUpdate.js</onUpdate> + <entityFields> + <entityIncomingField> + <name>#INCOMING</name> + </entityIncomingField> + <entityField> + <name>NAME</name> + <fieldName>FILENAME</fieldName> + <caption>Dateiname</caption> + <valueProcess>%aditoprj%/entity/Document_entity/entityfields/name/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>TYPE</name> + <caption>Dateityp</caption> + </entityField> + <entityField> + <name>SIZE</name> + <caption>Dateigröße</caption> + </entityField> + <entityField> + <name>DATE_NEW</name> + <caption>Datum</caption> + <contentType>DATE</contentType> + </entityField> + <entityField> + <name>PREVIEW</name> + <caption>Vorschau</caption> + <contentType>IMAGE</contentType> + <state>READONLY</state> + </entityField> + <entityIncomingField> + <name>OrgDocument_dfi</name> + <fieldType>DEPENDENCY_IN</fieldType> + <dependencies> + <entityDependency> + <name>a6870a73-171b-4060-960c-8cc53ea558ae</name> + <entityName>Org_entity</entityName> + <fieldName>OrgDocument_dfo</fieldName> + <isOutgoing v="false" /> + </entityDependency> + </dependencies> + </entityIncomingField> + <entityField> + <name>BINDATA_UPLOAD</name> + <fieldName>UPLOAD</fieldName> + <caption>Datei</caption> + <contentType>FILE</contentType> + <defaultAction>%aditoprj%/entity/Document_entity/entityfields/bindata_upload/defaultAction.js</defaultAction> + </entityField> + <entityActionGroup> + <name>myActions</name> + <children> + <entityActionField> + <name>downloadAction</name> + <fieldType>ACTION</fieldType> + <iconId>VAADIN:DOWNLOAD</iconId> + </entityActionField> + </children> + </entityActionGroup> + <entityParameter> + <name>AssignmentTable_param</name> + <expose v="true" /> + <triggerRecalculation v="false" /> + <description>PARAMETER</description> + </entityParameter> + <entityParameter> + <name>AssignmentName_param</name> + <expose v="true" /> + <triggerRecalculation v="false" /> + <description>PARAMETER</description> + </entityParameter> + <entityParameter> + <name>AssignmentRowId_param</name> + <expose v="true" /> + <triggerRecalculation v="false" /> + <description>PARAMETER</description> + </entityParameter> + <entityIncomingField> + <name>PersDocument_dfi</name> + <fieldType>DEPENDENCY_IN</fieldType> + <dependencies> + <entityDependency> + <name>b312a3cc-2689-4bf6-8a83-85f0c21ae61e</name> + <entityName>Pers_entity</entityName> + <fieldName>PersDocument_dfo</fieldName> + <isOutgoing v="false" /> + </entityDependency> + </dependencies> + </entityIncomingField> + </entityFields> +</entity> diff --git a/entity/Document_entity/contentProcess.js b/entity/Document_entity/contentProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a5a8e9e1090631debca790599e7b29dcf6fa8c9f --- /dev/null +++ b/entity/Document_entity/contentProcess.js @@ -0,0 +1,17 @@ +import("system.logging"); +import("system.vars"); +import("system.result"); +import("system.db"); + +if(vars.exists("$param.AssignmentTable_param") && + vars.exists("$param.AssignmentName_param") && + vars.exists("$param.AssignmentRowId_param")) +{ + var assignmentTable = vars.get("$param.AssignmentTable_param"); + var assignmentName = vars.get("$param.AssignmentName_param"); + var assignmentRowId = vars.get("$param.AssignmentRowId_param"); + var alias = db.getCurrentAlias(); + + //logging.log("contentProcess -> table: " + assignmentTable + " name: " + assignmentName + " id: " + assignmentRowId); + //logging.log(db.getBinaryMetadata(assignmentTable, assignmentName, assignmentRowId, false, alias)); +} diff --git a/entity/Document_entity/entityfields/bindata_upload/defaultAction.js b/entity/Document_entity/entityfields/bindata_upload/defaultAction.js new file mode 100644 index 0000000000000000000000000000000000000000..2822624e944f56efe058139e54e0b97775d664d4 --- /dev/null +++ b/entity/Document_entity/entityfields/bindata_upload/defaultAction.js @@ -0,0 +1,2 @@ +import("system.logging"); +logging.log("document default action"); \ No newline at end of file diff --git a/entity/Document_entity/onInsert.js b/entity/Document_entity/onInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..120dccd76d38d59419791d393f6246fd0a3adc65 --- /dev/null +++ b/entity/Document_entity/onInsert.js @@ -0,0 +1,13 @@ +import("system.logging"); +import("system.db"); +import("system.vars"); + +var assignmentTable = vars.get("$param.AssignmentTable_param"); +var assignmentName = vars.get("$param.AssignmentName_param"); +var assignmentRowId = vars.get("$param.AssignmentRowId_param"); +var bindata = vars.get("$field.BINDATA_UPLOAD"); +var filename = vars.get("$field.NAME"); +var alias = db.getCurrentAlias(); + +//logging.log("onInsert -> table: " + assignmentTable + " name: " + assignmentName + " id: " + assignmentRowId + " filename: " + filename); +//db.insertBinary(assignmentTable, assignmentName, assignmentRowId, "", bindata, filename, "", "", alias); diff --git a/entity/Document_entity/onUpdate.js b/entity/Document_entity/onUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/entity/History_entity/History_entity.aod b/entity/History_entity/History_entity.aod index 28ac88a64b1f8da37ccf53a89dee1f8205b61126..e55567e1bc5c4dd254cb1f07cd4200908647e857 100644 --- a/entity/History_entity/History_entity.aod +++ b/entity/History_entity/History_entity.aod @@ -19,6 +19,7 @@ <columnName>DIRECTION</columnName> <caption>Direction</caption> <possibleItemsProcess>%aditoprj%/entity/History_entity/entityfields/direction/possibleItemsProcess.js</possibleItemsProcess> + <groupable v="true" /> </entityField> <entityField> <name>ENTRYDATE</name> @@ -28,6 +29,7 @@ <contentType>DATE</contentType> <resolution>DAY</resolution> <mandatory v="true" /> + <groupable v="true" /> </entityField> <entityField> <name>HISTORYID</name> @@ -49,6 +51,7 @@ <caption>Medium</caption> <mandatory v="false" /> <possibleItemsProcess>%aditoprj%/entity/History_entity/entityfields/medium/possibleItemsProcess.js</possibleItemsProcess> + <groupable v="true" /> </entityField> <entityField> <name>SUBJECT</name> @@ -56,6 +59,7 @@ <columnName>SUBJECT</columnName> <caption>Subject</caption> <mandatory v="true" /> + <groupable v="true" /> </entityField> <entityIncomingField> <name>OrgHistory_dfi</name> diff --git a/entity/History_entity/conditionProcess.js b/entity/History_entity/conditionProcess.js index 495433af6a8a50ac19b381fb3034f96b9e1502b2..9df40aadc1bafa81ac5ba922c8c94a9a385f64bc 100644 --- a/entity/History_entity/conditionProcess.js +++ b/entity/History_entity/conditionProcess.js @@ -4,27 +4,13 @@ import("system.result"); import("system.logging"); import("Sql_lib"); -var rowId, conditionStr, preparedValues - ,sqlHelper; -conditionStr = ""; -preparedValues = []; -sqlHelper = new LegacySqlUtils(); +var rowId, cond, preparedValues, sqlHelper; +cond = new SqlCondition(); -if ((rowId = vars.getString("$param.RowId_param"))){ - conditionStr += " and HISTORYLINK.ROW_ID = ? "; - preparedValues.push([rowId, sqlHelper.getSingleColumnType("HISTORYLINK.ROW_ID")]); - +rowId = vars.getString("$param.RowId_param"); +if (rowId){ + cond.andPrepare("HISTORYLINK.ROW_ID", "# = ?", rowId); } -//TODO; add OBJECT_ID (probably another param) -//conditionStr += " and HISTORYLINK.OBJECT_ID = ? " -//preparedValues.push(["1", sqlHelper.getSingleColumnType("HISTORYLINK.OBJECT_ID")]); - -if (conditionStr){ - conditionStr = " 1 = 1 " + conditionStr; - result.string(db.translateCondition([conditionStr, preparedValues])); -} -else - result.string("1 = 1"); -//TODO: use the preparedStatemenet when available: -//result.object([conditionStr, preparedValues]); \ No newline at end of file +//TODO: use a preparedCondition when available +result.string(db.translateCondition([cond.toString("1 = 1"), cond.preparedValues])); \ No newline at end of file diff --git a/entity/History_entity/entityfields/icon/valueProcess.js b/entity/History_entity/entityfields/icon/valueProcess.js index 4d1c6b169de486104235d26a7ca3f1155bd5fad5..1b79490f997310b7f45167662e936c10269fa77d 100644 --- a/entity/History_entity/entityfields/icon/valueProcess.js +++ b/entity/History_entity/entityfields/icon/valueProcess.js @@ -2,4 +2,22 @@ import("system.vars"); import("system.result"); import("system.neon"); -result.string("NEON:HISTORY"); \ No newline at end of file +var medium = vars.getString("$field.MEDIUM"); + +switch (medium) { + case "0": + result.string("VAADIN:PHONE"); + break; + case "1": + result.string("VAADIN:AT"); + break; + case "2": + result.string("VAADIN:PHONE"); + break; + case "3": + result.string("VAADIN:LINK"); + break; + default: + result.string("NEON:HISTORY"); + break; +} \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js index ece8c2eca10356f471b5d9013c36208311b4a7b6..f9ee3edbce8cc8b3c6e8e7c65b6f7f3e59087e3f 100644 --- a/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js +++ b/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js @@ -4,8 +4,8 @@ import("system.db"); import("Sql_lib"); //TODO: change field to lookup field -var sqlUtils = new LegacySqlUtils(); -var prodsSql = "select PRODUCTID, " + sqlUtils.concat(["PRODUCTCODE", "'/'", "PRODUCTNAME"]) +var sqlUtils = new SqlMaskingUtils(); +var prodsSql = "select PRODUCTID, " + sqlUtils.concat(["PRODUCTCODE", "PRODUCTNAME"], "/") + " from PRODUCT"; var prods = db.table(prodsSql); diff --git a/entity/Org_entity/Org_entity.aod b/entity/Org_entity/Org_entity.aod index 857f8573e8b1395215ce18af443c5a5049fcc7da..b8cd216f8075b935f50fd3d7375d704bd11a37a7 100644 --- a/entity/Org_entity/Org_entity.aod +++ b/entity/Org_entity/Org_entity.aod @@ -3,13 +3,13 @@ <name>Org_entity</name> <title>Company</title> <majorModelMode>DISTRIBUTED</majorModelMode> - <alias>Data_alias</alias> - <fromClauseProcess>%aditoprj%/entity/Org_entity/fromClauseProcess.js</fromClauseProcess> <recordContainerType>DB</recordContainerType> <caption>Company</caption> <captionProcess>%aditoprj%/entity/Org_entity/captionProcess.js</captionProcess> <iconId>VAADIN:BUILDING</iconId> <imageProcess>%aditoprj%/entity/Org_entity/imageProcess.js</imageProcess> + <alias>Data_alias</alias> + <fromClauseProcess>%aditoprj%/entity/Org_entity/fromClauseProcess.js</fromClauseProcess> <entityFields> <entityField> <name>CUSTOMERCODE</name> @@ -273,10 +273,12 @@ <entityParameter> <name>RelId_param</name> <code>%aditoprj%/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> <entityParameter> <name>MediumCategoriesFilter_param</name> <code>%aditoprj%/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> </children> </entityOutgoingField> @@ -293,10 +295,12 @@ <entityParameter> <name>RelId_param</name> <code>%aditoprj%/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> <entityParameter> <name>MediumCategoriesFilter_param</name> <code>%aditoprj%/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> </children> </entityOutgoingField> @@ -313,10 +317,12 @@ <entityParameter> <name>RelId_param</name> <code>%aditoprj%/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> <entityParameter> <name>MediumCategoriesFilter_param</name> <code>%aditoprj%/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> </children> </entityOutgoingField> @@ -371,6 +377,30 @@ <entityIncomingField> <name>#INCOMING</name> </entityIncomingField> + <entityOutgoingField> + <name>OrgDocument_dfo</name> + <title>Dokumente</title> + <fieldType>DEPENDENCY_OUT</fieldType> + <dependency> + <name>dependency</name> + <entityName>Document_entity</entityName> + <fieldName>OrgDocument_dfi</fieldName> + </dependency> + <children> + <entityParameter> + <name>AssignmentName_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentname_param/code.js</code> + </entityParameter> + <entityParameter> + <name>AssignmentRowId_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentrowid_param/code.js</code> + </entityParameter> + <entityParameter> + <name>AssignmentTable_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmenttable_param/code.js</code> + </entityParameter> + </children> + </entityOutgoingField> </entityFields> <linkInformation> <linkInformation> diff --git a/entity/Org_entity/entityfields/image/valueProcess.js b/entity/Org_entity/entityfields/image/valueProcess.js index c88b7ab04f19f1ebdbb7cfbd189709d3fcd9cbfe..7896c3cd246fda2c07b795aeb228a5d7dad45582 100644 --- a/entity/Org_entity/entityfields/image/valueProcess.js +++ b/entity/Org_entity/entityfields/image/valueProcess.js @@ -1,4 +1,17 @@ import("system.vars"); +import("system.db"); import("system.result"); +import("system.neon"); -result.string("TEXT:" + vars.getString("$field.NAME")); \ No newline at end of file +var base64_gfk = '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' +var orgId = vars.getString("$field.ORGID"); + +switch (orgId) { + case "328b8a8b-c053-447a-bc69-17965b6a60ae": + result.string(base64_gfk); + break; + + default: + result.string("TEXT:" + vars.getString("$field.NAME")); + break; +} \ No newline at end of file diff --git a/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentname_param/code.js b/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentname_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..3e4bf7585b2ca4628118e46818683fc51bfcf1c5 --- /dev/null +++ b/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentname_param/code.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.string("DOCUMENT"); \ No newline at end of file diff --git a/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentrowid_param/code.js b/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentrowid_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..aa257b8b78ed72ce888626a9fa22a890e3c9bf17 --- /dev/null +++ b/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmentrowid_param/code.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$field.RELATIONID")); \ No newline at end of file diff --git a/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmenttable_param/code.js b/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmenttable_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..12bc7590c1bd654d67409332f165b2f7a0cd24b6 --- /dev/null +++ b/entity/Org_entity/entityfields/orgdocument_dfo/children/assignmenttable_param/code.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.string("RELATION"); \ No newline at end of file diff --git a/entity/Pers_entity/Pers_entity.aod b/entity/Pers_entity/Pers_entity.aod index 7ba81324c95c5f13253287e500ab38498461299f..7742c30a61227a250767a0e0c1c567076102c33b 100644 --- a/entity/Pers_entity/Pers_entity.aod +++ b/entity/Pers_entity/Pers_entity.aod @@ -3,14 +3,14 @@ <name>Pers_entity</name> <title>Contact</title> <majorModelMode>DISTRIBUTED</majorModelMode> - <alias>Data_alias</alias> - <fromClauseProcess>%aditoprj%/entity/Pers_entity/fromClauseProcess.js</fromClauseProcess> - <conditionProcess>%aditoprj%/entity/Pers_entity/conditionProcess.js</conditionProcess> <recordContainerType>DB</recordContainerType> <caption>Contact</caption> <captionProcess>%aditoprj%/entity/Pers_entity/captionProcess.js</captionProcess> <iconId>VAADIN:USERS</iconId> <imageProcess>%aditoprj%/entity/Pers_entity/imageProcess.js</imageProcess> + <alias>Data_alias</alias> + <fromClauseProcess>%aditoprj%/entity/Pers_entity/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/Pers_entity/conditionProcess.js</conditionProcess> <entityFields> <entityField> <name>DATEOFBIRTH</name> @@ -300,10 +300,12 @@ <entityParameter> <name>RelId_param</name> <code>%aditoprj%/entity/Pers_entity/entityfields/perscommphone_dfo/children/relid_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> <entityParameter> <name>MediumCategoriesFilter_param</name> <code>%aditoprj%/entity/Pers_entity/entityfields/perscommphone_dfo/children/mediumcategoriesfilter_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> </children> </entityOutgoingField> @@ -320,10 +322,12 @@ <entityParameter> <name>RelId_param</name> <code>%aditoprj%/entity/Pers_entity/entityfields/perscommemail_dfo/children/relid_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> <entityParameter> <name>MediumCategoriesFilter_param</name> <code>%aditoprj%/entity/Pers_entity/entityfields/perscommemail_dfo/children/mediumcategoriesfilter_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> </children> </entityOutgoingField> @@ -340,10 +344,12 @@ <entityParameter> <name>RelId_param</name> <code>%aditoprj%/entity/Pers_entity/entityfields/perscommothers_dfo/children/relid_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> <entityParameter> <name>MediumCategoriesFilter_param</name> <code>%aditoprj%/entity/Pers_entity/entityfields/perscommothers_dfo/children/mediumcategoriesfilter_param/code.js</code> + <triggerRecalculation v="true" /> </entityParameter> </children> </entityOutgoingField> @@ -402,6 +408,30 @@ <mandatory v="true" /> <possibleItemsProcess>%aditoprj%/entity/Pers_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess> </entityField> + <entityOutgoingField> + <name>PersDocument_dfo</name> + <title>Dokumente</title> + <fieldType>DEPENDENCY_OUT</fieldType> + <dependency> + <name>dependency</name> + <entityName>Document_entity</entityName> + <fieldName>PersDocument_dfi</fieldName> + </dependency> + <children> + <entityParameter> + <name>AssignmentName_param</name> + <code>%aditoprj%/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentname_param/code.js</code> + </entityParameter> + <entityParameter> + <name>AssignmentRowId_param</name> + <code>%aditoprj%/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentrowid_param/code.js</code> + </entityParameter> + <entityParameter> + <name>AssignmentTable_param</name> + <code>%aditoprj%/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmenttable_param/code.js</code> + </entityParameter> + </children> + </entityOutgoingField> </entityFields> <linkInformation> <linkInformation> diff --git a/entity/Pers_entity/conditionProcess.js b/entity/Pers_entity/conditionProcess.js index f2d2356e392ceb64a7411674838ddc827ff730a6..17bc706a5eac01a8b96580320881036fe22d28d2 100644 --- a/entity/Pers_entity/conditionProcess.js +++ b/entity/Pers_entity/conditionProcess.js @@ -3,25 +3,17 @@ import("system.vars"); import("system.result"); import("Sql_lib"); -var orgId, conditionStr, preparedValues - ,sqlHelper; -conditionStr = ""; -preparedValues = []; -sqlHelper = new LegacySqlUtils(); +var orgId, cond; -if (vars.exists("$param.OrgId_param") && (orgId = vars.getString("$param.OrgId_param"))){ - conditionStr += " and RELATION.ORG_ID = ? "; - preparedValues.push([orgId, sqlHelper.getSingleColumnType("RELATION.ORG_ID")]); - +cond = new SqlCondition(); +if (vars.exists("$param.OrgId_param")){ + orgId = vars.getString("$param.OrgId_param"); + if (orgId != "" && orgId != null){ + cond.andPrepare("RELATION.ORG_ID", "# = ?", orgId); + } } //TODO; add OBJECT_ID (probably another param) -//conditionStr += " and HISTORYLINK.OBJECT_ID = ? " -//preparedValues.push(["1", sqlHelper.getSingleColumnType("HISTORYLINK.OBJECT_ID")]); -if (conditionStr){ - conditionStr = " 1 = 1 " + conditionStr; - result.string(db.translateCondition([conditionStr, preparedValues])); -} -else - result.string("1 = 1"); \ No newline at end of file +//TODO: use preparedStatements when available +result.string(db.translateCondition([cond.toString("1 = 1"), cond.preparedValues])); diff --git a/entity/Pers_entity/entityfields/image/valueProcess.js b/entity/Pers_entity/entityfields/image/valueProcess.js index 5d2df8e196653490095b85181e8c898278870419..1ee9325f55b08de6dd49f7bb13bd6cbc673eb873 100644 --- a/entity/Pers_entity/entityfields/image/valueProcess.js +++ b/entity/Pers_entity/entityfields/image/valueProcess.js @@ -1,6 +1,18 @@ import("system.vars"); +import("system.db"); import("system.result"); +import("system.neon"); -result.string("TEXT:" + vars.getString("$field.FIRSTNAME") + " " + vars.getString("$field.LASTNAME")); +var base64_f_adito_1 = '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'; +var persId = vars.getString("$field.PERSID"); +switch (persId) { + case "ef345d11-a40d-59e0-a24c-afcb6095d2cb": + result.string(base64_f_adito_1); + break; + + default: + result.string("TEXT:" + vars.getString("$field.FIRSTNAME") + " " + vars.getString("$field.LASTNAME")); + break; +} diff --git a/entity/Pers_entity/entityfields/orgaddress_dfo/children/relid_param/code.js b/entity/Pers_entity/entityfields/orgaddress_dfo/children/relid_param/code.js index 22ba1eb2fb3d6f23e64bb602a05f62bcc94f61be..8ffe7d0d15b7e8646ecaa82db1c2b8147742194f 100644 --- a/entity/Pers_entity/entityfields/orgaddress_dfo/children/relid_param/code.js +++ b/entity/Pers_entity/entityfields/orgaddress_dfo/children/relid_param/code.js @@ -3,14 +3,12 @@ import("system.db"); import("system.vars"); import("Sql_lib"); -var orgId, orgRelId, sqlHelper; +var orgId, orgRelId, sqlHelper, cond; -sqlHelper = new LegacySqlUtils(); orgId = vars.get("$field.ORGID"); if (orgId){ - orgRelId = db.cell(["select RELATION.RELATIONID from RELATION where RELATION.PERS_ID is null and RELATION.ORG_ID = ?", - [ - [orgId, sqlHelper.getSingleColumnType("RELATION", "ORG_ID")] - ]]); + cond = new SqlCondition(); + cond.and("RELATION.PERS_ID is null").andPrepare("RELATION.ORG_ID", "# = ?", orgId) + orgRelId = db.cell(["select RELATION.RELATIONID from RELATION" + cond.toWhereString(), cond.preparedValues]); result.string(orgRelId); } \ No newline at end of file diff --git a/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentname_param/code.js b/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentname_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..3e4bf7585b2ca4628118e46818683fc51bfcf1c5 --- /dev/null +++ b/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentname_param/code.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.string("DOCUMENT"); \ No newline at end of file diff --git a/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentrowid_param/code.js b/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentrowid_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..aa257b8b78ed72ce888626a9fa22a890e3c9bf17 --- /dev/null +++ b/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmentrowid_param/code.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$field.RELATIONID")); \ No newline at end of file diff --git a/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmenttable_param/code.js b/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmenttable_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..12bc7590c1bd654d67409332f165b2f7a0cd24b6 --- /dev/null +++ b/entity/Pers_entity/entityfields/persdocument_dfo/children/assignmenttable_param/code.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.string("RELATION"); \ No newline at end of file diff --git a/neonContext/Document_context/Document_context.aod b/neonContext/Document_context/Document_context.aod new file mode 100644 index 0000000000000000000000000000000000000000..145dcfcc46b26b8ae776882a6aa6bdc06ceb0ea5 --- /dev/null +++ b/neonContext/Document_context/Document_context.aod @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.0.0"> + <name>Document_context</name> + <title>Document</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <icon>VAADIN:FILE_TEXT_O</icon> + <filterview>DocumentFilter_view</filterview> + <editview>DocumentEdit_view</editview> + <entity>Document_entity</entity> + <references> + <neonViewReference> + <name>3634ca6a-2317-4dde-9368-efa64f7227d7</name> + <view>DocumentFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>fcc99fdd-5524-4f32-a418-a88a4b7c0c09</name> + <view>DocumentEdit_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonView/DocumentEdit_view/DocumentEdit_view.aod b/neonView/DocumentEdit_view/DocumentEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..7aced50b649abe512383014a11008694c52a5002 --- /dev/null +++ b/neonView/DocumentEdit_view/DocumentEdit_view.aod @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.0.0"> + <name>DocumentEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>DocumentGeneric_template</name> + <editMode v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>91d96ac4-d838-4f92-90e7-954166b57288</name> + <entityField>NAME</entityField> + </entityFieldLink> + <entityFieldLink> + <name>7d74c495-1af7-4e00-8a78-5787e544e101</name> + <entityField>BINDATA_UPLOAD</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/DocumentFilter_view/DocumentFilter_view.aod b/neonView/DocumentFilter_view/DocumentFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..d808ca261f6ba8496dae471cb0852f6155779af5 --- /dev/null +++ b/neonView/DocumentFilter_view/DocumentFilter_view.aod @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.0.0"> + <name>DocumentFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table_template</name> + <favoriteActionGroup1>myActions</favoriteActionGroup1> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>1ecb7858-44ab-42de-abb8-d8c74afa30d0</name> + <entityField>NAME</entityField> + <width v="75" /> + <expandRatio v="100" /> + </neonTableColumn> + <neonTableColumn> + <name>455a5afa-82f0-42d0-aba4-46ff1196234f</name> + <entityField>TYPE</entityField> + <width v="75" /> + <expandRatio v="100" /> + </neonTableColumn> + <neonTableColumn> + <name>000be993-3d70-4511-add9-8590b4d3c8ef</name> + <entityField>SIZE</entityField> + <width v="75" /> + <expandRatio v="100" /> + </neonTableColumn> + <neonTableColumn> + <name>a533d8a1-ae5e-434d-8254-415586af26ed</name> + <entityField>DATE_NEW</entityField> + <width v="75" /> + <expandRatio v="100" /> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/HistoryFilter_view/HistoryFilter_view.aod b/neonView/HistoryFilter_view/HistoryFilter_view.aod index 03685f5f1a3bc30c3cb06b639978ecdfea3768f7..94f06583463f0f6d47b6ff429e1cb970d904bcb4 100644 --- a/neonView/HistoryFilter_view/HistoryFilter_view.aod +++ b/neonView/HistoryFilter_view/HistoryFilter_view.aod @@ -47,8 +47,9 @@ <entityField>#ENTITY</entityField> </timelineViewTemplate> <treetableViewTemplate> - <name>Treetable</name> - <descriptionField>SUBJECT</descriptionField> + <name>Treetable_template</name> + <titleField>SUBJECT</titleField> + <descriptionField>INFO</descriptionField> <iconField>ICON</iconField> <entityField>#ENTITY</entityField> </treetableViewTemplate> diff --git a/neonView/OrgFilter_view/OrgFilter_view.aod b/neonView/OrgFilter_view/OrgFilter_view.aod index 271ba9e405e7ec8bd32ef7e07f92a071ae8889b5..c582d6d1735065281c18cf9352a00600fd47c715 100644 --- a/neonView/OrgFilter_view/OrgFilter_view.aod +++ b/neonView/OrgFilter_view/OrgFilter_view.aod @@ -14,7 +14,7 @@ <columns> <neonTableColumn> <name>2008e7ac-9e6a-4104-9d5b-da60a10a1c02</name> - <entityField>#IMAGE</entityField> + <entityField>IMAGE</entityField> </neonTableColumn> <neonTableColumn> <name>a290a2ca-3236-4eb0-bf51-99f99d8414d6</name> diff --git a/neonView/OrgMain_view/OrgMain_view.aod b/neonView/OrgMain_view/OrgMain_view.aod index 8a580cad3a558d7225371e2f39be9055993e3468..958de056bf6a638fb1ef6e25e06cac9fc25625fb 100644 --- a/neonView/OrgMain_view/OrgMain_view.aod +++ b/neonView/OrgMain_view/OrgMain_view.aod @@ -30,5 +30,10 @@ <entityField>OrgProductprice_dfo</entityField> <view>ProductpriceRelation_view</view> </neonViewReference> + <neonViewReference> + <name>eba90ed2-5e55-4cdb-9e0b-5a09feeb7536</name> + <entityField>OrgDocument_dfo</entityField> + <view>DocumentFilter_view</view> + </neonViewReference> </children> </neonView> diff --git a/neonView/PersFilter_view/PersFilter_view.aod b/neonView/PersFilter_view/PersFilter_view.aod index ec8bc3ee05333157dfc2d475a88446d6f4b00a3a..2d635744c55f4e26b67eae66c912841281720a53 100644 --- a/neonView/PersFilter_view/PersFilter_view.aod +++ b/neonView/PersFilter_view/PersFilter_view.aod @@ -37,7 +37,7 @@ <columns> <neonTableColumn> <name>210cc6ab-5123-4d8a-8f2e-a6cd91d494ef</name> - <entityField>#IMAGE</entityField> + <entityField>IMAGE</entityField> </neonTableColumn> <neonTableColumn> <name>125d04cc-5c7a-4c38-bd0f-b5d02d21067d</name> diff --git a/neonView/PersMain_view/PersMain_view.aod b/neonView/PersMain_view/PersMain_view.aod index 5f77bdaab1821fb500a21fa9c0a13b65fe54691b..acb0f8066909b469502b0fba3931b9f9f139d5f6 100644 --- a/neonView/PersMain_view/PersMain_view.aod +++ b/neonView/PersMain_view/PersMain_view.aod @@ -19,5 +19,10 @@ <entityField>PersHistory_dfo</entityField> <view>HistoryFilter_view</view> </neonViewReference> + <neonViewReference> + <name>4b50b784-484f-4cdf-a705-4c356da763fa</name> + <entityField>PersDocument_dfo</entityField> + <view>DocumentFilter_view</view> + </neonViewReference> </children> </neonView> diff --git a/others/db_changes/data/example_history/example_history_gfk.xml b/others/db_changes/data/example_history/example_history_gfk.xml new file mode 100644 index 0000000000000000000000000000000000000000..244f9083a569fe5d8225188be9e372979f458131 --- /dev/null +++ b/others/db_changes/data/example_history/example_history_gfk.xml @@ -0,0 +1,167 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="j.goderbauer" id="4a7bca18-2923-4a5f-a7dc-acf1b10db9fd"> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="661a7b87-68ae-4d52-bc22-6bf96184e6fe"/> + <column name="SUBJECT" value="Webinar: Transparentes Kampagnen- und Veranstaltungsmanagement"/> + <column name="INFO" value="Hat teilgenommen und Feedback gegeben: begeistert von den neuen Möglichkeiten und der Webinar-Qualität"/> + <column name="MEDIUM" valueNumeric="1"/> + <column name="DIRECTION" value="o"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-03T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-03T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="5a4d249a-e3e4-48e5-80a5-2fd1567a82b8"/> + <column name="HISTORY_ID" value="661a7b87-68ae-4d52-bc22-6bf96184e6fe"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-03T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="9dda39bf-966c-4560-be03-5ddbbc1da84a"/> + <column name="SUBJECT" value="Webinar-Aufzeichnung"/> + <column name="INFO" value="Aufzeichnungen zum Thema "Transparentes Kampagnen- und Veranstaltungsmanagement" verschickt."/> + <column name="MEDIUM" valueNumeric="2"/> + <column name="DIRECTION" value="o"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-07-31T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-07-31T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="b0fae79b-0b1e-4650-8d94-853d17cca7bd"/> + <column name="HISTORY_ID" value="9dda39bf-966c-4560-be03-5ddbbc1da84a"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-07-31T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="94365b81-cddd-4f56-8379-7ba0a98840a4"/> + <column name="SUBJECT" value="Daten-update"/> + <column name="INFO" value="Hat uns Zusatzinfos geschickt - diese wurden an allen entsprechenden Stellen hinterlegt und final eingepflegt"/> + <column name="MEDIUM" valueNumeric="3"/> + <column name="DIRECTION" value="i"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-03T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-03T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="01ff4193-d5b4-41eb-b2db-ea31e5ed7df4"/> + <column name="HISTORY_ID" value="94365b81-cddd-4f56-8379-7ba0a98840a4"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-03T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="6397161c-afed-40cf-a1bd-12e657054ce4"/> + <column name="SUBJECT" value="Prüfung durchgeführt"/> + <column name="INFO" value="Abgleich der Bestandsdaten wurde gemacht."/> + <column name="MEDIUM" valueNumeric="3"/> + <column name="DIRECTION" value="i"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-06T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-06T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="80d3de8f-fd86-401b-aeae-63b389b9310c"/> + <column name="HISTORY_ID" value="6397161c-afed-40cf-a1bd-12e657054ce4"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-06T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="b378876d-dba5-4e41-865f-9ac056bffa60"/> + <column name="SUBJECT" value="weiterer Vertrag"/> + <column name="INFO" value="Vertragsgrundlagen besprochen. Wird in den nächsten Tagen definiert"/> + <column name="MEDIUM" valueNumeric="2"/> + <column name="DIRECTION" value="o"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-04T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-04T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="5ad45b3e-72a0-419e-a183-17aaead38158"/> + <column name="HISTORY_ID" value="b378876d-dba5-4e41-865f-9ac056bffa60"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-04T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="beda92e0-bbd6-423a-8b49-78da30064e84"/> + <column name="SUBJECT" value="Standortwechsel"/> + <column name="INFO" value="Ein Standortwechsel steht an und die neuen Daten wurden erfasst."/> + <column name="MEDIUM" valueNumeric="2"/> + <column name="DIRECTION" value="i"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-09T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-09T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="6c212e64-a9db-4395-a118-5279dbc6761d"/> + <column name="HISTORY_ID" value="beda92e0-bbd6-423a-8b49-78da30064e84"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-09T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="56c78f3d-e126-4e36-8031-d5eef9877243"/> + <column name="SUBJECT" value="Einladung Messe"/> + <column name="INFO" value="Messeeinladung und besondere Eintrittkarten zukommen lassen. Hat sich sehr gefreut"/> + <column name="MEDIUM" valueNumeric="1"/> + <column name="DIRECTION" value="o"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-04T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-04T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="8d384436-9989-4571-a193-cc3061249f97"/> + <column name="HISTORY_ID" value="56c78f3d-e126-4e36-8031-d5eef9877243"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-04T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="9f498736-c523-4c63-8c53-28e49324b52b"/> + <column name="SUBJECT" value="Präsentation: Terminvorschlag"/> + <column name="INFO" value="Terminvorschlag gesendet. Aufgabe gestellt"/> + <column name="MEDIUM" valueNumeric="1"/> + <column name="DIRECTION" value="i"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-12T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-12T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="20a50d5d-fe87-4ed2-8f94-b2571b6b34e7"/> + <column name="HISTORY_ID" value="9f498736-c523-4c63-8c53-28e49324b52b"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-12T12:02:52"/> + </insert> + <insert tableName="HISTORY"> + <column name="HISTORYID" value="1c711078-8324-4fcf-93ec-2c8aa29c0cc6"/> + <column name="SUBJECT" value="Einladung zum GfK-Abend"/> + <column name="INFO" value="Einladung von Kunden, Interessenten und Zulieferern zu einer internen Veranstaltung in unserem Haus"/> + <column name="MEDIUM" valueNumeric="0"/> + <column name="DIRECTION" value="o"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-11T12:02:52"/> + <column name="ENTRYDATE" valueDate="2018-08-11T12:02:52"/> + </insert> + <insert tableName="HISTORYLINK"> + <column name="HISTORYLINKID" value="46d9d317-1b7d-4046-8278-9a4957cc1dfe"/> + <column name="HISTORY_ID" value="1c711078-8324-4fcf-93ec-2c8aa29c0cc6"/> + <column name="OBJECT_ID" valueNumeric="1"/> + <column name="ROW_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-08-11T12:02:52"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/others/db_changes/data/example_org/ORG_mass.xml b/others/db_changes/data/example_org/ORG_mass.xml new file mode 100644 index 0000000000000000000000000000000000000000..0ebd764f258a53744fb3b4d316d0a96d105a18cb --- /dev/null +++ b/others/db_changes/data/example_org/ORG_mass.xml @@ -0,0 +1,680 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="j.goderbauer" id="ded084f6-174d-49a9-a829-f49590c1cc85"> + <insert tableName="ORG"> + <column name="ORGID" value="e5a0bbdb-6cc4-4889-97ab-dc5143fbeac2"/> + <column name="NAME" value="MNF Versicherung"/> + <column name="CUSTOMERCODE" value="00000002"/> + <column name="DATE_NEW" valueDate="2018-09-12T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e6da1393-f46b-41a4-826b-2c7d22de2246"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-12T03:03:43"/> + <column name="ORG_ID" value="e5a0bbdb-6cc4-4889-97ab-dc5143fbeac2"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d140e41d-9f56-4e74-9aac-f048e10bcea2"/> + <column name="NAME" value="Lichtenstein Document Solutions GmbH "/> + <column name="CUSTOMERCODE" value="00000003"/> + <column name="DATE_NEW" valueDate="2018-09-13T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e83c45e0-c30b-436e-b445-00a8b58383b0"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-13T03:03:43"/> + <column name="ORG_ID" value="d140e41d-9f56-4e74-9aac-f048e10bcea2"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d6a328ba-cb1f-4676-aa08-41762153876a"/> + <column name="NAME" value="International Kältetechnik AG "/> + <column name="CUSTOMERCODE" value="00000004"/> + <column name="DATE_NEW" valueDate="2018-09-14T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="eda61ea6-35ed-4a92-a93c-6118fc67d533"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-14T03:03:43"/> + <column name="ORG_ID" value="d6a328ba-cb1f-4676-aa08-41762153876a"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d9a4c4e4-fd34-4256-921d-dd681d862b42"/> + <column name="NAME" value="Pichelmaier Financial AG "/> + <column name="CUSTOMERCODE" value="00000005"/> + <column name="DATE_NEW" valueDate="2018-09-15T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="fd082db5-be43-4219-a705-588f9c06e59b"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-15T03:03:43"/> + <column name="ORG_ID" value="d9a4c4e4-fd34-4256-921d-dd681d862b42"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f7310676-b0c6-412d-917f-3b21ad80d610"/> + <column name="NAME" value="Sieber Kältetechnik "/> + <column name="CUSTOMERCODE" value="00000006"/> + <column name="DATE_NEW" valueDate="2018-09-16T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e913fcce-0722-44ee-9964-a91dc90cfefe"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-16T03:03:43"/> + <column name="ORG_ID" value="f7310676-b0c6-412d-917f-3b21ad80d610"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="ded2582c-1c97-4e06-8d12-16ae00b60fb7"/> + <column name="NAME" value="Amberger Dental & Technik GmbH & Co.KG "/> + <column name="CUSTOMERCODE" value="00000007"/> + <column name="DATE_NEW" valueDate="2018-09-17T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e1ee1d84-c9eb-4000-8921-b342db81d534"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-17T03:03:43"/> + <column name="ORG_ID" value="ded2582c-1c97-4e06-8d12-16ae00b60fb7"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f8bf3212-d698-45a5-8270-5b786a83ce28"/> + <column name="NAME" value="Winkelberg Versicherung "/> + <column name="CUSTOMERCODE" value="00000008"/> + <column name="DATE_NEW" valueDate="2018-09-18T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d8ea5981-ab27-4371-8a8b-65225d00dad9"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-18T03:03:43"/> + <column name="ORG_ID" value="f8bf3212-d698-45a5-8270-5b786a83ce28"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d7f9af7d-c09b-41dd-88d0-8d66f464be19"/> + <column name="NAME" value="Brandenburg Versicherungs AG "/> + <column name="CUSTOMERCODE" value="00000009"/> + <column name="DATE_NEW" valueDate="2018-09-19T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="de0ec35f-d123-4cbf-aa76-9089fbe6c3c3"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-19T03:03:43"/> + <column name="ORG_ID" value="d7f9af7d-c09b-41dd-88d0-8d66f464be19"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e29b1302-68f6-4326-b9b2-dee3da297bc8"/> + <column name="NAME" value="Lieferdienst GmbH und Co.KG"/> + <column name="CUSTOMERCODE" value="00000010"/> + <column name="DATE_NEW" valueDate="2018-09-20T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e16eb8a4-dffd-4a4a-8398-d1de4968f64f"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-20T03:03:43"/> + <column name="ORG_ID" value="e29b1302-68f6-4326-b9b2-dee3da297bc8"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f304765c-7513-4ad6-89a5-e158c592c8be"/> + <column name="NAME" value="Schwan GmbH"/> + <column name="CUSTOMERCODE" value="00000011"/> + <column name="DATE_NEW" valueDate="2018-09-21T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="ef9b34a6-c930-4ce0-939d-cdc5417f39d3"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-21T03:03:43"/> + <column name="ORG_ID" value="f304765c-7513-4ad6-89a5-e158c592c8be"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="ec6d609f-6623-4589-ae32-9b957a9a0865"/> + <column name="NAME" value="Neumann GmbH Tunnelvortriebstechnik "/> + <column name="CUSTOMERCODE" value="00000012"/> + <column name="DATE_NEW" valueDate="2018-09-22T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="da3fca12-14ae-4d1e-aece-40f96dae345a"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-22T03:03:43"/> + <column name="ORG_ID" value="ec6d609f-6623-4589-ae32-9b957a9a0865"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d3138d27-4c09-4c0a-b647-ffe62bb7a425"/> + <column name="NAME" value="Liebik KG"/> + <column name="CUSTOMERCODE" value="00000013"/> + <column name="DATE_NEW" valueDate="2018-09-23T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f462072b-6ead-4d85-aba2-c87573f8a7b8"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-23T03:03:43"/> + <column name="ORG_ID" value="d3138d27-4c09-4c0a-b647-ffe62bb7a425"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="dfcb852d-8730-4fc2-9999-4e5ab86114f7"/> + <column name="NAME" value="JKL Ltd."/> + <column name="CUSTOMERCODE" value="00000014"/> + <column name="DATE_NEW" valueDate="2018-09-24T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d321e2b4-f97e-4754-ba16-ab4853512c3c"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-24T03:03:43"/> + <column name="ORG_ID" value="dfcb852d-8730-4fc2-9999-4e5ab86114f7"/> + <column name="LANGUAGE" value="en-GB"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f0c7b4c7-e9f2-45d0-b823-771483a40c6d"/> + <column name="NAME" value="SF Engineering-Services Ltd."/> + <column name="CUSTOMERCODE" value="00000015"/> + <column name="DATE_NEW" valueDate="2018-09-25T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="ff7978e6-9053-48fc-8dc2-b6ee93f71b32"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-25T03:03:43"/> + <column name="ORG_ID" value="f0c7b4c7-e9f2-45d0-b823-771483a40c6d"/> + <column name="LANGUAGE" value="en-GB"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d9a40db6-7ec7-4271-af7b-649cbc1fd03f"/> + <column name="NAME" value="Wolfshofer AG "/> + <column name="CUSTOMERCODE" value="00000016"/> + <column name="DATE_NEW" valueDate="2018-09-26T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d9a72273-fe0c-4461-bff0-851c294718c1"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-26T03:03:43"/> + <column name="ORG_ID" value="d9a40db6-7ec7-4271-af7b-649cbc1fd03f"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d07a6321-ac60-4f58-a35d-80f6c8e4fc59"/> + <column name="NAME" value="Grün Versicherung AG "/> + <column name="CUSTOMERCODE" value="00000017"/> + <column name="DATE_NEW" valueDate="2018-09-27T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d60e2e0d-bf6a-437d-89a8-841b09f4a899"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-27T03:03:43"/> + <column name="ORG_ID" value="d07a6321-ac60-4f58-a35d-80f6c8e4fc59"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d4b18031-b1ad-4a5f-8c3f-1f483775ede3"/> + <column name="NAME" value="Verband für Bauwirtschaft "/> + <column name="CUSTOMERCODE" value="00000018"/> + <column name="DATE_NEW" valueDate="2018-09-28T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d94ccadb-0022-4eb7-86ae-ba011fd257eb"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-28T03:03:43"/> + <column name="ORG_ID" value="d4b18031-b1ad-4a5f-8c3f-1f483775ede3"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d882e2c8-84bd-411c-84db-81513e8d1918"/> + <column name="NAME" value="Paseo S.R.L."/> + <column name="CUSTOMERCODE" value="00000019"/> + <column name="DATE_NEW" valueDate="2018-09-29T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e867c779-34bd-4659-88dc-eb0ae056c37f"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-29T03:03:43"/> + <column name="ORG_ID" value="d882e2c8-84bd-411c-84db-81513e8d1918"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d4fbee0e-57ac-47bd-bc62-d41d979d97f1"/> + <column name="NAME" value="Verband für Druckindustrie "/> + <column name="CUSTOMERCODE" value="00000020"/> + <column name="DATE_NEW" valueDate="2018-09-30T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d15f4906-3898-46f8-a039-03d58cfe56a9"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-09-30T03:03:43"/> + <column name="ORG_ID" value="d4fbee0e-57ac-47bd-bc62-d41d979d97f1"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d27d05dc-d06b-4cc6-8007-d13c0adff070"/> + <column name="NAME" value="ZTN Ltd."/> + <column name="CUSTOMERCODE" value="00000021"/> + <column name="DATE_NEW" valueDate="2018-10-01T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e69a9f1c-1054-4ccf-8c3b-69ee1e8aa99b"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-01T03:03:43"/> + <column name="ORG_ID" value="d27d05dc-d06b-4cc6-8007-d13c0adff070"/> + <column name="LANGUAGE" value="en-GB"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e7d22826-8d4c-428b-a45a-02b4257cc7f4"/> + <column name="NAME" value="IKWA Services GmbH "/> + <column name="CUSTOMERCODE" value="00000022"/> + <column name="DATE_NEW" valueDate="2018-10-02T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e9ddbdbd-914f-4ade-944a-6de908168d19"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-02T03:03:43"/> + <column name="ORG_ID" value="e7d22826-8d4c-428b-a45a-02b4257cc7f4"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e6f2aeba-ec06-4ebc-b6b3-43b3c977dc7e"/> + <column name="NAME" value="KITAMURA MACHINERY CO., LTD."/> + <column name="CUSTOMERCODE" value="00000023"/> + <column name="DATE_NEW" valueDate="2018-10-03T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="de2733d3-e40a-4cb2-8c51-f02f36de0b7d"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-03T03:03:43"/> + <column name="ORG_ID" value="e6f2aeba-ec06-4ebc-b6b3-43b3c977dc7e"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f71d811c-e7be-486f-95c4-6031dc3d8bbd"/> + <column name="NAME" value="Bauunternehmen Wilhelm Huber GmbH"/> + <column name="CUSTOMERCODE" value="00000024"/> + <column name="DATE_NEW" valueDate="2018-10-04T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="da0463a5-10c4-4db1-9521-36c4e8d4894d"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-04T03:03:43"/> + <column name="ORG_ID" value="f71d811c-e7be-486f-95c4-6031dc3d8bbd"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="efe2dc72-f8e9-42ce-858d-af597c66f9fd"/> + <column name="NAME" value="Beck IT Support GmbH"/> + <column name="CUSTOMERCODE" value="00000025"/> + <column name="DATE_NEW" valueDate="2018-10-05T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e6b44ceb-2ec6-421f-b50f-33b1d7757cc8"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-05T03:03:43"/> + <column name="ORG_ID" value="efe2dc72-f8e9-42ce-858d-af597c66f9fd"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="ff050ff3-ab15-4381-a911-a741425c73eb"/> + <column name="NAME" value="Buchberger & Partner"/> + <column name="CUSTOMERCODE" value="00000026"/> + <column name="DATE_NEW" valueDate="2018-10-06T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f97c4822-2157-4033-aa83-31c7704e6015"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-06T03:03:43"/> + <column name="ORG_ID" value="ff050ff3-ab15-4381-a911-a741425c73eb"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f15728d5-acf6-4dd6-b3ee-27df76a3b91f"/> + <column name="NAME" value="CCK GmbH"/> + <column name="CUSTOMERCODE" value="00000027"/> + <column name="DATE_NEW" valueDate="2018-10-07T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d6d540c1-3993-4037-98be-499486021b47"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-07T03:03:43"/> + <column name="ORG_ID" value="f15728d5-acf6-4dd6-b3ee-27df76a3b91f"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="fbb39871-02d1-4912-86a7-796d261c88f8"/> + <column name="NAME" value="Financial Group Chesterfield"/> + <column name="CUSTOMERCODE" value="00000028"/> + <column name="DATE_NEW" valueDate="2018-10-08T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="dc63e588-060b-441b-9790-b81574e2c544"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-08T03:03:43"/> + <column name="ORG_ID" value="fbb39871-02d1-4912-86a7-796d261c88f8"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d3092cde-649d-4699-b0ae-52c93d639e78"/> + <column name="NAME" value="Frankenmann Co.KG"/> + <column name="CUSTOMERCODE" value="00000029"/> + <column name="DATE_NEW" valueDate="2018-10-09T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f89cbdb4-0dbf-4df0-8625-88cb4cc3fab1"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-09T03:03:43"/> + <column name="ORG_ID" value="d3092cde-649d-4699-b0ae-52c93d639e78"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e5c0aa96-e196-4b5e-9e23-718b9bffc5d0"/> + <column name="NAME" value="Friedrich & Frank GmbH"/> + <column name="CUSTOMERCODE" value="00000030"/> + <column name="DATE_NEW" valueDate="2018-10-10T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f3641d66-a970-49a6-8143-340bc24cb352"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-10T03:03:43"/> + <column name="ORG_ID" value="e5c0aa96-e196-4b5e-9e23-718b9bffc5d0"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d4f7cf2f-5f4f-4857-9f7c-fe3475b2803c"/> + <column name="NAME" value="Lesser GmbH & Co.KG"/> + <column name="CUSTOMERCODE" value="00000031"/> + <column name="DATE_NEW" valueDate="2018-10-11T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="fea24840-5504-4c4c-86ba-84f0dc50f10e"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-11T03:03:43"/> + <column name="ORG_ID" value="d4f7cf2f-5f4f-4857-9f7c-fe3475b2803c"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="d1aeaca7-96bc-4ef4-9aa5-b52e374df6b9"/> + <column name="NAME" value="Förderverband Doritz"/> + <column name="CUSTOMERCODE" value="00000032"/> + <column name="DATE_NEW" valueDate="2018-10-12T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="dd0bf580-b86b-43c1-b202-fda20711c903"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-12T03:03:43"/> + <column name="ORG_ID" value="d1aeaca7-96bc-4ef4-9aa5-b52e374df6b9"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f6763689-5cdc-47e3-97df-a3bdc579a383"/> + <column name="NAME" value="GHG Consulting"/> + <column name="CUSTOMERCODE" value="00000033"/> + <column name="DATE_NEW" valueDate="2018-10-13T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e6ee4479-4f68-4002-a18b-b3cd0109fc18"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-13T03:03:43"/> + <column name="ORG_ID" value="f6763689-5cdc-47e3-97df-a3bdc579a383"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f974fcf9-51f9-4469-b772-223ee625f5e2"/> + <column name="NAME" value="Gorch Systems Engineering GmbH"/> + <column name="CUSTOMERCODE" value="00000034"/> + <column name="DATE_NEW" valueDate="2018-10-14T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="ecde89ab-4e30-484a-aec2-cff3069d25f6"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-14T03:03:43"/> + <column name="ORG_ID" value="f974fcf9-51f9-4469-b772-223ee625f5e2"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e58a9160-d480-42c3-8ab3-7ca01f964570"/> + <column name="NAME" value="Gußberg Software KG"/> + <column name="CUSTOMERCODE" value="00000035"/> + <column name="DATE_NEW" valueDate="2018-10-15T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f0360f92-b881-4448-b250-d9f3cf18d9c1"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-15T03:03:43"/> + <column name="ORG_ID" value="e58a9160-d480-42c3-8ab3-7ca01f964570"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e9c73782-7c8f-492e-8fa0-971b43f02710"/> + <column name="NAME" value="Hartmann Großbau AG"/> + <column name="CUSTOMERCODE" value="00000036"/> + <column name="DATE_NEW" valueDate="2018-10-16T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f191c170-84c3-4bcd-baf6-4b4b1e99bdf9"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-16T03:03:43"/> + <column name="ORG_ID" value="e9c73782-7c8f-492e-8fa0-971b43f02710"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e717a3d3-9f83-45bc-8779-f17cee22ea5a"/> + <column name="NAME" value="Immobilien & Vermögensberatung Steinmeier"/> + <column name="CUSTOMERCODE" value="00000037"/> + <column name="DATE_NEW" valueDate="2018-10-17T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d5dd7578-868e-4cc6-9c0f-27625c62c0be"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-17T03:03:43"/> + <column name="ORG_ID" value="e717a3d3-9f83-45bc-8779-f17cee22ea5a"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="fd0da4f9-0898-48f7-bf35-b7d29a2e78d0"/> + <column name="NAME" value="KPO Kernsysteme"/> + <column name="CUSTOMERCODE" value="00000038"/> + <column name="DATE_NEW" valueDate="2018-10-18T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="dae79c22-a04b-4948-97ee-a41d2d4c187b"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-18T03:03:43"/> + <column name="ORG_ID" value="fd0da4f9-0898-48f7-bf35-b7d29a2e78d0"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f9842336-8544-4c58-9bac-f957e8ef22d6"/> + <column name="NAME" value="Kfz Verkaufsgruppe PHK"/> + <column name="CUSTOMERCODE" value="00000039"/> + <column name="DATE_NEW" valueDate="2018-10-19T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="d1d6c1cd-23d9-46a5-a560-df7f11cc63ea"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-19T03:03:43"/> + <column name="ORG_ID" value="f9842336-8544-4c58-9bac-f957e8ef22d6"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f7aaa4f6-340a-48e4-874f-7287e440f6e0"/> + <column name="NAME" value="Marketingcenter Eyespace"/> + <column name="CUSTOMERCODE" value="00000040"/> + <column name="DATE_NEW" valueDate="2018-10-20T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e6b57b4e-3776-4e79-9998-3aba2ee46923"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-20T03:03:43"/> + <column name="ORG_ID" value="f7aaa4f6-340a-48e4-874f-7287e440f6e0"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f61b71b4-9e5f-4fee-929c-c13ded95ece6"/> + <column name="NAME" value="Rüdiger Marsenburg GmbH"/> + <column name="CUSTOMERCODE" value="00000041"/> + <column name="DATE_NEW" valueDate="2018-10-21T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="ed394880-74d7-4b2c-b781-b24b003b6871"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-21T03:03:43"/> + <column name="ORG_ID" value="f61b71b4-9e5f-4fee-929c-c13ded95ece6"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f4bb9045-7280-4f21-a0f9-c909fac23b23"/> + <column name="NAME" value="Van Hug Financial Service"/> + <column name="CUSTOMERCODE" value="00000042"/> + <column name="DATE_NEW" valueDate="2018-10-22T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f4a95bcf-799f-41ab-b77c-8f05e3a66627"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-22T03:03:43"/> + <column name="ORG_ID" value="f4bb9045-7280-4f21-a0f9-c909fac23b23"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="e54e7d63-6bfc-46a6-a0c7-0fca2478331e"/> + <column name="NAME" value="Versicherungen ABK AG"/> + <column name="CUSTOMERCODE" value="00000043"/> + <column name="DATE_NEW" valueDate="2018-10-23T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e808ba75-6c12-4b0a-88ae-779fb9894fda"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-23T03:03:43"/> + <column name="ORG_ID" value="e54e7d63-6bfc-46a6-a0c7-0fca2478331e"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f6f65e33-95b2-4aeb-ac30-6b33ea00f595"/> + <column name="NAME" value="Weinbuch Deutschland GmbH"/> + <column name="CUSTOMERCODE" value="00000044"/> + <column name="DATE_NEW" valueDate="2018-10-24T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e465cc10-0fb9-4a67-a135-e10c72c10f49"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-24T03:03:43"/> + <column name="ORG_ID" value="f6f65e33-95b2-4aeb-ac30-6b33ea00f595"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="f1eabc20-c1b1-4865-aded-db902c3ab1f5"/> + <column name="NAME" value="Wellington Wings Corp."/> + <column name="CUSTOMERCODE" value="00000045"/> + <column name="DATE_NEW" valueDate="2018-10-25T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="e6d8384e-4ba1-4784-86b4-18e36e1b33d5"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-25T03:03:43"/> + <column name="ORG_ID" value="f1eabc20-c1b1-4865-aded-db902c3ab1f5"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <insert tableName="ORG"> + <column name="ORGID" value="dfaf3c29-5317-46e3-be83-cff4a52cd6fd"/> + <column name="NAME" value="Zimmermann Logistik AG"/> + <column name="CUSTOMERCODE" value="00000046"/> + <column name="DATE_NEW" valueDate="2018-10-26T03:03:43"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="f7179fda-231d-40d4-a7b6-b2dab5cd76cf"/> + <column name="USER_NEW" value="admin"/> + <column name="DATE_NEW" valueDate="2018-10-26T03:03:43"/> + <column name="ORG_ID" value="dfaf3c29-5317-46e3-be83-cff4a52cd6fd"/> + <column name="LANGUAGE" value="de-DE"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/others/db_changes/data/example_pers/PERS_andre.xml b/others/db_changes/data/example_pers/PERS_andre.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a1c3be071cb96fb738575ffc4ae2416d8d73c10 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_andre.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be1a824-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Peter"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Andre"/> + <column name="SALUTATION" value="Herr"/> + <column name="TITLE" value="Dr."/> + <column name="DATEOFBIRTH" valueDate="1980-10-14"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be1a824-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be1a978-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be1a978-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be1a824-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_braun.xml b/others/db_changes/data/example_pers/PERS_braun.xml new file mode 100644 index 0000000000000000000000000000000000000000..0215541bdd6ca262eec7f5249ea94d38358c2c8b --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_braun.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d73c10-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Herbert"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Braun"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1994-04-08"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d73c10-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d73d3c-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d73d3c-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d73c10-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_carolin.xml b/others/db_changes/data/example_pers/PERS_carolin.xml new file mode 100644 index 0000000000000000000000000000000000000000..32980c708348744193ff950d6eace7405a9963de --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_carolin.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d739c2-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Carolin"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Schmitt"/> + <column name="SALUTATION" value="Frau"/> + <column name="DATEOFBIRTH" valueDate="1960-12-16"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d739c2-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d73aee-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d73aee-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d739c2-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_grenzer.xml b/others/db_changes/data/example_pers/PERS_grenzer.xml new file mode 100644 index 0000000000000000000000000000000000000000..890e3fc765439ac831fab63c3e23e0809a2b7558 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_grenzer.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be18cf4-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Peter"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Grenzer"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1982-08-25"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be18cf4-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be18e20-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be18e20-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be18cf4-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_gruener.xml b/others/db_changes/data/example_pers/PERS_gruener.xml new file mode 100644 index 0000000000000000000000000000000000000000..23cba3f1896fa816860ce30a13ed7af964b40809 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_gruener.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d732ce-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Jerome"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Grüner"/> + <column name="SALUTATION" value="Monsieur"/> + <column name="DATEOFBIRTH" valueDate="1993-01-20"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d732ce-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d73404-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="0"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d73404-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d732ce-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_haller.xml b/others/db_changes/data/example_pers/PERS_haller.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb5ef28c3b2444fd5fd1b6ea44ef9ea89a1b5ee5 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_haller.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d74d90-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Erna"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Haller"/> + <column name="SALUTATION" value="Mrs."/> + <column name="DATEOFBIRTH" valueDate="1961-09-29"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d74d90-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d74ec6-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d74ec6-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d74d90-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_hamann.xml b/others/db_changes/data/example_pers/PERS_hamann.xml new file mode 100644 index 0000000000000000000000000000000000000000..702f39c7b509c0678d5c331259841b2b293a598a --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_hamann.xml @@ -0,0 +1,39 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be19f82-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Suse"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Hamann"/> + <column name="SALUTATION" value="Mrs."/> + <column name="DATEOFBIRTH" valueDate="1985-03-24"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be19f82-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be1a0ae-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be1a0ae-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be19f82-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_hausler.xml b/others/db_changes/data/example_pers/PERS_hausler.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ddea4d2e2d910dec090b4eb0837707d376741d0 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_hausler.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d75236-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Gerd"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Hausler"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1988-12-23"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d75236-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be17ffc-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be17ffc-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d75236-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_hinterecker.xml b/others/db_changes/data/example_pers/PERS_hinterecker.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c314905c05c24e547fe3f12c2cd19ca46fb81be --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_hinterecker.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be182a4-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Thomas"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Hinterecker"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1955-08-15"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be182a4-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be18402-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be18402-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be182a4-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_hugenmaier.xml b/others/db_changes/data/example_pers/PERS_hugenmaier.xml new file mode 100644 index 0000000000000000000000000000000000000000..9f3d6ae1d20be454cf7d3ca49ec6b5599d929cdd --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_hugenmaier.xml @@ -0,0 +1,39 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be193fc-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Josef"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Hugenmaier"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1960-11-13"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be193fc-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be19532-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be19532-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be193fc-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_kanzler.xml b/others/db_changes/data/example_pers/PERS_kanzler.xml new file mode 100644 index 0000000000000000000000000000000000000000..f183128900e9f84012eadac3513228590acf80bb --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_kanzler.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Ludwig"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Kanzler"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1994-08-03"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d731a2-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="0"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d731a2-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d7306c-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_kormann.xml b/others/db_changes/data/example_pers/PERS_kormann.xml new file mode 100644 index 0000000000000000000000000000000000000000..6850098f3526b84c47fd875c9e9d11a06d274136 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_kormann.xml @@ -0,0 +1,39 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be19654-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Annette"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Kormann"/> + <column name="SALUTATION" value="Madame"/> + <column name="DATEOFBIRTH" valueDate="1986-02-17"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be19654-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be19780-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be19780-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be19654-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_leicht.xml b/others/db_changes/data/example_pers/PERS_leicht.xml new file mode 100644 index 0000000000000000000000000000000000000000..9f09b483112eaa6e1dfa64b22d0b3edaef755ba0 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_leicht.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d72bf8-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Birgit"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Leicht"/> + <column name="SALUTATION" value="Frau"/> + <column name="DATEOFBIRTH" valueDate="2001-05-07"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d72bf8-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="0"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d72f18-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d72bf8-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_miller.xml b/others/db_changes/data/example_pers/PERS_miller.xml new file mode 100644 index 0000000000000000000000000000000000000000..770590f1f7d544fbf767833264086e06d1af9047 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_miller.xml @@ -0,0 +1,41 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be18a7e-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Berd"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Miller"/> + <column name="SALUTATION" value="Herr"/> + <column name="TITLE" value="Dr."/> + <column name="DATEOFBIRTH" valueDate="1971-05-21"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be18a7e-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be18baa-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be18baa-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be18a7e-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_muller.xml b/others/db_changes/data/example_pers/PERS_muller.xml new file mode 100644 index 0000000000000000000000000000000000000000..d62d5ceea2ee6a2bc64b1fc31e23c6e3056023d6 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_muller.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d72202-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Herbert"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Obermeier"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="DATEOFBIRTH" valueDate="1989-12-03"/> + <column name="USER_NEW" value="admin"/> + <column name="GENDER" value="m"/> + <column name="SALUTATION" value="Herr"/> + </insert> + <insert tableName="RELATION"> + <column name="RELATIONID" value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="PERS_ID" value="73d72202-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="0"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d72702-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d72202-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_petersen.xml b/others/db_changes/data/example_pers/PERS_petersen.xml new file mode 100644 index 0000000000000000000000000000000000000000..83157e90148c1178d15b2b4cac74cd256cc595f1 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_petersen.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d74ff2-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Peter"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Petersen"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1991-03-17"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d74ff2-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d75114-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d75114-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d74ff2-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_reisecker.xml b/others/db_changes/data/example_pers/PERS_reisecker.xml new file mode 100644 index 0000000000000000000000000000000000000000..232319cc3ed75b7aa58af18c5df1225589b2e211 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_reisecker.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be18f42-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Claudia"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Reisecker"/> + <column name="SALUTATION" value="Frau"/> + <column name="TITLE"/> + <column name="DATEOFBIRTH" valueDate="1967-09-03"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be18f42-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be1906e-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be1906e-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be18f42-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_rieber.xml b/others/db_changes/data/example_pers/PERS_rieber.xml new file mode 100644 index 0000000000000000000000000000000000000000..07c9e6c71980a305b3da78b9b3e47b7a1d574c08 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_rieber.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d743a4-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Mark"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Rieber"/> + <column name="SALUTATION" value="Mr."/> + <column name="DATEOFBIRTH" valueDate="1948-02-09"/> + <column name="DATE_NEW" valueDate="1948-02-09T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d743a4-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d744f8-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d744f8-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d743a4-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_robert_sommer.xml b/others/db_changes/data/example_pers/PERS_robert_sommer.xml new file mode 100644 index 0000000000000000000000000000000000000000..809eae5d5c769e68d6864b80d36a8d365c19b14e --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_robert_sommer.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d74660-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Robert"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Sommer"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1956-07-02"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d74660-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d7478c-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d7478c-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d74660-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_saubermann.xml b/others/db_changes/data/example_pers/PERS_saubermann.xml new file mode 100644 index 0000000000000000000000000000000000000000..0349c098babb9553e7a956559102bfe5930bc935 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_saubermann.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d73e68-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Walter"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Saubermann"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1985-10-22"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d73e68-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d73f8a-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d73f8a-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d73e68-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_schmitt.xml b/others/db_changes/data/example_pers/PERS_schmitt.xml new file mode 100644 index 0000000000000000000000000000000000000000..c6a41edcc7939b9916a3348b72b47d655a7b6bb7 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_schmitt.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d73530-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Paula"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Schmitt"/> + <column name="SALUTATION" value="Frau"/> + <column name="DATEOFBIRTH" valueDate="1988-05-06"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d73530-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d73864-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d73864-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d73530-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_stone.xml b/others/db_changes/data/example_pers/PERS_stone.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3c5966f89f70d30da2237eb4d52a1ef82081033 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_stone.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be1852e-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Sharon"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Stone"/> + <column name="SALUTATION" value="Frau"/> + <column name="TITLE" value="Prof."/> + <column name="DATEOFBIRTH" valueDate="1976-03-15"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be1852e-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be1892a-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be1892a-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be1852e-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_thaler.xml b/others/db_changes/data/example_pers/PERS_thaler.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5e09e576d375a1b8605731b5657c54136cc80e1 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_thaler.xml @@ -0,0 +1,39 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be198ac-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Kristiane"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Thaler"/> + <column name="SALUTATION" value="Frau"/> + <column name="DATEOFBIRTH" valueDate="2001-02-23"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be198ac-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be199d8-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be199d8-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be198ac-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_traum.xml b/others/db_changes/data/example_pers/PERS_traum.xml new file mode 100644 index 0000000000000000000000000000000000000000..bd24c69a92c30b6347048ab9f5785d111a63f72f --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_traum.xml @@ -0,0 +1,39 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be19d0c-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Prinz"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Traum"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="2002-02-26"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be19d0c-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be19e60-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be19e60-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be19d0c-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_vogel.xml b/others/db_changes/data/example_pers/PERS_vogel.xml new file mode 100644 index 0000000000000000000000000000000000000000..97e4130c6b6182c2c357ad149a7647f9291b365c --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_vogel.xml @@ -0,0 +1,40 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="73d748ae-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Franz"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Vogel"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="2011-10-16"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="MIDDLENAME" value=""/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="73d748ae-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="73d74c3c-e7f5-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="73d74c3c-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="73d748ae-e7f5-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/data/example_pers/PERS_walter.xml b/others/db_changes/data/example_pers/PERS_walter.xml new file mode 100644 index 0000000000000000000000000000000000000000..e3d784bf9737952704581e3da0ea49740ac80906 --- /dev/null +++ b/others/db_changes/data/example_pers/PERS_walter.xml @@ -0,0 +1,39 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> +<changeSet author="m.escher" id="efc45d2-a40d-49e0-a24c-afab6095d1cb"> + <insert tableName="PERS"> + <column name="PERSID" value="6be1a1d0-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="FIRSTNAME" value="Fritz"/> + <column name="MIDDLENAME"/> + <column name="LASTNAME" value="Walter"/> + <column name="SALUTATION" value="Herr"/> + <column name="DATEOFBIRTH" valueDate="1957-03-05"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + </insert> + <insert tableName="RELATION"> + <column name="PERS_ID" value="6be1a1d0-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="RELATIONID" value="6be1a2fc-e7fa-11e8-9f32-f2801f1b9fd1"/> + <column name="ORG_ID" value="328b8a8b-c053-447a-bc69-17965b6a60ae"/> + <column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/> + <column name="USER_NEW" value="admin"/> + <column name="STATUS" valueNumeric="1"/> + </insert> + <rollback> + <delete tableName="RELATION"> + <where>RELATIONID = ?</where> + <whereParams> + <param value="6be1a2fc-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + <delete tableName="PERS"> + <where>PERSID = ?</where> + <whereParams> + <param value="6be1a1d0-e7fa-11e8-9f32-f2801f1b9fd1" /> + </whereParams> + </delete> + </rollback> +</changeSet> + + +</databaseChangeLog> diff --git a/others/db_changes/masterChangelog.xml b/others/db_changes/masterChangelog.xml index b08c2f67ed0c460f421c03eec1b8fde66f582978..7643ca496adb9153021bd48301d1ac6b77438afb 100644 --- a/others/db_changes/masterChangelog.xml +++ b/others/db_changes/masterChangelog.xml @@ -26,6 +26,34 @@ <include file="data/example_org/ORG_gfk.xml"/> <include file="data/example_pers/PERS_pfiffig.xml"/> <include file="data/example_pers/PERS_sommer.xml"/> + <include file="data/example_pers/PERS_muller.xml"/> + <include file="data/example_pers/PERS_leicht.xml"/> + <include file="data/example_pers/PERS_kanzler.xml"/> + <include file="data/example_pers/PERS_gruener.xml"/> + <include file="data/example_pers/PERS_schmitt.xml"/> + <include file="data/example_pers/PERS_carolin.xml"/> + <include file="data/example_pers/PERS_braun.xml"/> + <include file="data/example_pers/PERS_saubermann.xml"/> + <include file="data/example_pers/PERS_rieber.xml"/> + <include file="data/example_pers/PERS_robert_sommer.xml"/> + <include file="data/example_pers/PERS_vogel.xml"/> + <include file="data/example_pers/PERS_haller.xml"/> + <include file="data/example_pers/PERS_petersen.xml"/> + <include file="data/example_pers/PERS_hausler.xml"/> + <include file="data/example_pers/PERS_hinterecker.xml"/> + <include file="data/example_pers/PERS_stone.xml"/> + <include file="data/example_pers/PERS_miller.xml"/> + <include file="data/example_pers/PERS_grenzer.xml"/> + <include file="data/example_pers/PERS_reisecker.xml"/> + <include file="data/example_pers/PERS_hugenmaier.xml"/> + <include file="data/example_pers/PERS_kormann.xml"/> + <include file="data/example_pers/PERS_thaler.xml"/> + <include file="data/example_pers/PERS_traum.xml"/> + <include file="data/example_pers/PERS_hamann.xml"/> + <include file="data/example_pers/PERS_walter.xml"/> + <include file="data/example_pers/PERS_andre.xml"/> <include file="data/example_contract/CONTRACT_42154311.xml"/> <include file="data/example_product/PRODUCT_42154311.xml"/> + <include file="data/example_org/ORG_mass.xml"/> + <include file="data/example_history/example_history_gfk.xml"/> </databaseChangeLog> diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index 4181790956d0d67fc930d95ce5d5e75d4ad2f20e..008530aefcbed41f1247edc482b8c4edda2fd823 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -1,1174 +1,1224 @@ -import("system.translate"); -import("system.vars"); -import("system.db"); -import("system.datetime"); -import("system.tools"); -import("system.SQLTYPES"); -import("system.text"); -import("Util_lib"); - -/** - * Object for easier handling of conditions; - * With this object you do not have to check if the string is empty or not; - * you don't need to append a "1=1" condition or similar; - * @example //TODO: add missing example - */ -function SqlCondition(alias){ - this._sqlStorage = ""; - this.preparedValues = []; - this.alias = alias; -} -/** - * append with SQL-and; no paranthesize of existing conditions is done - * @param {String} cond the condition string which shall be appended - * @return {Object} current SqlCondition-object - */ -SqlCondition.prototype.and = function(cond){ - if (!cond) - return this; - if (this._sqlStorage) - this._sqlStorage += " and "; - this._sqlStorage += cond; - return this; -} - -/** - * same as the "and"-function but with preparedStatement functionality - * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" - * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; - * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" - * @param {String} value the value that shall be set into the prepared statement - * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; - * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) - * @return {Object} current SqlCondition-object - */ -SqlCondition.prototype.andPrepare = function(field, cond, value, fieldType){ - cond = this._prepare(field, cond, value, fieldType); - return this.and(cond); -} - -/** - * append with SQL-or; Also paranthesize the existing conditions - * @param {String} cond the condition string which shall be appended - * @return {Object} current SqlCondition-object - */ -SqlCondition.prototype.or = function(cond){ - if (!cond) - return this; - if (this._sqlStorage) - this._sqlStorage = "(" + this._sqlStorage + ") or (" + cond + ")"; - else - this._sqlStorage = cond; - return this; -} - -/** - * same as the "or"-function but with preparedStatement functionality - * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" - * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; - * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" - * @param {String} value the value that shall be set into the prepared statement - * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; - * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) - * @return {Object} current SqlCondition-object - */ -SqlCondition.prototype.orPrepare = function(field, cond, value, fieldType){ - cond = this._prepare(field, cond, value, fieldType); - return this.or(cond); -} -/** - * ready to use string; does not contain a where keyword at the beginning - * @param {String} alternativeCond condition that is returned when nothing has been appended - * @return {String} concatenated SQL-condition; empty string if nothing has been appended or - if passed - the alternativeCond - */ -SqlCondition.prototype.toString = function(alternativeCond){ - if (!this._sqlStorage && alternativeCond) - return alternativeCond - else - return this._sqlStorage; -} -/** - * ready to use string; does contain a where keyword at the beginning - * @param {String} alternativeCond condition that is returned when nothing has been appended - * @return {String} concatenated SQL-condition; empty string if nothing has been appended or - if passed - the alternativeCond - */ -SqlCondition.prototype.toWhereString = function(alternativeCond){ - var cond = this.toString(alternativeCond); - if (cond) - return " where " + cond; - else - return cond; -} - -/** - * hidden function for composing preparedStatements - * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" - * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; - * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" - * @param {String} value the value that shall be set into the prepared statement - * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; - * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) - * @return {String} the replaced SQL-condition string (replace # by the fieldname) - */ -SqlCondition.prototype._prepare = function(field, cond, value, fieldType){ - //this function looks more complex (and slower) than it actually is - /* the following regex looks like this after javascript-escaping of the backslash: (?<!\\)((?:\\\\)*)# - the regexp searches for the unescaped character and these characters are replaced by the field name - - examples: - --------------------- - | # --match | - | \# --no-match | - | \\# --match | - | \\\# --no-match | - | \\\\# --match | - --------------------- - */ - //use replaceAll because it's faster and supports negative lookbehinds - cond = text.replaceAll(cond, { - //manually readd the replaced backslashes by using a group reference, because they a part of the match and therefore replaced by "replaceAll" - //since the field COULD contain already a group reference (I think this is extremely uncommon; - //probably that never happens but better stay save): escape that references within the fieldname - "(?<!\\\\)((?:\\\\\\\\)*)#": "$1" + text.replaceAll(field, {"$1": "\\$1"}), - //now that we've replaced the correct field placeholder let's replace the escaped number sign "\#" to a normal number sign "#" - "\\\\#": "#" - }); - type = fieldType || SqlUtils.getSingleColumnType(field, undefined, this.alias); - this.preparedValues.push([value.toString(), type]); - return cond; -} - -function SqlMaskingUtils(){ - //TODO: use callbacks for different handling? - /** - * masks the function cast of standard sql - * - * @param {String} field name of the database field that shall be castet - * @param {String} [targetDatatype] a SQLTYPES-value of the following: SQLTYPES.CHAR, SQLTYPES.VARCHAR, SQLTYPES.INTEGER, - * SQLTYPES.DECIMAL, SQLTYPES.DATE - * @param {int|int[]} targetLength specifies the length of the target data type; - * <br/>- char/varchar: length - * <br/>- decimal: [length, decimals] - * @param {String} [alias=the current alias] the alias where the statement shall be executed (this is needed to determine the database-type) - * - * @return {String} sql part to be included in sql-statements - */ - this.cast = function (field, targetDatatype, targetLength, alias){ - /* Some informations if you want to add supported databaseTypes or dataTypes: - * You should consider using the _mapDefaults function-expression (details in the functions doc) - * However you shouldn't use the function in a "default"-Block of a switch-case because of the following behaviour: - * If a datatype is not supported you just have to NOT specify "sqlDataType" (leave it "undefined") -> an error is then raised - * Therefore you should explicitly define which Data-type is supported and which is not - */ - var dbType, functionName, sqlPart, sqlDataType, _mapDefaults; - if (alias == undefined) - alias = vars.getString("$sys.dbalias"); - dbType = db.getDatabaseType(alias); - functionName = "cast";//overwrite this in the "switch (dbType)" if needed with your DBMS - - /** - * handles default-scenarios for mapping input-targetDatatype to a string for a sql-statement - * e.g. SQLTYPES.INTEGER --> int - * @param {Number} dataType input as a value of "SQLTYPES." that will be mapped to a string - * @return {String} the mapped dataType for using in a sql-statement - */ - _mapDefaults = function (dataType){ - var res; - switch(dataType) - { - case SQLTYPES.CHAR: - res = "char"; - break; - case SQLTYPES.VARCHAR: - res = "char"; - break; - case SQLTYPES.INTEGER: - res = "int"; - break; - case SQLTYPES.DECIMAL: - res = "decimal"; - break; - case SQLTYPES.DATE: - res = "date"; - break; - } - return res; - } - switch (dbType) { - case db.DBTYPE_DERBY10: - switch(targetDatatype) { - case SQLTYPES.VARCHAR: - // Because of a Derby bug, you can't cast INTEGER into VARCHAR - // Therefor first cast to char then to varchar - // https://issues.apache.org/jira/browse/DERBY-2072 - field = "rtrim(" + cast(field, SQLTYPES.CHAR, targetLength, alias) + ")"; - sqlDataType = "varchar"; - break; - case SQLTYPES.CHAR: - //TODO: throw error if(targetLength > 254)? https://db.apache.org/derby/docs/10.14/ref/rrefsqlj13733.html - sqlDataType = "char"; - break; - case SQLTYPES.DECIMAL: - case SQLTYPES.INTEGER: - case SQLTYPES.DATE: - sqlDataType = _mapDefaults(dataType); - break; - } - break; - case db.DBTYPE_MARIADB10: - case db.DBTYPE_MYSQL4: - switch(targetDatatype) { - case SQLTYPES.VARCHAR: - case SQLTYPES.CHAR: - case SQLTYPES.INTEGER: - case SQLTYPES.DECIMAL: - case SQLTYPES.DATE: - sqlDataType = _mapDefaults(targetDatatype); - break; - } - break; - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - switch(pDatatype) - { - case SQLTYPES.VARCHAR: - datatype = "varchar2"; - break; - case SQLTYPES.INTEGER: - datatype = "number"; - targetLength = "10" - break; - case SQLTYPES.CHAR: - case SQLTYPES.DECIMAL: - case SQLTYPES.DATE: - sqlDataType = _mapDefaults(targetDatatype); - break; - } - break; - case db.DBTYPE_POSTGRESQL8: - switch(pDatatype) - { - case SQLTYPES.DATE: - case SQLTYPES.DECIMAL: - case SQLTYPES.INTEGER: - case SQLTYPES.CHAR: - case SQLTYPES.VARCHAR: - sqlDataType = _mapDefaults(targetDatatype); - break; - } - break; - case db.DBTYPE_SQLSERVER2000: - case SQLTYPES.DATE: - case SQLTYPES.DECIMAL: - case SQLTYPES.INTEGER: - case SQLTYPES.CHAR: - case SQLTYPES.VARCHAR: - sqlDataType = _mapDefaults(targetDatatype); - break; - case db.DBTYPE_FIREBIRD250: - //TODO: firebird support? - break; - } - - if (sqlDataType == undefined) { - throw new Error("sqlDataType");//TODO: add usefull message - } - - if(targetLength == undefined) - targetLength = ""; - else if(targetLength != "") - { - if(typeof(targetLength == "object") && (targetLength instanceof Array)) - targetLength = "(" + targetLength.join(", ") + ")"; - else - targetLength = "(" + targetLength + ")"; - } - - sqlPart = functionName + "(" + field + " as " + sqlDataType + targetLength + ")"; - return sqlPart; - } -} - -function SqlUtils(){ -} - -SqlUtils.getSingleColumnType = function(fieldOrTableName, columnName, alias) -{ - var tableName, fieldVarType; - if (columnName == undefined){ - fieldVarType = typeof(fieldOrTableName); - if (fieldVarType == "string") - fieldOrTableName = text.split(fieldOrTableName, "\\."); - else if (fieldVarType != "object"){ - throw new TypeError();//TODO: add message - } - - if (fieldOrTableName.hasOwnProperty("length") && fieldOrTableName.length == 2) - { - tableName = fieldOrTableName[0]; - columnName = fieldOrTableName[1]; - } - else - throw new TypeError();//TODO: add message - } - else - tableName = fieldOrTableName; - - if (typeof(columnName) != "string") - throw new TypeError();//TODO: add message - if (typeof(tableName) != "string") - throw new TypeError();//TODO: add message - - if (alias == undefined) - alias = db.getCurrentAlias(); - - return db.getColumnTypes(tableName, [columnName], alias)[0]; -} - -/** - *Class containing utilities for SQL - *@deprecated use SqlMaskingUtils - *@class - */ -function LegacySqlUtils() -{ - var that = this; - /** - * masks the cast function for lob datatypes(clob, blob) - * - * @param {String} pField req the data field - * @param {Integer|Interger[]} pLength req the length of the data - * decimal: [length, decimals] - * @param {String} pAlias req the database alias - * - * @return {String} (Teil einer SQL-Anweisung) - */ - this.castLob = function(pField, pLength, pAlias) - { - if(pAlias == undefined) - pAlias = vars.getString("$sys.dbalias"); - - var dbtype = db.getDatabaseType(pAlias); - - switch(Number(dbtype)) - { - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - return "DBMS_LOB.SUBSTR(" + pField + ", " + pLength + ", 1)"; - break; - default: - return cast(pField, "varchar", pLength, pAlias); - break; - } - } - /** - * masks the function substring. - * - * @param {String }pExpression req - * @param {Integer} pStart req index of the beginning - * @param {String} pAlias req database alias - * @param {Integer} pLength req - * - * @return {String} - */ - this.substring = function(pExpression, pStart, pLength, pAlias) - { - if(pLength == undefined) - pLength = 100; - if(pAlias == undefined) - pAlias = vars.getString("$sys.dbalias"); - - var dbtype = db.getDatabaseType(pAlias); - var string = ""; - - switch(Number(dbtype)) - { - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - string = "substr"; - break; - case db.DBTYPE_DERBY10: - string = "substr"; - break; - case db.DBTYPE_POSTGRESQL8: - string = "substr"; - break; - case db.DBTYPE_SQLSERVER2000: - string = "substring"; - break; - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - string = "substring"; - break; - } - - return string + "(" + pExpression + ", " + pStart + ", " + pLength + ")"; - } - - /** - * masks the function concat. - * - * @param {Array} pFields req fields that should be concatenated - * @param {String} pSeparator opt field separator - * @param {String} pAlias opt database alias - * - * @return {String} part of SQL-querey - */ - this.concat = function(pFields, pSeparator, pAlias) - { - var i; - if(pAlias == undefined || pAlias == "") - pAlias = vars.getString("$sys.dbalias"); - - var dbtype = db.getDatabaseType(pAlias); - var concat_string = " || "; - var retstr = ""; - var blank = "' '"; - - //it must be checked for empty string and null - var isNotEmpty = " != '' "; - var isNotNull = " is not null "; - if(pSeparator == undefined) - pSeparator = " "; - - switch(Number(dbtype)) - { - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - retstr = " concat_ws( '" + pSeparator + "'"; - for(i=0; i<pFields.length; i++) - { - retstr += ", " + pFields[i]; - } - return retstr + ") "; - break; - - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - blank = "trim(' ')"; - isNotEmpty = " is not null "; //needed for oracle - break; - - case db.DBTYPE_SQLSERVER2000: - concat_string = " + "; - break; - } - pSeparator = concat_string + "'" + pSeparator + "'"; - for(i = 0; i < pFields.length; i++) - { - if(retstr != "") - retstr += concat_string; - if ( i < pFields.length - 1 ) //Check if another value follows, if not separator is not needed - retstr += " case when " + pFields[i] + isNotEmpty + " then case when " + this.trimSql(pFields[i+1], pAlias) + isNotEmpty + " and " - + this.trimSql(pFields[i+1], pAlias) + isNotNull + " then " + pFields[i] + pSeparator + " else " + pFields[i] + " end" + " else " + blank + " end "; - else - retstr += " case when " + pFields[i] + isNotEmpty + " then " + pFields[i] + " else " + blank + " end "; - } - return retstr; - } - /** - * builds a condition out of multiple conditions - * - * @param {Array} pArray req Array containing the conditions - * @param {String} pOperator req Operator that concatenates the conditions (AND/OR) - * - * @return {String} concatenated Condition - */ - this.concatConditions = function(pArray, pOperator) - { - var resultCondition = ""; - - for(var i = 0; i < pArray.length; i++) - { - if(pArray[i] != null && pArray[i] != '') - { - if(resultCondition.length > 0) - resultCondition += (" " + pOperator + " "); - - resultCondition += pArray[i]; - } - } - - return resultCondition; - } - /** - * Checks if a new entry already exists - * - * @param {String} pTable req Databasetable(z.B. "comm") - * @param {Array} pColumns req colums, like sqlInsert - * @param {Array} pTypes req die datatypes, like sqlInsert - * @param {Array} pValues req values, like sqlInsert - * @param {Array} pExcludeFields opt columns, that should not be checked - * @param {String} pAlias opt Database alias - * - * @return {Integer} - */ - this.isDuplicat = function(pTable, pColumns, pTypes, pValues, pExcludeFields, pAlias) - { - var col = new Array(); - var typ = new Array(); - var val = new Array(); - var excludefields = ["DATE_NEW" ,"DATE_EDIT" ,"USER_NEW" ,"USER_EDIT", "KEYVALUE", "KEYSORT", pTable.toUpperCase() + "ID"]; - - if(pExcludeFields != undefined) - excludefields = excludefields.concat(pExcludeFields); - if(pAlias == undefined) - pAlias = vars.getString("$sys.dbalias"); - - for(var i = 0; i < pColumns.length; i++) - { - if(!hasElement(excludefields, pColumns[i], true) && pValues[i] != "" && pTypes[i] != SQLTYPES.LONGVARCHAR && pTypes[i] != SQLTYPES.CLOB) - { - col.push(pColumns[i]); - typ.push(pTypes[i]); - val.push(pValues[i]); - } - } - var count = db.getRowCount(pTable, col, typ, val, pAlias); - return count; - } - /** - * returns the trim function depending on the database - * - * @param {String} pField field the should be trimmed - * @param {String} pAlias opt database alias - * - * @return {String} - */ - this.trimSql = function(pField, pAlias) - { - if(pAlias == undefined || pAlias == "") - pAlias = vars.getString("$sys.dbalias"); - - var dbtype = db.getDatabaseType(pAlias); - var string; - - switch(Number(dbtype)) - { - case db.DBTYPE_SQLSERVER2000: - string = "ltrim(rtrim(" + pField + "))"; - break; - default: - string = "trim(" + pField + ")" - break; - } - return string; - } - /** - * returns the day of a date - * - * @param {Datetime} pDate req the date - * @param {String} pAlias req database alias - * - * @return {String} - */ - this.dayFromDate = function(pDate, pAlias) - { - var usedAlias = pAlias; - - if(pAlias == undefined) - usedAlias = vars.getString("$sys.dbalias"); - - var dbAlias = db.getDatabaseType(usedAlias); - var string = ""; - - switch(Number(dbAlias)) - { - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - string = "to_char(" + pDate + ",'dd')"; - break; - case db.DBTYPE_DERBY10: - case db.DBTYPE_SQLSERVER2000: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - string = "DAY(" + pDate + ")"; - break; - case db.DBTYPE_POSTGRESQL8: - string = "EXTRACT (DAY from " + pDate + ")"; - break; - } - return string; - } - /** - * returns the month of a date - * - * @param {Datetime} pDate req the date - * @param {String} pAlias req database alias - * - * @return {String} - */ - this.monthFromDate = function(pDate, pAlias) - { - var usedAlias = pAlias; - if(pAlias == undefined) - usedAlias = vars.getString("$sys.dbalias"); - - var dbAlias = db.getDatabaseType(usedAlias); - var string = ""; - - switch(Number(dbAlias)) - { - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - string = "to_char(" + pDate + ",'MM')"; - break; - case db.DBTYPE_DERBY10: - case db.DBTYPE_SQLSERVER2000: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - string = "MONTH(" + pDate + ")"; - break; - case db.DBTYPE_POSTGRESQL8: - string = "EXTRACT (MONTH FROM " + pDate + ")"; - break; - } - return string; - } - /** - * returns the year of a date - * - * @param {Datetime} pDate req the date - * @param {String} pAlias req database alias - * - * @return {String} - */ - this.yearFromDate = function(pDate, pAlias) - { - var usedAlias = pAlias; - if(pAlias == undefined) - usedAlias = vars.getString("$sys.dbalias"); - - var dbAlias = db.getDatabaseType(usedAlias); - var string = ""; - - switch(Number(dbAlias)) - { - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - string = "to_char(" + pDate + ",'yyyy')"; - break; - case db.DBTYPE_DERBY10: - case db.DBTYPE_SQLSERVER2000: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - string = "YEAR(" + pDate + ")"; - break; - case db.DBTYPE_POSTGRESQL8: - string = "EXTRACT (YEAR FROM " + pDate + ")"; - break; - } - return string; - } - /** - * returns the function for current date depending on database - * - * @return {String} expression - */ - this.currentDate = function() - { - var dbtype = db.getDatabaseType(vars.getString("$sys.dbalias")); - var expression = ""; - - switch (Number(dbtype)) - { - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - case db.DBTYPE_DERBY10: - expression = "CURRENT_DATE"; - break; - case db.DBTYPE_SQLSERVER2000: - expression = "GETDATE()"; - break; - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - expression = "NOW()"; - break; - } - return expression; - } - /** - * returns the current search string incl placeholders - * - * @param {String} pfield req the search field - * @param {String} pfind req the search string - * @param {String} pIgnoreCase opt (true/false) - * @param {String} pPlaceHolder opt (Platzhalter config) - * - * @return {String} - */ - this.getPlacerholderCondition = function( pfield, pfind, pIgnoreCase, pPlaceHolder ) - { - var user = tools.getCurrentUser(); - var IgCa; - var PlHo; - - //wenn optoinal IgnoreCase und PlaceHolder vorhanden, dann diese verwenden - if(pIgnoreCase != undefined) - IgCa = pIgnoreCase; - else - IgCa = user[tools.PARAMS][tools.SELECTION_IGNORECASE]; - - if(pPlaceHolder != undefined) - PlHo = pPlaceHolder; - else - PlHo = user[tools.PARAMS][tools.SELECTION_PLACEHOLDER]; - - if ( pfind ) - { - pfind = pfind.replace( new RegExp("\\'", "g"), "''"); - pfind = pfind.replace( new RegExp("\\*", "g"), "%"); - var ic = (IgCa == "true" ? "UPPER" : ""); - var cond = ""; - switch( PlHo ) - { - case "1": - cond = ic + "(" + pfield + ") like " + ic + "('" + pfind + "%')"; - break; - case "2": - cond = ic + "(" + pfield + ") like " + ic + "('%" + pfind + "')"; - break; - case "3": - cond = ic + "(" + pfield + ") like " + ic + "('%" + pfind + "%')"; - break; - case "4": - cond = ic + "(" + pfield + ") like " + ic + "('" + pfind + "')"; - break; - default: - cond = ic + "(" + pfield + ") = " + ic + "('" + pfind + "')"; - break; - } - } - return cond; - } - /** - * returns SQLSystax for a date. - * - * @param {String} pColumn req Column name - * @param {String} pAlias opt Database alias - * @param {Boolean} pWithTime opt if true, then add time hh:mm:ss - * @param {String} pFormat opt type of the format, e.g. yyyy-MM-dd; possible placeholers are: -dd -MM -yyyy - * - *@return {String} sqlstr, fully functional select for sql for different types of databases - */ - this.getSqlFormattedDate = function(pColumn, pAlias, pWithTime, pFormat) - { - if(pAlias == undefined) - pAlias = vars.getString("$sys.dbalias"); - - var pDatabaseType = db.getDatabaseType(pAlias); - - if (pFormat == undefined) - pFormat = translate.text("yyyy-MM-dd"); - - var str = ""; - - switch(Number(pDatabaseType)) - { - case db.DBTYPE_SQLSERVER2000: - day = "right('0' + cast(day(" + pColumn + ") as varchar(2)) , 2)"; - month = "right('0' + cast(month(" + pColumn + ") as varchar(2)) , 2)"; - year = "cast(year(" + pColumn + ") as char(4))"; - time = pWithTime == true? that.concat(["' '","cast(cast(" + pColumn + " as time) as char(8))"], "", pAlias) : ""; - break; - case db.DBTYPE_POSTGRESQL8: - day = "extract(day from " + pColumn + ")"; - month = "extract(month from " + pColumn + ")"; - year = "extract(year from " + pColumn + ")"; - time = pWithTime == true? that.concat(["' '","extract(time from" + pColumn + ")"], "", pAlias) : ""; - break; - case db.DBTYPE_DERBY10: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - // concat will try to have a leading blank space if the number is => 10. This is why we had to use substr. - day = that.substring(that.concat(["case when day(" + pColumn + ") <= 9 then '00' else '0' end " - , " trim(cast(day(" + pColumn + ") as char(2)))"], "", pAlias), 2, 2, pAlias); - month = that.substring(that.concat(["case when month(" + pColumn + ") <= 9 then '00' else '0' end " - , "trim(cast(month(" + pColumn + ") as char(2)))"], "", pAlias), 2, 2, pAlias); - year = "trim(cast(year(" + pColumn + ") as char(4)))"; - time = pWithTime == true? that.concat(["cast(' ' as char(1))", "trim(cast(time(" + pColumn + ") as char(8)))"], "", pAlias) : ""; - break; - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_OCI: - case db.DBTYPE_ORACLE10_THIN: - - day = "to_char(" + pColumn + ", 'dd') "; - month = "to_char(" + pColumn + ", 'MM') "; - year = "to_char(" + pColumn + ", 'yyyy') "; - time = pWithTime == true ? " to_char(" + pColumn + ", ' hh24:mi:ss')" : ""; - break; - default: - str = "cast(" + pColumn + " as varchar (10))"; - return str; - break; - } - - var re = /(dd)|(MM)|(yyyy)/g // Regex to check the date - var matchResult; - var endOfLastMatch = 0; - var res = []; - - while ((matchResult = re.exec(pFormat)) !== null) - { - if( endOfLastMatch != matchResult.index) - { - res.push("'" + db.quote(pFormat.substring(endOfLastMatch, matchResult.index), pAlias) + "'"); // making sure we get the correct amount of quotations - } - switch(matchResult[0]) - { - case "dd": - res.push(day); - break; - case "MM": - res.push(month); - break; - case "yyyy": - res.push(year); - break; - } - endOfLastMatch = re.lastIndex; - } - // making sure we get the correct amount of quotations - // allows us to add custom strings behind the format which will be shown in the output - // e.g. "yyyy-MM-dd 00:00", "date: MM/dd/yyyy" - res.push("'" + db.quote(pFormat.slice(endOfLastMatch), pAlias) + "'"); - - if(time != "") - res.push(time); - - str = concat(res, "", pAlias); - - return str; - } - /** - * returns a SQL operator depending on an integer value, i.e. $local.operator - * - * @param {int} pVal - * - * @return {string} - */ - this.getSQLOperator = function(pVal) - { - var retval = ""; - switch(Number(pVal)) - { - case 1: - retval = "="; - break; //equals - case 2: - retval = "<>"; - break; //not equal - case 3: - retval = ">"; - break; //greater - case 4: - retval = "<"; - break; //lesser - case 5: - retval = "<="; - break; //lesser or equal - case 6: - retval = ">="; - break; //greater or equal - case 7: - retval = "like"; - break; //contains - case 8: - retval = "not like"; - break; //contains not - case 9: - retval = ""; - break; - case 10: - retval = ""; - break; - case 11: - retval = "is not null"; - break; - case 12: - retval = "is null"; - break; - } - return retval; - } - /** - * returns the function which determines the length of binary data, depending on db type - * - * @param {String} pField name of the checked field - * - * @return {String} - */ - this.binDataLength = function(pField) - { - var dbtype = db.getDatabaseType(vars.getString("$sys.dbalias")); - var length; - - switch(Number(dbtype)) - { - case db.DBTYPE_MARIADB10: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - case db.DBTYPE_POSTGRESQL8: - case db.DBTYPE_DERBY10: - length = "LENGTH("+pField+")"; - break; - case db.DBTYPE_SQLSERVER2000: - length = "DATALENGTH("+pField+")"; - break; - } - return length; - } - /** - * returns the function for replacing a null value - * - * @param {String} pValue req - * @param {String} pReplaceWith - * - * @return {string} - */ - this.isNull = function(pValue, pReplaceWith) - { - var pAlias = vars.getString("$sys.dbalias"); - - if(pReplaceWith == undefined) - pReplaceWith = 0; - - var pDatabaseType = db.getDatabaseType(pAlias); - - switch(Number(pDatabaseType)) - { - case db.DBTYPE_SQLSERVER2000: - str = "isnull("+ pValue +", " + pReplaceWith+ ")"; - break; - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_OCI: - case db.DBTYPE_ORACLE10_THIN : - str = "NVL("+ pValue +", "+ pReplaceWith+ ")"; - break; - case db.DBTYPE_POSTGRESQL8: - case db.DBTYPE_DERBY10: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_MARIADB10: - default: - str = "COALESCE("+ pValue +", "+ pReplaceWith+ ")"; - break; - } - return str; - } - /** - * returns the concat symbol depending on database type - * - * @param {String} pAlias opt database alias - * - * @return {String} Concat Symbol - */ - this.getConcatSymbol = function(pAlias) - { - if(pAlias == undefined || pAlias == "") - pAlias = vars.getString("$sys.dbalias"); - - var dbtype = db.getDatabaseType(pAlias); - var concatSymbol = " "; - - switch(Number(dbtype)) - { - case db.DBTYPE_SQLSERVER2000: - concatSymbol = " + "; - break; - case db.DBTYPE_MARIADB10: - case db.DBTYPE_MYSQL4: - case db.DBTYPE_ORACLE10_CLUSTER: - case db.DBTYPE_ORACLE10_THIN: - case db.DBTYPE_ORACLE10_OCI: - case db.DBTYPE_POSTGRESQL8: - case db.DBTYPE_DERBY10: - default: - concatSymbol = " || "; - break; - } - - return concatSymbol; - } - /** - * Builds a SQL IN condition, while accounting for the 1000 elements maximum - * Single conditions are concatenated with OR, which can be devastating for performance! - * - * @param {String} pFieldname req name of the field with table alias - * z.B ORGREL.RELATIONID - * @param {String[]|String[][]} pData req Data as ID Array - * @param {String} pQuoteSymbol opt symbol for quoting values, - * Strings i.e.: ' default is no symbol - * - * @return {String} SQL condition: where VALS in (1,2,3) - */ - this.getSqlInStatement = function(pFieldname, pData, pQuoteSymbol) - { - if (pData.length == 0) - return " 1 = 2 "; - - var res = ""; - var qs = pQuoteSymbol || ""; - - var MAX_COUNT = 1000; - //pData.length -1 um für den Fall, dass MAX_COUNT == pData.length ist trotzdem nur einen Aufruf - //zu machen - var count = ((pData.length -1) / MAX_COUNT) >> 0;//aus kommazahl eine ganzzahl machen - //<= verwenden, da bei einer Länge von "126" der Vorgang einmal ausgeführt werden soll - for (var i = 0; i <= count; i++) - { - if (i > 0) - res += "or "; - - res += pFieldname + " in (" + qs + pData.slice(i * MAX_COUNT, i * MAX_COUNT + MAX_COUNT) - .join(qs + ", " + qs) + qs + ") "; - } - - //wenn mehrere Zeilen mit "or" verknüpft wurden nochmal klammern - if (count > 0) - res = "(" + res + ")"; - - return res; - } - /** - * Setzt eine Condition zusammen und liefert sie zurück - * builds a conditions and returns it - * - * @param {Object} pValue req Filtervalue - * @param {String} pCondition req variable in which the condition should be written - * @param {String} pWhere req additional condition - * @param {Integer} pSQLType opt SQLTYPES type of pValue - * @param {Array} pPreparedValues opt Value for the condition, if it's a prepared statement - * - * @return {String} - */ - this.makeCondition = function( pValue, pCondition, pWhere, pSQLType, pPreparedValues) - { - if ( pValue != "" ) - { - if ( pCondition != "" ) - pCondition += " and "; - - pCondition += pWhere; - - if(pPreparedValues != undefined) - { - pPreparedValues.push([pValue, pSQLType]); - } - } - return pCondition; - } - /** - * returns a type of column in the database - * - * @param {String} pTableName req name of a table (e.g. "EVENT") OR if pColumnName is not passed table.column (e.g. "EVENT.STATUS") - * @param {String} pColumnName opt name of column (e.g. "STATUS") if in pTableName only tablename is passed - * @param {String} pAlias opt Alias to the database where the type should be loaded; default is current alias - * - * @return {String} type of column such as SQLTYPES.xyz - */ - this.getSingleColumnType = function(pTableName, pColumnName, pAlias) - { - if (pColumnName == undefined) - { - pColumnName = pTableName.substring(pTableName.indexOf(".") + 1); - pTableName = pTableName.substring(0, pTableName.indexOf(".")); - } - if (pAlias == undefined) - pAlias = db.getCurrentAlias(); - - return db.getColumnTypes(pTableName, [pColumnName], pAlias)[0]; - } - /** - * calls a given function for N blocks of sql-data as long as records are available or the paging-process is manually canceled - * - * @param {Object|String} pSql req sql statement that shall be executed - * String: SQL-query in a simple text form - * Object: prepared-sql-query: [sqlStr, [[value1, type1], [valueN, typeN]]] - * @param {Number} pBlockSize req Amount of records that shall be read per block. (you need to specify an ORDER BY in your SQL-query) - * "0" <=> all records - * @param {Object (function)} pCallback req a callback-function that is called for every block and has the following params: - * myCallback(myDataBlockAs2Darray, myLoopCountThatStartsWith1) - * If "false" is returned sqlPageData will abort the paging process and return false - * @param {String} pDbAlias opt Database-Aliasname, where the SQL-Statement shall be executed; default is the current dbalias - * @param {Number} pTimeout opt Timeout in milliseconds; When it's reached the SQL-Statement will abort; default is in PREFERENCES configured - * @param {Number} pStartOffset opt Position where to begin with the data-reading-process; default is 0 - * - * - * @return {bool} returns whether the function read all available data or not: - * false if the callback-function returned false, otherwise true - * - * @example - * var varValues = [];//you've got access to variables declared with 'var' - * let letValues = [];//you've got access to variables declared with 'let' - * var count = 0;//you cannot overwrite a variable of 'sqlPageData' by accident - * - * var sql = "select ORGNAME from ORG"; - * var blockSize = 5 * 1000; - * - * var allRows = +db.cell("select count(*) from ORG"); - * - * sqlPageData(sql, blockSize, function (pData, pRunNo){ - * var j = pData.length;//pData is the current block with data - * logging.log(pRunNo.toString() + "#" + j);//pRunNo is the amount how often the func. has been already called - * //you can calculate the progress easily by: progress = (blockSize* (pRunNo-1) + pData.length) / (allRows - startOffset) - * //example in per cent: - * var startOffset = 0;//we did not pass any startOffset to sqlPageData - this is equivalent to zero - * var progress = (blockSize* (pRunNo-1) + pData.length) / (allRows - startOffset); - * logging.log("progess: " + eMath.roundDec(progress * 100, 2, eMath.ROUND_CEILING) + "%"); - * - * for (var i = 0; i < j; i++) - * { - * varValues.push(pData[i][0]); - * letValues.push(pData[i][0]); - * } - * - * count += pRunNo * 100; - * logging.log("count:" + count);//you cannot overwrite a variable of 'sqlPageData' by accident - * }); - * - * logging.show(letValues);//contains orgnames - * logging.show(varValues);//contains orgnames - */ - this.sqlPageData = function(pSql, pBlockSize, pCallback, pDbAlias, pTimeout, pStartOffset) - { - if (pDbAlias == undefined) - pDbAlias = db.getCurrentAlias(); - - if (pStartOffset == undefined) - pStartOffset = 0; - - let count = 0; - while (pStartOffset > -1) - { - let data; - if (pTimeout == undefined) - data = db.tablePage(pSql, pDbAlias, pStartOffset, pBlockSize); - else - data = db.tablePage(pSql, pDbAlias, pStartOffset, pBlockSize, pTimeout); - - pStartOffset += pBlockSize; - - //this happens when all-records % pBlockSize == 0 - //we do not want to call the callback-fn - if (data.length == 0) - return true; - else if (data.length < pBlockSize || pBlockSize == 0)//blocksize 0 is everything - pStartOffset = -1;//call callback the last time - - if (pCallback.call(this, data, ++count) === false) - return false;//callback can return false to manually stop the paging-process - - } - return true; - } +import("system.translate"); +import("system.vars"); +import("system.db"); +import("system.datetime"); +import("system.tools"); +import("system.SQLTYPES"); +import("system.text"); +import("Util_lib"); + +/** + * object for easier handling of conditions; + * With this object you do not have to check if the string is empty or not; + * you don't need to append a "1=1" condition or similar; + * this objects gains most benefit if you have a lot of conditions that are added (or not) depending on tons of conditions + * @example //TODO: add missing example + */ +function SqlCondition(alias){ + //setting null is only needed to provide autocomplete for the ADITO-designer + this.preparedValues = null; + this._init();//the properties are initalized in an extra function because init is nearly the same as resetting (clearing) the SqlConditions + this.alias = alias; +} +/** + * append with SQL-and; no paranthesize of existing conditions is done + * @param {String} cond the condition string which shall be appended + * @return {Object} current SqlCondition-object + */ +SqlCondition.prototype.and = function(cond){ + if (!cond) + return this; + if (this._sqlStorage) + this._sqlStorage += " and "; + this._sqlStorage += cond; + return this; +} + +/** + * same as the "and"-function but with preparedStatement functionality + * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" + * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; + * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" + * @param {String} value the value that shall be set into the prepared statement + * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; + * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) + * @return {Object} current SqlCondition-object + */ +SqlCondition.prototype.andPrepare = function(field, cond, value, fieldType){ + cond = this._prepare(field, cond, value, fieldType); + return this.and(cond); +} + +/** + * append with SQL-or; Also paranthesize the existing conditions + * @param {String} cond the condition string which shall be appended + * @return {Object} current SqlCondition-object + */ +SqlCondition.prototype.or = function(cond){ + if (!cond) + return this; + if (this._sqlStorage) + this._sqlStorage = "(" + this._sqlStorage + ") or (" + cond + ")"; + else + this._sqlStorage = cond; + return this; +} + +/** + * same as the "or"-function but with preparedStatement functionality + * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" + * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; + * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" + * @param {String} value the value that shall be set into the prepared statement + * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; + * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) + * @return {Object} current SqlCondition-object + */ +SqlCondition.prototype.orPrepare = function(field, cond, value, fieldType){ + cond = this._prepare(field, cond, value, fieldType); + return this.or(cond); +} +/** + * ready to use string; does not contain a where keyword at the beginning + * @param {String} alternativeCond condition that is returned when nothing has been appended + * @return {String} concatenated SQL-condition; empty string if nothing has been appended or - if passed - the alternativeCond + */ +SqlCondition.prototype.toString = function(alternativeCond){ + if (!this._sqlStorage && alternativeCond) + return alternativeCond + else + return this._sqlStorage; +} +/** + * ready to use string; does contain a where keyword at the beginning + * @param {String} alternativeCond condition that is returned when nothing has been appended + * @return {String} concatenated SQL-condition; empty string if nothing has been appended or - if passed - the alternativeCond + */ +SqlCondition.prototype.toWhereString = function(alternativeCond){ + var cond = this.toString(alternativeCond); + if (cond) + return " where " + cond; + else + return cond; +} + +/** + * hidden function for composing preparedStatements + * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" + * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; + * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" + * @param {String} value the value that shall be set into the prepared statement + * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; + * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) + * @return {String} the replaced SQL-condition string (replace # by the fieldname) + */ +SqlCondition.prototype._prepare = function(field, cond, value, fieldType){ + var type; + //this function looks more complex (and slower) than it actually is + /* the following regex looks like this after javascript-escaping of the backslash: (?<!\\)((?:\\\\)*)# + the regexp searches for the unescaped character and these characters are replaced by the field name + + examples: + --------------------- + | # --match | + | \# --no-match | + | \\# --match | + | \\\# --no-match | + | \\\\# --match | + --------------------- + */ + //use replaceAll because it's faster and supports negative lookbehinds + cond = text.replaceAll(cond, { + //manually readd the replaced backslashes by using a group reference, because they a part of the match and therefore replaced by "replaceAll" + //since the field COULD contain already a group reference (I think this is extremely uncommon; + //probably that never happens but better stay save): escape that references within the fieldname + "(?<!\\\\)((?:\\\\\\\\)*)#": "$1" + text.replaceAll(field, {"$1": "\\$1"}), + //now that we've replaced the correct field placeholder let's replace the escaped number sign "\#" to a normal number sign "#" + "\\\\#": "#" + }); + type = fieldType || SqlUtils.getSingleColumnType(field, undefined, this.alias); + this.preparedValues.push([value.toString(), type]); + return cond; +} + + +/** + * function that resets the current SqlCondition as if no conditions would have been added + * this is usefull if you want to reuse the same object over and over + * @return {null} + */ +SqlCondition.prototype.clear = function(){ + this._sqlStorage = ""; + this.preparedValues = []; + return null; +} + +/** + * hidden function for initializing all properties for the sql conditions + * @return {null} + */ +SqlCondition.prototype._init = function(){ + //init only wraps the clear function to avoid confusion in the constructor (and provide better extensibility) + return this.clear(); +} +/** + provides functions for masking sql functions +* +* @param {String} [alias=currentAlias] database alias, you can specify null if you have no alias available and you can manually set the dbType property +*/ +function SqlMaskingUtils(alias){ + this.alias = null; + Object.defineProperty(this, "alias", { + set: function(v){ + this._alias = v; + if (v != null) + this._dbType = db.getDatabaseType(this._alias); + }, + get: function (){ + return this._alias; + } + }); + this.dbType = null; + Object.defineProperty(this, "dbType", { + set: function(v){ + this._alias = null; + this._dbType = v; + }, + get: function (){ + return this._dbType; + } + }); + + if (alias === undefined) + this.alias = vars.getString("$sys.dbalias"); + else + this.alias = alias; +} + +/** +* returns the trim function depending on the database behin the given alias +* note that this function does not verifiy where the types of your expression are trimable or not +* +* @param {String} field expression that shall be trimmed +* +* @return {String} +*/ +SqlMaskingUtils.prototype.trim = function(field) { + var dbType, resultStr; + dbType = this.dbType; + switch(dbType) { + case db.DBTYPE_SQLSERVER2000: + resultStr = "ltrim(rtrim(" + field + "))"; + break; + default: + resultStr = "trim(" + field + ")" + break; + } + return resultStr; +} + + +/** + * masks the function cast of standard sql + * please note that this function does not do any validation if it's possible to cast the expression's datatype you pass to the function in every supported DBMS + * + * @param {String} field name of the database field that shall be castet + * @param {String} [targetDatatype] a SQLTYPES-value of the following: SQLTYPES.CHAR, SQLTYPES.VARCHAR, SQLTYPES.INTEGER, + * SQLTYPES.DECIMAL, SQLTYPES.DATE + * @param {int|int[]} targetLength specifies the length of the target data type; + * <br/>- char/varchar: length + * <br/>- decimal: [length, decimals] + * + * @return {String} sql part to be included in sql-statements + */ +SqlMaskingUtils.prototype.cast = function (field, targetDatatype, targetLength){ + //TODO: use callbacks for different handling? + /* Some informations if you want to add supported databaseTypes or dataTypes: + * You should consider using the _mapDefaults function-expression (details in the functions doc) + * However you shouldn't use the function in a "default"-Block of a switch-case because of the following behaviour: + * If a datatype is not supported you just have to NOT specify "sqlDataType" (leave it "undefined") -> an error is then raised + * Therefore you should explicitly define which Data-type is supported and which is not + */ + var dbType, functionName, sqlPart, sqlDataType, _mapDefaults; + dbType = this.dbType; + functionName = "cast";//overwrite this in the "switch (dbType)" if needed with your DBMS + + /** + * handles default-scenarios for mapping input-targetDatatype to a string for a sql-statement + * e.g. SQLTYPES.INTEGER --> int + * @param {Number} dataType input as a value of "SQLTYPES." that will be mapped to a string + * @return {String} the mapped dataType for using in a sql-statement + */ + _mapDefaults = function (dataType){ + var res; + switch(dataType) { + case SQLTYPES.CHAR: + res = "char"; + break; + case SQLTYPES.VARCHAR: + res = "char"; + break; + case SQLTYPES.INTEGER: + res = "int"; + break; + case SQLTYPES.DECIMAL: + res = "decimal"; + break; + case SQLTYPES.DATE: + res = "date"; + break; + } + return res; + } + + switch (dbType) { + case db.DBTYPE_DERBY10: + switch(targetDatatype) { + case SQLTYPES.VARCHAR: + // Because of a Derby bug, you can't cast INTEGER into VARCHAR + // Therefor first cast to char then to varchar + // https://issues.apache.org/jira/browse/DERBY-2072 + field = "rtrim(" + this.cast(field, SQLTYPES.CHAR, targetLength) + ")"; + sqlDataType = "varchar"; + break; + case SQLTYPES.CHAR: + //TODO: throw error if(targetLength > 254)? https://db.apache.org/derby/docs/10.14/ref/rrefsqlj13733.html + sqlDataType = "char"; + break; + case SQLTYPES.DECIMAL: + case SQLTYPES.INTEGER: + case SQLTYPES.DATE: + sqlDataType = _mapDefaults(targetDatatype); + break; + } + break; + case db.DBTYPE_MARIADB10: + case db.DBTYPE_MYSQL4: + switch(targetDatatype) { + case SQLTYPES.VARCHAR: + case SQLTYPES.CHAR: + case SQLTYPES.INTEGER: + case SQLTYPES.DECIMAL: + case SQLTYPES.DATE: + sqlDataType = _mapDefaults(targetDatatype); + break; + } + break; + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + switch(targetDatatype) + { + case SQLTYPES.VARCHAR: + datatype = "varchar2"; + break; + case SQLTYPES.INTEGER: + datatype = "number"; + targetLength = "10" + break; + case SQLTYPES.CHAR: + case SQLTYPES.DECIMAL: + case SQLTYPES.DATE: + sqlDataType = _mapDefaults(targetDatatype); + break; + } + break; + case db.DBTYPE_POSTGRESQL8: + switch(targetDatatype) + { + case SQLTYPES.DATE: + case SQLTYPES.DECIMAL: + case SQLTYPES.INTEGER: + case SQLTYPES.CHAR: + case SQLTYPES.VARCHAR: + sqlDataType = _mapDefaults(targetDatatype); + break; + } + break; + case db.DBTYPE_SQLSERVER2000: + case SQLTYPES.DATE: + case SQLTYPES.DECIMAL: + case SQLTYPES.INTEGER: + case SQLTYPES.CHAR: + case SQLTYPES.VARCHAR: + sqlDataType = _mapDefaults(targetDatatype); + break; + case db.DBTYPE_FIREBIRD250: + //TODO: firebird support? + break; + } + + if (sqlDataType == undefined) { + throw new Error("sqlDataType");//TODO: add usefull message + } + + if(targetLength == undefined) + targetLength = ""; + else if(targetLength != "") + { + if(typeof(targetLength == "object") && (targetLength instanceof Array)) + targetLength = "(" + targetLength.join(", ") + ")"; + else + targetLength = "(" + targetLength + ")"; + } + + sqlPart = functionName + "(" + field + " as " + sqlDataType + targetLength + ")"; + return sqlPart; +} + +/** + * masks the cast function for lob datatypes(clob, blob) into varchar or similar + * + * @param {String} field expression that shall be casted + * @param {Integer|Interger[]} targetLength dessired length of the datatype + * decimal: [length, decimals] + * + * @return {String} part of sql-expression that can be used + */ +SqlMaskingUtils.prototype.castLob = function(field, targetLength) { + var res; + switch(this.dbType) { + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + res = "DBMS_LOB.SUBSTR(" + field + ", " + targetLength + ", 1)"; + break; + default: + res = this.cast(field, "varchar", targetLength); + break; + } + return res; +} + +/** + * masks the sql function substring + * + * @param {String } field the expression that shall be substringed + * @param {Number} start posistion where the substring starts + * @param {Number} length amount of characters of the expression will be returned by the sql function + * + * @return {String} part of sql-expression that can be used for substringing + */ +SqlMaskingUtils.prototype.substring = function(field, start, length){ + var sqlFnName; + + switch(this.dbType) + { + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + sqlFnName = "substr"; + break; + case db.DBTYPE_DERBY10: + sqlFnName = "substr"; + break; + case db.DBTYPE_POSTGRESQL8: + sqlFnName = "substr"; + break; + case db.DBTYPE_SQLSERVER2000: + sqlFnName = "substring"; + break; + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + sqlFnName = "substring"; + break; + default: + throw new Error();//ToDo: add message + } + + return sqlFnName + "(" + field + ", " + start + ", " + length + ")"; +} + + +/** +* masks the function concat +* if a sql field is empty no separator will be added +* note that this function will often create a lot of sql-code +* +* @param {Array} fields req fields (or expressions) that should be concatenated +* @param {String} [separatorCharacter=space-character] character for separating the fields; warning: the character will not be quoted +* @param {String} [autoTrimFields=true] autoTrimFields if true the expressions are always trimmed, false no change will be applied +* +* @return {String} part of SQL-querey +*/ +SqlMaskingUtils.prototype.concat = function(fields, separatorCharacter, autoTrimFields) { + var i, concatSql, retSql, isNotEmptyStrSql, isNotNullSql, separatorSql, _isNotEmpty, _trimIfAutoTrimEnabled; + if (fields.length == 0) + return "''"; + else if (fields.length == 1) + return fields[0]; + concatSql = " || "; + isNotEmptyStrSql = " != '' "; + isNotNullSql = " is not null "; + separatorSql = separatorCharacter == undefined ? " " : separatorCharacter; + retSql = ""; + if (autoTrimFields == undefined) + autoTrimFields = true; + + switch(this.dbType) + { + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + retSql = " concat_ws( '" + separatorSql + "'"; + for (i = 0; i < fields.length; i++) { + retSql += ", " + fields[i]; + } + return retSql + ") "; + break; + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + isNotEmptyStrSql = null; //empty strings are changed to DB-null-values internally in oracle; by specifing JS-null we disable this check + break; + case db.DBTYPE_SQLSERVER2000: + //MS SQL Server supports "concat_ws" (and ignoring null values) from version SQL Server 2017 and newer: + //https://docs.microsoft.com/de-de/sql/t-sql/functions/concat-ws-transact-sql?view=sql-server-2017 + concatSql = " + "; + break; + case db.DBTYPE_DERBY10: + break; + default: + throw new Error();//TODO: add Message + } + separatorSql = concatSql + "'" + separatorSql + "'"; + _trimIfAutoTrimEnabled = function(f){ + if (autoTrimFields) + return this.trim(f); + else + return f; + } + _trimIfAutoTrimEnabled = _trimIfAutoTrimEnabled.bind(this); + _isNotEmpty = function(f){ + return _trimIfAutoTrimEnabled(f) + isNotEmptyStrSql + " and " + f + isNotNullSql; + } + _isNotEmpty = _isNotEmpty.bind(this); + + for (i = 0; i < fields.length; i++) { + if (retSql != "") + retSql += concatSql; + retSql += "case when " + _isNotEmpty(fields[i]) + " then "; + if ( i < fields.length - 1 ) //Prüfen, ob ein nachfolgender Wert kommt, sonst braucht man keinen Separator + retSql += " case when " + _isNotEmpty(fields[i + 1]) + " then " + _trimIfAutoTrimEnabled(fields[i]) + separatorSql + " else " + _trimIfAutoTrimEnabled(fields[i]) + " end "; + else + retSql += _trimIfAutoTrimEnabled(fields[i]); + retSql += " else '' end "; + } + return retSql; +} + +/** + * returns the function for replacing a null value + * + * @param {String} field expression that shall be checked for a null value + * @param {String} [replaceWith=empty string] expression that shall be used if the field contains null + * + * @return {string} + */ +SqlMaskingUtils.prototype.isNull = function(field, replaceWith) { + var retSql; + + if (replaceWith == undefined) + replaceWith = "''"; + switch(this.dbType) { + case db.DBTYPE_SQLSERVER2000: + retSql = "isnull(" + field + ", " + replaceWith + ")"; + break; + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_OCI: + case db.DBTYPE_ORACLE10_THIN : + retSql = "nvl(" + field + ", " + replaceWith + ")"; + break; + case db.DBTYPE_POSTGRESQL8: + case db.DBTYPE_DERBY10: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + default: + retSql = "coalesce(" + field + ", " + replaceWith + ")"; + break; + } + return retSql; +} + +function SqlUtils(){ +} + +SqlUtils.getSingleColumnType = function(fieldOrTableName, columnName, alias) { + var tableName, fieldVarType; + if (columnName == undefined){ + fieldVarType = typeof(fieldOrTableName); + if (fieldVarType == "string") + fieldOrTableName = text.split(fieldOrTableName, "\\."); + else if (fieldVarType != "object"){ + throw new TypeError();//TODO: add message + } + + if (fieldOrTableName.hasOwnProperty("length") && fieldOrTableName.length == 2) + { + tableName = fieldOrTableName[0]; + columnName = fieldOrTableName[1]; + } + else + throw new TypeError();//TODO: add message + } + else + tableName = fieldOrTableName; + + if (typeof(columnName) != "string") + throw new TypeError();//TODO: add message + if (typeof(tableName) != "string") + throw new TypeError();//TODO: add message + + if (alias == undefined) + alias = db.getCurrentAlias(); + + return db.getColumnTypes(tableName, [columnName], alias)[0]; +} + +/** + *Class containing utilities for SQL + *@deprecated use SqlMaskingUtils + *@class + */ +function LegacySqlUtils() +{ + var that = this; + /** + * builds a condition out of multiple conditions + * + * @param {Array} pArray req Array containing the conditions + * @param {String} pOperator req Operator that concatenates the conditions (AND/OR) + * + * @return {String} concatenated Condition + */ + this.concatConditions = function(pArray, pOperator) + { + var resultCondition = ""; + + for(var i = 0; i < pArray.length; i++) + { + if(pArray[i] != null && pArray[i] != '') + { + if(resultCondition.length > 0) + resultCondition += (" " + pOperator + " "); + + resultCondition += pArray[i]; + } + } + + return resultCondition; + } + /** + * Checks if a new entry already exists + * + * @param {String} pTable req Databasetable(z.B. "comm") + * @param {Array} pColumns req colums, like sqlInsert + * @param {Array} pTypes req die datatypes, like sqlInsert + * @param {Array} pValues req values, like sqlInsert + * @param {Array} pExcludeFields opt columns, that should not be checked + * @param {String} pAlias opt Database alias + * + * @return {Integer} + */ + this.isDuplicat = function(pTable, pColumns, pTypes, pValues, pExcludeFields, pAlias) + { + var col = new Array(); + var typ = new Array(); + var val = new Array(); + var excludefields = ["DATE_NEW" ,"DATE_EDIT" ,"USER_NEW" ,"USER_EDIT", "KEYVALUE", "KEYSORT", pTable.toUpperCase() + "ID"]; + + if(pExcludeFields != undefined) + excludefields = excludefields.concat(pExcludeFields); + if(pAlias == undefined) + pAlias = vars.getString("$sys.dbalias"); + + for(var i = 0; i < pColumns.length; i++) + { + if(!hasElement(excludefields, pColumns[i], true) && pValues[i] != "" && pTypes[i] != SQLTYPES.LONGVARCHAR && pTypes[i] != SQLTYPES.CLOB) + { + col.push(pColumns[i]); + typ.push(pTypes[i]); + val.push(pValues[i]); + } + } + var count = db.getRowCount(pTable, col, typ, val, pAlias); + return count; + } + + /** + * returns the day of a date + * + * @param {Datetime} pDate req the date + * @param {String} pAlias req database alias + * + * @return {String} + */ + this.dayFromDate = function(pDate, pAlias) + { + var usedAlias = pAlias; + + if(pAlias == undefined) + usedAlias = vars.getString("$sys.dbalias"); + + var dbAlias = db.getDatabaseType(usedAlias); + var string = ""; + + switch(Number(dbAlias)) + { + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + string = "to_char(" + pDate + ",'dd')"; + break; + case db.DBTYPE_DERBY10: + case db.DBTYPE_SQLSERVER2000: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + string = "DAY(" + pDate + ")"; + break; + case db.DBTYPE_POSTGRESQL8: + string = "EXTRACT (DAY from " + pDate + ")"; + break; + } + return string; + } + /** + * returns the month of a date + * + * @param {Datetime} pDate req the date + * @param {String} pAlias req database alias + * + * @return {String} + */ + this.monthFromDate = function(pDate, pAlias) + { + var usedAlias = pAlias; + if(pAlias == undefined) + usedAlias = vars.getString("$sys.dbalias"); + + var dbAlias = db.getDatabaseType(usedAlias); + var string = ""; + + switch(Number(dbAlias)) + { + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + string = "to_char(" + pDate + ",'MM')"; + break; + case db.DBTYPE_DERBY10: + case db.DBTYPE_SQLSERVER2000: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + string = "MONTH(" + pDate + ")"; + break; + case db.DBTYPE_POSTGRESQL8: + string = "EXTRACT (MONTH FROM " + pDate + ")"; + break; + } + return string; + } + /** + * returns the year of a date + * + * @param {Datetime} pDate req the date + * @param {String} pAlias req database alias + * + * @return {String} + */ + this.yearFromDate = function(pDate, pAlias) + { + var usedAlias = pAlias; + if(pAlias == undefined) + usedAlias = vars.getString("$sys.dbalias"); + + var dbAlias = db.getDatabaseType(usedAlias); + var string = ""; + + switch(Number(dbAlias)) + { + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + string = "to_char(" + pDate + ",'yyyy')"; + break; + case db.DBTYPE_DERBY10: + case db.DBTYPE_SQLSERVER2000: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + string = "YEAR(" + pDate + ")"; + break; + case db.DBTYPE_POSTGRESQL8: + string = "EXTRACT (YEAR FROM " + pDate + ")"; + break; + } + return string; + } + /** + * returns the function for current date depending on database + * + * @return {String} expression + */ + this.currentDate = function() + { + var dbtype = db.getDatabaseType(vars.getString("$sys.dbalias")); + var expression = ""; + + switch (Number(dbtype)) + { + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + case db.DBTYPE_DERBY10: + expression = "CURRENT_DATE"; + break; + case db.DBTYPE_SQLSERVER2000: + expression = "GETDATE()"; + break; + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + expression = "NOW()"; + break; + } + return expression; + } + /** + * returns the current search string incl placeholders + * + * @param {String} pfield req the search field + * @param {String} pfind req the search string + * @param {String} pIgnoreCase opt (true/false) + * @param {String} pPlaceHolder opt (Platzhalter config) + * + * @return {String} + */ + this.getPlacerholderCondition = function( pfield, pfind, pIgnoreCase, pPlaceHolder ) + { + var user = tools.getCurrentUser(); + var IgCa; + var PlHo; + + //wenn optoinal IgnoreCase und PlaceHolder vorhanden, dann diese verwenden + if(pIgnoreCase != undefined) + IgCa = pIgnoreCase; + else + IgCa = user[tools.PARAMS][tools.SELECTION_IGNORECASE]; + + if(pPlaceHolder != undefined) + PlHo = pPlaceHolder; + else + PlHo = user[tools.PARAMS][tools.SELECTION_PLACEHOLDER]; + + if ( pfind ) + { + pfind = pfind.replace( new RegExp("\\'", "g"), "''"); + pfind = pfind.replace( new RegExp("\\*", "g"), "%"); + var ic = (IgCa == "true" ? "UPPER" : ""); + var cond = ""; + switch( PlHo ) + { + case "1": + cond = ic + "(" + pfield + ") like " + ic + "('" + pfind + "%')"; + break; + case "2": + cond = ic + "(" + pfield + ") like " + ic + "('%" + pfind + "')"; + break; + case "3": + cond = ic + "(" + pfield + ") like " + ic + "('%" + pfind + "%')"; + break; + case "4": + cond = ic + "(" + pfield + ") like " + ic + "('" + pfind + "')"; + break; + default: + cond = ic + "(" + pfield + ") = " + ic + "('" + pfind + "')"; + break; + } + } + return cond; + } + /** + * returns SQLSystax for a date. + * + * @param {String} pColumn req Column name + * @param {String} pAlias opt Database alias + * @param {Boolean} pWithTime opt if true, then add time hh:mm:ss + * @param {String} pFormat opt type of the format, e.g. yyyy-MM-dd; possible placeholers are: -dd -MM -yyyy + * + *@return {String} sqlstr, fully functional select for sql for different types of databases + */ + this.getSqlFormattedDate = function(pColumn, pAlias, pWithTime, pFormat) + { + if(pAlias == undefined) + pAlias = vars.getString("$sys.dbalias"); + + var pDatabaseType = db.getDatabaseType(pAlias); + + if (pFormat == undefined) + pFormat = translate.text("yyyy-MM-dd"); + + var str = ""; + + switch(Number(pDatabaseType)) + { + case db.DBTYPE_SQLSERVER2000: + day = "right('0' + cast(day(" + pColumn + ") as varchar(2)) , 2)"; + month = "right('0' + cast(month(" + pColumn + ") as varchar(2)) , 2)"; + year = "cast(year(" + pColumn + ") as char(4))"; + time = pWithTime == true? that.concat(["' '","cast(cast(" + pColumn + " as time) as char(8))"], "", pAlias) : ""; + break; + case db.DBTYPE_POSTGRESQL8: + day = "extract(day from " + pColumn + ")"; + month = "extract(month from " + pColumn + ")"; + year = "extract(year from " + pColumn + ")"; + time = pWithTime == true? that.concat(["' '","extract(time from" + pColumn + ")"], "", pAlias) : ""; + break; + case db.DBTYPE_DERBY10: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_MARIADB10: + // concat will try to have a leading blank space if the number is => 10. This is why we had to use substr. + day = that.substring(that.concat(["case when day(" + pColumn + ") <= 9 then '00' else '0' end " + , " trim(cast(day(" + pColumn + ") as char(2)))"], "", pAlias), 2, 2, pAlias); + month = that.substring(that.concat(["case when month(" + pColumn + ") <= 9 then '00' else '0' end " + , "trim(cast(month(" + pColumn + ") as char(2)))"], "", pAlias), 2, 2, pAlias); + year = "trim(cast(year(" + pColumn + ") as char(4)))"; + time = pWithTime == true? that.concat(["cast(' ' as char(1))", "trim(cast(time(" + pColumn + ") as char(8)))"], "", pAlias) : ""; + break; + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_OCI: + case db.DBTYPE_ORACLE10_THIN: + + day = "to_char(" + pColumn + ", 'dd') "; + month = "to_char(" + pColumn + ", 'MM') "; + year = "to_char(" + pColumn + ", 'yyyy') "; + time = pWithTime == true ? " to_char(" + pColumn + ", ' hh24:mi:ss')" : ""; + break; + default: + str = "cast(" + pColumn + " as varchar (10))"; + return str; + break; + } + + var re = /(dd)|(MM)|(yyyy)/g // Regex to check the date + var matchResult; + var endOfLastMatch = 0; + var res = []; + + while ((matchResult = re.exec(pFormat)) !== null) + { + if( endOfLastMatch != matchResult.index) + { + res.push("'" + db.quote(pFormat.substring(endOfLastMatch, matchResult.index), pAlias) + "'"); // making sure we get the correct amount of quotations + } + switch(matchResult[0]) + { + case "dd": + res.push(day); + break; + case "MM": + res.push(month); + break; + case "yyyy": + res.push(year); + break; + } + endOfLastMatch = re.lastIndex; + } + // making sure we get the correct amount of quotations + // allows us to add custom strings behind the format which will be shown in the output + // e.g. "yyyy-MM-dd 00:00", "date: MM/dd/yyyy" + res.push("'" + db.quote(pFormat.slice(endOfLastMatch), pAlias) + "'"); + + if(time != "") + res.push(time); + + str = concat(res, "", pAlias); + + return str; + } + /** + * returns a SQL operator depending on an integer value, i.e. $local.operator + * + * @param {int} pVal + * + * @return {string} + */ + this.getSQLOperator = function(pVal) + { + var retval = ""; + switch(Number(pVal)) + { + case 1: + retval = "="; + break; //equals + case 2: + retval = "<>"; + break; //not equal + case 3: + retval = ">"; + break; //greater + case 4: + retval = "<"; + break; //lesser + case 5: + retval = "<="; + break; //lesser or equal + case 6: + retval = ">="; + break; //greater or equal + case 7: + retval = "like"; + break; //contains + case 8: + retval = "not like"; + break; //contains not + case 9: + retval = ""; + break; + case 10: + retval = ""; + break; + case 11: + retval = "is not null"; + break; + case 12: + retval = "is null"; + break; + } + return retval; + } + /** + * returns the function which determines the length of binary data, depending on db type + * + * @param {String} pField name of the checked field + * + * @return {String} + */ + this.binDataLength = function(pField) + { + var dbtype = db.getDatabaseType(vars.getString("$sys.dbalias")); + var length; + + switch(Number(dbtype)) + { + case db.DBTYPE_MARIADB10: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + case db.DBTYPE_POSTGRESQL8: + case db.DBTYPE_DERBY10: + length = "LENGTH("+pField+")"; + break; + case db.DBTYPE_SQLSERVER2000: + length = "DATALENGTH("+pField+")"; + break; + } + return length; + } + + /** + * returns the concat symbol depending on database type + * + * @param {String} pAlias opt database alias + * + * @return {String} Concat Symbol + */ + this.getConcatSymbol = function(pAlias) + { + if(pAlias == undefined || pAlias == "") + pAlias = vars.getString("$sys.dbalias"); + + var dbtype = db.getDatabaseType(pAlias); + var concatSymbol = " "; + + switch(Number(dbtype)) + { + case db.DBTYPE_SQLSERVER2000: + concatSymbol = " + "; + break; + case db.DBTYPE_MARIADB10: + case db.DBTYPE_MYSQL4: + case db.DBTYPE_ORACLE10_CLUSTER: + case db.DBTYPE_ORACLE10_THIN: + case db.DBTYPE_ORACLE10_OCI: + case db.DBTYPE_POSTGRESQL8: + case db.DBTYPE_DERBY10: + default: + concatSymbol = " || "; + break; + } + + return concatSymbol; + } + /** + * Builds a SQL IN condition, while accounting for the 1000 elements maximum + * Single conditions are concatenated with OR, which can be devastating for performance! + * + * @param {String} pFieldname req name of the field with table alias + * z.B ORGREL.RELATIONID + * @param {String[]|String[][]} pData req Data as ID Array + * @param {String} pQuoteSymbol opt symbol for quoting values, + * Strings i.e.: ' default is no symbol + * + * @return {String} SQL condition: where VALS in (1,2,3) + */ + this.getSqlInStatement = function(pFieldname, pData, pQuoteSymbol) + { + if (pData.length == 0) + return " 1 = 2 "; + + var res = ""; + var qs = pQuoteSymbol || ""; + + var MAX_COUNT = 1000; + //pData.length -1 um für den Fall, dass MAX_COUNT == pData.length ist trotzdem nur einen Aufruf + //zu machen + var count = ((pData.length -1) / MAX_COUNT) >> 0;//aus kommazahl eine ganzzahl machen + //<= verwenden, da bei einer Länge von "126" der Vorgang einmal ausgeführt werden soll + for (var i = 0; i <= count; i++) + { + if (i > 0) + res += "or "; + + res += pFieldname + " in (" + qs + pData.slice(i * MAX_COUNT, i * MAX_COUNT + MAX_COUNT) + .join(qs + ", " + qs) + qs + ") "; + } + + //wenn mehrere Zeilen mit "or" verknüpft wurden nochmal klammern + if (count > 0) + res = "(" + res + ")"; + + return res; + } + /** + * Setzt eine Condition zusammen und liefert sie zurück + * builds a conditions and returns it + * + * @param {Object} pValue req Filtervalue + * @param {String} pCondition req variable in which the condition should be written + * @param {String} pWhere req additional condition + * @param {Integer} pSQLType opt SQLTYPES type of pValue + * @param {Array} pPreparedValues opt Value for the condition, if it's a prepared statement + * + * @return {String} + */ + this.makeCondition = function( pValue, pCondition, pWhere, pSQLType, pPreparedValues) + { + if ( pValue != "" ) + { + if ( pCondition != "" ) + pCondition += " and "; + + pCondition += pWhere; + + if(pPreparedValues != undefined) + { + pPreparedValues.push([pValue, pSQLType]); + } + } + return pCondition; + } + /** + * returns a type of column in the database + * + * @param {String} pTableName req name of a table (e.g. "EVENT") OR if pColumnName is not passed table.column (e.g. "EVENT.STATUS") + * @param {String} pColumnName opt name of column (e.g. "STATUS") if in pTableName only tablename is passed + * @param {String} pAlias opt Alias to the database where the type should be loaded; default is current alias + * + * @return {String} type of column such as SQLTYPES.xyz + */ + this.getSingleColumnType = function(pTableName, pColumnName, pAlias) + { + if (pColumnName == undefined) + { + pColumnName = pTableName.substring(pTableName.indexOf(".") + 1); + pTableName = pTableName.substring(0, pTableName.indexOf(".")); + } + if (pAlias == undefined) + pAlias = db.getCurrentAlias(); + + return db.getColumnTypes(pTableName, [pColumnName], pAlias)[0]; + } + /** + * calls a given function for N blocks of sql-data as long as records are available or the paging-process is manually canceled + * + * @param {Object|String} pSql req sql statement that shall be executed + * String: SQL-query in a simple text form + * Object: prepared-sql-query: [sqlStr, [[value1, type1], [valueN, typeN]]] + * @param {Number} pBlockSize req Amount of records that shall be read per block. (you need to specify an ORDER BY in your SQL-query) + * "0" <=> all records + * @param {Object (function)} pCallback req a callback-function that is called for every block and has the following params: + * myCallback(myDataBlockAs2Darray, myLoopCountThatStartsWith1) + * If "false" is returned sqlPageData will abort the paging process and return false + * @param {String} pDbAlias opt Database-Aliasname, where the SQL-Statement shall be executed; default is the current dbalias + * @param {Number} pTimeout opt Timeout in milliseconds; When it's reached the SQL-Statement will abort; default is in PREFERENCES configured + * @param {Number} pStartOffset opt Position where to begin with the data-reading-process; default is 0 + * + * + * @return {bool} returns whether the function read all available data or not: + * false if the callback-function returned false, otherwise true + * + * @example + * var varValues = [];//you've got access to variables declared with 'var' + * let letValues = [];//you've got access to variables declared with 'let' + * var count = 0;//you cannot overwrite a variable of 'sqlPageData' by accident + * + * var sql = "select ORGNAME from ORG"; + * var blockSize = 5 * 1000; + * + * var allRows = +db.cell("select count(*) from ORG"); + * + * sqlPageData(sql, blockSize, function (pData, pRunNo){ + * var j = pData.length;//pData is the current block with data + * logging.log(pRunNo.toString() + "#" + j);//pRunNo is the amount how often the func. has been already called + * //you can calculate the progress easily by: progress = (blockSize* (pRunNo-1) + pData.length) / (allRows - startOffset) + * //example in per cent: + * var startOffset = 0;//we did not pass any startOffset to sqlPageData - this is equivalent to zero + * var progress = (blockSize* (pRunNo-1) + pData.length) / (allRows - startOffset); + * logging.log("progess: " + eMath.roundDec(progress * 100, 2, eMath.ROUND_CEILING) + "%"); + * + * for (var i = 0; i < j; i++) + * { + * varValues.push(pData[i][0]); + * letValues.push(pData[i][0]); + * } + * + * count += pRunNo * 100; + * logging.log("count:" + count);//you cannot overwrite a variable of 'sqlPageData' by accident + * }); + * + * logging.show(letValues);//contains orgnames + * logging.show(varValues);//contains orgnames + */ + this.sqlPageData = function(pSql, pBlockSize, pCallback, pDbAlias, pTimeout, pStartOffset) + { + if (pDbAlias == undefined) + pDbAlias = db.getCurrentAlias(); + + if (pStartOffset == undefined) + pStartOffset = 0; + + let count = 0; + while (pStartOffset > -1) + { + let data; + if (pTimeout == undefined) + data = db.tablePage(pSql, pDbAlias, pStartOffset, pBlockSize); + else + data = db.tablePage(pSql, pDbAlias, pStartOffset, pBlockSize, pTimeout); + + pStartOffset += pBlockSize; + + //this happens when all-records % pBlockSize == 0 + //we do not want to call the callback-fn + if (data.length == 0) + return true; + else if (data.length < pBlockSize || pBlockSize == 0)//blocksize 0 is everything + pStartOffset = -1;//call callback the last time + + if (pCallback.call(this, data, ++count) === false) + return false;//callback can return false to manually stop the paging-process + + } + return true; + } } \ No newline at end of file