version 11
Envoi de requêtes au moteur SQL de 4D
Le moteur SQL intégré de 4D peut être interrogé de trois manières :
via la commande CHERCHER PAR SQL. Le principe consiste à passer la clause WHERE d'une commande SQL SELECT en tant que paramètre à la commande. Exemple:
CHERCHER PAR SQL([OFFICES];"SALES > 100")
via les commandes SQL intégrées de 4D, placées dans le thème"SQL" (SQL FIXER PARAMETRE, SQL EXECUTER, etc.). Ces commandes peuvent fonctionnent avec une source de données OBDC ou le moteur SQL 4D de la base de données courante.
via l'éditeur de méthodes standard de 4D. Les instructions SQL peuvent être saisies directement dans l'éditeur de méthodes de 4D. Il suffit d'insérer les requêtes SQL entre les mots-clés Debut SQL et Fin SQL. Le code compris entre ces balises ne sera pas analysé par l'interpréteur de 4D et sera exécuté par le moteur SQL (ou par un autre moteur, si défini par la commande SQL LOGIN).
Echanger des données entre 4D et le moteur SQL
Référencer les expressions 4D
Il est possible de faire référence à tout type d'expression 4D valide (variable, champ, tableau, expression...) au sein des clauses WHERE et INTO des expressions SQL. Pour désigner une référence 4D, vous pouvez utiliser indifféremment l'une des deux notations suivantes :
placer la référence entre chevrons "<<" et ">>"
faire précéder la référence de deux-points ":"
Exemples:
C_ALPHA(80;vNom) vNom:=Demander("Nom :") SQL EXECUTER("SELECT age FROM PEOPLE WHERE nom=<<vNom>>")
ou bien :
C_ALPHA(80;vNom) vNom:=Demander("Nom :") Debut SQL SELECT age FROM PEOPLE WHERE name= :vNom Fin SQL
Note : Lorsque vous manipulez des variables interprocess (nommées <>mavar), vous devez encadrer le nom des variables avec des crochets [] (par exemple <<[<>mavar]>> ou :[<>mavar]).
Récupérer les données des requêtes SQL dans 4D
Les données issues d'une commande SELECT doivent être manipulées soit à l'intérieur d'un bloc Debut SQL/Fin SQL via la clause INTO de la commande SELECT, soit via les commandes 4D du thème "SQL" :
Dans le cas d'une structure Debut SQL/Fin SQL, vous pouvez utiliser la clause INTO de la requête SQL pour désigner tout objet 4D valide (champ, variable ou tableau) comme destinataire des valeurs.
Debut SQL SELECT ename FROM emp INTO <<[Employés]Nom>> Fin SQL
Avec la commande SQL EXECUTER, vous pouvez également utiliser les paramètres supplémentaires :
SQL EXECUTER("SELECT ename FROM emp";[Employés]Nom)
La principale différence entre les deux façons de récupérer les données issues d'une requête SQL (balises Debut SQL/Fin SQL et commandes SQL) est que dans le premier cas toutes les informations sont retournées à 4D en une seule fois, tandis que dans le second cas chaque enregistrement doit être chargé explicitement à l'aide de la commande SQL CHARGER ENREGISTREMENT.
Par exemple, en supposant que la table PERSONS comporte 100 enregistrements :
Récupération dans un tableau en utilisant les commandes SQL génériques de 4D :
TABLEAU ENTIER(tAnneeNaiss;0) C_ALPHA(40;vNom) vNom:="Smith" $SQLStm:="SELECT Birth_Year FROM PERSONS WHERE ename= <<vNom>>" SQL EXECUTER($SQLStm;tAnneeNaiss) Tant que(Non (SQL Fin de selection)) SQL CHARGER ENREGISTREMENT(10) Fin tant que
Ici, il est donc nécessaire d'effectuer 10 boucles afin de récupérer les 100 enregistrements. Pour charger tous les enregistrements en une seule fois, il suffit d'écrire :
SQL CHARGER ENREGISTREMENT(SQL Tous les enregistrements)
Récupération dans un tableau en utilisant les balises Debut SQL/Fin SQL :
TABLEAU ENTIER (tAnneeNaiss;0) C_ALPHA(40;vNom) vNom:="Smith" Debut SQL SELECT Birth_Year FROM PERSONS WHERE ename= <<vNom>> INTO <<tAnneeNaiss>> Fin SQL
Dans ce cas, après l'exécution de l'instruction SELECT, le tableau tAnneeNaiss contient 100 éléments, chaque élément stockant une année de naissance provenant des 100 enregistrements.
Si, au lieu d'un tableau nous souhaitons récupérer les données dans un champ 4D, 4D créera automatiquement autant d'enregistrements que nécessaire pour contenir toutes les valeurs. Reprenons l'exemple d'une table PERSONS contenant 100 enregistrements !
Récupération dans un champ en utilisant les commandes SQL génériques de 4D :
C_ALPHA(40;vNom) vNom:="Smith" $SQLStm:="SELECT Birth_Year FROM PERSONS WHERE ename= <<vNom>>" SQL EXECUTER($SQLStm;[Matable]Annee_Naiss) Tant que(Non (SQL Fin de selection)) SQL CHARGER ENREGISTREMENT(10) Fin tant que
Ici, il est nécessaire d'effectuer 10 boucles afin de récupérer les 100 enregistrements. Chaque passage dans la boucle entraînera la création de 10 enregistrements dans la table [Matable] et chaque valeur Birth_Year récupérée de la table PERSONS sera stockée dans le champ Annee_Naiss.
Récupération dans un champ en utilisant les balises Debut SQL/FinSQL :
C_ALPHA(40;vNom) vNom:="Smith" Debut SQL SELECT Birth_Year FROM PERSONS WHERE ename= <<vNom>> INTO <<[Matable]Annee_Naiss>> Fin SQL
Dans ce cas, pendant l'exécution de l'instruction SELECT, 100 enregistrements seront créés dans la table [Matable], les valeurs de la colonne Birth_Year étant stockées dans le champ 4D Annee_Naiss.
Utilisation d'une listbox
4D inclut un automatisme spécifique permettant de placer les données issues d'une requête SELECT dans une listbox. Pour plus d'informations, reportez-vous au manuel Mode Développement.
Optimisation des requêtes
Pour des raisons d'optimisation, il est préférable d'utiliser des expressions 4D plutôt que des fonctions SQL dans les requêtes. En effet, les expressions 4D seront calculées une fois avant l'exécution de la requête tandis que les fonctions SQL sont évaluées pour chaque enregistrement trouvé.
Par exemple, avec l'instruction suivante :
SQL EXECUTER("SELECT nomcomplet FROM PEOPLE WHERE nomcomplet=<<vNom+vPrenom>>")
... l'expression vNom+vPrenom est calculée une fois, avant l'exécution de la requête. Avec l'instruction suivante :
SQL EXECUTER("SELECT nomcomplet FROM PEOPLE WHERE nomcomplet=CONCAT(<<vNom>>,<<vPrenom>>)")
... la fonction CONCAT(<<vNom>>,<<vPrenom>>) est appelée pour chaque enregistrement de la table, autrement dit l'expression est évaluée pour chaque enregistrement.