Home > Models
Contraintes, triggers et fonctions
Les facettes permettent de définir des contraintes sur les Master Data dans les modèles d'adaptation. EBX.Platform supporte les facettes XML Schema et fournit des facettes étendues et programmatiques afin de définir des contrôles avancés.
- Facettes XML Schema supportées
- Facettes étendues
- Facettes programmatiques
- Triggers et fonctions
- Controles des Entrées Utilisateurs
Facettes XML Schema supportées
|
X |
X |
X |
X |
X |
(1) |
(2) |
(2) |
(2) |
(2) | |||
|
X |
(1) |
|||||||||||
|
X |
X |
(1) |
X |
X |
X |
X |
X |
X | ||||
|
X |
X |
(1) |
X |
X |
X |
X | ||||||
|
X |
X |
(1) |
X |
X |
X |
X | ||||||
|
X |
X |
(1) |
X |
X |
X |
X | ||||||
|
X |
X |
X |
X |
X |
(1) |
|||||||
|
X |
X |
X |
X |
X |
(1) |
(2) |
(2) |
(2) |
(2) | |||
|
X |
X |
(1) |
X |
X |
X |
X |
X |
X | ||||
|
resource (3) |
Notes :
-
(1) La facette whiteSpace peut être définie, mais n’est pas interprétée par EBX.Platform.
-
(2) Dans XML Schema, les facettes ‘boundary’ ne sont pas autorisées sur le type string, néanmoins EBX.Platform les autorise en tant que extensions.
-
(3) Le type resource supporte une seule facette (obligatoire) EBX, FacetOResource (cf Facettes Etendues).
-
(4) D’autres types supportent les mêmes facettes que le type dont ils dérivent. Par exemple, le type integer supporte les mêmes facettes que le type decimal.
Exemple:
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:minInclusive value="4.5"/>
<xs:maxExclusive value="17.5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Contrainte d'unicité
Il est possible de définir une contrainte d'unicité en utilisant la définition standard XML Schema xs:unique . Cette contrainte permet d'indiquer qu'une valeur doit être unique dans une table.
Dans l'exemple ci-dessous, une contrainte d'unicité est définie sur la table publisher pour le champ cible name (cela signifie que deux occurrences de la table publisher ne peuvent pas avoir le même nom) :
<xs:element name="publisher">
...
<xs:complexType>
<xs:sequence>
...
<xs:element name="name" type="xs:string"/>
...
</xs:sequence>
</xs:complexType>
<xs:unique name="uniqueName">
<xs:selector xpath="."/>
<xs:field xpath="name"/>
</xs:unique>
</xs:element>
La contrainte d'unicité doit être définie dans une table et doit comporter les propriétés suivantes :
|
Propriété |
Description |
Obligatoire |
|
Attribut
|
Identifie la contrainte dans le schéma. |
Oui |
|
Elément
|
Indique, au moyen d'une expression XPath, la table dans laquelle la contrainte d'unicité s'applique. L'expression XPath doit être simple, la notation '..' est interdite. |
Oui |
|
Elément
|
indique le champ sur lequel porte la contrainte d'unicité, au moyen d'une expression XPath relative à
|
Oui |
Limitations :
-
Le champ cible de l'élément
xs:fielddoit être dans une table. -
La contrainte d'unicité ne peut pas s'appliquer si le champ cible est à l'intérieur d'une liste agrégée.
-
Une seule contrainte d'unicité sur plusieurs champs cible n'est pas supportée.
Facettes étendues
EBX.Platform fournit des contraintes avancées qui ne sont pas définies dans XML Schema mais sont utiles pour le Master Data Management.
Afin de conserver la conformité du document par rapport à la norme XML Schema, ces facettes sont définies sous l’élément
annotation/appinfo/otherFacets .
Clés étrangères
Une référence à une clé primaire de
table est définie par une facette étendue
tableRef . L'élément doit être du type
xs:string .
|
Element |
Description |
Obligatoire |
|
|
Expression XPath qui spécifie la table cible. |
Oui. |
|
|
Optionnel, référence de l'instance qui contient la table cible. |
Non, si cet élément n'est pas spécifié, l'instance est celle contenant la table. |
|
|
Optionnel, référence la branche contenant l'instance cible. |
Non, par défaut la branche courante est utilisée. |
|
|
Présentation personnalisée de la clé sélectionnée dans l'enregistrement courant et de la liste triée des clés possibles. Deux variantes peuvent être spécifiées :
|
Non. |
|
|
Spécifie une contrainte additionnelle qui filtre les occurrences de de la table cible. Deux types de filtres sont disponibles :
|
Non. |
L'exemple ci-dessous spécifie une référence (clé étrangère) vers une occurrence de l'élément catalog .
<xs:appinfo>
<osd:otherFacets>
<osd:tableRef>
<tablePath>../catalog</tablePath>
<label xml:lang="en-US">Product: ${./ProductID}</label>
<filter>
<predicate>type = ${../refType} </predicate>
</filter>
</osd:tableRef>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
Note: Différentes combinaisons peuvent être spécifiées pour définir le libellé d'une clé étrangère. L'ordre de priorité des balises est le suivant :
-
balise label définissant un libellé programmatique.
-
balise label définissant une expression localisée.
-
balise label définissant une expression par défaut.
La facette
tableRef est interprétée comme une énumération. La clé étrangère formatée est la valeur de l'élément (type
xs:string ). Le libellé peut être composé en ajoutant les chemins d'autres champs des occurrences référencées par l'élément
labelPaths (les chemins sont absolus dans le contexte de l'occurrence).
Voir aussi :
Contraintes dynamiques
Les facettes suivantes supportent le référencement de la valeur d’un autre noeud :
-
length
-
minLength
-
maxLength
-
maxInclusive
-
maxExclusive
-
minInclusive
-
minExclusive
Cette propriété permet de modifier les contraintes du modèle de données dynamiquement, dans les adaptations ou même dans un contexte.
Par rapport aux facettes standards, le nom de l’élément est conservé, cependant l’attribut statique value est remplacé par l’attribut path .
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:minInclusive path="/domain/Loan/Pricing/AmountMini/amount"/>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
...
</xs:element>
Dans cet exemple, la borne de la facette minInclusive n’est pas définie statiquement, la valeur de la borne est détenue par le nœud " /domain/Loan/Pricing/AmountMini/amount ".
Contrainte FacetOResource
La facette doit être définie pour chaque type resource. Elle a les attributs suivants :
-
moduleName: indique via un alias quel module contient la ressource. Si c’est le module lui-même qui possède la ressource, alors l’alias doit être "wbp". Sinon, l’alias doit être l’une des valeurs définies dans l’élément <dependencies> du fichier ‘module.xml’; -
resourceType: désigne le type de la ressource qui peut être : "ext-images", "ext-jscripts", "ext-stylesheets", "ext-html"; -
relativePath: représente le répertoire local où se trouve la ressource, situé juste en-dessous du répertoire correspondant au type de cette ressource ( "resourceType" ). Dans l'exemple ci-après, il s'agit du répertoire www/common/images/ . Ainsi, pour cet exemple, la ressource est située dans le répertoire www/common/images/promotion/ . Notons que le répertoire www/ est au même niveau que le répertoire WEB-INF/ .De plus, pour qu'une ressource définie dans un répertoire régionalisé ( www/fr/ par exemple) soit prise en compte, il faut qu'une ressource de même nom soit définie dans www/common/ .
Cette facette a le même comportement qu’une facette énumération : l’ensemble des valeurs est obtenu en listant récursivement tous les fichiers situés dans ‘local path’ du répertoire spécifié ‘resource type’ dans le ‘module’ spécifié.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:FacetOResource
osd:moduleName="wbp"
osd:resourceType="ext-images"
osd:relativePath="promotion/" />
</osd:otherFacets>
</xs:appinfo>
</xs:annotation >
</ xs:element>
Un aperçu de la structure des répertoires dans un module EBX.Platform (application Web J2EE) est donné dans la section Modules - Structure .
Contrainte excludeValue
Cette facette vérifie qu’une instance est différente d’une valeur donnée.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:excludeValue value="">
<osd:defaultErrorMessage>
Please select address role(s).
</osd:defaultErrorMessage>
</osd:excludeValue>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
<xs:simpleType type="xs:string"/>
</xs:element >
Ici, la chaîne vide est exclue des valeurs possibles.
Contrainte excludeSegment
Cette facette vérifie qu’une instance n’appartient pas à un segment de valeurs. Les bornes elles-mêmes sont exclues.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:excludeSegment minValue="20000" maxValue="20999">
<osd:defaultErrorMessage>
Postal code not valid.
</osd:defaultErrorMessage>
</osd:excludeSegment>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
<xs:simpleType type="xs:string"/>
</xs:element>
Ici, les valeurs comprises entre 20000 et 20999 sont exclues.
Facette énumération alimentée par un autre noeud
Par défaut, une facette énumération est décrite statiquement en XML Schema.
Le contenu de la facette énumération peut être alimenté par un autre nœud du modèle de données.
Alimentation par une liste
En ajoutant l’information suivante, on indique que le contenu de la facette énumération provient du nœud frère CountryList .
<xs:appinfo>
<osd:otherFacets>
<osd:enumeration osd:path="../CountryList"/>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
-
doit être de même type que le nœud portant la facette énumération.
-
doit être multiple (
maxOccurs> 1).
Exemple :
<xs:complexType>
<xs:sequence>
<xs:element name="CountryList" maxOccurs="unbounded">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="DE" osd:label="Allemagne"/>
<xs:enumeration value="AT" osd:label="Autriche"/>
<xs:enumeration value="BE" osd:label="Belgique"/>
<xs:enumeration value="JP" osd:label="Japon"/>
<xs:enumeration value="KR" osd:label="Corée"/>
<xs:enumeration value="CN" osd:label="Chine"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="CountryChoice" type="xs:string">
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:enumeration osd:path="../CountryList"/>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType >
</xs:element >
Facettes programmatiques
EBX.Platform propose d'implémenter des contraintes qui ne sont ni spécifiées par XML Schema, ni proposées en extension par EBX.Platform, via une simple déclaration de classe Java dans le schéma.
Afin de conserver la conformité du document par rapport à la norme XML Schema, ces facettes sont définies sous l’élément
annotation/appinfo/otherFacets .
Contraintes programmatiques
Une facette programmatique est définie par une classe Java implémentant l'interface Java
Constraint .
Il est possible d'associer des paramètres à la facette. Par conséquent, la classe Java implémentée doit être conforme au protocole JavaBean. Dans l'exemple ci-dessous, elle doit définir les méthodes : getParam1(), setParam1(String), ..., getParamX(), setParamX(String), etc.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:constraint class="com.foo.CheckAmount">
<param1>...</param1>
<param...n>...</param...n>
</osd:constraint>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
...
</xs:element>
Voir aussi :
Contraintes programmatiques de type Enumération
Une contrainte énumération ajoute à une contrainte programmatique basique la définition d'une liste ordonnée de valeurs. Pour cela, on définit une classe Java implémentant l'interface
ConstraintEnumeration . Cette facette permet la sélection d'une valeur dans une liste.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:constraintEnumeration class="com.foo.CheckAmountInEnumeration">
<param1>...</param1>
<param...n>...</param...n>
</osd:constraintEnumeration>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
...
</xs:element>
Contraintes programmatiques de type Nomenclature
Une contrainte nomenclature ajoute à une contrainte programmatique basique la définition d'une liste ordonnée de "valeurs-labels". Pour cela, on définit une classe Java implémentant l'interface
ConstraintNomenclature . Cette facette permet la sélection d'une valeur dans une liste.
Notons qu'une contrainte énumération (décrite précédemment) est davantage appropriée lorsque l'on souhaite afficher des "valeurs localisées" ou lorsque le nombre d'éléments de la liste de sélection est important.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:constraintNomenclature class="com.foo.CheckAmountInNomenclature">
<param1>...</param1>
<param...n>...</param...n>
</osd:constraintNomenclature>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
...
</xs:element >
Contrainte sur valeur nulle
Parfois une valeur n'est obligatoire que si certaines conditions sont vérifiées (par exemple si un autre champ a une certaine valeur). Cependant l'attribut standard de XML Schema,
minOccurs , ne répond pas à un besoin de ce type, puisqu'il est statique.
Pour vérifier si un élément est obligatoire ou non obligatoire selon son contexte :
-
une contrainte programmatique doit être définie par une classe Java (voir ci-dessus) ;
-
cette classe doit de plus implémenter l'interface ConstraintOnNull ;
-
enfin les attributs de cardinalité XML Schema doivent spécifier que l'élément est optionnel (
minOccurs="0"etmaxOccurs="1").
Note : par défaut, la contrainte sur valeur nulle n'est pas vérifiée lorsque l'utilisateur soumet sa saisie via l'outil EBX.Manager. Pour activer cette vérification à la saisie, il faut définir la propriété checkNullInput et si l'élément est terminal, activer l'instance.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:otherFacets>
<osd:constraint class="com.foo.CheckIfNull">
<param1>...</param1>
<param...n>...</param...n>
</osd:constraint>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
...
</xs:element >
Contraintes sur tables
Une contrainte portant sur une table est définie par une classe Java implémentant l'interface Java
ConstraintOnTable .
Une contrainte portant sur une table peut uniquemement être définie sur un noeud table.
Il est possible d'associer des paramètres à la contrainte. Par conséquent, la classe Java implémentée doit être conforme au protocole JavaBean. Dans l'exemple ci-dessous, elle doit définir les méthodes : getParam1(), setParam1(String), ..., getParamX(), setParamX(String), etc.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:table>
<primaryKeys>/key</primaryKeys>
</osd:table>
<osd:otherFacets>
<osd:constraint class="com.foo.checkTable">
<param1>...</param1>
<param...n>...</param...n>
</osd:constraint>
</osd:otherFacets>
</xs:appinfo>
</xs:annotation>
</xs:element>
Important: Les contraintes définies au niveau d'une table sont uniquement vérifiées lors d'un appel à un rapport de validation d'une instance ou d'une table. Autrement dit, pour des raisons de performances, ce type de contrainte n'est pas vérifié lors d'une mise à jour telle que l'insertion, la suppression ou la modification d'un enregistrement sur la table associée à cette contrainte. Cependant, le mécanisme interne de validation incrémentale optimise le nombre de vérifications de ce type de contrainte si des dépendances sont définies. Pour plus d'information sur le mécanisme de validation incrémentale, voir la section performances .
Voir aussi :
Triggers et fonctions
Valeurs calculées
Par défaut, les valeurs des nœuds d’une adaptation sont lues et persistées dans le référentiel EBX. Néanmoins, il est possible d’alimenter la valeur d’un nœud d’adaptation de manière spécifique.
Par exemple, une valeur peut provenir d’un système de persistance externe (base de données relationnelle, système central, etc.). Elle peut aussi être le résultat d'un calcul. Ce calcul (ou l'accès à la base) peut même prendre en compte des paramètres de l'adaptation courante.
Ceci est rendu possible par l’utilisation d’une fonction .
Une fonction est spécifiée dans le schéma XML au moyen de l’élément
osd:function (voir exemple ci-dessous).
-
La valeur de l'attribut class doit être le nom qualifié d’une classe Java qui implémente l’interface Java
ValueFunction. -
Des paramètres additionnels peuvent être spécifiés au niveau du schéma, en ce cas la convention des propriétés JavaBean est utilisée.
Exemple:
<xs:annotation>
<xs:appinfo>
<osd:function class="com.foo.ComputeValue">
<param1>...</param1>
<param...n>...</param...n>
</osd:function>
</xs:appinfo>
</xs:annotation>
...
</xs:element>
Triggers
Il est possible d'associer à des instances ou à des occurrences de tables des méthodes qui seront exécutées automatiquement lorsque certaines opérations sont effectuées : création, mise à jour, suppression, etc.
Dans le document XML Schéma, on spécifie ce cas de figure en utilisant la balise
osd:trigger dans la balise
annotation/appinfo .
Pour la définition de triggers sur des instances d'un schéma, on doit définir dans la balise
osd:trigger , une classe Java qui étend la classe abstraite
InstanceTrigger .
Notons que dans le cas de triggers d'instances, il est conseillé de définir les balises
annotation/appinfo/osd:trigger juste en dessous de l'élément racine du schéma XML concerné.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:trigger class="com.foo.MyInstanceTrigger">
<param1>...</param1>
<param...n>...</param...n>
</osd:trigger>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
</xs:element>
Pour la définition de triggers sur des occurrences de tables, on doit définir dans la balise
osd:trigger une classe Java qui étend la classe abstraite
TableTrigger .
Dans le cas de triggers sur des occurrences de table, il est conseillé de définir les balises
annotation/appinfo/osd:trigger juste en dessous de l'élément définissant la table ou le type de la table concernée.
Exemple :
Sur une table :
<xs:annotation>
<xs:appinfo>
<osd:table>
<primaryKeys>/key</primaryKeys>
</osd:table>
<osd:trigger class="com.foo.MyTableTrigger"/>
</xs:appinfo>
</xs:annotation>
</xs:element>
ou sur un type associé à une table :
<xs:annotation>
<xs:appinfo>
<osd:trigger class="com.foo.MyTableTrigger">
<param1>...</param1>
<param...n>...</param...n>
</osd:trigger>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
Notons qu'il est possible d'associer des paramètres à un trigger. Par conséquent, la classe Java implémentée doit être conforme au protocole JavaBean. Dans l'exemple ci-dessus, elle doit définir les méthodes : getParam1(), setParam1(String), ..., getParamX(), setParamX(String), etc.
Valeurs auto incrémentées
Il est possible de définir des valeurs auto-incrémentées. Les valeurs auto-incrémentées sont uniquement autorisées à l'intérieur de tables et doivent être de type
xs:int ou
xs:integer .
Un auto-incrément est spécifié dans le document XML Schéma en utilisant la balise
osd:autoIncrement dans la balise
annotation/appinfo .
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:autoIncrement />
</xs:appinfo>
</xs:annotation>
</xs:element>
Les deux éléments
start et
step sont optionnels.
Exemple :
<xs:annotation>
<xs:appinfo>
<osd:autoIncrement>
<start>100</start>
<step>5</step>
</osd:autoIncrement>
</xs:appinfo>
</xs:annotation>
</xs:element>
L'attribut
start représente la valeur de départ de l'incrément. Si cet attribut n'est pas renseigné, alors la valeur
1 est utilisée par défaut.
L'attribut
step indique le pas pour la prochaine valeur de l'auto incrément. Si cet attribut n'est pas renseigné, alors la valeur
1 est utilisée par défaut.
Un champ utilisant la balise
osd:autoIncrement a le comportement suivant :
-
Le calcul et l'allocation de la valeur du champ sont effectués chaque fois qu'un nouvel enregistrement est inséré et que la valeur du champ est encore indéfinie.
-
Aucune allocation n'est effectuée si l'insertion définit déjà une valeur non nulle. Par exemple, si un import d'archive ou un import XML définit la valeur, celle-ci est préservée. Il est à noter également qu'en conséquence, l'allocation n'est pas non plus effectuée pour l'insertion d'un enregistrement en mode 'overwriting' ou 'occulting'.
-
Une valeur nouvellement allouée est, chaque fois que possible, unique dans l'étendue du référentiel. Plus précisément, l'unicité de l'allocation s'étend à toutes les instances et elle s'étend aussi à toutes les branches. Ce dernier cas permet de fusionner une branche avec une garantie raisonnable qu'il n'y aura pas de conflit de fusion si le champ
osd:autoIncrementfait aprtie de la clé primaire. Ce principe a une limitation très spécifique : quand une mise à jour en masse et pré-spécifiant les valeurs est exécutée en parallèle d'une transaction allouant une valeur une valeur sur le même champ, il est possible que cette dernière alloue une valeur qui sera aussi affectée dans la première transaction (il n'y a pas de verrou entre plusieurs branches).
En interne, la dernière value d'un auto incrément est stockée dans la table 'Auto Incréments' de l'adaptation
ebx-repository . Ce champ est automatiquement mis à jour, de telle sorte qu'il contienne la plus grande valeur ayant été affectée pour le champ
osd:autoIncrement associé, et ce dans toute instance et branche du référentiel. Cette valeur est calculée en tenant compte de la plus grande valeur de la colonne auto-incrémentée dans la table en cours de mise à jour.
Dans certaines situations particulières, il peut être souhaitable d'éviter ce comportement (ex: gestion multi-environnement _dev/test/prod, avec des plages d'auto incréments différentes). Ce comportement particulier est supporté en activant la propriété
disableMaxTableCheck :
-
localement, en définissant l'élément
<disableMaxTableCheck>true</disableMaxTableCheck>dans la déclaration de l'auto-incrément, -
pour tous les auto-incréments d'un schéma, en ajoutant l'élément
<osd:disableMaxTableCheck="true">dans la déclaration du schéma (xs:appinfo), -
ou globalement, en déclarant la propriété
ebx.autoIncrement.disableMaxTableCheck=truedans la configuration principale (ebx.properties).
Remarque : il n'est pas conseillé d'utiliser cette option, les valeurs des auto-incréments générées pouvant entrer en conflit.
Controles des Entrées Utilisateurs
Contrôle de la saisie d'une valeur nulle
Selon la stratégie générale de validation, afin de permettre temporairement la saisie incomplète des données, le contrôle du caractère obligatoire d'un élément n'est pas exécuté lorsque l'utilisateur saisit une valeur nulle via l'outil EBX.Manager, mais lors de la validation globale de l'adaptation. Pour déclencher un contrôle immédiat à la saisie utilisateur, l'élément doit spécifier l'attribut
osd:checkNullInput="true" .
Note : le caractère obligatoire d'une valeur n'est vérifié que si le schéma spécifie que l'élément est obligatoire, soit de façon statique (
minOccurs="1"), soit de façon dynamique (au moyen d'une contrainte sur valeur nulle). L'adaptation doit aussi être activée si l'élément obligatoire est terminal.
Exemple:
...
</xs:element >
Voir aussi :
Gestion des espaces sur les types de données par EBX.Platform
Conformément à XML Schema ( cf. http://www.w3.org/TR/xmlschema-2/#rf-whiteSpace ), la gestion des espaces pour un type donné doit suivre l'une des procédures suivantes :
-
preserve. Aucune normalisation n'est faite, la valeur initiale n'est pas modifiée
-
replace. Toutes les occurrences de #x9 (tabulation), #xA (interligne) et #xD (retour chariot) sont remplacées par des occurrences de #x20 (espace)
-
collapse. Après un traitement par la procédure replace , toutes les séquences de #x20 (espace) sont remplacées par un seul caractère #x20, et les espaces de début et de fin sont supprimés.
Procédure générale de EBX.Platform
EBX.Platform est conforme à la recommandation XML Schema :
-
Pour les noeuds de type
xs:string(clés primaires ou non), les espaces sont toujours preservés et la chaîne vide n'est jamais convertie ànull. -
Pour les autres noeuds (différents du type
xs:string), les espaces sont traités en suivant la procédure collapse et la chaîne vide est convertie ànull.
Exceptions : Pour les noeuds de type
osd:html ou
osd:password , les espaces sont toujours preservés et la chaîne vide est convertie à
null . Pour les noeuds de type
xs:string définissant la propriété
osd:checkNullInput="true" la chaîne vide est considérée comme
null lors de la vérification de la saisie utilisateur par
EBX.Manager.
Cas spécifique pour la gestion des espaces sur les clés primaires de type string
Pour les colonnes de clé primaire de type
xs:string , EBX.Platform définit une contrainte par défaut. Cette contrainte interdit les chaînes vides et les valeurs dont les espaces ne sont pas "collapsés" à la validation.
Cependant, si le noeud de la clé primaire définit une facette
xs:pattern , cette dernière remplace la contrainte par défaut de EBX.Platform. Par exemple, un pattern spécifique peut autoriser tout type de chaîne. Ce pattern peut donc avoir la forme suivante :
.* . Ce cas de figure n'est cependant pas recommandé.
La contrainte par défaut permet d'empêcher certaines ambiguïtés. Par exemple, il sera difficile pour un utilisateur final de distinguer entre les chaînes de caractères suivantes : "12 34" et "12 34". Pour les valeurs usuelles cela ne pose pas de problèmes. En revanche, pour les clés primaires, cela peut porter à confusion et provoquer des erreurs.
Note : EBX.Platform permet de définir des tables qui permettent d'organiser et de gérer des Master Data avec des fonctionnalités semblables à celles des bases de données relationnelles.
Home > Models