Aller au contenu principal
Version: 20 R6

DataStore

Un Datastore correspond à l'objet d'interface fourni par ORDA pour référencer et accéder à une base de données. Les objets Datastore sont retournés par les commandes suivantes :

  • ds : un raccourci vers le datastore principal
  • Open datastore : pour ouvrir n'importe quel datastore distant

Sommaire

.cancelTransaction()
annule la transaction
.clearAllRemoteContexts()
efface tous les attributs de tous les contextes actifs dans le datastore
.dataclassName : 4D.DataClass
contient la description de la dataclass
.encryptionStatus(): Object
renvoie un objet fournissant le statut de chiffrement du fichier de données courant
.flushAndLock()
vide le cache du datastore local et empêche d'autres process d'effectuer des opérations d'écriture sur la base de données
.getAllRemoteContexts() : Collection
renvoie une collection d'objets contenant des informations sur tous les contextes d'optimisation actifs dans le datastore
.getGlobalStamp() : Real
retourne la valeur actuelle du marqueur de modification global du datastore
.getInfo(): Object
renvoie un objet fournissant des informations sur le datastore
.getRemoteContextInfo(contextName : Text) : Object
renvoie un objet qui contient des informations sur le contexte d'optimisation contextName dans le datastore
.getRequestLog() : Collection
retourne les requêtes ORDA enregistrées en mémoire sur le poste client
.locked() : Boolean
renvoie True si le datastore local est actuellement verrouillé
.makeSelectionsAlterable()
définit toutes les entity selections comme modifiables par défaut dans les datastores de l'application courante
.provideDataKey( curPassPhrase : Text ) : Object
.provideDataKey( curDataKey : Object ) : Object

permet de fournir une clé de chiffrement des données pour le fichier de données courant du datastore et détecte si la clé correspond aux données chiffrées
.setAdminProtection( status : Boolean )
permet de désactiver tout accès aux données sur le port d'administration web, y compris pour l'Explorateur de données dans les sessions WebAdmin
.setGlobalStamp( newStamp : Real)
définit newStamp comme la nouvelle valeur du marqueur de modification global du datastore
.setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
.setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )

lie les attributs de la dataclass spécifiée au contexte d'optimisation contextName
.startRequestLog()
.startRequestLog( file : 4D.File )
.startRequestLog( file : 4D.File ; options : Integer )
.startRequestLog( reqNum : Integer )

démarre l'enregistrement des requêtes ORDA côté client ou côté serveur
.startTransaction()
démarre une transaction dans le process courant sur la base de données du datastore
.stopRequestLog()
arrête tout enregistrement des requêtes ORDA sur la machine où elle est appelée (client ou serveur)
.unlock()
supprime le verrou courant sur les opérations d'écriture dans le datastore, s'il a été défini dans le même process
.validateTransaction()
valide la transaction

ds

Historique
ReleaseModifications
18Prise en charge du paramètre localID
17Ajout

ds { ( localID : Text ) } : cs.DataStore

ParamètresTypeDescription
localIDText->Identifiant local du datastore distant
Résultatcs.DataStore<-Nouvelle référence de datastore

Description

La commande ds retourne une référence vers le datastore correspondant à la base de données 4D courante ou à la base de données désignée par localID.

Si vous omettez le paramètre localID (ou si vous passez une chaîne vide ""), la commande renvoie une référence au datastore correspondant à la base de données 4D locale (ou à la base 4D Server en cas d'ouverture d'une base de données distante sur 4D Ser Le datastore est ouvert automatiquement et est disponible directement via ds.

Vous pouvez également obtenir une référence sur un datastore distant ouvert en passant son identifiant local dans le paramètre localID. Le datastore doit avoir été préalablement ouvert avec la commande Open datastore par la base de données courante (hôte ou composant). L'identifiant local est défini lors de l'utilisation de cette commande.

La portée de l'identifiant local est la base de données dans laquelle le datastore a été ouvert.

Si aucun datastore nommé localID n'est trouvé, la commande renvoie Null.

Les objets disponibles dans le cs.Datastore sont créés à partir de la base de données cible en fonction des règles générales de correspondance d'ORDA.

Exemple 1

Utilisation du datastore principal de la base 4D :

 $result:=ds.Employee.query("firstName = :1";"S@")

Exemple 2

 var $connectTo; $firstFrench; $firstForeign : Object

var $frenchStudents; $foreignStudents : cs.DataStore

$connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
$frenchStudents:=Open datastore($connectTo;"french")

$connectTo.hostname:="192.168.18.11:8050"
$foreignStudents:=Open datastore($connectTo;"foreign")
//...
//...
$firstFrench:=getFirst("french";"Students")
$firstForeign:=getFirst("foreign";"Students")
  //getFirst method
//getFirst(localID;dataclass) -> entity
#DECLARE( $localId : Text; $dataClassName : Text ) -> $entity : 4D.Entity

$0:=ds($localId)[$dataClassName].all().first()

Open datastore

Historique
ReleaseModifications
20 R6Prise en charge de l'accès aux instances Qodly
20 R4Nouvelle propriété passwordAlgorithm
18Ajout

Open datastore( connectionInfo : Object ; localID : Text ) : cs.DataStore

ParamètresTypeDescription
connectionInfoObject->Propriétés de connexion utilisées pour joindre le datastore distant
localIDText->Identifiant à affecter au datastore ouvert sur l'application locale (obligatoire)
Résultatcs.DataStore<-Objet datastore

Description

La commande Open datastore connecte l'application au datastore distant identifié par le paramètre connectionInfo et renvoie un objet cs.DataStore correspondant associé à l'alias local localID.

Les datastores distants suivants sont pris en charge par la commande :

type de datastoreDescription
Application 4D distanteUne application 4D disponible en tant que datastore distant, c'est-à-dire :
  • son serveur web est lancé avec le support de http et/ou https,
  • son datastore est exposé via l'option REST (Exposer en tant que serveur REST cochée).
  • Une licence peut être requise (voir note)
    Application QodlyUne application Qodly Server qui vous a fourni un api endpoint et une api key valide associée à un rôle défini. Vous devez passer la clé d'api dans la propriété api-key de l'objet connectionInfo. Vous pouvez ensuite travailler avec l'objet datastore renvoyé, avec tous les privilèges accordés au rôle associé.
    note

    Les requêtes Open datastore reposent sur l'API REST 4D et peuvent nécessiter une licence 4D Client pour ouvrir la connexion sur un 4D Server distant. Référez-vous à la section User login mode pour savoir comment configurer l'authentification en fonction du mode de connexion utilisateur actuel sélectionné.

    Passez dans connectionInfo un objet décrivant le datastore distant auquel vous souhaitez vous connecter. Il peut contenir les propriétés suivantes (toutes les propriétés sont optionnelles, à l'exception de hostname) :

    PropriétéTypeApplication 4D distanteApplication Qodly
    hostnameTextNom ou adresse IP de la base de données distante + " :" + numéro de port (le numéro de port est obligatoire)API Endpoint de l'instance Qodly cloud
    userTextNom d'utilisateur- (ignoré)
    passwordTextMot de passe de l'utilisateur- (ignoré)
    idleTimeoutIntegerDélai d'inactivité de la session (exprimé en minutes), au terme duquel la session est automatiquement fermée par 4D. Si cette propriété est omise, la valeur par défaut est 60 (1h). La valeur ne peut pas être < 60 (si une valeur inférieure est passée, le timeout est fixé à 60). Pour plus d'informations, voir Fermeture des sessions.- (ignoré)
    tlsBooleanVrai pour utiliser une connexion sécurisée(1). Si cette propriété est omise, "false" par défaut. L'utilisation d'une connexion sécurisée est recommandée dans la mesure du possible.Vrai pour utiliser une connexion sécurisée. Si omis, faux par défaut
    typeTextdoit être "4D Server"- (ignoré)
    api-keyText- (ignoré)API key de l'instance Qodly cloud

    (1) Si tls est vrai, le protocole HTTPS est utilisé si :

    • HTTPS est activé sur le datastore distant
    • Le port donné correspond au port HTTPS configuré dans les propriétés
    • un certificat valide et une clé de chiffrement privée sont installés dans l'application 4D. Sinon, l'erreur "1610 - Une requête vers l’hôte: "{xxx}" a échoué" est générée

    localID est un alias local de la session ouverte sur le datastore distant. Si localID existe déjà dans l'application, il est utilisé. Sinon, une nouvelle session localID est créée lors de l’utilisation de l’objet datastore.

    Une fois la session ouverte, les instructions suivantes deviennent équivalentes et renvoient une référence sur le même objet datastore :

     $myds:=Open datastore(connectionInfo;"myLocalId")
    $myds2:=ds("myLocalId")
    //$myds et $myds2 sont équivalents

    Les objets disponibles dans le cs.Datastore sont mappés conformément aux [règles générales ORDA] (ORDA/dsMapping.md#general-rules).

    Si aucun datastore correspondant n'est trouvé, Open datastore retourne Null.

    Exemple 1

    Connexion à un datastore distant sans utilisateur/mot de passe :

     var $connectTo : Object
    var $remoteDS : cs.DataStore
    $connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
    $remoteDS:=Open datastore($connectTo;"students")
    ALERT("This remote datastore contains "+String($remoteDS.Students.all().length)+" students")

    Exemple 2

    Connexion à un datastore distant avec utilisateur/mot de passe/timeout/tls :

     var $connectTo : Object
    var $remoteDS : cs.DataStore
    $connectTo:=New object("type";"4D Server";"hostname";\"192.168.18.11:4443";\
    "user";"marie";"password";$pwd;"idleTimeout";70;"tls";True)
    $remoteDS:=Open datastore($connectTo;"students")
    ALERT("This remote datastore contains "+String($remoteDS.Students.all().length)+" students")

    Exemple 3

    Travailler avec plusieurs datastores distants :

     var $connectTo : Object
    var $frenchStudents; $foreignStudents : cs.DataStore
    $connectTo:=New object("hostname";"192.168.18.11:8044")
    $frenchStudents:=Open datastore($connectTo;"french")
    $connectTo.hostname:="192.168.18.11:8050"
    $foreignStudents:=Open datastore($connectTo;"foreign")
    ALERT("They are "+String($frenchStudents.Students.all().length)+" French students")
    ALERT("They are "+String($foreignStudents.Students.all().length)+" foreign students")

    Exemple 4

    Connexion à une application Qodly :

    var $connectTo : Object:={hostname : "https://xxx-x54xxx-xx-xxxxx-8xx5-xxxxxx.xx-api.cloud.com" ; tls : True}

    var $remoteDS : 4D.DataStoreImplementation
    var $data : 4D.EntitySelection

    $connectTo["api-key"]:="fxxxx-xxxx-4xxx-txxx-xxxxxxxx0" //uniquement à titre d'exemple
    //il est recommandé de stocker la clé API dans un endroit sécurisé
    //(par ex. un fichier) et de la charger dans le code

    $remoteDS:=Open datastore($connectTo; "remoteId")
    $data:=$remoteDS.item.all()

    ALERT(String($data.length)+" items have been read")

    Gestion des erreurs

    En cas d'erreur, la commande retourne Null. Si le datastore distant ne peut pas être joint (adresse incorrecte, web serveur non lancé, http et https non activés, etc.), l'erreur 1610 "Une requête vers l’hôte: {xxx} a échoué" est générée. Vous pouvez intercepter cette erreur avec une méthode installée par ON ERR CALL.

    .dataclassName

    Historique
    ReleaseModifications
    17Ajout

    .dataclassName : 4D.DataClass

    Description

    Chaque dataclass d'un datastore est disponible en tant que propriété de l'objet DataStore. L'objet retourné contient la description de la dataclass.

    Exemple

     var $emp : cs.Employee
    var $sel : cs.EmployeeSelection
    $emp:=ds.Employee //$emp contient la dataclass Employee
    $sel:=$emp.all() //obtient une entity selection de tous les employés

    //vous poubez également saisir directement :
    $sel:=ds.Employee.all()

    .cancelTransaction()

    Historique
    ReleaseModifications
    18Ajout

    .cancelTransaction()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .cancelTransaction() annule la transaction ouverte par la fonction .startTransaction() au niveau correspondant dans le process en cours pour le datastore spécifié.

    La fonction .cancelTransaction() annule toutes les modifications apportées aux données durant la transaction.

    Vous pouvez imbriquer plusieurs transactions (sous-transactions). Si la transaction principale est annulée, toutes ses sous-transactions le sont également, même si elles ont été validées individuellement à l'aide de la fonction .validateTransaction().

    Exemple

    Voir l'exemple de la fonction .startTransaction().

    .clearAllRemoteContexts()

    Historique
    ReleaseModifications
    19 R5Ajout

    .clearAllRemoteContexts()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .clearAllRemoteContexts() efface tous les attributs de tous les contextes actifs dans le datastore.

    Cette fonction est utile principalement dans le contexte du débogage. Gardez à l'esprit que lorsque vous ouvrez le débogueur, il envoie des requêtes au serveur et récupère tous les attributs de la dataclass pour les afficher. Cela peut surcharger vos contextes avec des données inutiles.

    Si cela se produit, vous pouvez utiliser .clearAllRemoteContexts() pour réinitialiser vos contextes.

    Voir également

    .getRemoteContextInfo()
    .getAllRemoteContexts()
    .setRemoteContextInfo()

    .encryptionStatus()

    Historique
    ReleaseModifications
    17 R5Ajout

    .encryptionStatus(): Object

    ParamètresTypeDescription
    RésultatObject<-Informations sur le chiffrement du datastore courant et de chaque table

    Description

    La fonction .encryptionStatus() renvoie un objet fournissant le statut de chiffrement du fichier de données courant (c'est-à-dire le fichier de données du datastore ds). Le statut de chiffrement pour chaque table est également fourni.

    Utilisez la commande Data file encryption status pour déterminer l'état de cryptage de tout autre fichier de données.

    Valeur retournée

    L'objet retourné contient les propriétés suivantes :

    PropriétéTypeDescription
    isEncryptedBooleanVrai si le fichier de données est chiffré
    keyProvidedBooleanVrai si la clé de chiffrement correspondant au fichier de données chiffré est fournie(*).
    tablesObjectObjet contenant autant de propriétés que de tables chiffrables ou chiffrées.
    tableNameObjectTable chiffrable ou chiffrée
    nameTextNom de la table
    numNumberNuméro de la table
    isEncryptableBooleanVrai si la table est déclarée chiffrable dans le fichier de structure
    isEncryptedBooleanVrai si les enregistrements de la table sont chiffrés dans le fichier de données

    (*) La clé de chiffrement peut être fournie :

    • via la fonction .provideDataKey(),
    • à la racine d'un appareil connecté avant l'ouverture du datastore,
    • via la commande Discover data key.

    Exemple

    Vous souhaitez connaitre le nombre de tables chiffrées dans le fichier de données courant :

     var $status : Object

    $status:=ds.encryptionStatus()

    If($status.isEncrypted) //la base est chiffrée
    C_LONGINT($vcount)
    C_TEXT($tabName)
    For each($tabName;$status.tables)
    If($status.tables[$tabName].isEncrypted)
    $vcount:=$vcount+1
    End if
    End for each
    ALERT(String($vcount)+" encrypted table(s) in this datastore.")
    Else
    ALERT("This database is not encrypted.")
    End if

    .flushAndLock()

    Historique

    |Release|Changes|

    |---|---| |20|Ajouté|

    .flushAndLock()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .flushAndLock() vide le cache du datastore local et empêche d'autres process d'effectuer des opérations d'écriture sur la base de données. Le datastore est placé dans un état cohérent et figé. L'appel de cette fonction est nécessaire avant l'exécution d'un instantané d'application (snapshot), par exemple.

    info

    Cette fonction ne peut être appelée que :

    • sur le datastore local (ds),
    • dans un environnement client/serveur, sur la machine serveur.

    Une fois cette fonction exécutée, les opérations d'écriture telles que .save() ou les autres appels .flushAndLock() sont figés dans tous les autres process jusqu'à ce que le datastore soit déverrouillé.

    Lorsque plusieurs appels à .flushAndLock() ont été effectués dans le même process, le même nombre d'appels à .unlock() doit être exécuté pour déverrouiller réellement le datastore.

    Le datastore est déverrouillé lorsque :

    • la fonction unlock() est appelée dans le même process, ou
    • le process qui a appelé la fonction .flushAndLock() est tué.

    Si le datastore est déjà verrouillé par un autre process, l'appel de .flushAndLock() est figé et sera exécuté lorsque le datastore sera déverrouillé.

    Une erreur est déclenchée si la fonction .flushAndLock() ne peut pas être exécutée (par exemple, elle est exécutée sur un 4D distant).

    caution

    D'autres fonctions et services 4D, notamment le backup, le vss et le MSC , peuvent également verrouiller le data Avant d'appeler .flushAndLock(), assurez-vous qu'aucune autre action de verrouillage n'est en cours d'utilisation, afin d'éviter toute interaction inattendue. Avant d'appeler .flushAndLock(), assurez-vous qu'aucune autre action de verrouillage n'est en cours d'utilisation, afin d'éviter toute interaction inattendue.

    Exemple

    Vous voulez créer une copie du dossier de données avec son fichier journal courant :

    $destination:=Folder(fk documents folder).folder("Archive") 
    $destination.create()

    ds.flushAndLock() //Bloque les opérations d'écriture des autres process

    $dataFolder:=Folder(fk data folder)
    $dataFolder.copyTo($destination) //Copie le dossier de données

    $oldJournalPath:=New log file //Ferme le journal et en créer un nouveau
    $oldJournal:=File($oldJournalPath; fk platform path)
    $oldJournal.moveTo($destination) //Sauvegarde l'ancien journal avec les données

    ds.unlock() //Notre copie est terminée, nous pouvons maintenant déverrouiller le datastore

    Voir également

    .locked()
    .unlock()

    .getAllRemoteContexts()

    Historique
    ReleaseModifications
    19 R5Ajout

    .getAllRemoteContexts() : Collection

    ParamètresTypeDescription
    RésultatCollection<-Collection d'objets contextes d'optimisation

    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 .getAllRemoteContexts() renvoie une collection d'objets contenant des informations sur tous les contextes d'optimisation actifs dans le datastore.

    Pour plus d'informations sur la façon dont les contextes peuvent être créés, voir Optimisation client/serveur.

    Chaque objet de la collection renvoyée possède les propriétés énumérées dans la section .getRemoteContextInfo().

    Exemple

    Le code suivant définit deux contextes et les récupère à l'aide de .getAllRemoteContexts() :

    var $ds : 4D.DataStoreImplementation
    var $persons : cs.PersonsSelection
    var $addresses : cs.AddressSelection
    var $p : cs.PersonsEntity
    var $a : cs.AddressEntity
    var $contextA; $contextB : Object
    var $info : Collection
    var $text : Text

    // Accès datastore distant
    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // définition contexte A
    $contextA:=New object("context"; "contextA")
    $persons:=$ds.Persons.all($contextA)
    $text:=""
    For each ($p; $persons)
    $text:=$p.firstname+" lives in "+$p.address.city+" / "
    End for each

    // définition contexte B
    $contextB:=New object("context"; "contextB")
    $addresses:=$ds.Address.all($contextB)
    $text:=""
    For each ($a; $addresses)
    $text:=$a.zipCode
    End for each

    // récupérer tous les contextes distants (ici contextA et contextB)
    $info:=$ds.getAllRemoteContexts()
    //$info = [{name:"contextB"; dataclass:"Address"; main:"zipCode"},
    {name:"contextA";dataclass:"Persons";main:"firstname,address.city"}]

    Cet exemple est à but de démonstration, il n'est pas destiné à une implémentation réelle.

    Voir également

    .getRemoteContextInfo()
    .setRemoteContextInfo()
    .clearAllRemoteContexts()

    .getGlobalStamp()

    Historique
    ReleaseModifications
    20 R3Ajout

    .getGlobalStamp() : Real

    ParamètresTypeDescription
    RésultatReal<-Valeur courante du marqueur de modification global

    Description

    La fonction .getGlobalStamp() retourne la valeur actuelle du marqueur de modification global du datastore.

    info

    Cette fonction ne peut être appelée que :

    • sur le datastore local (ds),
    • dans un environnement client/serveur, sur la machine serveur.

    Pour plus d'informations sur le marqueur global et le suivi des modifications de données, veuillez consulter la page Utiliser le marqueur global.

    Exemple

    var $currentStamp : Real
    var $hasModifications : Boolean

    $currentStamp:=ds.getGlobalStamp()
    methodWhichCouldModifyEmployees //exécuter du code
    $hasModifications:=($currentStamp # ds.getGlobalStamp())

    Voir également

    .setGlobalStamp()

    .getInfo()

    Historique
    ReleaseModifications
    17Ajout

    .getInfo(): Object

    ParamètresTypeDescription
    RésultatObject<-Propriétés du datastore

    Description

    La fonction .getInfo() renvoie un objet fournissant des informations sur le datastore. Cette fonction est utile pour l'écriture de code générique.

    Objet retourné

    PropriétéTypeDescription
    typestring
  • "4D": datastore principal, disponible via ds
  • "4D Server": datastore distant, ouvert avec Open datastore
  • networkedboolean
  • True: le datastore est atteint via une connexion réseau.
  • False : le datastore n'est pas atteint via une connexion réseau (base de données locale)
  • localIDtextIdentifiant du datastore sur la machine. Identifiant du datastore sur la machine. Chaîne vide ("") pour le datastore principal.
    connectionobjectObjet décrivant la connexion au datastore distant (non retourné pour le datastore principal). Propriétés disponibles:
    PropriétéTypeDescription
    hostnametextAdresse IP ou nom du datastore distant + ":" + numéro de port
    tlsbooleannTrue si une connexion sécurisée est utilisée avec le datastore distant
    idleTimeoutnumberDélai d'inactivité de la session (en minutes)
    usertextUtilisateur authentifié sur le datastore distant
    • Si la fonction .getInfo() est exécutée sur un 4D Server ou un 4D monoposte, networked est Faux.
    • Si la fonction .getInfo() est exécutée sur un 4D distant, networked est Vrai

    Exemple 1

     var $info : Object

    $info:=ds.getInfo() //Exécuté sur 4D Server ou 4D
    //{"type":"4D","networked":false,"localID":""}

    $info:=ds.getInfo() // Exécuté sur 4D distant
    //{"type":"4D","networked":true,"localID":""}

    Exemple 2

    Sur un datastore distant :

      var $remoteDS : cs.DataStore
    var $info; $connectTo : Object

    $connectTo:=New object("hostname";"111.222.33.44:8044";"user";"marie";"password";"aaaa")
    $remoteDS:=Open datastore($connectTo;"students")
    $info:=$remoteDS.getInfo()

    //{"type":"4D Server",
    //"localID":"students",
    //"networked":true,
    //"connection":{hostname:"111.222.33.44:8044","tls":false,"idleTimeout":2880,"user":"marie"}}

    .getRemoteContextInfo()

    Historique
    ReleaseModifications
    19 R5Ajout

    .getRemoteContextInfo(contextName : Text) : Object

    ParamètresTypeDescription
    contextNameText->Nom du contexte
    RésultatObject<-Description du contexte

    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 .getRemoteContextInfo() renvoie un objet qui contient des informations sur le contexte d'optimisation contextName dans le datastore.

    Pour plus d'informations sur la façon dont les contextes peuvent être créés, voir Optimisation client/serveur.

    Objet retourné

    L'objet retourné contient les propriétés suivantes :

    PropriétéTypeDescription
    nameTextNom du contexte
    mainTextAttribut(s) associé(s) au contexte (les noms d'attributs sont séparés par des virgules)
    dataclassTextNom de la dataclass
    currentItem (optionnel)TextAttributs du mode page si le contexte est lié à une list box. Retourn Null ou un élément de texte vide si le contexte n'est pas utilisé pour une list box, ou s'il n'y a pas de contexte pour l'élément courant (currentItem)

    Comme les contextes se comportent comme des filtres d'attributs, si main est retourné vide, cela signifie qu'aucun filtre n'est appliqué et que le serveur donc retourne tous les attributs de la dataclass.

    Exemple

    Voir l'exemple de la section .setRemoteContextInfo().

    Voir également

    .setRemoteContextInfo()
    .getAllRemoteContexts()
    .clearAllRemoteContexts()

    .getRequestLog()

    Historique
    ReleaseModifications
    17 R6Ajout

    .getRequestLog() : Collection

    ParamètresTypeDescription
    RésultatCollection<-Collection d'objets décrivant les requêtes

    Description

    La fonction .getRequestLog() retourne les requêtes ORDA enregistrées en mémoire sur le poste client. L'enregistrement des requêtes ORDA doit avoir été préalablement activé à l'aide de la fonction .startRequestLog().

    Cette fonction doit être appelée sur un client 4D distant, sinon elle retourne une collection vide. Elle est conçue à des fins de débogage dans les configurations client/serveur.

    Valeur retournée

    Collection d'objets requête empilés. La requête la plus récente porte l'indice 0.

    Pour une description du format du journal des requêtes ORDA, veuillez vous référer à la section Requêtes des clients ORDA.

    Exemple

    Voir l'exemple 2 de .startRequestLog().

    .isAdminProtected()

    Historique
    ReleaseModifications
    18 R6Ajout

    .isAdminProtected() : Boolean

    ParamètresTypeDescription
    RésultatBoolean<-Vrai si l'accès au Data Explorer est désactivé, Faux s'il est activé (défaut)

    Description

    La fonction .isAdminProtected() renvoie True si l'accès au Data Explorer a été désactivé pour la session de travail.

    Par défaut, l'accès au Data Explorer est autorisé pour les sessions webAdmin, mais il peut être désactivé pour empêcher que les administrateurs puissent accéder aux données (voir la fonction .setAdminProtection()).

    Voir également

    .setAdminProtection()

    .locked()

    Historique
    ReleaseModifications
    20Ajout

    .locked() : Boolean

    ParamètresTypeDescription
    RésultatBoolean<-Vrai si verrouillé

    Description

    La fonction .locked() renvoie True si le datastore local est actuellement verrouillé.

    Vous pouvez verrouiller le datastore à l'aide de la fonction .flushAndLock() avant d'exécuter un instantané du fichier de données, par exemple.

    caution

    La fonction renvoie également True si le datastore a été verrouillé par une autre fonction d'administration telle que la sauvegarde ou le vss (voir .flushAndLock()).

    Voir également

    .flushAndLock()
    .unlock()

    .makeSelectionsAlterable()

    Historique
    ReleaseModifications
    18 R5Ajout

    .makeSelectionsAlterable()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .makeSelectionsAlterable() définit toutes les entity selections comme modifiables par défaut dans les datastores de l'application courante (y compris les datastores distants). Elle est destinée à être appelée une fois, par exemple dans la méthode base On Startup.

    Lorsque cette méthode n'est pas appelée, les nouvelles sélections d'entités peuvent être partageables, selon la nature de leur "parent" ou la façon dont elles sont créées (voir la section [Entity selections partageables et non partageables](ORDA/entities.

    Cette fonction ne modifie pas les entity selections créées par .copy() ou OB Copy lorsque l'option explicite ck shared est utilisée.

    Compatibilité : Cette fonction doit être utilisée uniquement dans des projets convertis à partir de versions de 4D antérieures à 4D v18 R5 et contenant des appels .add(). Dans ce contexte, l'utilisation de .makeSelectionsAlterable() peut faire gagner du temps en restaurant instantanément le précédent comportement 4D dans les projets existants. En revanche, l'utilisation de cette méthode dans les nouveaux projets créés dans 4D v18 R5 et les versions plus récentes n'est pas recommandée, car elle empêche le partage des entity selections, ce qui offre de meilleures performances et une plus gran

    .provideDataKey()

    Historique
    ReleaseModifications
    17 R5Ajout

    .provideDataKey( curPassPhrase : Text ) : Object
    .provideDataKey( curDataKey : Object ) : Object

    ParamètresTypeDescription
    curPassPhraseText->Phrase secrète courante
    curDataKeyObject->Clé de chiffrement des données courante
    RésultatObject<-Résultat de la mise en correspondance de la clé de chiffrement

    Description

    La fonction .provideDataKey() permet de fournir une clé de chiffrement des données pour le fichier de données courant du datastore et détecte si la clé correspond aux données chiffrées. Cette fonction peut être utilisée à l'ouverture d'une base chiffrée, ou à l'exécution de n'importe quelle opération de chiffrement qui nécessite la clé de chiffrement, telle que le re-chiffrement du fichier de données.

    • La fonction .provideDataKey() doit être appelée dans une base de données chiffrée. S'il est appelé dans une base de données non cryptée, l'erreur 2003 (la clé de cryptage ne correspond pas aux données) est retournée. est retournée. Utilisez la commande Data file encryption status pour déterminer si la base de données est chiffrée.
    • La fonction .provideDataKey() ne peut pas être appelée depuis un 4D distant ou un datastore distant chiffré.

    Si vous utilisez le paramètre curPassPhrase, passez la chaîne utilisée pour générer la clé de chiffrement des données. Lorsque vous utilisez ce paramètre, une clé de chiffrement est générée.

    Si vous utilisez le paramètre curDataKey, passez un objet (avec la propriété encodedKey) contenant la clé de chiffrement des données. Cette clé peut avoir été générée à l'aide de la commande New data key.

    Si une clé de chiffrement des données valide est fournie, elle est ajoutée à la keyChain dans la mémoire et le mode chiffrement est activé :

    • toutes les modifications de données apportées dans les tables chiffrables sont chiffrées sur le disque (fichiers .4DD, .journal, . 4Dindx).
    • toutes les données chargées à partir de tables chiffrables sont déchiffrées dans la mémoire

    Résultat

    Le résultat de la commande est décrit dans l'objet retourné :

    PropriétéTypeDescription
    successBooleanVrai si la clé de chiffrement fournie correspond aux données chiffrées, sinon Faux
    Les propriétés ci-dessous sont retournées uniquement si success est à Faux
    statusNumberCode d'erreur (4 si la clé de chiffrement fournie est erronée)
    statusTextTextMessage d'erreur
    errorsCollectionPile d'erreurs. La première erreur possède l'indice le plus élevé.
    [ ].componentSignatureTextNom du composant interne
    [ ].errCodeNumberNuméro de l'erreur
    [ ].messageTextMessage d'erreur

    Si aucun paramètre curPassphrase ou curDataKey n'est fourni, .provideDataKey() retourne null (aucune erreur n'est générée).

    Exemple

     var $keyStatus : Object
    var $passphrase : Text

    $passphrase:=Request("Enter the passphrase")
    If(OK=1)
    $keyStatus:=ds.provideDataKey($passphrase)
    If($keyStatus.success)
    ALERT("You have provided a valid encryption key")
    Else
    ALERT("You have provided an invalid encryption key, you will not be able to work with encrypted data")
    End if
    End if

    .setAdminProtection()

    Historique
    ReleaseModifications
    18 R6Ajout

    .setAdminProtection( status : Boolean )

    ParamètresTypeDescription
    statusBoolean->Vrai pour désactiver l'accès au Data Explorer sur le port webAdmin, Faux (défaut) pour permettre l'accès

    Description

    La fonction .setAdminProtection() permet de désactiver tout accès aux données sur le port d'administration web, y compris pour l'Explorateur de données dans les sessions WebAdmin.

    Par défaut lorsque la fonction n'est pas appelée, l'accès aux données est possible via le Data Explorer sur le port d'administration web pour une session avec le privilège WebAdmin . Dans certaines configurations, par exemple lorsque le serveur d'application est hébergé sur une machine tierce, il se peut que vous ne souhaitiez pas que l'administrateur puisse consulter vos données, bien qu'il puisse modifier la configuration du serveur, y compris les paramètres access key.

    Dans ce cas, vous pouvez appeler cette fonction pour désactiver l'accès aux données depuis le Data Explorer sur le port web admin de la machine, même pour les sessions utilisateurs ayant le privilège WebAdmin. Lorsque cette fonction est exécutée, le fichier de données est immédiatement protégé et le statut est sauvegardé sur disque : le fichier de données sera protégé même si l'application est redémarrée.

    Exemple

    Vous créez une méthode projet protectDataFile à appeler par exemple avant le déploiement :

     ds.setAdminProtection(True) //Désactive l'accès aux données de l'Explorateur de données

    Voir également

    .isAdminProtected()

    .setGlobalStamp()

    Historique
    ReleaseModifications
    20 R3Ajout

    .setGlobalStamp( newStamp : Real)

    ParamètresTypeDescription
    newStampReal->Nouvelle valeur du marqueur de modification global
    Mode avancé

    Cette fonction est destinée aux développeurs qui ont besoin de modifier la valeur courante du marqueur global. Elle doit être utilisée avec précaution.

    Description

    La fonction .setGlobalStamp() définit newStamp comme la nouvelle valeur du marqueur de modification global du datastore.

    info

    Cette fonction ne peut être appelée que :

    • sur le datastore local (ds),
    • dans un environnement client/serveur, sur la machine serveur.

    Pour plus d'informations sur le marqueur global et le suivi des modifications de données, veuillez consulter la page Utiliser le marqueur global.

    Exemple

    Le code suivant définit le marqueur de modification global:

    var $newValue: Real
    $newValue:=ReadValueFrom //on obtient une valeur à assigner
    ds.setGlobalStamp($newValue)

    Voir également

    .getGlobalStamp()

    .setRemoteContextInfo()

    Historique
    ReleaseModifications
    19 R5Ajout

    .setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
    .setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
    .setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
    .setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )

    ParamètresTypeDescription
    contextNameText->Nom du contexte
    dataClassNameText->Nom de la dataclass
    dataClassObject4D.DataClass->Objet dataclass (e.g datastore.Employee)
    attributesText->Liste d'attributs séparés par des virgules
    attributesCollCollection->Collection de noms d'attributs (text)
    contextTypeText->Si passé, "main" ou "currentItem"
    pageLengthInteger->Taille de page de l'entity selection associée au contexte (80 par défaut)

    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 .setRemoteContextInfo() lie les attributs de la dataclass spécifiée au contexte d'optimisation contextName. Si un contexte d'optimisation existe déjà pour les attributs spécifiés, la commande le remplace.

    Lorsque vous passez un contexte aux fonctions de classe ORDA, l'optimisation des requêtes REST est déclenchée immédiatement :

    • la première entité n'est pas chargée intégralement, à la différence du mode automatique
    • des pages de 80 entités (ou de pageLength entités) sont imméditament demandées au serveur avec uniquement les attributs du contexte

    Pour plus d'informations sur la façon dont les contextes peuvent être créés, voir Optimisation client/serveur.

    Dans contextName, passez le nom du contexte d'optimisation à lier aux attributs de la dataclass.

    Pour désigner la dataclass qui doit recevoir le contexte, vous pouvez passer un dataClassName ou un dataClassObject.

    Pour désigner les attributs à lier au contexte, passez soit une liste d'attributs séparés par des virgules dans attributes (Text), soit une collection de noms d'attributs dans attributesColl (collection de textes).

    Si attributes est un texte vide, ou si attributesColl est une collection vide, tous les attributs scalaires de la dataclass sont intégrés au contexte d'optimisation. Si vous passez un attribut qui n'existe pas dans la dataclass, la fonction l'ignore et une erreur est générée.

    Vous pouvez passer un contextType pour spécifier si le contexte est standard ou s'il s'agit du contexte de l'élément courant de l'entity selection affichée dans une list box :

    • Si sa valeur est "main" (défaut), contextName désigne un contexte standard.
    • Si sa valeur est "currentItem", les attributs passés sont intégrés dans le contexte de l'élément courant. Voir Listbox basée sur une sélection d'entités.

    Dans pageLength, spécifiez le nombre d'entités de dataclass à demander au serveur.

    Vous pouvez passer une pageLength pour un attribut relationnel qui est une entity selection (1-vers-N). La syntaxe est relationAttributeName:pageLength (e.g employees:20).

    Exemple 1

    var $ds : 4D.DataStoreImplementation
    var $persons : cs.PersonsSelection
    var $p : cs.PersonsEntity
    var $contextA : Object
    var $info : Object
    var $text : Text

    // Ouvrir datastore distant
    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // définir le contexte
    $contextA:=New object("context"; "contextA")
    $ds.setRemoteContextInfo("contextA"; $ds.Persons; "firstname, lastname")

    // envoi de requêtes au serveur dans une boucle
    $persons:=$ds.Persons.all($contextA)
    $text:=""
    For each ($p; $persons)
    $text:=$p.firstname + " " + $p.lastname
    End for each

    // vérifier le contenu du contexte
    $info:=$ds.getRemoteContextInfo("contextA")
    // $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}

    Cet exemple est à but de démonstration, il n'est pas destiné à une implémentation réelle.

    Exemple 2

    Le code suivant demande des pages de 30 entités de la dataclass Address au serveur. Les entités retournées contiennent uniquement l'attribut zipCode.

    Pour chaque entité Address, 20 entités Persons sont retournées, et elles contiennent uniquement les attributs lastname et firstname :

    var $ds : 4D.DataStoreImplementation

    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    $ds.setRemoteContextInfo("contextA"; $ds.Address; "zipCode, persons:20,\
    persons.lastname, persons.firstname"; "main"; 30)

    Example 3 - Listbox

    // Au chargement du formulaire
    Case of
    : (Form event code=On Load)

    Form.ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // définir les attributs du contexte de page
    Form.ds.setRemoteContextInfo("LB"; Form.ds.Persons; "age, gender,\
    children"; "currentItem")

    Form.settings:=New object("context"; "LB")
    Form.persons:=Form.ds.Persons.all(Form.settings)
    // Form.persons est affiché dans une list box
    End case

    // vous récupérez les attributs dans le contexte de l'élément courant:
    Form.currentItemLearntAttributes:=Form.selectedPerson.getRemoteContextAttributes()
    // Form.currentItemLearntAttributes = "age, gender, children"

    Voir également

    .getRemoteContextInfo()
    .getAllRemoteContexts()
    .clearAllRemoteContexts()

    .startRequestLog()

    Historique
    ReleaseModifications
    20Prise en charge côté serveur, nouveau paramètre options
    17 R6Ajout

    .startRequestLog()
    .startRequestLog( file : 4D.File )
    .startRequestLog( file : 4D.File ; options : Integer )
    .startRequestLog( reqNum : Integer )

    ParamètresTypeDescription
    file4D.File->Objet File
    optionsInteger->Option d'enregistrement de réponse (serveur uniquement)
    reqNumInteger->Nombre de requêtes à conserver en mémoire (client seulement)

    Description

    La fonction .startRequestLog() démarre l'enregistrement des requêtes ORDA côté client ou côté serveur. Elle est conçue à des fins de débogage dans les configurations client/serveur.

    info

    Pour une description du format du journal des requêtes ORDA, veuillez vous référer à la section Requêtes ORDA.

    Côté client

    Pour créer un journal des requêtes ORDA côté client, appelez cette fonction sur une machine distante. Le journal peut être envoyé à un fichier ou en mémoire, selon le type de paramètre :

    • Si vous avez passé un objet file créé à l'aide de la commande File, les données de l'enregistrement sont écrites dans ce fichier sous forme de collection d'objets (format JSON). Chaque objet représente une requête.
      Si le fichier n'existe pas encore, il est créé. Sinon, s'il existe déjà, les nouvelles données d'enregistrement y sont ajoutées. Si la fonction .startRequestLog() est appelée avec un fichier alors qu'un enregistrement des requêtes est déjà en cours en mémoire, l'enregistrement en mémoire est stoppé et vidé.

    Un caractère ] doit être ajouté manuellement à la fin du fichier pour effectuer une validation JSON

    • Si vous avez passé un numéro reqNum, l'enregistrement en mémoire est vidé (le cas échéant) et un nouvel enregistrement est lancé. Il gardera en mémoire les requêtes jusqu'à atteindre le nombre reqNum, auquel cas les entrées les plus anciennes sont vidées (pile FIFO).
      Si la fonction .startRequestLog() est appelée avec un reqNum alors qu'un enregistrement des requêtes était déjà en cours dans un fichier, l'enregistrement dans le fichier est stoppé.

    • Si vous n'avez passé aucun paramètre, l'enregistrement est lancé dans la mémoire. Si .startRequestLog() a été préalablement appelée avec un reqNum (avant un .stopRequestLog()), les données enregistrées sont empilées dans la mémoire jusqu'au prochain vidage ou appel de .stopRequestLog().

    Côté serveur

    Pour créer un journal des requêtes ORDA côté serveur, appelez cette fonction sur la machine serveur. Les données du journal sont écrites dans un fichier au format .jsonl. Chaque objet représente une requête. Si le fichier n'existe pas encore, il est créé. Sinon, s'il existe déjà, les nouvelles données d'enregistrement y sont ajoutées.

    • Si vous avez passé le paramètre file , les données du journal sont écrites dans ce fichier, à l'emplacement demandé. - Si vous omettez le paramètre file ou s'il est null, les données du journal sont écrites dans un fichier nommé ordaRequests.jsonl et stockées dans le dossier "/LOGS".
    • Le paramètre options peut être utilisé pour spécifier si la réponse du serveur doit être enregistrée et si elle doit inclure le corps du message. Par défaut, lorsque le paramètre est omis, la réponse complète est enregistrée. Les constantes suivantes peuvent être utilisées dans ce paramètre :
    ConstanteDescription
    srl log allEnregistrer entièrement la réponse (valeur par défaut)
    srl log no responseDésactiver l'enregistrement de la réponse
    srl log response without bodyEnregistrer la réponse sans le corps (body)

    Exemple 1

    Vous souhaitez enregistrer des requêtes ORDA clientes dans un fichier et utiliser le numéro de séquence de l'enregistrement :

     var $file : 4D.File
    var $e : cs.PersonsEntity

    $file:=File("/LOGS/ORDARequests.txt") //dossier logs

    SET DATABASE PARAMETER(Client Log Recording;1) //pour déclencher le numéro de séquence log global
    ds.startRequestLog($file)
    $e:=ds.Persons.get(30001) //envoyer une requête
    ds.stopRequestLog()
    SET DATABASE PARAMETER(Client Log Recording;0)

    Exemple 2

    Vous souhaitez enregistrer des requêtes ORDA clientes dans la mémoire :

     var $es : cs.PersonsSelection
    var $log : Collection

    ds.startRequestLog(3) //conserve 3 requêtes en mémoire

    $es:=ds.Persons.query("name=:1" ; "Marie")
    $es:=ds.Persons.query("name IN :1";New collection("Marie"))
    $es:=ds.Persons.query("name=:1" ; "So@")

    $log:=ds.getRequestLog()
    ALERT("La requête la plus longue a duré : "+String($log.max("duration"))+" ms")

    Exemple 3

    Vous souhaitez enregistrer les requêtes du serveur ORDA dans un fichier spécifique et activer le numéro de séquence du log et la durée :

    SET DATABASE PARAMETER(4D Server Log Recording;1)

    $file:=Folder(fk logs folder).file("myOrdaLog.jsonl")
    ds.startRequestLog($file)
    ...
    ds.stopRequestLog()
    SET DATABASE PARAMETER(4D Server Log Recording;0)


    .startTransaction()

    Historique
    ReleaseModifications
    18Ajout

    .startTransaction()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .startTransaction() démarre une transaction dans le process courant sur la base de données du datastore. Toute modification apportée aux entités du datastore dans le process de la transaction est temporairement stockée jusqu'à ce que la transaction soit validée ou annulée.

    Si cette méthode est appelée sur le datastore principal (c'est-à-dire le datastore retourné par la commande ds), la transaction est appliquée à toutes les opérations effectuées sur le datastore principal et sur la base de données sous-jacente, incluant

    Vous pouvez imbriquer plusieurs transactions (sous-transactions). Chaque transaction ou sous-transaction doit être annulée ou validée. A noter que si la transaction principale est annulée, toutes ses sous-transactions le sont également, même si elles avaient été validées individuellement à l'aide de la fonction .validateTransaction().

    Exemple

     var $connect; $status : Object
    var $person : cs.PersonsEntity
    var $ds : cs.DataStore
    var $choice : Text
    var $error : Boolean

    Case of
    :($choice="local")
    $ds:=ds
    :($choice="remote")
    $connect:=New object("hostname";"111.222.3.4:8044")
    $ds:=Open datastore($connect;"myRemoteDS")
    End case

    $ds.startTransaction()
    $person:=$ds.Persons.query("lastname=:1";"Peters").first()

    If($person#Null)
    $person.lastname:="Smith"
    $status:=$person.save()
    End if
    ...
    ...
    If($error)
    $ds.cancelTransaction()
    Else
    $ds.validateTransaction()
    End if

    .stopRequestLog()

    Historique
    ReleaseModifications
    20Server side support
    17 R6Ajout

    .stopRequestLog()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .stopRequestLog() arrête tout enregistrement des requêtes ORDA sur la machine où elle est appelée (client ou serveur).

    Cela ferme en fait le document ouvert sur le disque. Côté client, si le journal a été démarré en mémoire, il est arrêté.

    Cette fonction ne fait rien si la journalisation des requêtes ORDA n'a pas été démarrée sur la machine.

    Exemple

    Voir les exemples pour .startRequestLog().

    .unlock()

    Historique
    ReleaseModifications
    20Ajout

    .unlock()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .unlock() supprime le verrou courant sur les opérations d'écriture dans le datastore, s'il a été défini dans le même process. Les opérations d'écriture peuvent être verrouillées dans le datastore local à l'aide de la fonction .flushAndLock().

    Si le verrou courant était le seul verrou sur le datastore, les opérations d'écriture sont immédiatement réactivées. Si la fonction .flushAndLock() a été appelée plusieurs fois dans le process, le même nombre de .unlock() doit être appelé pour déverrouiller réellement le datastore.

    La fonction .unlock() doit être appelée par le process qui a appelé la fonction .flushAndLock()correspondante, sinon la fonction ne fait rien et le verrou n'est pas supprimé.

    Si la fonction .unlock() est appelée dans un datastore déverrouillé, elle ne fait rien.

    Voir également

    .flushAndLock()
    .locked()

    .validateTransaction()

    Historique
    ReleaseModifications
    18Ajout

    .validateTransaction()

    ParamètresTypeDescription
    Ne requiert aucun paramètre

    Description

    La fonction .validateTransaction() valide la transaction qui a été démarrée avec la fonction .startTransaction() au niveau correspondant sur le datastore spécifié.

    La fonction sauvegarde les modifications apportées aux données sur le datastore durant la transaction.

    Vous pouvez imbriquer plusieurs transactions (sous-transactions). Si la transaction principale est annulée, toutes ses sous-transactions sont également annulées, même si elles ont été validées individuellement à l'aide de cette fonction.

    Exemple

    Voir l'exemple de la fonction .startTransaction().