Une requête peut être créé soit par l'assistant soit par saisie directe (ou copie...) du code SQL. Suivant le code de la requête, le mode HRequêteSansCorrection devra être utilisé (notamment si des noms de bibliothèque ou des ordres spécifiques sont présents), il faut dans ce cas spécifier la connexion dans la syntaxe de la requête.
Les requêtes de sélection "SELECT" vont retourner une source de donnée qui peut être parcourue et manipulée en programmation.
Remarque : il est possible de remplacer l'option MAIN des infos étendues du fichier ou l'option LF d'une clé par une requête SELECT dont les colonnes correspondent à la description du fichier.
hModifieFichier peut être utilisé si l'option SQLLIVE est active (valeur 1 ou 3) dans les infos étendues de la connexion.
Dans ce cas les données du résultat de la requête sont modifiables même si elles combinent plusieurs fichiers.
Par défaut des index sont créés sur chaque colonne de la requête, ce qui permet notamment la présence des loupes dans les tables. Cette fonctionnalité peut être désactivée par l'option SQLIDX des infos étendues de la connexion.
Les contrôles d'intégrité de l'AS/400 sont évidemment respectés.
Il n'est pas possible d'utiliser les indices de tableau dans une requête SQL.
Pour définir une condition sur une clé composée dans une requête SQL, il faut préciser les conditions de chacune des composantes de la clé.
Les filtres sur les requêtes ne sont pas supportés.
La fonction HExécuteRequete envoie et exécute directement une requête créée par l'éditeur, cette requête peut contenir des paramètres ou pas, elle peut être de type SELECT ou UPDATE, INSERT, DELETE...
La fonction HExécuteRequêteSQL permet d’envoyer directement des requêtes sous la forme d’une chaîne SQL et d’être utilisé conjointement avec la fonction HPrepareRequêteSQL, voir requêtes préparées.
Voir exemple Requêtes et SQL.
Requête et transactions
Les requêtes AS/400 peuvent s'inscrirent dans les transactions. Une transaction peut tout à fait concerner des modifications par les fonctions classiques (HModifie...) et par des ordres SQL.
schaine est une chaîne
marequete est une Source de Données
SQLTransaction(sqlDébut,MaConnexion)
schaine="UPDATE SP_CUST SET Firstname='Jean' WHERE CUST_ID='C-01'"
HExécuteRequêteSQL(marequete,MaConnexion,hRequêteDéfaut,schaine)
SQLTransaction(sqlAnnule,MaConnexion)
Utilisation du mode HRequêteDefaut
Le mode HRequêteDefaut est utilisé pour un code de requête simple lorsque les fichiers concernés se trouvent dans l'analyse.
Il faut être très vigilant à la notion de bibliothèque puisque seul le nom du fichier apparaît dans la chaîne SQL. Il sera donc recherché dans la LIBL du job.
Le plus simple est de faire précéder l'exécution d'un CHGCURLIB :
ASExec("CHGCURLIB MABIBLIO")
HExécuteRequête(REQ_Requête3,hRequêteDéfaut)
Utilisation du mode HRequêteSansCorrection
Le mode HRequêteSansCorrection permet de ne pas interpréter la requête par WinDev avant envoi sur l'AS/400. Il permet également de travailler sur des fichiers non importés dans l'analyse en utilisant le chemin complet (BIBLIO/FICHIER).
Ce mode est utilisé dans le cas où le code SQL de la requête est modifié manuellement (exemple : ajout du nom de la bibliothèque) ou pour un code de requête compliqué (concaténation …).
Dans ce mode aucune information des infos étendues n’est récupérée (notamment le chemin d’accès).
HRequêteDéfaut |
HRequêteSansCorrection |
Détermination automatique de la connexion associée aux fichiers présents dans la requête. |
La connexion à utiliser doit être précisée dans la fonction HExécuteRequêteSQL. |
Remplacement de tous les signes propriétaires PC SOFT (exemple : ']=' |
Aucun remplacement n'est effectué. Il est nécessaire d'utiliser les signes SQL standard. |
Formatage des dates et des heures selon le format utilisée par la base de données utilisée. |
Aucun formatage n'est effectué. Il est nécessaire d'utiliser le format reconnu par la base de données. |
Formatage des flottants (le séparateur de décimal peut être '.' ou ',') |
Aucun formatage des flottants n'est réalisé. |
Selon la base de données utilisée, remplacement des noms d'alias par les noms complets des rubriques dans les clauses Where, Order by et Group by |
Aucun remplacement n'est effectué. Il est nécessaire d'utiliser directement dans le code de la requête les noms complets des rubriques dans les clauses Where, Order by et Group by. |
Heures et dates en paramètres
En mode HRequêteDéfaut les dates et heures sont automatiquement formatées.
dToday est une Date
HExécuteRequête(REQ_Requête3,hRequêteDéfaut,dToday)
Si la valeur de date est passée directement il faut la mettre sur 8 caractères :
HExécuteRequête(REQ_Requête3,hRequêteDéfaut,"20050101")
Dans le cas particulier où des rubriques Date ou Heure sont associées à des types différent, l'option DATETYPE/TIMETYPE des infos étendues de la connexion ou du fichier et l'option NATIVETYPE des infos étendues de la rubrique permettent un formatage spécifique par Easycom.
Si le mode HRequêteSansCorrection est utilisé, les dates et les heures doivent être au format *ISO :
pour les heures HH:MM:SS,
pour les dates YYYY-MM-DD,
Exemple
HExécuteRequête(Nom_requête, Nom_connexion, hRequêteSansCorrection, "'00:00:03'")
HExécuteRequête(Nom_requête, Nom_connexion, hRequêteSansCorrection, "'1970-07-01'")
Syntaxe {Param} et formatage des chaînes
La requête contient en dur le nom de chaque paramètre. Ils doivent alors être initialisés avant l'appel ou bien passés dans l'ordre dans la fonction.
Attention, dans le cas des chaînes (texte), les quotes ne sont pas automatiquement insérées et doivent être ajoutées avant et après les valeurs :
REQ_Exemple2.Param1="'"+SAI_P1+"'"
Paramètres de la requête non précisés
Quelle que soit la façon de passer les paramètres à la requête, tous les paramètres de la requête ne doivent pas obligatoirement être précisés. Les conditions de la requête utilisant des paramètres non précisés seront ignorées.
Exemple : Soit la requête "Clients_nom_prénom" dont le code SQL est le suivant :
SELECT * FROM CLIENT WHERE NOM = {Param1} ET PRENOM = {Param2}
Si les 2 paramètres sont donnés :
HExécuteRequête(Clients_nom_prénom, hRequêteDéfaut, "Dupond", "Jean" )
exécutera la requête
SELECT * FROM CLIENT WHERE NOM = 'Dupond' ET PRENOM = 'Jean'
Si seul le nom est donné
HExécuteRequête(Clients_nom_prénom, hRequêteDéfaut, "Dupond")
exécutera la requête
SELECT * FROM CLIENT WHERE NOM = 'Dupond'
Si seul le prénom est donné. Le nom doit cependant être spécifié et correspondre à NULL.
HExécuteRequête(Clients_nom_prénom, hRequêteDéfaut, NULL, "Jean" )
exécutera la requête
SELECT * FROM CLIENT WHERE PRENOM = 'Jean'