4D v16.3

Types de champs 4D

Accueil

 
4D v16.3
Types de champs 4D

Types de champs 4D  


 

 

Il est nécessaire de spécifier un type de champ pour chaque champ d’une table. Les types des champs affectent la manière dont 4D manipule et stocke les données dans les champs et la manière dont vous les saisissez et les affichez dans les formulaires.
Par défaut, 4D affecte le type Alpha aux champs que vous créez. Au moment de la création du champ, vous devez modifier ce type si nécessaire. 

Pour modifier le type d’un champ :

  1. Cliquez sur l’icône du type du champ dans l’image de la table et choisissez le type souhaité dans le menu associé.

    OU
    Cliquez avec bouton droit de la souris sur le champ à retyper et choisissez le type souhaité dans le sous-menu Type du menu contextuel.
    OU
    Sélectionnez le champ à retyper puis cliquez dans la zone Type de la Palette Inspecteur afin d’afficher le menu des types.

Vous pouvez changer de type à tout moment, sauf lorsque le champ comporte un lien ou appartient à une clé primaire. Dans ce cas, le menu de choix du type est désactivé. Vous devez supprimer explicitement le lien ou la clé primaire avant de pouvoir changer de type de champ.

Si vous changez de type de champ avant d’avoir commencé la saisie de données, 4D change tout simplement le type du champ. Si vous changez de type de champ, après avoir commencé la saisie de vos données, 4D convertit, si possible, ces données pour qu’elles correspondent au nouveau type. Cette conversion intervient la première fois que les données sont chargées après la modification. Les données d’un champ Image converti en tout autre type ne sont plus affichées. Les données d’un champ converti en champ de type Image ne sont plus affichées.
Quand vous convertissez un type de champ, 4D conserve la valeur originale du champ jusqu’à ce que l’enregistrement soit modifié. Par exemple, si un champ de type texte contient la valeur “plus de 10” et que vous changez son type en Entier, le champ modifié affiche “10”. Si vous changez de nouveau le type du champ en Texte, 4D affiche de nouveau “plus de 10”.

4D propose les types de champs suivants :

  • Alpha : chaînes de caractères alphanumériques de 1 à 255 caractères,
  • Texte : texte jusqu’à 2 Go,
  • Date : date comprise entre les années 100 et 32 767,
  • Heure : heure (durée ou horaire) exprimée en heures:minutes:secondes,
  • Booléen : champ binaire (Vrai ou Faux),
  • Entier : nombre entier compris entre -32 768 et 32 767,
  • Entier long : nombre entier compris entre -2 147 483 647 et 2 147 483 647,
  • Entier 64 bits(1) : nombre entier sur 8 octets compris entre -2^63 et (2^63)-1,
  • Réel : nombre réel compris dans l’intervalle ±1,7e±308 (avec 13 chiffres significatifs),
  • Float(1) : nombre à virgule flottante,
  • BLOB (Binary Large Object) : tout objet binaire tel qu’un objet graphique, une autre application ou un autre document,
  • Image : image dans l'un des formats natifs pris en charge par 4D (cf. paragraphe Formats natifs pris en charge dans le manuel Langage de 4D).
  • Objet : paires attribut/valeur en notation JSON, jusqu'à 2 Go.

(1) Attention, ces types de champs sont exploités uniquement par le moteur SQL de 4D. Si ces champs sont utilisés dans le langage de 4D, leurs valeurs sont converties en interne en nombres réels. 

Note : Le terme générique "chaîne" désigne un type Alpha ou Texte, "numérique" désigne un type  Entier, Entier long, Entier 64 bits, Réel et Float.

Alpha  

Un champ Alpha peut contenir des caractères alphanumériques (lettres et chiffres), des marques de ponctuation et des caractères spéciaux tels que l’astérisque (*), le caractère pourcentage (%), le tiret (-), etc. Les champs alphanumériques sont utilisés pour stocker toute information compacte qui doit être traitée comme du texte et qui a une longueur de moins de 255 caractères.

Un champ alphanumérique peut être associé à un index standard et/ou à un index de mots-clés. Pour plus d’informations sur l’indexation, reportez-vous à la section Créer et modifier des index.

Le type Alpha est le type de champ le plus courant. Il est généralement utilisé pour les noms, adresses, numéros de téléphone, codes postaux, etc. Lors de la saisie, un champ Alpha accepte tout type de caractères, de chiffres, toute marque de ponctuation ou caractère spécial.

Les codes postaux sont souvent placés dans des champs Alpha pour deux raisons principales : les champs numériques n’affichent pas les 0 placés en début de code et certains codes contiennent un tiret. La règle générale appliquée pour choisir entre Alpha ou numérique consiste à choisir le champ Alpha à moins que des calculs ou des tris doivent être réalisés à partir des données du champ.

Vous pouvez définir la longueur maximale d’un Alpha entre 1 et 255 caractères.

Les informations dans un champ Alpha peuvent être concaténées avec celles d’un autre champ Alpha. Par exemple, vous pouvez vouloir placer le nom et le prénom d’une personne sur la même ligne d’une étiquette. Vous pouvez réaliser cette opération à l’aide du code suivant :

 NomComplet:=[Personnes]Prénom+" "+[Personnes]Nom

La variable NomComplet peut être affichée ou imprimée. Vous pouvez aussi extraire une fraction de l’information pour l’utiliser à un autre endroit (extraction d’une sous-chaîne de caractères). La sous-chaîne de caractères peut être affichée ou imprimée.

Texte  

Un champ de type Texte est semblable à un champ Alpha, à quelques différences près. 

Un champ Texte peut contenir jusqu’à 2Go de caractères alphanumériques. En général, les champs Texte sont utilisés pour stocker des blocs de texte de grande taille, comme des commentaires ou des descriptions.

Pour des raisons d’optimisation, le contenu d’un champ Texte peut être stocké en-dehors des enregistrements (cf. paragraphe “Stocké dans l’enregistrement” dans la section Propriétés des champs). Dans ce cas, le champ ne peut pas être associé à un index standard. Comme les champs Alpha, un champ Texte peut être associé à un index de mots-clés. Pour plus d’informations sur l’indexation, reportez-vous à la section Créer et modifier des index.

Dans un formulaire de saisie, un champ Texte peut posséder des barres de défilement. Dans un état imprimé, la zone du champ de texte peut s’étendre autant qu’il est nécessaire pour imprimer la totalité des données, même si elles s’étendent sur plusieurs pages.

Pendant la saisie des données, le champ Texte fournit les fonctionnalités de base d’édition de texte : le défilement, le double-clic pour sélectionner un mot, le déplacement du point d’insertion à l’aide des touches fléchées et les opérations de couper/coller ou copier/coller standard. S’il dispose de l’option Multiligne, un champ de type Texte accepte les retours chariot pendant la saisie afin de créer un nouveau paragraphe (un champ Alpha ne le permet pas). S'il dispose de l'option Multistyle, il peut contenir des variations de style telles qu'un mot ou un groupe de mots souligné, gras ou de couleur différente.

Vous pouvez coller du texte dans les champs de type Texte, y compris du texte provenant de logiciels de traitement de texte.

Note : Vous pouvez aussi stocker du texte dans un enregistrement à l’aide du plug-in 4D Write. En utilisant 4D Write vous pouvez bénéficier de styles ou d’autres fonctionnalités de traitement de texte qui ne sont pas disponibles dans les champs Texte standard. Comme pour tous les plug-ins de 4D, la zone 4D Write doit être placée dans un champ de type BLOB — et non pas Texte. Pour plus d’informations sur l’utilisation de 4D Write, reportez-vous par exemple à la section Introduction du manuel Langage de 4D Write.

Date  

Ce type de champ est utilisé pour stocker des dates. Un champ Date peut stocker toute valeur de date (mois, jour, année) saisie dans un format JJ/MM/AAAA entre l’année 100 et 32 767.

Notes :

  • En France, les dates sont spécifiées en utilisant le format Jour/Mois/Année (JJ/MM/AAAA). D’autres pays, comme les Etats-Unis, utilisent d’autres formats tels que Mois/Jour/Année. 4D utilise le format de dates spécifié par votre système d’exploitation.
  • Bien qu'un champ date puisse stocker des dates allant jusqu'à l'année 32 767, certaines opérations passant par le système imposent une limite plus basse. 

Heure  

Ce type de champ est utilisé pour stocker des heures, telles que l’heure courante, une heure de rendez-vous, une heure de facturation, etc. Un champ de type heure peut contenir tout type d’heure saisi en respectant le format HH:MM:SS.

Les champs booléens contiennent soit la valeur VRAI soit la valeur FAUX. Ce type de champ est utilisé pour stocker des informations qui sont une réponse binaire à une question telle que Marié (oui/non), Sexe (Femme/Homme), etc.

Vous pouvez définir deux formats pour un champ booléen : une case à cocher ou un bouton radio. Une case à cocher contient la valeur Vrai quand elle est cochée et Faux quand elle est désélectionnée. De la même manière, si le premier bouton radio est sélectionné, le champ contient la valeur Vrai ; si le second est coché, le bouton contient Faux.

Il est préférable de nommer le champ de manière à pouvoir poser la question “Est-ce que le champ NomDuChamp est vrai ?”. Cette question est utile pour les recherches car, dans un champ Booléen, elles se font sur les valeurs Vrai ou Faux. Par exemple, il est préférable de nommer un champ “Masculin” (ou “Féminin”) plutôt que Sexe. Vos conditions de recherche peuvent alors être écrites de la manière suivante : “Masculin est égal à Vrai” au lieu de “Sexe est égal à Vrai”.

Entier  

Le type de champ Entier est utilisé pour stocker des nombres entiers (nombres sans chiffres après la virgule). Ce type de champ peut accueillir des nombres entiers compris entre -32 768 et +32 767. 

Ce type de champ peut être utilisé pour tout champ qui stocke des nombres entiers qui sont trop grands pour être stockés dans un champ de type Entier. Ce type de champ peut contenir des nombres entiers compris entre -2 147 483 647 et +2 147 483 647.

Ce type de champ peut être utilisé pour stocker des entiers sur 8 octets permettant de manipuler des valeurs entières de très grande taille, comprises entre -2^63 et (2^63)-1. 

Note : Attention, ce type de champ est exploité uniquement par le moteur SQL de 4D. Si ce champ est utilisé dans le langage de 4D, sa valeur est convertie en interne en nombre réel.

Réel  

Les champs de type Réel sont utilisés pour stocker des nombres réels, c’est-à-dire des nombres décimaux (par exemple des prix, des salaires, des dépenses, etc.). Les champs Réels peuvent stocker tout nombre inclus dans l’intervalle ±1,7e±308.
Les formats d’affichage numériques sont automatiquement basés sur les paramètres système régionaux. 4D substitue les caractères “,” et “.” dans les formats d’affichage des numériques par, respectivement, le séparateur des milliers et le séparateur décimal définis dans le système d’exploitation.

Note : Dans le moteur de base de données de 4D, les comparaisons de nombres réels sont toujours effectuées avec une valeur epsilon de 10^-6 afin d'obtenir un niveau de précision suffisant. Pour assurer la cohérence des données et des calculs, cette valeur epsilon n'est pas modifiable. En particulier, le moteur de base de données ne tient pas compte de la commande SET REAL COMPARISON LEVEL, qui ne s'applique qu'aux traitements effectués dans le langage de 4D. Du fait de l'imprécision inhérente aux calculs sur les réels, il est déconseillé d'utiliser ce type de données pour stocker des valeurs précises telles que des identifiants.

Float  

Ce type de champ peut être utilisé pour stocker des nombres à virgule flottante. Les nombres à virgule flottante permettent de stocker des valeurs réelles sans perte de précision. 

Note : Attention, ce type de champ est exploité uniquement par le moteur SQL de 4D. Si ce champ est utilisé dans le langage de 4D, sa valeur est convertie en interne en nombre réel.

Les champs de type BLOB (Binary Large Object) stockent des documents binaires de tout type et de toute taille. Vous pouvez utiliser un champ de type BLOB pour des documents complets dans votre base (des fichiers créés par d’autres applications, des applications, etc.). Vous pouvez aussi sauvegarder dans un fichier sur disque le contenu d’un champ BLOB. Par exemple, vous pouvez utiliser des champs de type BLOB dans un système de gestion de documents qui stocke les documents dans la base et les restitue aux utilisateurs lorsqu’ils le souhaitent.

Vous pouvez également stocker des données provenant des plug-ins dans des champs de type BLOB. Pour plus d’informations sur ce point, reportez-vous à la documentation livrée avec les plug-ins. 

Vous utilisez le langage pour manipuler les champs de type BLOB. Les commandes DOCUMENT TO BLOB ou BLOB TO DOCUMENT vous permettent respectivement de créer un document à partir du contenu du BLOB et de stocker un document dans un BLOB. Les commandes COMPRESS BLOB, EXPAND BLOB et BLOB PROPERTIES vous permettent de travailler avec les BLOBs. 

Pour des raisons d’optimisation, le contenu d’un champ BLOB est stocké en-dehors des enregistrements. Les BLOBs ne sont effectivement chargés que lorsque c’est nécessaire, par exemple une fois que l’enregistrement recherché a été trouvé. 

Le contenu d’un champ BLOB n’est pas affiché à l’écran car il peut représenter tout type de données.

Image  

Les champs de type Image permettent de stocker des photos numérisées, des images, des plans ou des illustrations créées à l’aide d’applications graphiques. Les images sont conservées dans leur format natif. Certaines applications graphiques permettent de stocker des informations supplémentaires avec les images comme, par exemple, des instructions pour une imprimante PostScript ou, à compter de 4D v12, des métadonnées. Ces informations accompagnent l’image lorsqu’elle est copiée ou collée dans un champ Image et peuvent être utilisées par 4D lors de l’impression de l’image ou, dans le cas des métadonnées, via les commandes GET PICTURE METADATA et SET PICTURE METADATA.

A compter de 4D v13, vous pouvez également associer un index de mots-clés aux champs images lorsque vous exploitez des métadonnées de type IPTC/Keywords (cf. section Créer et modifier des index).

Pour des raisons d’optimisation, le contenu d’un champ image est stocké en-dehors des enregistrements. Les images ne sont effectivement chargées que lorsque c’est nécessaire, par exemple une fois que l’enregistrement recherché a été trouvé. Depuis 4D v13, vous pouvez choisir en outre de stocker les images en-dehors même du fichier de données (cf. section Stockage externe des données).

4D peut mémoriser un nom par défaut pour chaque image stockée dans un champ. Ce principe permet de proposer un nom de fichier par défaut lors de l’écriture du contenu du champ image dans un fichier disque via un export utilisateur ou la commande WRITE PICTURE FILE (lorsque vous passez une chaîne vide dans le paramètre nomFichier). Si le contenu du champ est copié dans une variable ou dans un autre champ, le nom par défaut est également copié.

L’association d’un nom par défaut à une image stockée dans un champ image s’effectue de deux manières :

  • par programmation, à l’aide de la commande SET PICTURE FILE NAME. Cette commande permet d’associer un nom de fichier par défaut à l’image. La commande Get picture file name permet de connaître le nom par défaut d’une image.
  • automatiquement, lorsque le contenu d’un fichier image est importé dans un champ image via le menu contextuel ou via la commande READ PICTURE FILE : dans ce cas, 4D mémorise le nom du fichier image d’origine.

Ce principe est illustré dans la séquence suivante :

  1. L’utilisateur importe le fichier nommé logo64.png dans un champ image :
  2. Par la suite, l’utilisateur enregistre le contenu du champ image : le nom logo64.png est proposé dans la boîte de dialogue (à noter qu’il s’agit d’un nom par défaut, il peut être modifié) :

Objet  

Les champs objet stockent des paires attribut / valeur de différent type, sans schémas de données prédéfinis. La structure des données stockées peut varier d'un enregistrement à un autre. Par exemple, un champ objet [Personne]Adresse peut contenir différents attributs selon que la personne habite un appartement, une maison, telle ou telle ville, état, etc :

record1= {"street1":"Cotton Treasure Grounds", "street2":"Place Corners", "state":"MD",...} 
record2= {"street1":"Umber Road", "Number":"28", "state":"MO",...}

La structure des objets 4D est basée sur le principe standard des paires "attribut/valeur". La syntaxe de ces objets s'inspire de la notation JSON, sans toutefois l'implémenter entièrement :

  • Un nom d'attribut est toujours un texte, par exemple "Nom".
  • Une valeur d'attribut peut être d'un des types suivants :
    • numérique (réel, entier, etc.)
    • texte
    • tableau (texte, réel, entier, booléen, objet, pointeur)
    • null
    • booléen
    • date (format "YYYY-MM-DDTHH:mm:ssZ")
    • objet (les objets peuvent être imbriqués sur plusieurs niveaux).

Attention : Gardez à l'esprit que les noms d'attributs différencient les majuscules/minuscules.

Un champ objet peut être contenir jusqu'à 2 Go de données. Lorsque vous travaillez avec un enregistrement qui contient un champ objet, l'objet entier est stocké en mémoire. Comme pour les champs de type Texte, Image ou BLOB, les champs objet peuvent être stockés dans le fichier de données (avec les enregistrements ou non), ou hors du fichier de données. Cette option est détaillée dans la section Stockage externe des données.

Vous utilisez les commandes 4D Objets (Langage) pour gérer les champs objet. Utilisez les commandes OB Get et OB SET pour lire et écrire des données dans les champs de type Objet. Vous pouvez également lire et stocker des attributs de type tableau à l'aide des commandes OB SET ARRAY et OB GET ARRAY.

Des commandes dédiées, telles que QUERY BY ATTRIBUTE, QUERY SELECTION BY ATTRIBUTE, DISTINCT ATTRIBUTE VALUES ou DISTINCT ATTRIBUTE PATHS permettent d'effectuer des recherches et des traitements parmi les champs objet.

Comme les champs de type Objet sont basés sur du texte, leur contenu peut être affiché par défaut dans un formulaire 4D en tant que texte, et formaté en JSON (voir paragraphe suivant).

Note : Pour manipuler des objets JSON, vous devez utiliser les commandes du thème "JSON".

Le type Objet vous permet de définir des champs dynamiques sans schéma de structure prédéfini. Les champs objet peuvent être considérés comme "définis par l'utilisateur" ou "personnalisés". Dans 4D, vous avez le choix entre des modèles de données basés ou non sur des schémas. Dans les deux cas, vous pouvez exécuter des recherches indexées ultra-rapides.

A noter également que les champs objet peuvent simplifier les modèles de données standard. Par exemple, pour une table [Contacts] conventionnelle, un simple champ de type Objet permet d'éviter la création de dizaines de champs représentant toutes les valeurs possibles -- dont la plupart ne sont pas utilisés dans 90 % des cas. Le modèle d'information est alors créé à la volée uniquement lorsque c'est nécessaire. 

Toutes les commandes du thème Objets (Langage) acceptent désormais un champ objet comme premier paramètre (objet).

Tout comme les objets de langage standard, les valeurs des champs objet sont manipulées à l'aide des commandes du thème Objets (Langage). Par exemple :

  // Définir une valeur
 OB SET([Personnes]Identity_OB;"Prénom";$firstName)
 OB SET([Personnes]Identity_OB;"Nom";$lastName)
 
  // Lire une valeur
 $firstName:=OB Get([Personnes]Identity_OB;"Prénom")
 $lastName:=OB Get([Personnes]Identity_OB;"Nom")

Les tableaux sont également pris en charge, par exemple :

 ARRAY TEXT($arrGirls;3)
 $arrGirls{1}:="Emma"
 $arrGirls{2}:="Susan"
 $arrGirls{3}:="Jamie"
 OB SET ARRAY([Personnes]Enfants;"Girls";$arrGirls)

Pour sauvegarder des modifications apportées aux attributs d'un champ objet, vous devrez dans la plupart des cas notifier explicitement 4D que le champ a été modifié avant de stocker l'enregistrement. Cette notification s'effectue par l'affectation du champ objet à lui-même :

 [Persons]Identity_OB:=[Persons]Identity_OB //forcer 4D à mettre à jour le contenu du champ
 SAVE RECORD([Persons])

Cette étape est nécessaire car une même référence d'objet peut être utilisée dans de multiples endroits de l'application, y compris dans d'autres champs objet. Le langage de 4D n'a aucun moyen de détecter si l'un des attributs du champ objet a été modifié au moment où l'enregistrement est stocké.

Vous devez donc réaffecter explicitement le champ pour que son contenu soit sauvegardé :

  • lorsque vous modifiez des attributs via la notation objet :
     [Person]Info.firstName:="Jane"
     [Person]Info:=[Person]Info //obligatoire pour sauvegarder les modifications
     SAVE RECORD([Person])
  • lorsque vous modifiez des attributs situés au-delà du premier niveau via la commande OB SET :
     OB SET([Person]Info.Children[0];"firstName";"Jenny")
     [Person]Info:=[Person]Info //obligatoire pour sauvegarder les modifications
     SAVE RECORD([Person])

Note : L'affectation explicite du champ n'est pas nécessaire lorsque vous modifiez des attributs de premier niveau avec la commande OB SET :

 OB SET([Rect]Desc;"x";"50";"y";"50";"color";"blue") //accès aux attributs de premier niveau
 SAVE RECORD([Rect]//inutile de réassigne le champ dans ce cas

Les champs objet peuvent être utilisés dans des formules 4D (à l'aide de l'éditeur de formules standard ou la commande EXECUTE FORMULA). Cependant dans ce contexte, les champs objet doivent être manipulés par l'intermédiaire des commandes suivantes :

Par exemple, vous pouvez exécuter la formule de requête suivante :

 OB Get([Rect]Desc;"color")="blue"

Par défaut, les champs objet sont représentés sous forme de zones de texte dans les formulaires 4D. A l'intérieur de ces zones, les données des objets sont soit undefined, soit formatées en texte JSON; sinon, une erreur est retournée.

Par exemple, si vous avez défini le champ [Rect]Desc en tant que champ objet, vous pouvez écrire:

 CREATE RECORD([Rect])
 [Rect]Name:="Blue square"
 OB SET([Rect]Desc;"x";"50";"y";"50";"color";"blue")
 SAVE RECORD([Rect])

Lorsque le champ [Rect]Desc est affiché dans un formulaire, le contenu suivant est affiché :

Vous pouvez modifier les valeurs affichées directement dans la zone de texte, ou ajouter des données en utilisant la notation objet standard; le contenu est automatiquement formaté en JSON lorsque vous appuyez sur la touche [Tab] :

Cependant, l'édition directe doit être effectuée avec précaution car tout symbole ou espace placé à un mauvais endroit provoquera une erreur de l'analyseur JSON et les données ne seront pas sauvegardées :

Il est plus approprié de gérer le contenu des champs objet à l'aide des commandes Objets (Langage) et JSON.

La plupart des fonctionnalités principales de 4D prennent totalement en charge les champs de type Objet. Cependant, dans la version actuelle du programme, certaines parties spécifiques ne sont pas encore "prêtes" à utiliser directement les champs objet. Ces parties seront mises à jour progressivement dans les versions suivantes.

Les commandes et fonctions suivantes prennent indirectement en charge les champs objet via les formules 4D :

Fonctions/Commandes
Editeur de recherche
Editeur de tri
Editeur d'import/export (prise en charge automatique pour le format 4D Application, nécessité d'utiliser des formulaires pour les formats texte)
4D Write
4D Write Pro
4D View
Balises 4D
PROCESS 4D TAGS

Les commandes et fonctions 4D suivantes ne prennent pas en charge les champs objet :

Fonctions/Commandes
Editeur d'états rapides
Editeur d'étiquettes
Graphes
PHP
Plugin SDK
SQL Data Definition Language (CREATE TABLE)
SQL Data Manipulation Language (SELECT, INSERT, UPDATE)
SQL EXPORT DATABASE et SQL EXPORT SELECTION
RELATE ONE
RELATE MANY
ORDER BY
SCAN INDEX

 
PROPRIÉTÉS 

Produit : 4D
Thème : Définir la structure de la base de données

 
HISTORIQUE 

Modifié : 4D v15

 
UTILISATION DE L'ARTICLE

4D - Mode Développement ( 4D v16)
4D - Mode Développement ( 4D v16.1)
4D - Mode Développement ( 4D v16.3)