IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DB2 Discussion :

Comment écrire un SELECT dynamique en SQLRPG ?


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut Comment écrire un SELECT dynamique en SQLRPG ?
    Bonjour,

    Je réalise une sélection avec uniquement la clause WHERE qui change en fonction des informations saisies dans un écran. Ce qui me donne 22 possibilités de requêtes différentes aussi j'aimerai paramétrer cette requête or je travaille en RPG III et la requête fait plus de 256 caractères :

    texte de la requête non paramétrée:
    C/EXEC SQL
    C+ DECLARE CURSOR1 CURSOR FOR
    C+ SELECT
    C+ A.ENRPG,
    C+ A.RTOOL, VALUE(B.ITNBR,' '), VALUE(C.ITDSC,' '),
    C+ A.WKCTR, A.JJDPG, A.MMDPG,
    C+ A.AADPG, A.JJRPG, A.MMRPG,
    C+ A.AARPG, A.STPGM, A.USPGM,
    C+ VALUE(C.DNN,' '), VALUE(C.UDN,' '), VALUE(C.ENGNO,' '),
    C+ VALUE(C.UUCBIM,' '),VALUE(B.OPSEQ,' '),VALUE(B.OPDSC,' ')
    C+ FROM M6PGAMP A
    C+ LEFT OUTER JOIN ROUTNG B
    C+ ON A.RTOOL = B.RTOOL AND A.WKCTR = B.WKCTR
    C+ LEFT OUTER JOIN ITEMASA C
    C+ ON B.ITNBR = C.ITNBR
    C+ WHERE
    C+ A.WKCTR=:WKCTRE
    C+ ORDER BY
    C+ A.ENRPG DESC
    C/END-EXEC

    Tentative de paramétrage de la requête :
    Pour cela, j’ai créé un tableau en carte E avec le texte de la requête
    E TSQL 1 5 70

    Et une DS en carte I :
    IDSSQL DS
    I 1 70 DSSQL1
    I 71 140 DSSQL2
    I 141 210 DSSQL3
    I 211 280 DSSQL4
    I 281 350 DSSQL5
    I 351 420 DSSQL6

    Ce qui donne :
    C MOVE *BLANKS DSSQL
    C MOVELTSQL,1 DSSQL1 P
    C MOVELTSQL,2 DSSQL2 P
    C MOVELTSQL,3 DSSQL3 P
    C MOVELTSQL,4 DSSQL4 P
    C MOVELTSQL,5 DSSQL5 P
    C/EXEC SQL
    C+ PREPARE SQLSRC FROM :DSSQL
    C/END-EXEC
    C/EXEC SQL
    C+ DECLARE CURSOR200 CURSOR FOR SQLSRC
    C/END-EXEC

    Ce qui donne l’erreur de compilation :
    SQL0312 30 996 Position 30 Variable DSSQL non définie ou non utilisable.

    Comment puis-je préparer la requête ?

    Y a t’il quelqu’un qui saurait m’aider ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    1/ Cette pseudo instruction SQL (Declare ...) n'est pas une instruction SQL dynamique, tu ne fais que lui passer une variable (WKCTRE ) au niveau du WHERE qui provient d'une saisie. Tu peux donc écrire directement cette instruction comme suit dans le code de ton programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    C/EXEC SQL
    C+ DECLARE CURSOR1 CURSOR FOR 
    C+ ... 
    C+ WHERE
    C+ A.WKCTR=:WKCTRE 
    C+ ...
    C+ A.ENRPG DESC 
    /END-EXEC
    Tu n'as pas besoin de tableau ou de zone de travail pour le faire.

    2/ Convertis déjà ton RPG III archaïque en RPG IV avec la commande CVTRPGSRC et tu seras bien plus à l'aise pour coder. Plus de contrainte à la noix des 256 caractères, et bien d'autres choses encore bien plus agréables...

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Bonjour,

    proposition 1- c'est celle que j'avais mise en oeuvre, mais qui ne me convenait pas car j'avais 22 requêtes avec uniquement la clause where qui changeait

    proposition 2- je me suis lancée : j'ai converti le source et l'ai modifié. Maintenant que je ne récupère plus rien dans la liste résultat, j'aimerai débuger ce programme en SQLRPGLE !

    j'ai ajouté en carte h:
    HOPTION (*srcstmt: *nodebugio)
    HDFTACTGRP (*no)

    compilé avec l'option 14 et le paramètre DBGVIEW à *SOURCE

    comment lancer le débug ? ce programme attend des paramètres et j'aimerai appeler le CL et débuger le SQLRPGLE ?

    D'avance merci pour votre aide

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Par défaut
    Tu tapes STRDBG avec le nom de ton SQLRPGLE.
    Tu poses un point d'arrêt avec F6 ou tu veux et tu sors.
    tu lances ton CLP il va s'arrêter à ton point d'arrêt.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Merci

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Citation Envoyé par L6N2000
    proposition 1- c'est celle que j'avais mise en oeuvre, mais qui ne me convenait pas car j'avais 22 requêtes avec uniquement la clause where qui changeait
    Et bien, justement ! Si ce n'est que le prédicat WHERE qui change, je ne vois pas la raison de faire "du" SQL dynamique bien plus coûteux que le SQL statique.

    Citation Envoyé par L6N2000
    proposition 2- je me suis lancée...

    j'ai ajouté en carte h:
    HOPTION (*srcstmt: *nodebugio)
    HDFTACTGRP (*no)

    compilé avec l'option 14 et le paramètre DBGVIEW à *SOURCE
    Bravo, tu as très bien fait ! Tu vas voir, tu ne vas plus vouloir revenir au RPG III

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment créer un SELECT dynamiquement ?
    Par waxx59 dans le forum Doctrine2
    Réponses: 1
    Dernier message: 17/12/2012, 17h27
  2. Réponses: 10
    Dernier message: 13/09/2012, 12h04
  3. Comment écrire un SELECT avec 2 ou 3 conditions apres le WHERE ?
    Par pro.dotnet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2009, 22h01
  4. Réponses: 6
    Dernier message: 04/08/2007, 14h17
  5. Réponses: 2
    Dernier message: 20/12/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo