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

others/guide adoc files moved and removed

parent 301b34e9
No related branches found
No related tags found
No related merge requests found
Showing
with 116 additions and 775 deletions
......@@ -39,6 +39,12 @@
<entityProvider>
<name>LogHistoryProvider</name>
<documentation>%aditoprj%/entity/LogHistory_entity/entityfields/loghistoryprovider/documentation.adoc</documentation>
<children>
<entityParameter>
<name>tablenames_param</name>
<documentation>%aditoprj%/entity/LogHistory_entity/entityfields/loghistoryprovider/children/tablenames_param/documentation.adoc</documentation>
</entityParameter>
</children>
<dependencies>
<entityDependency>
<name>23dbfa51-5340-48e3-bd60-e0dcb7d44ad3</name>
......
......@@ -2,5 +2,92 @@
Entity for the log entries in the individual modules.
This entity is based on the `AB_LOGHISTORY`-table. Note that this database table has no primary key associated to it.
This is because it is only a pit of log-record and not necessary.
\ No newline at end of file
This entity is based on the `AB_LOGHISTORY`-table.
== configure Loghistory
:DATA_ALIAS: Data_alias
:EDITOR_ALIAS_DEFINITION: AliasDefinition-Editor
=== the concept
//TODO: extend the concept description
Stoarge: Database-table: `AB_LOGHISTORY`
Collecting Data:
----
Audit -> process_audit -> Loghistory_lib: LogHistoryExecutor
----
Data is collected and pre-translated. Therefor only one Language can be applied for logging.
Because the loghistory is written via the auditing, only changes that are done with the proper Jdito-Methods will be logged.
=== prerequisites
Auditing has to be activated for all tables you want to log.
.prerequisites of enabling Audit in general
* Auditing has to be enabled in your Server
* Auditing has to be enabled for your alias (default: +{DATA_ALIAS}+)
* Tables that shall be logged need some configs in the _{EDITOR_ALIAS_DEFINITION}_
** property `idColumn` has to be set (a primary key is needed therefore)
** `auditMode` has to be set -Standard, -CLOB, or -BLOB (chosse the one you really need)
=== activate writing into loghistory
Assuming that the
* required database-tables exist
* JDito-processes already exist
* audit has been activated in general
you are ready to configure _which_ column shall be logged and _how_.
==== configure columns for logging
There are several properties (custom and pre-exisiting) that can be set for configuring the logging:
.configuration options per column
[options="header"]
|=======
|property |purpose |property-type
|+title+ |text that is used to display which column has been modified|pre-exisiting
|+log+ |defines whether a column needs to be logged or not; not exisisting equals `false` |custom: Booelan
|+tableRef+ |references table for automatically grouping data. This is usefull for ForeignKeys, e.g. a +OFFERITEM.OFFER_ID+ column could have a +tableRef+ "OFFER"|custom: String
|+primaryKey+ |this is not only used to enable auditing generally, but it's used to resolve +tableRef+ values correctly|pre-exisiting
|+keyword+ |defines a keyword contianer that should be used to transform a +KEYID+ into a display value|custom: String
|+autoMapTrueFalse4Log+ |if `true` the loghistory-executor tries to automatically translate a value into a "yes"/"no"-display value|custom: Booelan
|+translate4Log+ |defines a process to transform a technical value into a display value |custom: JDito
|=======
+translate4Log+ is a mighty possibility to translate a ID-value into a displayvalue. However, you should keep several important things in mind:
* translate text if necessary via the locale-parameter
* the process is called each time a change to that column is applied - keep it fast and simple
.translate4Log example (skip imports for better readability)
[source,javascript]
----
var params = Translate4LogParams.load();// <1>
var countryName = CountryUtils.getLatinNameByIso2(params.value, params.locale); // <2>
result.string(countryName);// <3>
----
<1> load the parameters in a easy and fail-proof way
<2> locale is passed to the resolving function and in that function a translation is applied
<3> always return a string
==== configure a consumer for retrieving the loghistory
.Example for the +tablenames_param+ process
----
import("system.vars");
import("system.result");
import("Context_lib");
var res = [];
res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]});
res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]});
res = JSON.stringify(res);
result.object(res);
----
\ No newline at end of file
= tablenames_param
.Example
----
import("system.vars");
import("system.result");
import("Context_lib");
var res = [];
res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]});
res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]});
res = JSON.stringify(res);
result.object(res);
----
\ No newline at end of file
= LogHistoryProvider
Generic provider for log history entries.
A filter for given _tablenames_ is applied, see the documentation of the parameters for an example.
\ No newline at end of file
......@@ -44,5 +44,8 @@
<name>136dceaa-0eca-452a-9757-132fd54e8c55</name>
<view>OfferPreviewMultiple_view</view>
</neonViewReference>
<webserviceReference>
<name>277d4493-9a49-4e68-b00c-29d3d0e0b9d2</name>
</webserviceReference>
</references>
</neonContext>
SET mypath=%~dp0
jsdoc -r %mypath:~0,-1%\..\process -d %mypath:~0,-1%\jsdocOut
\ No newline at end of file
= Sample Document
Doc Writer <doc.writer@asciidoc.org>; John Smith <john.smith@asciidoc.org>
v1.0, 2013-05-20: First draft
:title: Sample Document
:tags: [document, example]
Preamble...
How to build js-doc out of the lib-comments
===========================================
:toc2: left
:numbered:
== installation ==
1. Nodejs:
https://nodejs.org/en/
LTS-version (aktuell 10.15.0)
download and install
2. install jsdoc
open CMD
[source]
----
npm install -g jsdoc
----
== generate jsdoc ==
=== manually ===
1. open CMD
2. navigate into the project-folder. e.g.
[source]
----
C:
cd C:\Users\M.Mustermann\Documents\AditoProjects\xRM-Basic5.1
----
3. run command
[source]
----
jsdoc -r process -d others\jsdocOut
----
4. Open others\jsdocOut\index.html with a webbrowser
=== with script in designer (Windows) ===
1. In the Designer right click on others\genJsdoc.bat -> "Open in System"
2. Right click on others\jsdocOut\index.html -> "View"
\ No newline at end of file
configure Loghistory
====================
:DATA_ALIAS: Data_alias
:EDITOR_ALIAS_DEFINITION: AliasDefinition-Editor
== the concept ==
//TODO: extend the concept description
Stoarge: Database-table: `AB_LOGHISTORY`
Collecting Data:
----
Audit -> process_audit -> Loghistory_lib: LogHistoryExecutor
----
Data is collected and pre-translated. Therefor only one Language can be applied for logging.
Because the loghistory is written via the auditing, only changes that are done with the proper Jdito-Methods will be logged.
== prerequisites ==
Auditing has to be activated for all tables you want to log.
.prerequisites of enabling Audit in general
* Auditing has to be enabled in your Server
* Auditing has to be enabled for your alias (default: +{DATA_ALIAS}+)
* Tables that shall be logged need some configs in the _{EDITOR_ALIAS_DEFINITION}_
** property `idColumn` has to be set (a primary key is needed therefore)
** `auditMode` has to be set -Standard, -CLOB, or -BLOB (chosse the one you really need)
== activate writing into loghistory ==
Assuming that the
* required database-tables exist
* JDito-processes already exist
* audit has been activated in general
you are ready to configure _which_ column shall be logged and _how_.
=== configure columns for logging ===
There are several properties (custom and pre-exisiting) that can be set for configuring the logging:
.configuration options per column
[options="header"]
|=======
|property |purpose |property-type
|+title+ |text that is used to display which column has been modified|pre-exisiting
|+log+ |defines whether a column needs to be logged or not; not exisisting equals `false` |custom: Booelan
|+tableRef+ |references table for automatically grouping data. This is usefull for ForeignKeys, e.g. a +OFFERITEM.OFFER_ID+ column could have a +tableRef+ "OFFER"|custom: String
|+primaryKey+ |this is not only used to enable auditing generally, but it's used to resolve +tableRef+ values correctly|pre-exisiting
|+keyword+ |defines a keyword contianer that should be used to transform a +KEYID+ into a display value|custom: String
|+autoMapTrueFalse4Log+ |if `true` the loghistory-executor tries to automatically translate a value into a "yes"/"no"-display value|custom: Booelan
|+translate4Log+ |defines a process to transform a technical value into a display value |custom: JDito
|=======
+translate4Log+ is a mighty possibility to translate a ID-value into a displayvalue. However, you should keep several important things in mind:
* translate text if necessary via the locale-parameter
* the process is called each time a change to that column is applied - keep it fast and simple
.translate4Log example (skip imports for better readability)
[source,javascript]
----
var params = Translate4LogParams.load();// <1>
var countryName = CountryUtils.getLatinNameByIso2(params.value, params.locale); // <2>
result.string(countryName);// <3>
----
<1> load the parameters in a easy and fail-proof way
<2> locale is passed to the resolving function and in that function a translation is applied
<3> always return a string
=== configure a consumer for retrieving the loghistory ===
.Exampel for the +tablenames_param+ process
----
import("system.vars");
import("system.result");
import("Context_lib");
var res = [];
res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]});
res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]});
res = JSON.stringify(res);//currently only strings can be passed as param
result.object(res);
----
\ No newline at end of file
Person, Organisation, Contact
=============================
:toc2: left
:numbered:
== Differences to old Adito ==
The old Adito basic had:
- Pers
- Org
- Relation
They are not gone, just renamed:
- Pers = Person
- Org = Organisation
- Relation = Contact
TODO: doku erweitern
erson, Organisation, Contact
===========================================
:toc2: left
:numbered:
== Differences to old Adito ==
The old Adito basic had:
- Pers
- Org
- Relation
They are not gone, just renamed:
- Pers = Person
- Org = Organisation
- Relation = Contact
Provider - Consumer
===================
:toc2: left
:numbered:
=== Provider ===
Is the old dfi.
==== Purpose ====
The provider provides access to an entity.
You can get data of another entity by connecting a consumer to a provider.
==== Naming ====
The names should provide information about *what the provider provides*.
For example:
Communication_entity has 3 providers:
- *AllCommunications*
- *EmailCommunications*
- *PhoneCommunications*
If you connect to *AllCommunications* you get *all* communication types of a contact.
If you connect to *EmailCommunications* you get *only the Email* communication type of a contact.
If you connect to *PhoneCommunications* you get *only the Phone* communication type of a contact.
*Important:*
*Do not always create a new provider when connecting a new entity. Maybe you can use an already existing provider.*
*Try to reuse providers if you need similar data for two dependencies*
=== Consumer ===
Is the old dfo.
=== Purpose ===
The Consumer *consumes* the data a provider provides.
It can be connected to a provider and fill the parameters of the provider.
=== Naming ===
Most of the time you get a list of "something" so you should call it the plural of what you get.
Example:
Persons
Organisations
If you have two Consumer to the same Entity, you should use speaking names.
Example:
Documents (e.g. for all documents of a person)
MainDocuments (e.g. for only the main documents of a person)
If you know you get only one row, you can use the singular.
Example:
Person
=== Parameter ===
Parameters provide a way to tell a provider *what exactly you need*.
==== Properties ====
The most important properties are
code, exposed, triggerRecalculation and mandatory
Parameters work with a fallback mechanism.
This means that if you set the code on the parameter directly then this is executed *only if you did not* provide the code on the parameter at the *provider* and/or *consumer*.
Likewise if you set the code on a parameter at the provider it will only be executed if a *consumer* which connects to this provider *has no code set* at the parameter.
Here some examples for the *code* property:
[options="header"]
|========================================================================================================================================================================================================================================================
| Parameter | Provider | Consumer | Result | Notes
| default | default | default | Nothing executed |
| default | default | code set | Code from consumer executed | This is the mostly used scenario.
| default | code set | default | Code from provider executed | This is used if you need a default value for a parameter which is different on each provider. e.g. used by the Document_entity to determine if it should show main documents or not.
| code set | default | default | Code from parameter executed |
|========================================================================================================================================================================================================================================================
The checkbox-parameters can have *three* states: default, checked, unchecked. Default means the property is *gray* and the value from the previous instance is used. Checked and unchecked overwrite always the previous instance.
The exposed property is a way to decide if a parameter should be visible by the next instance
Here some examples for the *exposed* property:
[options="header"]
|========================================================================================================================================================
| Parameter | Provider | Result | Notes
| default | default | NOT Exposed | because the default for exposed is: NOT exposed. -> the parameter won't be visible on the provider and consumer!
| set | set | Exposed | This means that the parameter can be set by the consumer.
| set | UNset | NOT Exposed | This will disable the parameter for one specific provider.
| set | default | Exposed |
|========================================================================================================================================================
*Note that there are currently (13.02.2019) some bugs and the handling of parameters with the default #PROVIDER may change.*
\ No newline at end of file
Target Context
==============
toc2: left
:numbered:
== What? ==
The target context is for forwarding the preview and the klick-action to another context.
== Why? ==
For example the ObjectRelation entity uses this feature to open the linked object directly.
== Where? ==
It is configured by two properties of the providers.
* targetContextField
* targetIdField
You can provide an entity-field for each of them which contains the contextId (currently the contextName 13.02.2019) and the rowId (UID) which should be used to open the preview or main view.
\ No newline at end of file
How to wirte JDito code
=======================
:toc2: left
:numbered:
== basics ==
* Keep everything english. Every title, caption, messages, comments, etc. should be english. Add german translation to the languages if necessary.
* in JavaScript-Strings use `"` instead of `'` - even if its only 1 character. `'` is for SQL (within JS-Strings)
* Parameters should start with p.
== code structure ==
=== vars and others (var, let) ===
* avoid `let` as much as possible because you cannot debug these variables
=== brackets ===
* `{` are placed on a new line
Example:
[source,javascript]
----
for (i = 0, i < dataLen; i++)
{
//code here
}
myArray.forEach(function(pItem)
{
// Do something
});
----
=== loops ===
nested loops should be defined with replicated indexer variables.
Therefore it's easy to see in which level of the counter you are.
Even better would be a good and describing name.
Example:
[source,javascript]
----
for (i = 0, i < dataLen; i++)
{
for (ii = 0, ii < dataLen[i].length; ii++)
{
//code...
}
}
for (row = 0, row < dataLen; row++)
{
for (col = 0, col < dataLen[row].length; col++)
{
//code...
}
}
----
== Functions - overview of different "types" ==
This sections covers how to define different "types" of functions in libraries.
=== by using static methods ===
This will be mostly utility functions where there is no need to instantiate an object. You'll need this probably the most time.
-> Static object with static functions.
Definition:
[source,javascript]
----
/**
* provides static methods for validation of communication data
* do not create an instance of this
* @static
* @class
*/
function CommValidationUtil(){}<1>
/**
* returns a blueprint for validation extensions; these extensions are needed for validating comm data and can be passed to other functions
* @return {object} a object with properties that have a specific default value; normally you want to overwrite that value
*/
CommValidationUtil.getExtensionsBlueprint = function() <2>
{
return {
countryCode: null
};
}
----
<1> the function-object that keeps everything together - this function should never be actually called (no direct call, no indirect call)
<2> an actual function that can be called
And how to use it:
[source,javascript]
----
import("Comm_lib");
var additionals = CommValidationUtil.getExtensionsBlueprint();
----
=== by creating an object with functions ===
You may want to hold data and create objects where methods share that data.
Here is an example for an object that can be created:
[source,javascript]
----
/**
* object that provides featrues for a single keyword attribute; initalizes itself on creation with a specific keyword-attribute
*
* @param {String} pContainerName specifies the type of the keyword and therefore the list elements;
* e.g. "COUNTRY"; use an entry of the $KeywordRegistry here
* @param {String} pAttributeName the name of the keyword attribute that shall be initalized
* @param {String} [pDefault=undefined] the default value -> Does not throw an error, if default value exists.
*
* @class
*/
function KeywordAttribute(pContainerName, pAttributeName, pDefault)
{
this.container = pContainerName;
this.attribute = pAttributeName;
this.defaultValue = pDefault;
var keywordAttrData = newSelect("AB_KEYWORD_ATTRIBUTE.AB_KEYWORD_ATTRIBUTEID, AB_KEYWORD_ATTRIBUTE.KIND")
.from("AB_KEYWORD_ATTRIBUTE")
.where("AB_KEYWORD_ATTRIBUTE.CONTAINER", pContainerName)
.and("AB_KEYWORD_ATTRIBUTE.NAME", pAttributeName)
.arrayRow();
if (keywordAttrData.length > 0)
{
this.id = keywordAttrData[0];
this.type = keywordAttrData[1];
this.dbField = this.type.trim();
}
else if(pDefault == undefined)
{
throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", [this.attribute, this.container]));
}
}
/**
* get the value for a specific keyId.
* Error if the keyword container does not have the attribute at all (you can check this with .exists())
* Error if the attribute does not exist at the provided keyId and you have not specified a default
*
* @param {String} pKeyId the keyId
*
* @return {String} the loaded value (or the default)
*/
KeywordAttribute.prototype.getValue = function(pKeyId)
{
if (this.exists())
{
var attrValue = newSelect(this.dbField)
.from("AB_KEYWORD_ENTRY")
.join("AB_KEYWORD_ATTRIBUTERELATION", "AB_KEYWORD_ENTRY.AB_KEYWORD_ENTRYID = AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID")
.where("AB_KEYWORD_ENTRY.CONTAINER", this.container)
.and("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ATTRIBUTE_ID", this.id)
.and("AB_KEYWORD_ENTRY.KEYID", pKeyId)
.cell();
if (attrValue)
return attrValue;
if (this.defaultValue)
return this.defaultValue;
throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword \"%1\" from container \"%2\"", [this.attribute, pKeyId, this.container]));
}
else if (this.defaultValue == undefined)
throw new Error(translate.withArguments("no keyword attribute \"%0\" found in keyword container \"%1\"", [this.attribute, this.container]));
else
return this.defaultValue;
}
/**
* get a SqlBuilder object for this keyword attribute. You can easily add additional conditions to it.
*
* @return {SqlBuilder} a SqlBuilder which contains a select for the entry-id's, joins to entry and attribute
* and conditions for the container and the attribute-name.
*/
KeywordAttribute.prototype.getSqlBuilderSelect = function()
{
return newSelect("AB_KEYWORD_ATTRIBUTERELATION.AB_KEYWORD_ENTRY_ID")
.from("AB_KEYWORD_ATTRIBUTERELATION")
.join("AB_KEYWORD_ENTRY", "AB_KEYWORD_ENTRYID = AB_KEYWORD_ENTRY_ID", "attrEntry")
.join("AB_KEYWORD_ATTRIBUTE", "AB_KEYWORD_ATTRIBUTEID = AB_KEYWORD_ATTRIBUTE_ID")
.where(["AB_KEYWORD_ENTRY", "CONTAINER", "attrEntry"], this.container)
.and("AB_KEYWORD_ATTRIBUTE.NAME", this.attribute)
}
/**
* check if the Container can have the attribute.
* @return {Boolean} true if it exists, false if not
*/
KeywordAttribute.prototype.exists = function()
{
return this.id != undefined && this.type != undefined && this.dbField != undefined;
}
----
=== private functions ===
Private functions would be possible but make everything much more complicate.
So just start your functions / methods name with a _ if you need private methods.
--> do not use functions which start with a _ outside of the class!
Add @ignore to the comment of those functions to prevent showing them in the generated jsdoc.
== JS-Doc ==
<1> JS-Doc comment: http://usejsdoc.org/
<2> jsdoc-blocks have to start with /&#x002A;&#x002A; otherwise JSDoc cannot generate a documentation
<3> use the correct form for optional/required parameters: http://usejsdoc.org/tags-param.html
Optional parameter: [alias=the current alias]
Required parameter: alias
Classes: @class
[source,javascript]
----
/**
* Description...
* ...
*
* @param {String} [pAlias=the current alias] the database alias where the condition shall be executed later (important for column types of preparedStatements)
* @example Here is an example
* @class
*/
function SqlCondition(pAlias)
{
...
}
----
<4> examples are useful on more complex functions
<5> constructor function; init properties (do not set functions ("methods") here!)
<6> add functions ("methods") to the prototype, they are available through the prototype chain
And how to use it (normally you'd want to use preparedStatements but for the sake of an easy example it's a bit shorter here)
See also HowToSqlConditionLib.adoc for a full documentation.
[source,javascript]
----
import("system.vars");
import("system.result");
import("Sql_lib");
import("Comm_lib");
var cond = new SqlCondition();
var mediumIds = CommExtensions.getContextualMediumIds();
if (mediumIds.length > 0)
cond.and("COMM.MEDIUM_ID in (" + mediumIds.join(", ") + ")");
var idVal = vars.get("$local.idvalue");
if (uids.length > 0)
cond.and("COMM.COMMID = '" + idVal + "' ");
result.string(cond.toString("COMM.OPTIONAL = 't'"));
----
= Example for a instanceable Lib =
:toc2: left
:numbered:
Remember to always change the comments to fit your class! +
Use speaking names for ALL variables, classes and functions!
[source,javascript]
----
import("...");
/**
* instanceable example Utility class;
*
* @param {String} pParam1 is for ...
*
* @example var myUtil = new UtilClass("-");
* @class
*/
function UtilClass(pParam1)
{
// here is the constructor.
// create class variables like this:
this.myVariable = pParam1;
}
/**
* a public function
*
* @param {String} pParam1 is for ...
* @param {String} pParam2 is for ...
*
* @example var myResult = myUtil.myFunction("p1", "p2");
*
* @return {String} a result
*/
UtilClass.prototype.myFunction = function(pParam1, pParam2)
{
return this._privateStaticFunction1(pParam1, pParam2, this.myVariable);
}
/**
* a private function
*
* @param {String} pParam1 is for ...
* @param {String} pParam2 is for ...
* @param {String} pParam3 is for ...
*
* @return {String} a result
* @ignore
*/
UtilClass.prototype._myPrivateFunction = function(pParam1, pParam2, pParam3)
{
if(pParam1 && pParam2 && pParam3)
{
...
return pParam1 + pParam3 + pParam2;
}
return "";
}
----
\ No newline at end of file
= Example for a static Lib =
:toc2: left
:numbered:
Remember to always change the comments to fit your class! +
Use speaking names for ALL variables, classes and functions!
[source,javascript]
----
import("...");
/**
* a static Example Utility class
*
* Do not create an instance of this!
* @class
*/
function ExampleUtils() {} // leave this function empty! A constructor is not needed for static functions.
/**
* a public static function
*
* @param {String} pParam1 is for ...
* @param {String} pParam2 is for ...
*
* @example var myResult = ExampleUtils.staticFunction1("p1", "p2");
*
* @return {String} a result
*/
ExampleUtils.staticFunction1 = function(pParam1, pParam2)
{
return this._privateStaticFunction1(pParam1, pParam2, "-")
}
/**
* a private static function
*
* Do not use outside of ExampleUtils!
*
* @param {String} pParam1 is for ...
* @param {String} pParam2 is for ...
* @param {String} pParam3 is for ...
*
* @return {String} a result
* @ignore
*/
ExampleUtils._privateStaticFunction1 = function(pParam1, pParam2, pParam3)
{
if(pParam1 && pParam2 && pParam3)
{
...
return pParam1 + pParam3 + pParam2;
}
return "";
}
----
\ No newline at end of file
Overview over datatypes
=======================
:toc2: left
:numbered:
This is a simple overview about when to to use which datatype.
== Boolean ==
=== Datatype ===
----
TINYINT
----
=== Usage ===
0 => false
1 => true
Add nullable="false" constraint, because for boolean null makes no sense and complicates searches and validations.
== Text ==
Text should be saved as Unicode. For this prefix the datatype with a 'N' (there are some exceptions like the UUID)
=== Big text ===
For informations, descriptions, ...
----
NCLOB
----
=== Small / Normal text ===
For Names, ...
You have to define the maximum length.
----
NVARCHAR(50)
----
=== Fixed size text ===
If you are sure that the length is always fixed and will not change.
You have to define the length.
----
NCHAR(5)
----
=== UUID's, standardized codes ===
For them unicode is mostly not needed. Only use unicode here if you are sure, it is needed.
For UUID's, standardized codes (language codes), ...
You have to define the length.
----
CHAR(5)
----
UUID needs length 36:
----
CHAR(36)
----
=== Decimal numbers ===
If precision and fixed decimals (Nachkommastellen) are needed, use DECIMAL.
For prices, ...
----
NUMERIC(10, 2)
----
Else you can use double.
----
DOUBLE
----
=== Integer numbers ===
In normal cases just use INTEGER
If you know that very big integers or only very small Integers are needed, you can also use
Byte count may not be the same on all databases.
8 Byte
----
BIGINT
----
4 Byte
----
INTEGER
----
2 Byte
----
SMALLINT
----
1 Byte
----
TINYINT
----
=== Binary data ===
----
BLOB
----
\ No newline at end of file
......@@ -2,6 +2,7 @@
<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.1">
<name>Neon_lib</name>
<majorModelMode>DISTRIBUTED</majorModelMode>
<documentation>%aditoprj%/process/Neon_lib/documentation.adoc</documentation>
<process>%aditoprj%/process/Neon_lib/process.js</process>
<variants>
<element>LIBRARY</element>
......
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