Pour compter directement le nombre d’enregistrements du résultat d’un GROUP BY :
select count(*) from
(SELECT MLWHLO, MLITNO , count(*) FROM mitloc join mitwhl onmlcono=mwcono and mlwhlo=mwwhlo WHERE mwcono = 100 and mwfaci ='402' GROUP BY MLWHLO, MLITNO) Mon_alias (n’importe quel nom bidon)
Remplacer une partie de chaîne de caractère avec SQL
Remplacer un libellé par un autre dans tous les enregistrements d’un fichier, avec SQL. C’est assez facile, et cela peut servir pour offrire des possibilités de paramétrage plus ou moins complexe aux utilisateurs.
La requête SQL
UPDATE QTEMP/TMPDUCLIB
SET LGNLIB =
CAST(
SUBSTR(LGNLIB, 1,
LOCATE(TRIM( :WMOT ), LGNLIB) -1 )
CONCAT TRIM ( :WVAL )
CONCAT SUBSTR(LGNLIB,
LOCATE(TRIM( :WMOT ), LGNLIB)
+ LENGTH(TRIM( :WMOT )) ,
LENGTH(LGNLIB) - (
LOCATE(TRIM( :WMOT ), LGNLIB)
+ LENGTH(TRIM( :WMOT )) -1 ))
AS CHAR(200))
WHERE LGNLIB LIKE
'%' CONCAT TRIM( :WMOT ) CONCAT '%'
Explication
- La variable WMOT contient la valeur de la chaîne de caractère à remplacer.
- La variable WVAL contient la valeur de remplacement.
- Dans l’exemple, le remplacement se fait sur un fichier qui contient une zone LGNLIB de 200 caractères de long. Il s’agit de libellés à imprimer.
- Lorsque la requête est lancée avec par exemple WMOT = "#DATE#" et WVAL = "010507", tous les enregistrements contenant #DATE# sont modifiés avec la valeur 010507.
Utilisation
J’utilise souvent ce système pour permettre aux utilisateurs de paramétrer certaines choses comme des libellés à éditer où viennent s’insérer des valeurs variables lors des traitements.
Exemples
L’utilisateur saisit dans son fichier de libellés à éditer :
Date limite de dépôt de la déclaration le : #DATE_DCL#
Cotisations à régler au plus tard le : #DATE_COT#
Salaire versé le : #DATE_VER#
Le traitement appel autant de fois que de variables possibles la requêtes SQL que l’on a mis dans une procédure, en affectant avant WMOT et WVAL avec les valeurs adéquates :
WMOT = "#DATE_DCL#"
WVAL = "01/05/2007"
Appel de la requête SQL
WMOT = "#DATE_COT#"
WVAL = "05/05/2007"
Appel de la requête SQL
WMOT = "#DATE_VER#"
WVAL = "05/05/2007"
Appel de la requête SQL
Vous faite autant d’appel que de variables prévues dans votre fonctionnel. Si l’utilisateur ne les utilise pas dans son paramétrage, pas d’impact dans vos programmes.
Astuce
essayer de mettre un mot clé de la même taille que vos variables de remplacement (#DATE_DCL# fait 10 de long, comme la date 01/05/2007), ceci pour faciliter les cadrages.
Parfois, en 5250, on souhaite maîtriser le positionnement des libellés à des endroits fixes de la ligne.
Première partie #DA# seconde partie ICI commence la partie fixe
Donnera
Première partie 01/02/2007 seconde partie ICI commence la partie fixe
Alors que
Première partie #DAT_DECL# seconde partie ICI commence la partie fixe
Donnera
Première partie 01/02/2007 seconde partie ICI commence la partie fixe
Soit pile poil la même taille de libellé.
Je trouve la méthode pratique
Recadrer une zone alpha, avec un zero significatif en sql
Comment recadrer une zone numérique stockée dans un champ alpha, à droite avec un ou plusieurs zero significatifs à gauche. En sql, c’est très facile.
Cas pratique
Cas classique, un code postal 06003 pour Nice, que l’on a dans un fichier en 6003. Et bien sur, ce n’est pas le seul.
Requête SQL
UPDATE FICHIER
SET CODPOS = REPEAT('0', 5 - CHARACTER_LENGTH(TRIM(CODPOS)))
CONCAT TRIM(CODPOS)
WHERE CHARACTER_LENGTH(TRIM(CODPOS)) < 5
Explications
- FICHIER est le fichier que l’on souhaite mettre à jour.
- CODPOS est la zone qui contient le code postal. Elle est d’au moins 5 caractères (on stocke un code postal, je vous le rappel). Mais elle peut être plus longue, cela ne pose pas de soucis à la requête.
- L’instruction REPEAT permet de répéter autant de fois le caractère 0, pour compléter jusque 5 caractères.
- Le CONCAT permet de concaténer aux 0 ajoutés, le code déjà stocké.
- Le WHERE permet de ne travailler que sur les codes qui n’ont pas les 5 caractères requis.
- Dans un cas réel, attention aux codes postaux outre mer, cela ne fonctionnerai pas pour eux.
Recherche de la chaine '%' par SQL
SELECT * FROM zchgrpf WHERE TRANSLATE(CHTX40, '@', '%') like '%@%'
Ou
SELECT * FROM zchgrpf WHERE CHTX40 like '%/%%' ESCAPE '/'