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

AS/400 Discussion :

problème de LIKE + param dans un query


Sujet :

AS/400

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut problème de LIKE + param dans un query
    Bonjour,

    J'ai le problème suivant:

    j'ai un sql de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NoArt, LibStd, LibLg
     FROM  ARTICL
     WHERE A.LibLg LIKE ?                                        
     AND   A.MclEdt LIKE ?
    Les variables sont assignées avec les valeurs suivantes:
    SQLC_LibStd = '%'
    SQLC_MclEdt = '%'


    J'utilise la commande suivante pour charger les paramètres ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXEC SQL Open wSqlCur  using :SQLC_LibStd ,
                                              :SQLC_MclEdt;

    le résultat de cette commande ne renvoie aucune erreur.
    Lors du fetch, aucun enregistement n'est renvoyé (pas normal).

    Prenons autre exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NoArt, LibStd, LibLg
     FROM  ARTICL
     WHERE A.LibLg LIKE ?
    La variable est assignée avec la valeurs suivante:
    SQLC_LibStd = '%'


    J'utilise la commande suivante pour charger les paramètres ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC SQL Open wSqlCur  using :SQLC_LibStd;
    le résultat de cette commande ne renvoie aucune erreur.
    Lors du fetch 3 enregistrements sont renvoyés (normal).

    Le problème est l'utilisation de plusieurs LIKE dans ce type de commande
    concernant l'exemple 1. Il ne supporte pas dès qu'il en a plusieurs.
    Par contre, si au lieu de LIKE, on met =, il renvoie des enregistrements.

    Y a-t'il une solution à ce problème très gênant ?

    Merci beaucoup.

  2. #2
    Membre expérimenté

    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
    Points : 1 578
    Points
    1 578
    Par défaut
    Peux-tu stp coller ici le coding du programme d'alimentation des deux zones de travail SQLC_LibStd et SQLC_MclEdt, ainsi que celui des opérations SQL depuis le DECLARE jusqu'au FETCH ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Hello,

    Voilà comment travaille le programme basiquement.
    Nous sommes en RPG ILE, mais nous pourrions aussi être en cobol, peu importe...
    Je passe la définition des zones en entrée.
    Impossible de mettre tout le programme en ligne.
    Ce qu'il faut savoir, c'est que les zones LibStd, LibLg sont de l'alpha.

    Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    wVLISqlStr = 
    'SELECT NoArt, LibStd, LibLg
    FROM ARTICL
    WHERE A.LibLg LIKE ? 
    AND A.MclEdt LIKE ?'; 
    
    SQLC_LibStd = '%';
    SQLC_MclEdt = '%';
    
                                                  
    EXEC SQL                                      
    Set Option                                    
        Naming    = *Sys,                         
        Commit    = *None,                        
        UsrPrf    = *User,                        
        DynUsrPrf = *User,                        
        Datfmt    = *iso,                         
        CloSqlCsr = *EndMod;                      
                                                  
    // declaration de l'instruction               
    EXEC SQL Prepare wSqlStatm from :wVLISqlStr;  
                                                  
    // declaration du curseur                     
    EXEC SQL Declare wSqlCur CURSOR FOR wSqlStatm;
    
    EXEC SQL Open wSqlCur  using :SQLC_LibStd ,
                                 :SQLC_MclEdt;
    
    EXEC SQL Fetch wSqlCur into                 
      :SqlR_L1NoArt, :SqlR_L1LibStd, :SqlR_LibLg

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    Est-il possible de faire un essai sans Prepare ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    SQLC_LibStd = '%';
    SQLC_MclEdt = '%';
    
    // declaration du curseur
    EXEC SQL Declare wSqlCur CURSOR FOR 
       SELECT NoArt, LibStd, LibLg
          FROM ARTICL
          WHERE A.LibLg LIKE :SQLC_LibStd 
          AND A.MclEdt LIKE :SQLC_MclEdt;
    
    EXEC SQL Open wSqlCur ;
    
    EXEC SQL Fetch wSqlCur into
    :SqlR_L1NoArt, :SqlR_L1LibStd, :SqlR_LibLg

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 55
    Points : 75
    Points
    75
    Par défaut
    SELECT NoArt, LibStd, LibLg
    FROM ARTICL
    WHERE A.LibLg LIKE ?
    AND A.MclEdt LIKE ?
    ARTICL.MCLEDT ou :MCLEDT ne serait elle pas de longueur variable ?

  6. #6
    Membre expérimenté

    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
    Points : 1 578
    Points
    1 578
    Par défaut
    Citation Envoyé par Pierre Quefer
    Je passe la définition des zones en entrée.
    Justement, ce sont ces définitions qui m'importent.

    Peut-on donc voir ici la définition (les spécifs D) des zones :
    • SQLC_LibStd
    • SQLC_MclEdt

    ainsi que le codage respectif de leur alimentation, signes "%" compris.

    Gracias.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Je vous donne le descriptif des zones impliquées.
    Le contenu des zones LIBLG, MCLEDT, c'est du texte tout simple: ABCDE
    Je n'ai pas le temps de faire un essai sans le PREPARE aujourd'hui, mais
    c'est une piste intéressante.
    Vos hypothèses pourraient être plausible.
    toutefois, si je remplace MclEdt LIKE ? par MclEdt = 'ABCDE',
    il me revoie l'enregistrement qui contient le string 'ABCDE',
    ce qui me fait dire qu'il n'aime pas les LIKE (AHAHAH !)

    Merci, j'essaie de faire sans le prepare demain, mais difficile de trouver du temps.
    Sinon, ce sera lundi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    0094.00 DwVLISqlStr       S            512             
    0095.00 DwVLIReaf         S              1N            
    0096.00 DwVLINoCour       S              5  0          
    0097.00 DwVLINbEnrPPag    S              5  0 Inz(18)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Zone       données      zone  tampon tampon           zone     colonne    
    NOART      CONDEN       6  0       4         1        E/S      N° ARTICLE 
      Texte descriptif de la zone . . . . . . . :  N° ARTICLE       
    LIBLG      ALPHA         100     100        64        E/S      TITRE LONG
      Texte descriptif de la zone . . . . . . . :  TITRE LONG                
      ID codé de jeu de caractères    . . . . . :    500                     
    MCLEDT     ALPHA           5       5       169        E/S      MOT CLE     
      Texte descriptif de la zone . . . . . . . :  MOT CLE   
      ID codé de jeu de caractères    . . . . . :    500

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    0094.00 DwVLISqlStr S 512
    0095.00 DwVLIReaf S 1N
    0096.00 DwVLINoCour S 5 0
    0097.00 DwVLINbEnrPPag S 5 0 Inz(18)
    Il n'y a pas les zones SQLC_LibStd et SQLC_MclEdt. Ce serait trés important de les avoir.

    Citation Envoyé par vazymimil Voir le message
    ARTICL.MCLEDT ou :MCLEDT ne serait elle pas de longueur variable ?
    Je pense que c'est la bonne piste ... mais à l'inverse.
    Je me suis déjà fait avoir avec les LIKE sur des zones définies sans VARYING .

    Dans la table, les colonnes LIBLG et MCLEDT sont définies respectivement en 100 A et 5 A.
    Je soupçonne que les variables programmes SQLC_LibStd et SQLC_MclEdt sont définies à l'identique. Donc non varying.
    Ce qui fait que le résultat des 2 lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQLC_LibStd = '%';
    SQLC_MclEdt = '%';
    SQLC_LibStd = '%___________________________________... ' ==> % suivi de 99 espaces
    SQLC_LibStd = '%____' ==> % suivi de 4 espaces

    Donc le LIKE recherche des champs contenant n'importe quoi (le %) suivi impérativement de 99 (ou 4) espaces.

    Une solution trés simple pour vérifier ça c'est de transformer ces 2 affectations en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQLC_LibStd = *ALL'%';
    SQLC_MclEdt = *ALL'%';
    Ou alors de préciser varying sur la définition de ces 2 variables

  9. #9
    Membre expérimenté

    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
    Points : 1 578
    Points
    1 578
    Par défaut
    C'est extraordinaire de ne pas pouvoir voir ici les spécifications D (les définitions) des zones SQLC_LibStd et SQLC_MclEdt.

    C'est pour t'aider Pierre que je te demande ça. Est-ce que je ne suis pas assez clair ou quoi ?

    Je ne comprends pas ce que tu veux nous indiquer avec ces 2 instructions :
    Les variables sont assignées avec les valeurs suivantes:
    SQLC_LibStd = '%'
    SQLC_MclEdt = '%'
    Tu recherches les caractères "%" dans les zones correspondantes de la table ARTICL ou quelque chose d'autre ?


    Pour récupérer tous les enregistrements de la table ARTICL qui contiennent la valeur "ABCDE" dans la colonne LIBLG, je définierais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D SQLC_LibStd     s            128a   varying
    D SQLC_MclEdt     s            128a   varying
    Le mot clé varying est très important ici. Il indique que la zone est de longueur varaible qui est automatiquement ajustée par le compilateur à la longueur de ce qu'on met dedans. Peu importe la longueur indiquée pourvu qu'elle soit au moins égale à la longueur maxi de la valeur qu'on va y mettre dedans + 2 caractères pour les "%".

    Ensuite, en mode free, j'écrierais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLC_LibStd = '%ABCDE%' ;
    Si la valeur "ABCDE" provient d'une autre zone, d'une saisie par exemple, je ferais un %trim() de cette zone pour la placer dans SQLC_LibStd de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLC_LibStd = '%' + %trim(zone) + '%';
    Puis, à l'open, effectivement, j'écrierais comme toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC SQL Open wSqlCur  using :SQLC_LibStd;
    Même traitement pour la zone SQLC_MclEdt s'il y a lieu.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Hello,

    Je vous remercie tous.

    Si j'ai demandé de l'aide, c'est que j'ai peu de temps pour résoudre ce
    problème.

    Il ne faut donc pas s'impatienter si je ne répond pas tout de suite.

    Un grand merci à ceux qui ont répondu.

    Les spécifications des zones sqlc_etc... découlent effectivement de leurs
    respectifs de la table ARTICL et n'ont pas de longueur variable.

    Le programme étant très conséquent (plus de 2500 lignes), je n'ai pas le temps de faire un test tout de suite.

    Je comprend bien le problème et vous donnerai des nouvelles lundi.


    On est en fin de mois, et les petits nains dans les machines disent:
    Ogué ogué, il y a le bouclement mensuel et nous voulons faire un festin de
    données mensuelles !!!

    A+

    Pierre Quefer

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Hello,

    finalement, les petits nains m'ont laissé tranquilles
    Et j'ai pu faire mes tests.

    La solution est effectivement de définir des zones à longueur
    variable, sans quoi des espaces viennent perturber la recherche.

    C'est très utile si on veut faire des recherches multicritères
    avec des LIKE sur des zones alpha.

    S'il s'agit de zones numériques sur une recherche d'un no fixe, on utilisera l'astuce

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WHERE NOART = 
    CASE ? 
    WHEN 0 THEN NOART
    ELSE ? 
    END
    ou ? est alimenté par SQLC_NOART

    Par contre si recherche avec LIKE sur une zone numérique, je suppose
    qu'on convertit tout en alpha et qu'on utilise la même méthode
    qu'avec des zones alpha.




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dww1 S 128 VARYING
    Dww2 S 128 VARYING
     
    ww1 = '%' + %trimr(SQLC_LibStd) + '%';
    ww2 = '%' + %trimr(SQLC_MclEdt) + '%';
     
    EXEC SQL Open wSqlCur using :ww1 ,
    :ww2;
    C'est absolument superbe et pourra être utilisé
    à l'infini.

    J'espère que cette petite discussion a été utilie à plein de monde.

    Merci infiniment à mes secourants.


    Pierre Quefer

  12. #12
    Membre expérimenté

    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
    Points : 1 578
    Points
    1 578
    Par défaut
    Tu aurais bien plus rapidement résolu ce pb si tu avais répondu tout simplement à mes premières demandes. Je me doutais bien, sans en être sûr évidemment, que l'erreur provenait de l'absence du mot clé "varying" car c'est une erreur très souvent rencontrée lorsqu'on parle du "LIKE" SQL.

    Citation Envoyé par Pierre Quefer
    J'espère que cette petite discussion a été utilie à plein de monde.
    Je pense que c'est surtout à toi qu'elle a été utile

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

Discussions similaires

  1. Problème avec like dans une requête SQL
    Par Boublou dans le forum SQL
    Réponses: 2
    Dernier message: 16/08/2007, 15h46
  2. envoyer null dans un Query.Param ?
    Par KRis dans le forum Bases de données
    Réponses: 10
    Dernier message: 13/04/2006, 16h54
  3. [VBA-E]problème de requete dans microsoft query
    Par isa21493 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/02/2006, 14h39
  4. [IB6] param NULL dans 1 query
    Par qi130 dans le forum InterBase
    Réponses: 2
    Dernier message: 04/04/2005, 13h57
  5. Réponses: 1
    Dernier message: 01/03/2005, 21h36

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