Vous avez besoin d’avoir un écran qui se met à jour automatiquement voici un exemple qui fait ca.
Cette une barre d’avancement qui rafraichit également l’heure affichée.
DSPF
A DSPSIZ(24 80 *DS3)
A CA03(03)
A* Test écran en réaffichage auto
A*
A R FMT01
A*%%TS SD 20231026 124638 PLB REL-V7R4M0 5770-WDS
A PUTOVR
A OVRDTA
A OVRATR
A 5 27'Barre d''avancement'
A DSPATR(HI)
A TEXTE 50A O 11 15
A 22 4'F3=Exit'
A STATUS 15A O 9 27
Vous voulez utiliser la souris dans un dspf sur dans un de vos programmes voici un exemple en CLLE:
DSPF :
A DSPSIZ(24 80 *DS3)
A CA03(03)
A* EVENNEMENT SOURIS
A* UNSHIFT / LEFT / PRESS
A R FMT01
A*%%TS SD 20231025 171347 QSECOFR REL-V7R4M0 5770-WDS
A MOUBTN(*ULP ENTER)
A RTNCSRLOC(*MOUSE &L1 &C1 &L2 &C2)
A* RÉCUPÉRATION DU CURSEUR
A L1 3S 0H
A C1 3S 0H
A L2 3S 0H
A C2 3S 0H
A 3 13'Tester la position de la souris'
A 5 13'En faisant un clic Gauche.'
A* BOUTON BAS DE PAGE
A F1B 2Y 0B 23 2PSHBTNFLD
A PSHBTNCHC(1 'F3=>Exit' CA03)
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-25 20:47:252023-10-27 19:46:40Utilisation de la souris dans un DSPF
C’est la possibilité d’avoir un menu déroulant dans vos DSPF avec plusieurs onglets et de choisir une option, exactement comme dans windows.
Ci dessous un exemple avec son programme 2 menus déroulants ici PULLA et PULLB
DSPF
A* Exemple de menu barre
A DSPSIZ(27 132 *DS4)
A MNUCNL(CA12)
A CA03(03 'EXIT')
A R MB MNUBAR
A MNUFLD 2Y 0B 1 2
A MNUBARCHC(1 PULLA +
A '>Pulla')
A MNUBARCHC(2 PULLB +
A '>Pullb')
A MNUBARSEP( +
A (*CHAR '_'))
A
A R RECORD
A*%%TS SD 20231025 122354 PLB REL-V7R4M0 5770-WDS
A MNUBARDSP(MB &MNUCHC &PULL)
A 11 2'Nom :'
A ZONE1 30A B 11 14
A 12 2'Prénom :'
A ZONE2 20A B 12 14
A MNUCHC 2Y 0H
A PULL 2S 0H
A 13 2'Sexe :'
A F1S 2Y 0B 13 14SNGCHCFLD(*AUTOSLT (*NUMCOL 3))
A CHOICE(1 '>Homme ')
A CHOICE(2 '>Femme ')
A CHOICE(3 '>Inconnu')
A 14 2'Langue(s):'
A F1M 2Y 0B 14 14MLTCHCFLD((*NUMCOL 4))
A CHOICE(1 '>Anglais')
A CHCCTL(1 &CHOIX1)
A CHOICE(2 '>Espagnol')
A CHCCTL(2 &CHOIX2)
A CHOICE(3 'Alleman>d')
A CHCCTL(3 &CHOIX3)
A CHOICE(4 '>Italien ')
A CHCCTL(4 &CHOIX4)
A* CHOICE(5 'A>utre ')
A* CHCCTL(5 &CHOIX5)
A CHOIX1 1Y 0H
A CHOIX2 1Y 0H
A CHOIX3 1Y 0H
A CHOIX4 1Y 0H
A* CHOIX5 1Y 0H
A* Bas de page
A F1B 2Y 0B 23 2PSHBTNFLD
A PSHBTNCHC(1 'F3=>Exit' CA03)
A PSHBTNCHC(2 'E>nter')
A 9 3'Renseignements'
A R PULLA PULLDOWN
A F1 2Y 0B 1 02SNGCHCFLD(*AUTOENT)
A CHOICE(1 '>UN ')
A CHCCTL(1 &C1)
A CHOICE(2 '>DEUX')
A CHCCTL(2 &C2)
A CHOICE(3 '>TROIS')
A CHCCTL(3 &C3)
A C1 1Y 0H
A C2 1Y 0H
A C3 1Y 0H
A R PULLB PULLDOWN
A F1 2Y 0B 1 02SNGCHCFLD
A CHOICE(1 '>UN')
A CHCCTL(1 &C21)
A CHOICE(2 '>DEUX')
A CHCCTL(2 &C22)
A CHOICE(3 '>TROIS')
A CHCCTL(3 &C23)
A C21 1Y 0H
A C22 1Y 0H
A C23 1Y 0H
A
RPGLE
**FREE
// exemple de menu barre
Dcl-F MNUBAR WORKSTN ;
CLEAR RECORD ;
DoW *IN03 = '0';
Exfmt RECORD;
If *IN03 = '0';
If PULL > 0;
Select ;
When PULL = 1;
DSPLY 'Un' ;
When PULL = 2;
DSPLY 'Deux' ;
when PULL = 3;
DSPLY 'Trois' ;
Endsl;
// ici traitement des zones du format
EndIf;
EndIf;
EndDo;
*INLR = *On;
Remarque :
Vous devez compiler avec l’option ENHDSP(*YES)
Pour la présentation, cet exemple comporte également Un bouton poussoir pour les touches de fonctions un exemple de case a cocher unique un exemple de case à cocher multiple
Pour commencer c’est un peu compliqué, pour vous aider, vous pouvez utiliser notre générateur téléchargeable ici …
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-25 15:49:012023-11-03 12:32:01Utiliser un menu barre dans vos DSPF
C’est la possibilité d’avoir plusieurs messages d’erreur et de pouvoir paginer dessus
Vous pouvez programmer un sous fichier message, mais ca peut être un peu compliqué à réaliser.
Voici une solution simple, il suffit de mettre le mot clé ERRSFL au niveau fichier écran
Ci dessous un exemple avec son programme en CLLE
DSPF
A* Exemple sous fichier d'erreurs
A DSPSIZ(24 80 *DS3)
A ERRSFL
A CA03(03)
A R FMT01
A ZONE1 10A B 11 20
A 41 ERRMSG('Erreur ZONE 1' 41)
A ZONE2 10A B 12 20
A 42 ERRMSG('Erreur ZONE 2' 42)
A ZONE3 10A B 13 20
A 43 ERRMSG('Erreur ZONE 3' 43)
A 6 8'Sous fichier d''erreur'
A DSPATR(HI)
A 11 8'Zone 1 :'
A 12 8'Zone 2 :'
A 13 8'Zone 3 :'
CLLE
/* Exemple sous fichier message d'erreur */
PGM
DCLF ERREUR
dountil &in03
SNDRCVF RCDFMT(FMT01)
IF COND(*NOT &IN03) THEN(DO)
/* activation des indicateurs d'erreur */
CHGVAR &IN41 '1'
CHGVAR &IN42 '1'
CHGVAR &IN43 '1'
enddo
enddo
ENDPGM
Remarque:
La seule limitation, c’est une seule erreur par zone, mais ca suffit dans 90 % des cas
Vous pouvez utilisez des sous fichiers pour faire des sélections par case à cocher, ce qui améliore la gestion des écrans pour les utilisateurs
Voici 2 exemples
Sélection unique
Mot clé SFLSNGCHC, https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sflsngchc-subfile-single-choice-selection-list-keyword-display-files
Le DSPF
A*%%TS SD 20231024 203749 QSECOFR REL-V7R4M0 5770-WDS
A* SOUS FICHIER À CHOIX MULTIPLE
A*
A*%%EC
A DSPSIZ(24 80 *DS3)
A CA03(03)
A R SFL01 SFL
A* ZONE À COCHER
A ZONCTL 1Y 0H SFLCHCCTL
A ZONE 10A O 4 10
A R CTL01 SFLCTL(SFL01)
A*%%TS SD 20231024 203749 QSECOFR REL-V7R4M0 5770-WDS
A SFLPAG(0005)
A WINDOW(5 5 9 31)
A* SOUS FICHIER A SELECTION UNIQUE
A SFLSNGCHC(*SLTIND *AUTOSLT)
A* TAILLE DYNAMIQUE À FOURNIR
A SFLSIZ(&SFLSIZ)
A SFLDSP
A SFLDSPCTL
A 41 SFLCLR
A 45 SFLEND(*SCRBAR *SCRBAR)
A* LIGNE EN COURS < FOURNIT PAR LE SYSTÈME
A DEMANDE 5S 0H SFLSCROLL
A* LIGNE DE LA PAGE À AFFICHER > A FOURNIR PAR LE PROGRAMME
A LIGNE 4S 0H SFLRCDNBR(*TOP)
A* TAILLE DU SOUS FICHIER > A FOURNIR PAR LE PROGRAMME
A SFLSIZ 5S 0P
A* CLÉ DU SOUS FICHIER
A CLE01 4Y 0H
A 2 01'Sous Fichier Sélection Simple'
Le RPGLE
**free
// sous fichier à choix unique
ctl-opt DFTACTGRP(*NO) ;
dcl-f BOUTON8 WORKSTN
SFILE(sfl01:cle01) ;
dcl-s i int(10) ;
// Initialisation du sous fichier
SFLSIZ = 10;
LIGNE = 1;
cle01 = 0 ;
*in41 = *on ;
write ctl01 ;
*in41 = *off ;
// Chargement du sous fichier
cle01 = cle01+1 ;
zone = 'AAAAAAAAA' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'BBBBBBBBB' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'CCCCCCCCC' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'DDDDDDDDD' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'EEEEEEEEE' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'FFFFFFFFF' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'GGGGGGGGG' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'HHHHHHHHH' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'IIIIIIIII' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'JJJJJJJJJ' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'KKKKKKKKK' ;
Write sfl01;
// Boucle d'affichage
dou *in03 ;
exfmt ctl01 ;
if not *in03;
// Lecture de l'enregistrement sélectionné
readc sfl01 ;
if not %eof() ;
dsply zone ;
ZONCTL = 0 ;
update(e) sfl01 ;
LIGNE = demande ;
endif ;
endif ;
enddo ;
*inlr = *on ;
Sélection multiple
Mot clé SFLMLTCHC https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sflmltchc-subfile-multiple-choice-selection-list-keyword-display-files
Le DSPF
A*%%TS SD 20231025 044340 QSECOFR REL-V7R4M0 5770-WDS
A* SOUS FICHIER À CHOIX MULTIPLE
A*
A*%%EC
A DSPSIZ(24 80 *DS3)
A CA03(03)
A R SFL01 SFL
A* ZONE À COCHER
A ZONCTL 1Y 0H SFLCHCCTL
A ZONE 10A O 4 10
A R CTL01 SFLCTL(SFL01)
A*%%TS SD 20231025 043531 QSECOFR REL-V7R4M0 5770-WDS
A SFLDSP
A SFLDSPCTL
A 41 SFLCLR
A 45 SFLEND(*SCRBAR *SCRBAR)
A* TAILLE DYNAMIQUE À FOURNIR
A SFLSIZ(&SFLSIZ)
A SFLPAG(0005)
A WINDOW(5 5 9 31)
A* SOUS FICHIER A SELECTION MULTIPLE
A SFLMLTCHC(&NBSEL *SLTIND)
A* LIGNE EN COURS < FOURNIT PAR LE SYSTÈME
A DEMANDE 5S 0H SFLSCROLL
A* LIGNE DE LA PAGE À AFFICHER > A FOURNIR PAR LE PROGRAMME
A LIGNE 4S 0H SFLRCDNBR(*TOP)
A* TAILLE DU SOUS FICHIER > A FOURNIR PAR LE PROGRAMME
A SFLSIZ 5S 0P
A* NOMBRE DE SELECTIONS < FOURNIT PAR LE SYSTÈME
A NBSEL 4Y 0H
A* CLÉ DU SOUS FICHIER
A CLE01 4Y 0H
A 2 1'Sous Fichier Sélection Multiple'
A DSPATR(HI)
Le RPGLE
**free
// sous fichier à choix multiple
ctl-opt DFTACTGRP(*NO) ;
dcl-f BOUTON7 WORKSTN
SFILE(sfl01:cle01) ;
dcl-s i int(10) ;
// Initialisation du sous fichier
SFLSIZ = 10;
LIGNE = 1;
cle01 = 0 ;
*in41 = *on ;
write ctl01 ;
*in41 = *off ;
// Chargement du sous fichier
cle01 = cle01+1 ;
zone = 'AAAAAAAAA' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'BBBBBBBBB' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'CCCCCCCCC' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'DDDDDDDDD' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'EEEEEEEEE' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'FFFFFFFFF' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'GGGGGGGGG' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'HHHHHHHHH' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'IIIIIIIII' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'JJJJJJJJJ' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'KKKKKKKKK' ;
Write sfl01;
// Boucle d'affichage
dou *in03 ;
exfmt ctl01 ;
if not *in03;
// Traitement des enregistrements cochés
for i = 1 to nbsel ;
readc sfl01 ;
if not %eof();
dsply zone ;
ZONCTL = 0 ;
update(e) sfl01 ;
LIGNE = demande ;
endif ;
endfor;
endif ;
enddo ;
*inlr = *on ;
Remarques:
Vous devez compiler avec l’option ENHDSP(*YES)
Pour les sélection simple , vous pouvez utiliser une alternative aux cases à cocher, SFLCSRRRN qui renvoit la clé de l’enregistrement lu sans faire un READC
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-25 06:08:352024-01-19 09:24:55Utiliser un sous fichier à cocher
Bien entendu cela favorise la capacité à proposer des offres Cloud !
De ce point de vue c’est une opportunité importante dans la modernisation des infrastructures, et surtout la perspective d’avoir à terme un parc (plus) à jour.
D’autres raisons peuvent être sous-jacentes : la capacité à planifier et prédire un chiffre d’affaire par exemple. Du côté du client cela impacté également les budgets IT (amortissement vs consommation). Laissons cela de côté pour l’instant.
Comment
En synthèse, IBM travaille sur la proposition d’un abonnement IBM i + SWMA (maintenance logicielle). Le parti-pris est une équivalence de budget à 4 ans.
Ainsi, si vous conservez vos machines 4 ans ou moins : pas de budget supplémentaire. Si vous conservez vos systèmes plus longtemps, le coût augmente. De même, il deviendra difficile de conserver des systèmes hors maintenance (mais quel intérêt ?).
D’un autre côté, IBM rend gratuit un grand nombre de produits sous licence : pour les clients les utilisant c’est également une source d’économie. Pour les autres, c’est l’opportunité de disposer de fonctions supplémentaires.
Logiciels sous licence désormais inclus avec la licence IBM i
Administration Runtime Expert, also called Application Runtime Expert (5733-ARE)
CICS Transaction Server (5770-DFH)
HTTP Server (5770-DG1)
Facsimile Support for i (5798-FAX)
Developer Kit for Java (5770-JV1)
Managed System Services (5770-MG1)
Network Authentication Enablement (5770-NAE)
System Manager (5770-SM1)
TCP/IP Connectivity Utilities (5770-TC1)
Transform Services (5770-TS1)
Universal Manageability Enablement (5770-UME)
Logiciels sous licence gratuit (à commander à part)
Web Enablement: includes selected versions of WebSphere Application Server (5733-WE3, 5722-WE2)
Cryptographic Device Manager (5733-CY3)
OmniFind Text Search Server for DB2 for I (5733-OMF)
Logiciels sous licence payants
BRMS (5770-BR1)
Rational Development Studio (5770-WDS)
PowerHA SystemMirror for i (5770-HAS)
Cloud Storage Solutions (5733-ICC)
Db2 Mirror (5770-DBM)
Rational Developer for i
ARCAD Observer for IBM i (5733-AO1)
ARCAD RPG Converter for IBM i (5733-AC1)
IBM i Modernization Engine for Lifecycle Integration (“Merlin” via Passport Advantage)
IBM i Optional Features: Db2 Data Mirroring – Opt 48
Malheureusement, ce sont les utilisateurs de DB2 Web Query qui en pâtissent, IBM ne proposant pas de produit aux fonctionnalités équivalentes.
Ce sera également un manque aux possibilités de l’IBM i : DB2 Web Query est la solution de BI, d’exploitation des données métier. Or les plus fortes valeurs ajoutées de l’IBM i sont aujourd’hui sa base de donnée DB2 et la capacité à traiter des workload business.
Même si le nombre d’utilisateurs de DB2 Web Query était limitée, c’est assurément une mauvaise nouvelle.
A* Case à cocher
A* Bouton à choix unique
A DSPSIZ(24 80 *DS3)
A CA03(03)
A R FMT01
A 1 20'Zone choix simple'
A 3 2'Sexe :'
A F1 2Y 0B 3 20SNGCHCFLD(*AUTOSLT (*NUMCOL 3))
A CHOICE(1 '>Homme ')
A CHOICE(2 '>Femme ')
A CHOICE(3 '>Inconnu')
A 23 02'F3=Exit'
A* Case à cocher
A* Bouton à choix multiple
A DSPSIZ(24 80 *DS3)
A CA03(03)
A R FMT01
A 1 20'Zone choix multiple'
A 3 2'Plat :'
A F1 2Y 0B 3 20MLTCHCFLD((*NUMCOL 3))
A CHOICE(1 'Entrée ')
A CHOICE(2 'Plat ')
A CHOICE(3 'Dessert ')
A CHCCTL(1 &CHOIX1 )
A CHCCTL(2 &CHOIX2 )
A CHCCTL(3 &CHOIX3 )
A CHOIX1 1Y 0H
A CHOIX2 1Y 0H
A CHOIX3 1Y 0H
A 23 02'F3=Exit'
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-24 02:43:162023-10-24 02:43:17Utilisation de cases à cocher
Suivez la procédure pour paramétrer le plugin dans RDI et l’installation de la bibliothèque JCRCMDS s’il elle n’existe pas sur votre partition, c’est la commande JCRHDF qui sera utilisée, vous pouvez également l’utiliser en 5250, si vous le désirez
L’utilisation est très simple dans un source de type RPGLE ou SQLRPGLE , vous avez une nouvelle option sur le clic droit, JCRCMDS.
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-14 15:37:492023-10-17 14:43:59Convertir les carte H, D et F sous RDI
Concernant les fichiers JSON, on observe plusieurs types de géométries, principalement POLYGON et MULTIPOLYGON. C’est pourquoi il nous faut définir dans nos fichiers, une colonne qui puisse englober plusieurs types de géométries. Pour ce faire, le document Database Geospatial Analytics nous fournit quelques informations …
Nous choisirons donc, pour nos fichiers, une colonne basée sur la fonction ST_GEOMETRY, qui nous permet d’englober les deux type nommés ci-dessus. Voici donc comment nous constituerons nos tables.
-- Table des états américains
CREATE TABLE GGEOLOC.US_STATES (
STATE_ID CHAR(2) PRIMARY KEY,
STATE_FULL_NAME VARCHAR(50),
STATE_GEO QSYS2.ST_GEOMETRY);
-- Table des pays
CREATE TABLE GGEOLOC.COUNTRIES (
CODE_ISO VARCHAR(3) PRIMARY KEY,
NAME VARCHAR(50),
CNTRY_GEO QSYS2.ST_GEOMETRY);
-- Table des villes
CREATE TABLE GGEOLOC.MYCITIES (
CTY_NAME VARCHAR(50) ,
CTY_GEO QSYS2.ST_GEOMETRY);
Cet article étant dédié aux fonctions géospatiales, nous n’expliciterons pas la récupération des données.
Bienvenue à bord
ST_ISSIMPLE & ST_GEOMETRYTYPE …
… attachez vos ceintures
ST_ISSIMPLE nous permet de savoir si la géométrie de la figure sélectionnée est simple (valeur 1) ou bon (valeur 0).
SELECT STATE_FULL_NAME,
CASE QSYS2.ST_ISSIMPLE(STATE_GEO)
WHEN 0 THEN 'Geometry is not simple'
WHEN 1 THEN 'Geometry is simple'
END
FROM GGEOLOC.US_STATES where STATE_ID in ('WI', 'IL', 'IN', 'HI', 'AK');
Alaska
Geometry is not simple
Hawaii
Geometry is simple
Illinois
Geometry is simple
Indiana
Geometry is simple
Wisconsin
Geometry is simple
ST_GEOMETRYTYPE nous permet de savoir de quel type de géométrie nous parlons, et nous pouvons donc constater que la simplicité de la géométrie n’a pas de lien avec le caractère « MULTI » de la figure.
SELECT STATE_FULL_NAME, QSYS2.ST_GEOMETRYTYPE(STATE_GEO)
FROM GGEOLOC.US_STATES where STATE_ID in ('WI', 'IL', 'IN', 'HI', 'AK');
Alaska
ST_MULTIPOLYGON
Hawaii
ST_MULTIPOLYGON
Illinois
ST_POLYGON
Indiana
ST_POLYGON
Wisconsin
ST_POLYGON
ST_ASTEXT & ST_ASBINARY …
… briefing avant décollage
Si nous exécutons une extraction brute de nos données, on ne comprend pas immédiatement
select STATE_ID, STATE_FULL_NAME, STATE_GEO
from GGEOLOC.US_STATES where STATE_ID in ('OK', 'TX', 'AL', 'AR', 'CO');
ST_AREA nous donne la surface en m² d’une aire géographique (POLYGON ou MULTIPOLYGON)
on ajoute une colonne ici pour avoir une idée de l’aire en km²
select STATE_ID, STATE_FULL_NAME, QSYS2.ST_AREA(STATE_GEO), integer(QSYS2.ST_AREA(STATE_GEO)/1000000)
from GGEOLOC.US_STATES
where STATE_ID in ('OK', 'TX', 'AL', 'AR', 'HI');
AL
Alabama
1.3409800288446873E11
134098
AR
Arkansas
1.3838751120399905E11
138387
HI
Hawaii
1.4748657954505682E10
14748
OK
Oklahoma
1.8250255202012402E11
182502
TX
Texas
6.886199875225208E11
688619
ST_BUFFER nous donne les coordonnées d’une surface élargie du nombre de mètres voulus
voici un exemple de calcul de surfaces en élargissant de 1000 m les frontières de deux états
select STATE_ID, STATE_FULL_NAME, integer(QSYS2.ST_AREA(STATE_GEO)/1000000), integer(QSYS2.ST_AREA(QSYS2.ST_BUFFER(STATE_GEO, 1000))/1000000)
from GGEOLOC.US_STATES
where STATE_ID in ('OK', 'AL');
AL
Alabama
134098
135822
OK
Oklahoma
182502
184806
ST_DISJOINT & ST_WITHIN …
… garder le cap
ST_DISJOINT retourne 1 si deux figures n’ont rien en commun.
select CTY_NAME, CODE_ISO
from GGEOLOC.MYCITIES, GGEOLOC.COUNTRIES
where QSYS2.ST_DISJOINT(CTY_GEO, CNTRY_GEO) = 0 ;
HELSINKI
FIN
TEGUCIGALPA
HND
NAIROBI
KEN
GUADALAJARA
MEX
COPENHAGEN
DNK
LYON
FRA
NANTES
FRA
OSLO
NOR
ROCHESTER
USA
ST_WITHIN retourne 1 si la première figure est complètement dans la seconde.
Exemple : Une ville est-elle contenue dans un pays ? Un pays est-il contenu dans une ville ?
select CTY_NAME, CODE_ISO, QSYS2.ST_WITHIN(CTY_GEO, CNTRY_GEO), QSYS2.ST_WITHIN(CNTRY_GEO, CTY_GEO)
from GGEOLOC.MYCITIES, GGEOLOC.COUNTRIES
where CTY_NAME in ('LYON', 'ROCHESTER') and CODE_ISO in ('FRA', 'USA') ;
LYON
FRA
1
0
ROCHESTER
FRA
0
0
LYON
USA
0
0
ROCHESTER
USA
1
0
ST_INTERSECTS & ST_INTERSECTION …
… passer la frontière
ST_INTERSECTS nous permet de savoir si deux figures ont une intersection (la fonction retourne 1 si tel est le cas)
Dans l’exemple suivant, on cherche parmi une liste d’états, à savoir si ceux-ci sont directement voisins du Michigan
select t1.STATE_FULL_NAME, t2.STATE_FULL_NAME,
CASE WHEN QSYS2.ST_INTERSECTS(t1.STATE_GEO, t2.STATE_GEO) = 1
THEN 'Etats Voisins'
ELSE 'Etats éloignés'
END as config
from GGEOLOC.US_STATES t1, GGEOLOC.US_STATES t2
where t1.STATE_ID = 'MI'
and t2.STATE_ID in('WI', 'IL', 'IN', 'OH', 'PA', 'MN') ;
Michigan
Illinois
Etats éloignés
Michigan
Indiana
Etats Voisins
Michigan
Minnesota
Etats éloignés
Michigan
Ohio
Etats Voisins
Michigan
Pennsylvania
Etats éloignés
Michigan
Wisconsin
Etats Voisins
Il suffisait de voir la carte pour s’en rendre compte !! Heureusement, ST_INTERSECTION nous en dit beaucoup plus puisqu’elle nous indique la forme de l’intersection entre deux figures géométriques.
select t1.STATE_FULL_NAME, t2.STATE_FULL_NAME,
QSYS2.ST_ASTEXT(QSYS2.ST_INTERSECTION(t1.STATE_GEO, t2.STATE_GEO)),
CASE WHEN QSYS2.ST_INTERSECTS(t1.STATE_GEO, t2.STATE_GEO) = 1
THEN 'Etats Voisins'
ELSE 'Etats éloignés'
END as config
from GGEOLOC.US_STATES t1, GGEOLOC.US_STATES t2
where t1.STATE_ID = 'MI'
and t2.STATE_ID in('WI', 'IL', 'IN', 'OH', 'PA', 'MN');
ST_DISTANCE va retourner la distance entre deux points, mais il est intéressant de l’utiliser sur des figures de type POLYGON …
select t1.STATE_FULL_NAME, t2.STATE_FULL_NAME,
QSYS2.ST_DISTANCE(t1.STATE_GEO, t2.STATE_GEO)/1000
CASE WHEN QSYS2.ST_INTERSECTS(t1.STATE_GEO, t2.STATE_GEO) = 1
THEN 'Etats Voisins'
ELSE 'Etats éloignés'
END as config
from GGEOLOC.US_STATES t1, GGEOLOC.US_STATES t2
where t1.STATE_ID = 'MI'
and t2.STATE_ID in('WI', 'IL', 'IN', 'OH', 'PA', 'MN');
Michigan
Illinois
58.493941547601004
Michigan
Indiana
0.0
Michigan
Minnesota
33.60195301382611
Michigan
Ohio
0.0
Michigan
Pennsylvania
179.1488383130458
Michigan
Wisconsin
0.0
… pour lesquelles on se rend compte que la fonction retourne la distance (ramenées en km ici) entre les points les plus proches des deux figures comparées.
Atterrissage
Nous n’avons exploré ici qu’une partie des fonctions géospatiales disponibles. Il en existe bien d’autres fonctions pour savoir si une figure recouvre complètement une autre, si une figure est contenue dans une autre si une figure en traverse une autre, … Il existe également des fonctions de manipulation des GEOHASHES (système de géocodage basé sur la division d’une zone géographique en cellules).
Bref, tout une panoplie de fonctions que l’on peut combiner à l’infini et au-delà !
https://www.gaia.fr/wp-content/uploads/2021/07/GG-2.jpg343343Guillaume GERMAN/wp-content/uploads/2017/05/logogaia.pngGuillaume GERMAN2023-10-09 18:03:122023-10-09 18:03:14LE TOUR DU MONDE EN 10 (+1) FONCTIONS GEOSPATIALES
Vous connaissez tous le mot clé WINDOW dans les DDS qui vous permet d’afficher une fenêtre.
Cette solution a certaine contraintes comme les réaffichages par exemple.
Voici une alternative qui permet d’afficher une fenêtre sans utiliser ce mot clé
Le code l’écran
A*%%TS SD 20231003 225454 PLB REL-V7R4M0 5770-WDS
A* EXEMPLE DE FENETRE SANS WINDOW
A*
A*%%EC
A DSPSIZ(24 80 *DS3)
A USRDSPMGT
A INDARA
A R FMT01
A*%%TS SD 20231003 225454 PLB REL-V7R4M0 5770-WDS
A CA03(03)
A CA12(12)
A SLNO(01)
A CLRL(*NO)
A TITRE 25A O 15 45DSPATR(HI)
A DSPATR(RI)
A 16 45' '
A DSPATR(HI)
A DSPATR(RI)
A TEXTE01 21A O 16 47
A 16 69' '
A DSPATR(HI)
A DSPATR(RI)
A 17 45' '
A DSPATR(HI)
A DSPATR(RI)
A TEXTE02 21A O 17 47
A 17 69' '
A DSPATR(RI)
A DSPATR(HI)
A 18 45' '
A DSPATR(HI)
A DSPATR(RI)
A TEXTE03 21A O 18 47
A 18 69' '
A DSPATR(HI)
A DSPATR(RI)
A 19 45' F2=Valider F3=Fin '
A DSPATR(HI)
A DSPATR(RI)
Le programme RPGLE
**free
// Affiche une fenêtre sans window
// renvoi OK si vous appuyez sur <ENTER>
// renvoi KO si vous appuyez sur F3 ou F12
// call fenetre ('Titre' 'texte01' 'texte02' 'texte03' ' ')
dcl-f fenetre workstn ;
dcl-pi *N ;
Titre char(25); // Titre fenêtre
Texte01 char(21); // texte première ligne
Texte02 char(21); // texte deuxiéme ligne
Texte03 char(21); // texte troisième ligne
Retour char(2); // code retours
end-pi ;
if %parms = 0 ;
dsply ('Ce programme nécessite 6 paramètres') ;
else ;
// Affichage format
Exfmt FMT01 ;
if *in03 or *in12 ;
Retour = 'KO' ;
else ;
Retour = 'OK' ;
endif ;
endif;
// Fin de programme
*inlr = *on ;
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-04 06:08:522023-10-04 06:08:54Fenêtre sans le mot clé WINDOW