CEC 2012 Vienna Forum Francophone Power IBM i ( et AS/400, iSeries, System i, ... )
Forum Francophone Power IBM i ( et AS/400, iSeries, System i,  ... )   Forum Francophone Power IBM i ( et AS/400, iSeries, System i,  ... )   Forum Francophone Power IBM i ( et AS/400, iSeries, System i,  ... )   Forum Francophone Power IBM i ( et AS/400, iSeries, System i,  ... )
18 Mai,2012, 20:56:57 *
Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?

Connexion avec identifiant, mot de passe et durée de la session
Nouvelles:
 
   Accueil   Aide Règles Rechercher Partenaires Identifiez-vous Inscrivez-vous Liens Common France Common Belgique Common Luxembourg  
Pages: [1]   Bas de page
  Imprimer  
Auteur Fil de discussion: [BDD/SQL/api] RTVSQLSRC : génération source SQL (DDL)  (Lu 1886 fois) Average Rating: 0
0 Membres et 1 Invité sur ce fil de discussion.
jmpenasse
Administrator
Membre Héroïque
*****
Hors ligne Hors ligne

Messages: 344




i_SilverDev http://fr.linkedin.com/in/jmpenasse
Voir le profil WWW
« le: 02 Février,2009, 18:18:39 »

L'api QSQGNDDL  permet de générer un source SQL à partir d'un objet fichier PF ou LF (créé par DDS ou SQL), mais également à partir de contraintes, objets SQL... Elle est disponible à partir de la V5R1
Le source généré contiendra les instructions SQL nécessaires pour recréer l'objet en question. Ainsi l'appel à cette API pour un PF donnera une instruction CREATE TABLE .... et également les LABEL, COMMENT ON, contraintes...

Cette API est relativement simple, mais contient cependant de nombreux paramètres : convention d'appellation (SYS ou SQL), la syntaxe à générer (AS400, DB2, ISO) etc...

Voici donc, ci-joint (pour ceux qui sont inscrits sur le forum), les sources d'une commande RTVSQLSRC  et son CLP permettant d'appeler cette API.
Le savf contant ces 2 objets (sauvegardés à partir de QGPL) est également fourni. V5R2 ou +

Un petit outil sympa pour reconstituer des objets SQL créés en "ligne de commande " (STRSQL ou autre) ou pour voir comment il faudrait faire en SQL pour créer les fichiers PF/LF faits en DDS.

téléchargement ci-dessous
|
V
Journalisée

Il y a 10 sortes de gens : Ceux qui comprennent le binaire et les autres ...
Didier
Bureau
Membre Senior
*****
Hors ligne Hors ligne

Messages: 158




http://fr.linkedin.com/pub/didier-adriaenssens/17/735/346
Voir le profil WWW
« Répondre #1 le: 02 Février,2009, 18:50:36 »

Bonjour JM,

Je crise  Grrrrrr je ne trouve pas le lien pour télécharger (pourtant je suis la flèche)  Cry

Je dois etre trop petit  Grin

merci didier
Journalisée
jmpenasse
Administrator
Membre Héroïque
*****
Hors ligne Hors ligne

Messages: 344




i_SilverDev http://fr.linkedin.com/in/jmpenasse
Voir le profil WWW
« Répondre #2 le: 02 Février,2009, 19:13:17 »

Pb de config des droits du forum. ce devrait être corrigé mainenant  Merci
« Dernière édition: 02 Février,2009, 19:43:34 par jmpenasse » Journalisée

Il y a 10 sortes de gens : Ceux qui comprennent le binaire et les autres ...
GAPIII
Membre Senior
****
Hors ligne Hors ligne

Messages: 160



Voir le profil
« Répondre #3 le: 02 Février,2009, 19:53:54 »

On peut utiliser cette API directement depuis Opérations Navigator.

Ouvrez la ligne "Bases de données",
cliquez sur votre système,
cliquez sur schémas (bibliothèques),
ouvrez la bibliothèque contenant votre fichier PF ou LF
cliquez sur "tables"
Dans la fenêtre de droite, cliquez droit sur le fichier PF ou LF et
sélectionnez l'option "Génération d'instructions SQL"

On peut sélectionner différentes options comme de générer l'instruction dans un fichier PC
ou dans un fichier source sur son système préféré, etc ... Wink
Journalisée
opicot
Néophyte
*
Hors ligne Hors ligne

Messages: 2

OS:
Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
Navigateur:
Chrome 14.0.835.202 Chrome 14.0.835.202


Voir le profil
« Répondre #4 le: 24 Octobre,2011, 16:11:08 »

Bonjour,

Merci pour vos posts. Nous sommes à la recherche d'une commande AS/400 qui ferait exactement la même chose que l'API QSQGNDDL, mais sans succès pour le moment.
I Series Navigator appelle-t-il cette API ou passe-t-il par un autre biais ?

Merci d'avance pour votre réponse

Bien Cordialement

Olivier
Journalisée
jmpenasse
Administrator
Membre Héroïque
*****
Hors ligne Hors ligne

Messages: 344


OS:
Windows XP Windows XP
Navigateur:
Firefox 8.0 Firefox 8.0



i_SilverDev http://fr.linkedin.com/in/jmpenasse
Voir le profil WWW
« Répondre #5 le: 25 Octobre,2011, 11:27:39 »

Bonjour,

Merci pour vos posts. Nous sommes à la recherche d'une commande AS/400 qui ferait exactement la même chose que l'API QSQGNDDL, mais sans succès pour le moment.
I Series Navigator appelle-t-il cette API ou passe-t-il par un autre biais ?

Merci d'avance pour votre réponse

Bien Cordialement

Olivier
Bonjour et bienvenue,

Effectivement Navigator utilise cette API.
Il n'y a pas d'autre moyen que d'utiliser l'API. C'est bien pour cela que ce sujet existe Wink
Si vous n'arrivez pas à télécharger les sources de la commande et du CLP (dans le premier message), les voici intégralement :

CLP :

Code:
/*  ************************************************************ */
/*  EXPERIA EUROPE 2008  -  JMP                                  */
/*  Member  . . : RTVSQLSRC                                      */
/*  Member type : CLLE                                           */
/*  Description : CPP de la commande RTVSQLSRC                   */
/*  ************************************************************ */
             PGM        PARM(&QUALOBJ &OBJTYPE &QUALSRC &SRCMBR +
                          &REPLACE &NAMING &STDOPT &MSGLVL &SEVLVL +
                          &DATFMT &DATSEP &TIMFMT &TIMSEP &DECPOINT +
                          &DROP &COMMENT &LABEL &HEADER &SYSNAMOPT +
                          &TRIGGER &CONSTRAINT)
/*  -- Paramètres -- */
             DCL        VAR(&QUALOBJ) TYPE(*CHAR) LEN(512)
             DCL        VAR(&OBJTYPE) TYPE(*CHAR) LEN(10)
             DCL        VAR(&QUALSRC) TYPE(*CHAR) LEN(20)
             DCL        VAR(&SRCMBR) TYPE(*CHAR) LEN(10)
             DCL        VAR(&REPLACE) TYPE(*CHAR) len(1)
             DCL        VAR(&NAMING) TYPE(*CHAR) LEN(3)
             DCL        VAR(&STDOPT) TYPE(*CHAR) LEN(1)
             DCL        VAR(&MSGLVL) TYPE(*DEC) LEN(2 0)
             DCL        VAR(&SEVLVL) TYPE(*DEC) LEN(2 0)
             DCL        VAR(&DATFMT) TYPE(*CHAR) LEN(3)
             DCL        VAR(&DATSEP) TYPE(*CHAR) LEN(1)
             DCL        VAR(&TIMFMT) TYPE(*CHAR) LEN(3)
             DCL        VAR(&TIMSEP) TYPE(*CHAR) LEN(1)
             DCL        VAR(&DECPOINT) TYPE(*CHAR) LEN(1)
             DCL        VAR(&DROP) TYPE(*CHAR) LEN(1)
             DCL        VAR(&COMMENT) TYPE(*CHAR) LEN(1)
             DCL        VAR(&LABEL) TYPE(*CHAR) LEN(1)
             DCL        VAR(&HEADER) TYPE(*CHAR) LEN(1)
             DCL        VAR(&SYSNAMOPT) TYPE(*CHAR) LEN(1)
             DCL        VAR(&TRIGGER) TYPE(*CHAR) LEN(1)
             DCL        VAR(&CONSTRAINT) TYPE(*CHAR) LEN(1)
/*  -- Parm API QSQGNDDL  -- */
             DCL        VAR(&TEMPLATE) TYPE(*CHAR) LEN(600)
             DCL        VAR(&TPLLEN) TYPE(*CHAR) LEN(4)
             DCL        VAR(&APIFMT) TYPE(*CHAR) LEN(8) +
                          VALUE('SQLR0100')
             DCL        VAR(&ERRORCODE) TYPE(*CHAR) LEN(8) +
                          VALUE(X'0000000000000000')
/*  -- Variables  -- */
             DCL        VAR(&OBJNAM) TYPE(*CHAR) LEN(258)
             DCL        VAR(&OBJLIB) TYPE(*CHAR) LEN(258)
             DCL        VAR(&SRCNAM) TYPE(*CHAR) LEN(10)
             DCL        VAR(&SRCLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&BINMSGLVL) TYPE(*CHAR) LEN(4)
             DCL        VAR(&BINSEVLVL) TYPE(*CHAR) LEN(4)

             DCL        VAR(&RTVDATFMT) TYPE(*CHAR) LEN(4)
             DCL        VAR(&RTVDATSEP) TYPE(*CHAR) LEN(1)
             DCL        VAR(&RTVTIMSEP) TYPE(*CHAR) LEN(1)
             DCL        VAR(&NEWDATFMT) TYPE(*CHAR) LEN(3)
             DCL        VAR(&NEWDATSEP) TYPE(*CHAR) LEN(1)
             DCL        VAR(&NEWTIMsep) TYPE(*CHAR) LEN(1)
             DCL        VAR(&BIN00) TYPE(*CHAR) LEN(40) +
                          VALUE(X'00000000000000000000000000000000000+
                          0000000000000000000000000000000000000000000+
                          00')

             CHGVAR     VAR(%BIN(&TPLLEN)) VALUE(0600)

             CHGVAR     VAR(&OBJNAM) VALUE(%SST(&QUALOBJ 1 256))
             CHGVAR     VAR(&OBJLIB) VALUE(%SST(&QUALOBJ 257 256))
             CHGVAR     VAR(&SRCNAM) VALUE(%SST(&QUALSRC 1 10))
             CHGVAR     VAR(&SRCLIB) VALUE(%SST(&QUALSRC 11 10))
             CHGVAR     VAR(%BIN(&BINMSGLVL)) VALUE(&MSGLVL)
             CHGVAR     VAR(%BIN(&BINSEVLVL)) VALUE(&SEVLVL)

             IF         COND(&SRCMBR = '*OBJ') THEN(DO)
             CHGVAR     VAR(&SRCMBR) VALUE(%SST(&OBJNAM 1 10))
             ENDDO

 /* --  Traitement des parms avec *JOB  -- */

             RTVJOBA    DATFMT(&RTVDATFMT) DATSEP(&RTVDATSEP) +
                          TIMSEP(&RTVTIMSEP)
             IF         COND(&DATFMT = 'JOB') THEN(DO)
             CHGVAR     VAR(&NEWDATFMT) VALUE(%SST(&RTVDATFMT 2 3))
             ENDDO
             ELSE       CMD(CHGVAR VAR(&NEWDATFMT) VALUE(&DATFMT))

             IF         COND(&DATSEP = 'J') THEN(DO)
             CHGVAR     VAR(&NEWDATSEP) VALUE(&RTVDATSEP)
             ENDDO
             ELSE       CMD(CHGVAR VAR(&NEWDATSEP) VALUE(&DATSEP))

             IF         COND(&TIMSEP = 'J') THEN(DO)
             CHGVAR     VAR(&NEWTIMSEP) VALUE(&RTVTIMSEP)
             ENDDO
             ELSE       CMD(CHGVAR VAR(&NEWTIMSEP) VALUE(&TIMSEP))

 /* --  Verification existence source file -- */

             CHKOBJ     OBJ(&SRCLIB/&SRCNAM) OBJTYPE(*FILE)
             MONMSG     MSGID(CPF9801 CPF9810) EXEC(DO)
             SNDPGMMSG  MSG('Fichier source ' *CAT &SRCLIB *TCAT '/' +
                          *CAT &SRCNAM *BCAT 'non trouvé.') +
                          MSGTYPE(*DIAG)
             GOTO       CMDLBL(ERROR)
             ENDDO


 /* --  Ajout du membre au srcf si nécessaire -- */

             CHKOBJ     OBJ(&SRCLIB/&SRCNAM) OBJTYPE(*FILE) +
                          MBR(&SRCMBR)
             MONMSG     MSGID(CPF9815) EXEC(DO) /* Mbr non trouvé */
             ADDPFM     FILE(&SRCLIB/&SRCNAM) MBR(&SRCMBR) +
                          TEXT('RTVSQLSRC - generated') SRCTYPE(SQL)
             ENDDO

 /* --  Constitution paramètre de l'API -- */

             CHGVAR     VAR(&TEMPLATE) VALUE(&OBJNAM *CAT &OBJLIB +
                          *CAT &OBJTYPE *CAT &SRCNAM *CAT &SRCLIB +
                          *CAT &SRCMBR *CAT &BINSEVLVL *CAT +
                          &REPLACE *CAT '0' *CAT &NEWDATFMT *CAT +
                          &NEWDATSEP *CAT &TIMFMT *CAT &NEWTIMSEP +
                          *CAT &NAMING *CAT &DECPOINT *CAT &STDOPT +
                          *CAT &DROP *CAT &BINMSGLVL *CAT &COMMENT +
                          *CAT &LABEL *CAT &HEADER *CAT &TRIGGER +
                          *CAT &CONSTRAINT *CAT &SYSNAMOPT *CAT &BIN00)

/* Appel de l'API */

             CALL       PGM(QSQGNDDL) PARM(&TEMPLATE &TPLLEN &APIFMT +
                          &ERRORCODE)
EXIT:
             RETURN

ERROR:
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Echec +
                          de l''extraction source SQL. Voir +
                          messages précédents') MSGTYPE(*ESCAPE)
End:
             ENDPGM


Commande :

Code:
/**************************************************************/
/*  EXPERIA EUROPE 2008  -  JMP                               */
/*  Member  . . : RTVSQLSRC                                   */
/*  Member type : CMD                                         */
/*  CPP . . . . : RTVSQLSRC (CLP)                             */
/*  Create cmd  :                                             */
/*       CRTCMD CMD(XXX/RTVSQLSRC) PGM(XXXX/RTVSQLSRC)        */
/*  Description : Command wrapper for API QSQGNDDL            */
/*                Build SQL source (DDL) to create an Object  */
/**************************************************************/
 CMD   PROMPT('Extraire source SQL (DDL)')

             PARM       KWD(OBJ) TYPE(QUAL) MIN(1) PROMPT('Objet')
 QUAL:       QUAL       TYPE(*NAME) LEN(256) MIN(1) EXPR(*YES) +
                          INLPMTLEN(10)
             QUAL       TYPE(*NAME) LEN(256) DFT(*LIBL) +
                          SPCVAL((*CURLIB) (*LIBL)) MIN(0) +
                          EXPR(*YES) INLPMTLEN(10) +
                          PROMPT('Bibliothèque')

             PARM       KWD(OBJTYPE) TYPE(*CHAR) LEN(10) RSTD(*YES) +
                          SPCVAL((*PF TABLE) (*LF VIEW) (*ALIAS +
                          ALIAS) (*CST CONSTRAINT) (*FUNC FUNCTION) +
                          (*INDEX INDEX) (*PROC PROCEDURE) (*SCHEMA +
                          SCHEMA) (*TABLE TABLE) (*TRG TRIGGER) +
                          (*TYPE TYPE) (*VIEW VIEW)) MIN(1) +
                          EXPR(*YES) PROMPT('Type d''objet')

             PARM       KWD(SRCFILE) TYPE(SRCFILE) PROMPT('Fichier +
                          source')
 SRCFILE:    QUAL       TYPE(*NAME) LEN(10) DFT(QSQLSRC) EXPR(*YES)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*CURLIB) (*LIBL)) MIN(0) +
                          EXPR(*YES) PROMPT('Bibliothèque')

             PARM       KWD(SRCMBR) TYPE(*NAME) LEN(10) DFT(*OBJ) +
                          SPCVAL((*OBJ)) EXPR(*YES) PROMPT('Membre +
                          source')

             PARM       KWD(REPLACE) TYPE(*LGL) DFT(*YES) +
                          SPCVAL((*YES '1') (*NO '0')) EXPR(*YES) +
                          PROMPT('Remplacer le membre')

             PARM       KWD(NAMING) TYPE(*CHAR) LEN(3) RSTD(*YES) +
                          DFT(*SYS) SPCVAL((*SQL SQL) (*SYS SYS)) +
                          EXPR(*YES) PROMPT('Convention +
                          d''appellation')

             PARM       KWD(STDOPT) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*AS400) SPCVAL((*AS400 0) (*DB2 1) +
                          (*ISO 2)) EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Standard SQL')

             PARM       KWD(MSGLVL) TYPE(*DEC) LEN(2 0) DFT(20) +
                          RANGE(0 39) PROMPT('Niveau de génération +
                          messages')

             PARM       KWD(SEVLVL) TYPE(*DEC) LEN(2 0) RSTD(*YES) +
                          DFT(30) VALUES(0 10 20 30 40) +
                          PROMPT('Niveau de gravité génération')

             PARM       KWD(DATFMT) TYPE(*CHAR) LEN(3) RSTD(*YES) +
                          DFT(*ISO) SPCVAL((*JOB JOB) (*ISO ISO) +
                          (*EUR EUR) (*JIS JIS) (*USA USA) (*MDY +
                          MDY) (*DMY DMY) (*YMD YMD) (*JUL JUL)) +
                          EXPR(*YES) PROMPT('Format date')

             PARM       KWD(DATSEP) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*DASH) SPCVAL((*JOB J) (*SLASH '/') +
                          (*PERIOD '.') (*COMMA ',') (*DASH '-') +
                          (*BLANK ' ')) EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Séparateur de date')

             PARM       KWD(TIMFMT) TYPE(*CHAR) LEN(3) RSTD(*YES) +
                          DFT(*ISO) SPCVAL((*ISO ISO) (*EUR EUR) +
                          (*JIS JIS) (*USA USA) (*HMS HMS)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) PROMPT('Format +
                          heure')

             PARM       KWD(TIMSEP) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*PERIOD) SPCVAL((*JOB J) (*COLON ':') +
                          (*PERIOD '.') (*COMMA ',') (*BLANK ' ')) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Séparateur d''heures')

             PARM       KWD(DECPOINT) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*PERIOD) SPCVAL((*PERIOD '.') (*COMMA +
                          ',')) EXPR(*YES) PROMPT('Symbole décimal')

             PARM       KWD(DROP) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*NO) SPCVAL((*NO 0) (*YES 1)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Générer instruction DROP')

             PARM       KWD(COMMENT) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*YES) SPCVAL((*NO 0) (*YES 1)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Générer COMMENT ON')

             PARM       KWD(LABEL) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*YES) SPCVAL((*NO 0) (*YES 1)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Générer LABEL ON')

             PARM       KWD(HEADER) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*YES) SPCVAL((*NO 0) (*YES 1)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Commentaires en en-tête')

             PARM       KWD(SYSNAMOPT) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*NO) SPCVAL((*NO 0) (*YES 1)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Générer RENAME V5R4+')

             PARM       KWD(TRIGGER) TYPE(*CHAR) LEN(1) RSTD(*YES) +
                          DFT(*NO ) SPCVAL((*NO 0) (*YES 1)) +
                          EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Générer Triggers V5R4+')

             PARM       KWD(CONSTRAINT) TYPE(*CHAR) LEN(1) +
                          RSTD(*YES) DFT(*NO ) SPCVAL((*NO 0) (*YES +
                          1)) EXPR(*YES) PMTCTL(*PMTRQS) +
                          PROMPT('Générer Contraintes V5R4+')
/* CONTROLE DEPENDANCES PARAMÈTRES */
             DEP        CTL(&STDOPT *NE '0') PARM((&NAMING *EQ 'SQL'))
             DEP        CTL(&STDOPT *NE '0') PARM((&DATFMT *NE +
                          'JOB') (&DATFMT *NE 'MDY') (&DATFMT *NE +
                          'DMY') (&DATFMT *NE 'YMD') (&DATFMT *NE +
                          'JUL'))
             DEP        CTL(&STDOPT *NE '0') PARM((&TIMFMT *NE +
                          'HMS'))
             DEP        CTL(&STDOPT *NE '0') PARM((&DECPOINT *EQ '.'))
             DEP        CTL(&STDOPT *EQ '2') PARM((&OBJTYPE *NE +
                          'ALIAS') (&OBJTYPE *NE 'INDEX'))
             DEP        CTL(&STDOPT *NE '0') PARM((&SYSNAMOPT *EQ '0'))
             DEP        CTL(&STDOPT *NE '0') PARM((&LABEL     *EQ '0'))
             DEP        CTL(&STDOPT *EQ '2') PARM((&COMMENT   *EQ '0'))

             DEP        CTL(*ALWAYS) PARM((&MSGLVL *LE &SEVLVL))

Journalisée

Il y a 10 sortes de gens : Ceux qui comprennent le binaire et les autres ...
opicot
Néophyte
*
Hors ligne Hors ligne

Messages: 2

OS:
Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
Navigateur:
Chrome 14.0.835.202 Chrome 14.0.835.202


Voir le profil
« Répondre #6 le: 25 Octobre,2011, 14:33:24 »

Bonjour,

Merci de la qualité et célérité de votre réponse.
Nous cherchons en fait à savoir si ISeries avait encapsulé l'API QSQGNDDL en C ou dans des classes Java.
Nous aimerions, si cela était en java, pouvoir accéder au service utilisé par ISeries pour obtenir les scripts SQL de création de tables.
J'espère être assez clair.

En vous remerciant par avance.
Bien cordialement
Journalisée
Pages: [1]   Haut de page
  Imprimer  
 
Aller à:  


Propulsé par MySQL Propulsé par PHP Common France © 2008, 2009  
AS/400, AS400, iSeries, i5, Power i sont des marques déposées d'International Business Machines Corp.

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines
SMFAds for Free Forums
SMF customization services by 2by2host.com
XHTML 1.0 Transitionnel valide ! CSS valide !
reserved
SimplePortal 2.1.1