Skip to content
Snippets Groups Projects
Commit fa52aec2 authored by Sebastian Listl's avatar Sebastian Listl :speech_balloon:
Browse files

Merge branch '2020.2_sk_1067042' into '2020.2'

Audit Log History

See merge request xrm/basic!459
parents 7eae3c72 9d70106f
No related branches found
No related tags found
No related merge requests found
Showing
with 641 additions and 3 deletions
<?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="s.kern" id="d4b5f8bc-b211-442a-b417-3b5d3c92def5">
<addColumn tableName="AB_LOGHISTORY">
<column name="AB_LOGHISTORYID" type="CHAR(36)"/>
</addColumn>
<addNotNullConstraint
columnName="AB_LOGHISTORYID"
tableName="AB_LOGHISTORY"
/>
<addPrimaryKey
columnNames="AB_LOGHISTORYID"
constraintName="pk_AB_LOGHISTORYID"
tableName="AB_LOGHISTORY"
/>
</changeSet>
</databaseChangeLog>
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
<include file="addAb_loghistoryId.xml" relativeToChangelogFile="true" />
</databaseChangeLog>
\ No newline at end of file
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
<include relativeToChangelogFile="true" file="Loghistory/changelog.xml"/>
</databaseChangeLog>
......@@ -16,6 +16,7 @@
<include relativeToChangelogFile="true" file="basic/2020.1.2/changelog.xml"/>
<include relativeToChangelogFile="true" file="basic/2020.1.3/changelog.xml"/>
<include relativeToChangelogFile="true" file="basic/2020.2.0/changelog.xml"/>
<include relativeToChangelogFile="true" file="basic/2020.2.1/changelog.xml"/>
<!--enable this only when you definetly want to overwrite the existing data with demo records:-->
<!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>-->
......
......@@ -8025,6 +8025,20 @@
<title></title>
<description></description>
</entityFieldDb>
<entityFieldDb>
<name>AB_LOGHISTORYID</name>
<dbName></dbName>
<primaryKey v="true" />
<columnType v="1" />
<size v="36" />
<scale v="0" />
<notNull v="true" />
<isUnique v="true" />
<index v="true" />
<documentation></documentation>
<title></title>
<description></description>
</entityFieldDb>
</entityFields>
</entityDb>
<entityDb>
......
......@@ -297,6 +297,10 @@
<kind v="10077" />
<title></title>
</entityNode>
<entityNode>
<name>AuditLogHistory</name>
<kind v="10077" />
</entityNode>
<entityNode>
<name>ExportTemplate</name>
<kind v="10077" />
......
<?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.3.17" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.17">
<name>AuditLogHistory_entity</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<icon>VAADIN:LINES_LIST</icon>
<title>Audit Log</title>
<grantCreate v="false" />
<grantUpdate v="false" />
<grantDelete v="true" />
<grantDeleteProcess>%aditoprj%/entity/AuditLogHistory_entity/grantDeleteProcess.js</grantDeleteProcess>
<initFilterProcess>%aditoprj%/entity/AuditLogHistory_entity/initFilterProcess.js</initFilterProcess>
<titlePlural>Audit Logs</titlePlural>
<recordContainer>db</recordContainer>
<entityFields>
<entityProvider>
<name>#PROVIDER</name>
<targetContextField>TARGET_CONTEXT</targetContextField>
<targetIdField>TARGET_ID</targetIdField>
</entityProvider>
<entityField>
<name>LOGTYPE</name>
<title>Action</title>
<dropDownProcess>%aditoprj%/entity/AuditLogHistory_entity/entityfields/logtype/dropDownProcess.js</dropDownProcess>
</entityField>
<entityField>
<name>DATE_NEW</name>
<title>Date</title>
<contentType>DATE</contentType>
<resolution>MINUTE</resolution>
<state>READONLY</state>
</entityField>
<entityField>
<name>DESCRIPTION</name>
<title>Description</title>
</entityField>
<entityField>
<name>TABLENAME</name>
<title>Tablename</title>
<dropDownProcess>%aditoprj%/entity/AuditLogHistory_entity/entityfields/tablename/dropDownProcess.js</dropDownProcess>
</entityField>
<entityField>
<name>UID</name>
</entityField>
<entityField>
<name>TABLENAMEID</name>
</entityField>
<entityField>
<name>USER_NEW</name>
<title>Editor</title>
<state>READONLY</state>
</entityField>
<entityField>
<name>SOURCE_TABLENAME</name>
</entityField>
<entityField>
<name>SOURCE_TABLENAMEID</name>
</entityField>
<entityField>
<name>TARGET_CONTEXT</name>
<valueProcess>%aditoprj%/entity/AuditLogHistory_entity/entityfields/target_context/valueProcess.js</valueProcess>
</entityField>
<entityField>
<name>TARGET_ID</name>
<valueProcess>%aditoprj%/entity/AuditLogHistory_entity/entityfields/target_id/valueProcess.js</valueProcess>
</entityField>
<entityField>
<name>PREVIEW_TITLE</name>
<valueProcess>%aditoprj%/entity/AuditLogHistory_entity/entityfields/preview_title/valueProcess.js</valueProcess>
</entityField>
<entityProvider>
<name>#PROVIDER_AGGREGATES</name>
<useAggregates v="true" />
</entityProvider>
</entityFields>
<recordContainers>
<dbRecordContainer>
<name>db</name>
<alias>Data_alias</alias>
<linkInformation>
<linkInformation>
<name>ed8bd1ca-64eb-443e-a04d-ea7aee0c352a</name>
<tableName>AB_LOGHISTORY</tableName>
<primaryKey>AB_LOGHISTORYID</primaryKey>
<isUIDTable v="false" />
<readonly v="true" />
</linkInformation>
</linkInformation>
<recordFieldMappings>
<dbRecordFieldMapping>
<name>UID.value</name>
<recordfield>AB_LOGHISTORY.AB_LOGHISTORYID</recordfield>
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>USER_NEW.value</name>
<recordfield>AB_LOGHISTORY.USER_NEW</recordfield>
<isFilterable v="true" />
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>TABLENAMEID.value</name>
<recordfield>AB_LOGHISTORY.TABLENAMEID</recordfield>
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>TABLENAME.value</name>
<recordfield>AB_LOGHISTORY.TABLENAME</recordfield>
<isFilterable v="true" />
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>SOURCE_TABLENAMEID.value</name>
<recordfield>AB_LOGHISTORY.SOURCE_TABLENAMEID</recordfield>
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>SOURCE_TABLENAME.value</name>
<recordfield>AB_LOGHISTORY.SOURCE_TABLENAME</recordfield>
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>LOGTYPE.value</name>
<recordfield>AB_LOGHISTORY.LOGTYPE</recordfield>
<isFilterable v="true" />
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>DESCRIPTION.value</name>
<recordfield>AB_LOGHISTORY.DESCRIPTION</recordfield>
<isFilterable v="true" />
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>DATE_NEW.value</name>
<recordfield>AB_LOGHISTORY.DATE_NEW</recordfield>
<isFilterable v="true" />
</dbRecordFieldMapping>
</recordFieldMappings>
<filterExtensions>
<filterExtension>
<name>contextFilter</name>
<title>Kontext</title>
<contentType>TEXT</contentType>
<filterValuesProcess>%aditoprj%/entity/AuditLogHistory_entity/recordcontainers/db/filterextensions/contextfilter/filterValuesProcess.js</filterValuesProcess>
<filterConditionProcess>%aditoprj%/entity/AuditLogHistory_entity/recordcontainers/db/filterextensions/contextfilter/filterConditionProcess.js</filterConditionProcess>
<isLookupFilter v="true" />
<filtertype>BASIC</filtertype>
</filterExtension>
</filterExtensions>
</dbRecordContainer>
</recordContainers>
</entity>
import("system.translate");
import("system.result");
result.object([
["I", translate.text("Inserted")]
,["U", translate.text("Updated")]
,["D", translate.text("Deleted")]
]);
\ No newline at end of file
import("system.translate");
import("Sql_lib");
import("system.result");
import("system.vars");
var context = vars.get("$field.TARGET_CONTEXT");
var title = "";
switch(context)
{
case "AcquisitionProject":
title = "Acquisition project";
break;
case "Bulkmail":
case "BULKMAIL":
title = "Bulk mail";
break;
case "CampaignStep":
title = "Campaign";
break;
case "DSGVO":
title = "Data Privacy";
break;
case "SerialLetter":
title = "Serial letter";
break;
case "Person":
title = "Contact";
break;
case "Event_context":
title = "Event";
break;
default:
if(context.length > 1)
{
title = context.substring(0, 1).toUpperCase() + context.substring(1).toLowerCase();
}
}
result.string(translate.text(title));
\ No newline at end of file
import("Sql_lib");
import("system.result");
result.object(newSelect("distinct TABLENAME, TABLENAME").from("AB_LOGHISTORY").orderBy("TABLENAME").table());
import("Sql_lib");
import("system.result");
import("system.vars");
var tablename = vars.get("$field.TABLENAME");
var tablenameId = vars.get("$field.TABLENAMEID");
var isPerson = "";
var res = "";
switch(tablename)
{
case "AB_ATTRIBUTERELATION":
isPerson = newSelect("PERSON_ID")
.from("CONTACT")
.where("CONTACT.CONTACTID", tablenameId)
.cell();
if(isPerson)
res = "Person";
else
res = "Organisation";
break;
case "AB_OBJECTRELATION":
isPerson = newSelect("CONTACT.PERSON_ID")
.from("CONTACT")
.join("AB_OBJECTRELATION on AB_OBJECTRELATION.OBJECT1_ROWID = CONTACT.CONTACTID")
.where("AB_OBJECTRELATION.AB_OBJECTRELATIONID", tablenameId)
.cell();
if(isPerson)
res = "Person";
else
res = "Organisation"
break;
case "ACTIVITYLINK":
case "ACTIVITY":
res = "Activity";
break;
case "ACQUISITIONPROJECT":
res = "AcquisitionProject";
break;
case "ASYS_BINARIES":
res = newSelect("ASYS_BINARIES.TABLENAME", "_____SYSTEMALIAS")
.from("ASYS_BINARIES")
.where("ASYS_BINARIES.ID", tablenameId)
.cell();
break;
case "BULKMAILRECIPIENT":
case "BULKMAIL":
res = "Bulkmail";
break;
case "CONTACT":
isPerson = newSelect("PERSON_ID")
.from("CONTACT")
.where("CONTACT.CONTACTID", tablenameId)
.cell();
if(isPerson)
res = "Person";
else
res = "Organisation";
break;
case "CAMPAIGNSTEP":
res = "CampaignStep";
break;
case "CAMPAIGNCOST":
case "CAMPAIGNPARTICIPANT":
case "CAMPAIGN":
res = "Campaign";
break;
case "DSGVO":
res = "DSGVO";
break;
case "EVENTPARTICIPANT":
case "EVENT":
res = "Event_context";
break;
case "ORGANISATION":
res = "Organisation";
break;
case "OBJECTMEMBER":
res = newSelect("OBJECTMEMBER.OBJECT_TYPE")
.from("OBJECTMEMBER")
.where("OBJECTMEMBER.OBJECTMEMBERID", tablenameId)
.cell();
break;
case "PERSON":
res = "Person";
break;
case "SALESORDER":
res = "Salesorder";
break;
case "SALESPROJECT_MILESTONE":
case "SALESPROJECT":
res = "Salesproject";
break;
case "LETTERRECIPIENT":
case "SERIALLETTER":
res = "SerialLetter";
break;
case "TASKLINK":
case "TASK":
res = "Task";
break;
case "TASKLINK":
res = "TaskLink";
break;
default:
res = tablename;
}
result.string(res);
\ No newline at end of file
import("Sql_lib");
import("system.result");
import("system.vars");
var tablename = vars.get("$field.TABLENAME");
var tablenameid = vars.get("$field.TABLENAMEID");
var returnId = "";
var res = tablenameid;
switch(tablename)
{
case "AB_OBJECTRELATION":
returnId = newSelect("OBJECT1_ROWID")
.from("AB_OBJECTRELATION")
.where("AB_OBJECTRELATION.AB_OBJECTRELATIONID", tablenameid)
.cell();
res = returnId;
break;
case "ACTIVITYLINK":
returnId = newSelect("ACTIVITY_ID")
.from("ACTIVITYLINK")
.where("ACTIVITYLINK.ACTIVITYLINKID", tablenameid)
.cell();
res = returnId;
break;
case "ASYS_BINARIES":
res = newSelect("ASYS_BINARIES.ROW_ID", "_____SYSTEMALIAS")
.from("ASYS_BINARIES")
.where("ASYS_BINARIES.ID", tablenameid)
.cell();
break;
case "BULKMAILRECIPIENT":
returnId = newSelect("BULKMAIL_ID")
.from("BULKMAILRECIPIENT")
.where("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", tablenameid)
.cell();
res = returnId;
break;
case "CAMPAIGNCOST":
returnId = newSelect("CAMPAIGNCOST.CAMPAIGN_ID")
.from("CAMPAIGNCOST")
.where("CAMPAIGNCOST.CAMPAIGNCOSTID", tablenameid)
.cell();
res = returnId;
break;
case "EVENTPARTICIPANT":
returnId = newSelect("EVENTPARTICIPANT.EVENT_ID")
.from("EVENTPARTICIPANT")
.where("EVENTPARTICIPANT.EVENTPARTICIPANTID", tablenameid)
.cell();
res = returnId;
break;
case "CAMPAIGNPARTICIPANT":
returnId = newSelect("CAMPAIGNPARTICIPANT.CAMPAIGN_ID")
.from("CAMPAIGNPARTICIPANT")
.where("CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID", tablenameid)
.cell();
res = returnId;
break;
case "OBJECTMEMBER":
res = newSelect("OBJECTMEMBER.OBJECT_ROWID")
.from("OBJECTMEMBER")
.where("OBJECTMEMBER.OBJECTMEMBERID", tablenameid)
.cell();
break;
case "PERSON":
res = newSelect("CONTACT.CONTACTID")
.from("CONTACT")
.join("PERSON", "CONTACT.PERSON_ID = PERSON.PERSONID")
.where("PERSON.PERSONID", tablenameid)
.cell();
break;
case "LETTERRECIPIENT":
returnId = newSelect("LETTERRECIPIENT.SERIALLETTER_ID")
.from("LETTERRECIPIENT")
.where("LETTERRECIPIENT.LETTERRECIPIENTID", tablenameid)
.cell();
res = returnId;
break;
case "SALESPROJECT_MILESTONE":
returnId = newSelect("SALESPROJECT_MILESTONE.SALESPROJECT_ID")
.from("SALESPROJECT_MILESTONE")
.where("SALESPROJECT_MILESTONE.SALESPROJECT_MILESTONEID", tablenameid)
.cell();
res = returnId;
break;
case "TASKLINK":
returnId = newSelect("TASKLINK.TASK_ID")
.from("TASKLINK")
.where("TASKLINK.TASKLINKID", tablenameid)
.cell();
res = returnId;
break;
}
result.string(res);
\ No newline at end of file
import("system.result");
import("system.neon");
import("system.datetime");
import("system.vars");
let presMode = vars.get("$sys.presentationmode");
let curDate = datetime.toDate(vars.get("$sys.date"), "dd.MM.yyyy");
if (presMode == neon.CONTEXT_PRESENTATIONMODE_FILTER || presMode == neon.CONTEXT_PRESENTATIONMODE_DASHBOARD)
{
var filter = {
"type":"group",
"operator":"AND",
"timestamp": curDate,
"childs":
[
{
"type":"row",
"name":"DATE_NEW",
"operator":"TIMEFRAME_PAST",
"value":"1 Tag",
"key":"REL=FIXED;START=P-1D",
"contenttype":"DATE"
}
]
};
result.string(JSON.stringify(filter));
}
\ No newline at end of file
import("system.result");
import("Sql_lib");
import("Entity_lib");
import("system.vars");
import("system.logging");
let values = [];
let operator = "";
let condition = "";
let additionalCondition = "";
let setAttrCondition = false;
switch(vars.get("$local.operator"))
{
case "1": // equals
operator = " in ";
break;
case "11": // is not empty
operator = " is not null ";
break;
case "2": // not equals
operator = " not in ";
break;
case "12": // is empty
operator = " is null ";
break;
}
condition = "TABLENAME " + operator;
if(vars.get("$local.operator") == "1" || vars.get("$local.operator") == "2")
{
values = [vars.get("$local.value").trim()];
switch(values[0])
{
case "'TASK'":
values.push("'TASKLINK'");
break;
case "'ACTIVITY'":
setAttrCondition = true;
values.push("'ACTIVITYLINK'");
break;
case "'BULKMAIL'":
values.push("'BULKMAILRECIPIENT'");
break;
case "'EVENT'":
values.push("'EVENTPARTICIPANT'");
break;
case "'SALESPROJECT'":
setAttrCondition = true;
values.push("'SALESPROJECT_MILESTONE'");
break;
case "'SERIALLETTER'":
values.push("'LETTERRECIPIENT'");
break;
case "'PERSON'":
setAttrCondition = true;
additionalCondition = " or AB_LOGHISTORYID in ("
+ newSelect("AB_LOGHISTORYID")
.from("AB_OBJECTRELATION")
.join("AB_LOGHISTORY", "TABLENAMEID = AB_OBJECTRELATIONID")
.join("CONTACT", "(OBJECT1_ROWID = CONTACTID or OBJECT2_ROWID = CONTACTID) and CONTACT.PERSON_ID is not null")
+ ")";
break;
case "'ORGANISATION'":
setAttrCondition = true;
additionalCondition = " or AB_LOGHISTORYID in ("
+ newSelect("AB_LOGHISTORYID")
.from("AB_OBJECTRELATION")
.join("AB_LOGHISTORY", "TABLENAMEID = AB_OBJECTRELATIONID")
.join("CONTACT", "(OBJECT1_ROWID = CONTACTID or OBJECT2_ROWID = CONTACTID) and CONTACT.PERSON_ID is null")
+ ")";
break;
}
if (setAttrCondition)
{
additionalCondition += " or AB_LOGHISTORYID in ("
+ newSelect("AB_LOGHISTORYID")
.from("AB_ATTRIBUTERELATION")
.join("AB_LOGHISTORY", "TABLENAMEID = OBJECT_ROWID and OBJECT_TYPE = "
+ values[0].substring(0, 2).toUpperCase() + values[0].substring(2).toLowerCase())
+ ")";
}
condition += "(" + values.join(", ") + ")";
condition += additionalCondition ? additionalCondition : "";
}
result.string(condition);
\ No newline at end of file
import("system.translate");
import("system.result");
result.object(
[
["ACTIVITY", translate.text("Activity")],
["BULKMAIL", translate.text("Bulk mail")],
["PERSON", translate.text("Contact")],
["DSGVO", translate.text("DSGVO")],
["EVENT", translate.text("Event")],
["ORGANISATION", translate.text("Organisation")],
["PERSON", translate.text("Person")],
["SALESORDER", translate.text("Salesorder")],
["SALESPROJECT", translate.text("Salesproject")],
["SERIALLETTER", translate.text("Serial letter")],
["TASK", translate.text("Task")],
]
);
<?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.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
<name>AuditLogHistory</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<filterView>AuditLogHistoryFilter_view</filterView>
<entity>AuditLogHistory_entity</entity>
<references>
<neonViewReference>
<name>c468be91-da18-4c22-abbd-cfa1c410d013</name>
<view>AuditLogHistoryFilter_view</view>
</neonViewReference>
</references>
</neonContext>
<?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.1.6" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.6">
<name>AuditLogHistoryFilter_view</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<filterable v="true" />
<dashletConfigurations>
<neonDashletConfiguration>
<name>AuditDashlet</name>
<title>AuditLogs</title>
<description>Show all audits</description>
<fragment>AuditLogHistory/filter</fragment>
<storeRoles>
<element>INTERNAL_ADMINISTRATOR</element>
<element>INTERNAL_DASHBOARDSTOREADMIN</element>
<element>INTERNAL_DESIGNER</element>
</storeRoles>
<icon>VAADIN:LINES_LIST</icon>
<categories>
<neonDashletCategory>
<name>Admin</name>
<title>Admin</title>
</neonDashletCategory>
</categories>
</neonDashletConfiguration>
</dashletConfigurations>
<layout>
<boxLayout>
<name>layout</name>
</boxLayout>
</layout>
<children>
<timelineViewTemplate>
<name>Timeline</name>
<dateField>DATE_NEW</dateField>
<titleField>PREVIEW_TITLE</titleField>
<descriptionField>DESCRIPTION</descriptionField>
<subdescriptionField>LOGTYPE</subdescriptionField>
<additionalInfoField>USER_NEW</additionalInfoField>
<hideContentSearch v="false" />
<entityField>#ENTITY</entityField>
<isEditable v="false" />
<informationField></informationField>
<isCreatable v="false" />
</timelineViewTemplate>
</children>
</neonView>
......@@ -250,12 +250,12 @@ LogHistoryExecutor.prototype._addEntryForInsert = function (pTablename, pTablena
//the "SOURCE_TABLENAME" and "SOURCE_TABLENAMEID" are reserved for later usage in the change-notification-subscriptions //TODO: check if they are really needed
this.toInsert = {
statements: []
,cols: ["LOGTYPE","TABLENAME","TABLENAMEID","DESCRIPTION", "SOURCE_TABLENAME", "SOURCE_TABLENAMEID", "DATE_NEW","USER_NEW"]
,cols: ["LOGTYPE","TABLENAME","TABLENAMEID","DESCRIPTION", "SOURCE_TABLENAME", "SOURCE_TABLENAMEID", "DATE_NEW","USER_NEW", "AB_LOGHISTORYID"]
};
this.toInsert.types = db.getColumnTypes("AB_LOGHISTORY", this.toInsert.cols);//load only once for better performance
}
var vals = [this.sqlAction, pTablename, pTablenameId, pDescription, pSourceTablename, pSourceTablenameId, this.timestamp, this.triggeringUser];
var vals = [this.sqlAction, pTablename, pTablenameId, pDescription, pSourceTablename, pSourceTablenameId, this.timestamp, this.triggeringUser, util.getNewUUID()];
this.toInsert.statements.push(["AB_LOGHISTORY", this.toInsert.cols, this.toInsert.types, vals]);
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment