Entity
Une entity est une instance d'une Dataclass, tel un enregistrement de la table correspondant à la dataclass contenue dans son datastore associé. Elle contient les mêmes attributs que la dataclass ainsi que les valeurs des données et des propriétés et fonctions spécifiques.
Sommaire
.attributeName : any stocke la valeur de l'attribut pour l'entité |
.clone() : 4D.Entity crée en mémoire une nouvelle entité faisant référence au même enregistrement que l'entité d'origine |
.diff( entityToCompare : 4D.Entity { ; attributesToCompare : Collection } ) : Collection compare le contenu de deux entités et renvoie leurs différences |
.drop( {mode : Integer} ) : Object supprime les données contenues dans l'entité |
.first(): 4D.Entity renvoie une référence vers l'entité en première position dans l'entity selection à laquelle l'entité appartient |
.fromObject( filler : Object ) remplit une entité avec le contenu du filler |
.getDataClass() : 4D.DataClass retourne la dataclass de l'entité |
.getKey( { mode : Integer } ) : Text .getKey( { mode : Integer } ) : Integer renvoie la valeur de la clé primaire de l'entité |
.getRemoteContextAttributes() : Text retourne des informations relatives au contexte d'optimisation utilisé par l'entité |
.getSelection(): 4D.EntitySelection renvoie l'entity selection à laquelle l'entité appartient |
.getStamp() : Integer renvoie la valeur courante du stamp de l'entité |
.indexOf( { entitySelection : 4D.EntitySelection } ) : Integer retourne la position de l'entité dans une entity selection |
.isNew() : Boolean renvoie Vrai si l'entité à laquelle elle est appliquée vient d'être créée et n'a pas encore été enregistrée dans le datastore |
.last() : 4D.Entity renvoie une référence vers l'entité en dernière position dans l'entity selection à laquelle l'entité appartient |
.lock( { mode : Integer } ) : Object pose un verrou pessimiste sur l'enregistrement référencé par l'entité |
.next() : 4D.Entity renvoie une référence vers l'entité suivante dans l'entity selection à laquelle l'entité appartient |
.previous() : 4D.Entity renvoie une référence vers l'entité précédente dans l'entity selection à laquelle l'entité appartient |
.reload() : Object recharge le contenu de l'entité en mémoire |
.save( { mode : Integer } ) : Object enregistre les modifications apportées à l'entité |
.toObject() : Object .toObject( filterString : Text { ; options : Integer} ) : Object .toObject( filterCol : Collection { ; options : Integer } ) : Object renvoie un objet qui a été construit à partir de l'entité |
.touched() : Boolean vérifie si un attribut de l'entité a été modifié ou non depuis que l'entité a été chargée en mémoire ou sauvegardée |
.touchedAttributes() : Collection renvoie les noms des attributs qui ont été modifiés depuis que l'entité a été chargée en mémoire |
.unlock() : Object supprime le verrou pessimiste sur l'enregistrement correspondant à l'entité |
.attributeName
Historique
Release | Modifications |
---|---|
17 | Ajout |
.attributeName : any
Description
Tout attribut de dataclass est disponible en tant que propriété des entités de la dataclass, et qui stocke la valeur de l'attribut pour l'entité.
Les attributs de dataclass peuvent également être obtenus en utilisant la syntaxe alternative avec [ ].
Le type de valeur de l'attribut dépend de l'attribut kind (relation ou storage) :
- Si le type de attributeName est storage :
.attributeName
retourne une valeur du même type que attributeName. - Si le type de attributeName est relatedEntity :
.attributeName
retourne une entité reliée. Les valeurs de l'entité liée sont directement disponibles par le biais des propriétés en cascade, par exemple "myEntity.employer.employees[0].lastname". - Si le type de attributeName est relatedEntities :
.attributeName
retourne une nouvelle entity selection d'entités liées. Les doublons sont supprimés (une entity selection non ordonnée est retournée).
Exemple
var $myEntity : cs.EmployeeEntity
$myEntity:=ds.Employee.new() //Créer une nouvelle entity
$myEntity.name:="Dupont" //assigner 'Dupont' à l'attribut 'name'
$myEntity.firstname:="John" //assigner 'John' à l'attribut 'firstname'
$myEntity.save() //sauvegarder l'entity
.clone()
Historique
Release | Modifications |
---|---|
17 | Ajout |
.clone() : 4D.Entity
Paramètres | Type | Description | |
---|---|---|---|
Résultat | 4D.Entity | <- | Nouvelle entité référençant l'enregistrement |
Description
La fonction .clone()
crée en mémoire une nouvelle entité faisant référence au même enregistrement que l'entité d'origine. Cette fonction vous permet de mettre à jour des entités séparément.
Gardez à l'esprit que toutes les modifications apportées aux entités seront enregistrées dans l'enregistrement référencé uniquement lorsque la fonction
save()
est exécutée.
Cette fonction ne peut être utilisée qu'avec des entités déjà enregistrées dans la base de données. Elle ne peut pas être appelée sur une entité nouvellement créée (pour laquelle isNew()
retourne True).
Exemple
var $emp; $empCloned : cs.EmployeeEntity
$emp:=ds.Employee.get(672)
$empCloned:=$emp.clone()
$emp.lastName:="Smith" //Les mises à jour de $emp ne sont pas effectuées sur $empCloned
.diff()
Historique
Release | Modifications |
---|---|
17 | Ajout |
.diff( entityToCompare : 4D.Entity { ; attributesToCompare : Collection } ) : Collection
Paramètres | Type | Description | |
---|---|---|---|
entityToCompare | 4D.Entity | -> | Entité à comparer à l'entité d'origine |
attributesToCompare | Collection | -> | Noms des attributs à comparer |
Résultat | Collection | <- | Différences entre les entités |
Description
La fonction .diff()
compare le contenu de deux entités et renvoie leurs différences.
Dans le paramètre entityToCompare, passez l'entité à comparer à l'entité d'origine.
Dans le paramètre attributesToCompare, vous pouvez désigner les attributs spécifiques à comparer. Si le paramètre est passé, la comparaison est effectuée uniquement sur les attributs spécifiés. S'il est omis, toutes les différences entre les entités sont retournées.
Les différences sont retournées sous forme de collection d'objets dont les propriétés sont :
Nom de propriété | Type | Description |
---|---|---|
attributeName | String | Nom de l'attribut |
value | Dépend du type d'attribut | Valeur de l'attribut dans l'entité d'origine |
otherValue | Dépend du type d'attribut | Valeur de l'attribut dans entityToCompare |
Seuls les attributs dont les valeurs diffèrent sont inclus dans la collection. Si aucune différence n'est trouvée, .diff()
retourne une collection vide.
La fonction s'applique aux attributs dont le kind est storage ou relatedEntity. Dans le cas où une entité liée a été mise à jour (c'est-à-dire la clé étrangère), le nom de l'entité liée et de sa clé primaire sont retournés comme propriétés attributeName (value et otherValue sont vides pour l'entité liée).
Si l'une des entités comparées vaut Null, une erreur est retournée.
Exemple 1
var $diff1; $diff2 : Collection
employee:=ds.Employee.query("ID=1001").first()
$clone:=employee.clone()
employee.firstName:="MARIE"
employee.lastName:="SOPHIE"
employee.salary:=500
$diff1:=$clone.diff(employee) // Toutes les différences sont retournées
$diff2:=$clone.diff(employee;New collection("firstName";"lastName"))
// Seules les différences sur firstName et lastName sont retournées
$diff1:
[
{
"attributeName": "firstName",
"value": "Natasha",
"otherValue": "MARIE"
},
{
"attributeName": "lastName",
"value": "Locke",
"otherValue": "SOPHIE"
},
{
"attributeName": "salary",
"value": 66600,
"otherValue": 500
}
]
$diff2:
[
{
"attributeName": "firstName",
"value": "Natasha",
"otherValue": "MARIE"
},
{
"attributeName": "lastName",
"value": "Locke",
"otherValue": "SOPHIE"
}
]
Exemple 2
var vCompareResult1; vCompareResult2; vCompareResult3; $attributesToInspect : Collection
vCompareResult1:=New collection
vCompareResult2:=New collection
vCompareResult3:=New collection
$attributesToInspect:=New collection
$e1:=ds.Employee.get(636)
$e2:=ds.Employee.get(636)
$e1.firstName:=$e1.firstName+" update"
$e1.lastName:=$e1.lastName+" update"
$c:=ds.Company.get(117)
$e1.employer:=$c
$e2.salary:=100
$attributesToInspect.push("firstName")
$attributesToInspect.push("lastName")
vCompareResult1:=$e1.diff($e2)
vCompareResult2:=$e1.diff($e2;$attributesToInspect)
vCompareResult3:=$e1.diff($e2;$e1.touchedAttributes())
vCompareResult1 (toutes les différences sont retournées) :
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
},
{
"attributeName": "salary",
"value": 33500,
"otherValue": 100
},
{
"attributeName": "employerID",
"value": 117,
"otherValue": 118
},
{
"attributeName": "employer",
"value": "[object Entity]",// Entity 117 de Company
"otherValue": "[object Entity]"// Entity 118 de Company
}
]
vCompareResult2 (seules les différences sur $attributesToInspect sont retournées)
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
}
]
vCompareResult3 (seules les différences sur les attributs touchés de $e1 sont retournées)
[
{
"attributeName": "firstName",
"value": "Karla update",
"otherValue": "Karla"
},
{
"attributeName": "lastName",
"value": "Marrero update",
"otherValue": "Marrero"
},
{
"attributeName": "employerID",
"value": 117,
"otherValue": 118
},
{
"attributeName": "employer",
"value": "[object Entity]",// Entity 117 de Company
"otherValue": "[object Entity]"// Entity 118 de Company
}
]
.drop()
Historique
Release | Modifications |
---|---|
17 | Ajout |
.drop( {mode : Integer} ) : Object
Paramètres | Type | Description | |
---|---|---|---|
mode | Integer | -> | dk force drop if stamp changed : Force la suppression même si le marqueur interne a changé |
Résultat | Object | <- | Résultat de l'opération de suppression |
Description
La fonction .drop()
supprime les données contenues dans l'entitéde la table liée à sa dataclass. A noter que l'entité reste en mémoire.
Dans une application multiprocess ou multi-utilisateurs, la fonction .drop()
est exécutée en mode "verrouillage optimiste" dans lequel un marqueur de verrouillage interne est automatiquement incrémenté à cha
Par défaut, si le paramètre mode est omis, la fonction retournera systématiquement une erreur (voir ci-dessous) lorsque la même entité a été modifiée entre-temps par un autre process ou utilisateur, quel(s) que soi(en)t l(es) attribut(s) modifié(s).
Sinon, vous pouvez passer l'option dk force drop if stamp changed
dans le paramètre mode : dans ce cas, l'entité est supprimée même si la valeur du marqueur interne est différente (si la clé primaire est identique).
Résultat
L'objet retourné par .drop( )
contient les propriétés suivantes :
Propriété | Type | Description | |
---|---|---|---|
success | boolean | vrai si l'action de suppression a été effectuée avec succès, sinon Faux. | |
Disponible uniquement en cas d'erreur : | |||
status(*) | number | Code d'erreur, voir ci-dessous | |
statusText(*) | text | Description de l'erreur, voir ci-dessous | |
Disponible uniquement en cas d'erreur de verrouillage pessimiste : | |||
LockKindText | text | "Locked by record" | |
lockInfo | object | Information sur l'origine du verrouillage | |
task_id | number | Id du process | |
user_name | text | Nom d'utilisateur de la session sur la machine | |
user4d_alias | text | Alias utilisateur si défini avec SET USER ALIAS , sinon le nom d'utilisateur dans le répertoire de la base 4D | |
host_name | text | Nom de la machine | |
task_name | text | Nom du process | |
client_version | text | ||
Disponible uniquement en cas d'erreur critique (clé primaire dupliquée, disque plein...) : | |||
errors | collection of objects | ||
message | text | Message d'erreur | |
component signature | text | signature du composant interne (e.g. "dmbg" pour le composant de base de données) | |
errCode | number | Code d'erreur |
(*) Les valeurs suivantes peuvent être retournées dans les propriétés status et statusText de l'objet Résultat en cas d'erreur :
Constante | Valeur | Commentaire |
---|---|---|
dk status entity does not exist anymore | 5 | L'entité n'existe plus dans les données. Cette erreur peut se produire dans les cas suivants: |
dk status locked | 3 | L'entité est verrouillée par un verrou pessimiste. statusText associé : "Already locked" |
dk status serious error | 4 | Une erreur critique peut être une erreur de bas niveau de la base de données (ex. clé dupliquée), une erreur matérielle, etc. statusText associé : "Other error" |
dk status stamp has changed | 2 | La valeur du marqueur interne de l'entité ne correspond pas à celle de l'entité stockée dans les données (verrouillage optimiste)..save() : erreur uniquement si l'option dk auto merge n'est pas utilisée.drop() : erreur uniquement si l'option dk force drop if stamp changed n'est pas utilisée.lock() : erreur uniquement si l'option dk reload if stamp changed n'est utilisée |
dk status wrong permission | 1 | Les privilèges courants ne permettent pas de supprimer l'entité. statusText associé : "Permission error" |
Exemple 1
Exemple sans option dk force drop if stamp changed
:
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
var $status : Object
$employees:=ds.Employee.query("lastName=:1";"Smith")
$employee:=$employees.first()
$status:=$employee.drop()
Case of
:($status.success)
ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //L'entité supprimée reste en mémoire
:($status.status=dk status stamp has changed)
ALERT($status.statusText)
End case
Exemple 2
Même exemple avec l'option dk force drop if stamp changed
:
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
var $status : Object
$employees:=ds.Employee.query("lastName=:1";"Smith")
$employee:=$employees.first()
$status:=$employee.drop(dk force drop if stamp changed)
Case of
:($status.success)
ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //L'entité supprimée reste en mémoire
:($status.status=dk status entity does not exist anymore)
ALERT($status.statusText)
End case
.first()
Historique
Release | Modifications |
---|---|
17 | Ajout |
.first(): 4D.Entity
Paramètres | Type | Description | |
---|---|---|---|
Résultat | 4D.Entity | <- | Référence à la première entité de l'entity selection (Null si non trouvée) |
Description
La fonction .first()
renvoie une référence vers l'entité en première position dans l'entity selection à laquelle l'entité appartient.
Si l'entité n'appartient à aucune entity selection (i.e. .getSelection( ) retourne Null), la fonction renvoie une valeur Null.
Exemple
var $employees : cs.EmployeeSelection
var $employee; $firstEmployee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName = :1";"H@") //Cette entity selection contient 3 entités
$employee:=$employees[2]
$firstEmployee:=$employee.first() //$firstEmployee est la première entité de l'entity selection $employees
.fromObject()
Historique
Release | Modifications |
---|---|
17 | Ajout |
.fromObject( filler : Object )
Paramètres | Type | Description | |
---|---|---|---|
filler | Object | -> | Objet avec lequel remplir l'entité |
Description
La fonction .fromObject()
remplit une entité avec le contenu du filler.
Cette fonction modifie l'entity d'origine.
La correspondance entre l'objet et l'entité est établie à partir des noms de propriétés/d'attributs :
- Si une propriété de l'objet n'existe pas dans la dataclass, elle est ignorée.
- Les types de données doivent être équivalents. S'il existe une différence de type entre l'objet et la dataclass, 4D essaie de convertir les données lorsque cela est possible (voir
Converting data types
), sinon l'attribut est laissé intact. - La clé primaire peut être donnée telle quelle ou avec une propriété "__KEY" (remplie avec la valeur de la clé primaire). Si elle n'existe pas déjà dans la dataclass, l'entité est créée avec la valeur donnée lorsque .save() est appelé. Si la clé primaire n'est pas fournie, l'entité est créée et la valeur de la clé primaire est affectée en fonction des règles de la base de données. L'auto-incrémentation n'est calculée que si la clé primaire est nulle.
filler peut contenir une related entity dans les conditions suivantes :
- filler contient lui-même la clé étrangère, ou
- filler contient une propriété de type objet qui a le même nom que l'entité relative, contenant une seule propriété nommée "__KEY".
- si l'entité relative n'existe pas, elle est ignorée.
Exemple
Avec l'objet $o suivant :
{
"firstName": "Mary",
"lastName": "Smith",
"salary": 36500,
"birthDate": "1958-10-27T00:00:00.000Z",
"woman": true,
"managerID": 411,// relatedEntity fournie avec clé primaire
"employerID": 20 // relatedEntity fournie avec clé primaire
}
Le code suivant créera une entité avec les entités relatives manager et employer.
var $o : Object
var $entity : cs.EmpEntity
$entity:=ds.Emp.new()
$entity.fromObject($o)
$entity.save()
Vous pouvez également utiliser une entité relative fournie sous forme d'objet :
{
"firstName": "Marie",
"lastName": "Lechat",
"salary": 68400,
"birthDate": "1971-09-03T00:00:00.000Z",
"woman": false,
"employer": {// relatedEntity fournie sous forme d'objet
"__KEY": "21"
},
"manager": {// relatedEntity fournie sous forme d'objet
"__KEY": "411"
}
}
.getDataClass()
Historique
Release | Modifications |
---|---|
17 R5 | Ajout |
.getDataClass() : 4D.DataClass
Paramètres | Type | Description | |
---|---|---|---|
Résultat | 4D.DataClass | <- | Dataclass à laquelle appartient l'entité |
Description
La fonction .getDataClass()
retourne la dataclass de l'entité. Cette fonction est utile pour l'écriture de code générique.
Exemple
Le code générique suivant duplique toute entité :
//méthode duplicate_entity
//duplicate_entity($entity)
#DECLARE($entity : 4D.Entity)
var $entityNew : 4D.Entity
var $status : Object
$entityNew:=$entity.getDataClass().new() //crée une nouvelle entité dans la dataclass parente
$entityNew.fromObject($entity.toObject()) //lire tous les attributs
$entityNew[$entity.getDataClass().getInfo().primaryKey]:=Null //réinitialise la clé primaire
$status:=$entityNew.save() //sauvegarde l'entité dupliquée
.getKey()
Historique
Release | Modifications |
---|---|
17 | Ajout |
.getKey( { mode : Integer } ) : Text
.getKey( { mode : Integer } ) : Integer
Paramètres | Type | Description | |
---|---|---|---|
mode | Integer | -> | dk key as string : retourner la clé primaire en texte, quel que soit son type d'origine |
Résultat | Text | <- | Valeur de la clé primaire texte de l'entité |
Résultat | Integer | <- | Valeur de la clé primaire numérique de l'entité |
Description
La fonction .getKey()
renvoie la valeur de la clé primaire de l'entité.
Les clés primaires peuvent être des nombres (integer) ou des textes. Vous pouvez "forcer" la méthode à retourner la valeur de clé primaire sous forme de chaîne, quel que soit son type d'origine, en passant l'option dk key as string
dans le paramètre mode.
Exemple
var $employees : cs.EmployeeSelection
var $employee : cs.EmployeeEntity
$employees:=ds.Employee.query("lastName=:1";"Smith")
$employee:=$employees[0]
ALERT("The primary key is "+$employee.getKey(dk key as string))
.getRemoteContextAttributes()
Historique
Release | Modifications |
---|---|
19R5 | Ajout |
.getRemoteContextAttributes() : Text
Paramètres | Type | Description | |
---|---|---|---|
result | Text | <- | Attirbuts de contexte associés à l'entity, séparés par une virgule |
Mode avancé : Cette fonction est destinée aux développeurs qui souhaitent personnaliser les fonctionnalités par défaut de ORDA dans le cadre de configurations spécifiques. Dans la plupart des cas, vous n'aurez pas besoin de l'utiliser.
Description
La fonction .getRemoteContextAttributes()
retourne des informations relatives au contexte d'optimisation utilisé par l'entité.
S'il n'existe pas de contexte d'optimisation pour l'entity, la fonction retourne un texte vide.