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

SAP Crystal Reports Discussion :

[CR 9]Traitement de requête sans résultat


Sujet :

SAP Crystal Reports

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut [CR 9]Traitement de requête sans résultat
    bonjour,

    je souhaiterais savoir si il existe un moyen de détecter si une requête ne renvoie aucun résultat car j'ai essayé la méthode suivant mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    local numbervar surface_etab;
    if ISNULL({METER_READING.MDMR_READ_VALUE}) then
        surface_etab:= {T_METER.MDMT_DEFAULT_VALUE}
    else if ISNULL ({METER_READING.MDMR_READ_VALUE}) And ISNULL ({T_METER.MDMT_DEFAULT_VALUE}) then 
        surface_etab:= -1
    else
        surface_etab:= {METER_READING.MDMR_READ_VALUE};
    En fait j'ai 2 champs possible pour ma donnée, une valeur par défaut et une valeur ponctuelle, je veux tester si la valeur ponctuelle (MDMR_READ_VALUE) contient une donnée et dans le cas contraire renvoyer la valeur par défaut, mais comme il se peut aussi que la valeur par défaut soit vide, je souhaiterais dans ce cas renseigner ma variable avec par exemple "-1".

    Comme la condition ci-dessus ne marche pas avez-vous une piste à me donner ?

    Merci d'avance

    Zyco

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Salut,
    je mettrais plutôt la condition la plus contraignante en premier, car sinon, si ta valeur MDMR_READ_VALUE est null, l'évaluation de ton else if ne sera jamais fait, même si MDMT_DEFAULT_VALUE est null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ISNULL ({METER_READING.MDMR_READ_VALUE}) And ISNULL ({T_METER.MDMT_DEFAULT_VALUE}) then 
    surface_etab:= -1
    Else If ISNULL({METER_READING.MDMR_READ_VALUE}) then
    surface_etab:= {T_METER.MDMT_DEFAULT_VALUE}
    Else surface_etab:= {METER_READING.MDMR_READ_VALUE};

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Bonjour Cirdek,

    merci pour le tuyau mais en fait mon pb est plus grave ! Je me permets de te l'exposer au cas où quelqu'un pourrais m'aider...

    je rappelle donc que j'ai 2 tables
    1. la table principale (compteurs) qui me renvoie les ID et la valeur par défaut
    2. une table "relevés de compteurs" qui contient l'ID, la date et la valeur du relevé...

    ce que je souhaiterais faire c'est que si ma table 2 ne contient aucun enregistrement (en gros pas de relevés compteur), je prend la valeur par défaut de la table 1.

    le soucis c que telle que ma requête de sélection est faite aujourd'hui, si j'ai pas d'enregistrement dans ma table 2, la requête ne renvoie aucun enregistrement et donc pas de valeur par défaut !

    voici la requête de mon expert selection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {T_METER.MDMT_CODE} like Left({?Pm-?Etab},3)+"-001" and
    {METER_READING.MDMR_DATE} in{@Date_Debut} to {@Date_Fin}
    ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT "T_METER"."MDMT_DEFAULT_VALUE", "T_METER"."MDMT_UNIT", "T_METER"."MDMT_CODE", "METER_READING"."MDMR_DATE"
    FROM  
    "COLLCG33"."T_METER" "T_METER", "COLLCG33"."METER_READING" "METER_READING"
     WHERE  ("T_METER"."MDMT_CODE"="METER_READING"."MDMR_METER") AND "T_METER"."MDMT_CODE" LIKE '010-001' AND ("METER_READING"."MDMR_DATE">=TO_DATE ('01-02-2008 00:00:00', 'DD-MM-YYYY HH24:MI:SS') AND "METER_READING"."MDMR_DATE"<TO_DATE ('01-03-2008 00:00:00', 'DD-MM-YYYY HH24:MI:SS'))
    Avez-vous une idée de ce que je dois faire pour faire en sorte d'obtenir ma valeur par défaut dans le cas où il n'y aurait pas d'enregistrements dans la table des relevés ?

    en espérant avoir été suffisamment limpide dans mes explications...

    Merci d'avance

    Zyco

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Salut,
    ta requête me semble bizarre, tu as 2 tables sans JOIN et le lien entre les tables est dans ton WHERE. As-tu fait ta liason avec l'expert ?
    Essaye plutôt comme requête (syntaxe à vérifier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tes champs
    FROM T_METER LEFT JOIN METER_READING ON {T_METER.MDMT_CODE}={METER_READING.MDMR_METER} 
    WHERE {T_METER.MDMT_CODE} LIKE LEFT({?Pm-?Etab},3)+"-001" AND
    {METER_READING.MDMR_DATE} IN{@Date_Debut} TO {@Date_Fin}
    Ainsi tu aura tous les enregistrements de ta table 1 même si il n'y a rien dans la table 2, tous les champs de la table 2 qui sont dans le SELECT seront à NULL
    Ensuite il restera à faire des tests avec un CASE dans ton SELECT pour donner une valeur ou une autre selon que le champ soit NULL ou pas.
    Autre chose: je ne comprend pas pourquoi un LIKE à la place du =, tu n'utilise pas de caractères génériques comme * pourtant ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    merci pour ces précisions, j'ai créé une commande SQL pour définir ma requête avec la jointure gauche, toutefois comme j'utilise le passage de paramètres entre les états (ex pour {?Pm-?Etab} et surtout pour la définition de la plage des dates {@Date_Debut} et {@Date_Fin} sont des champs de formule) je ne sais pas comment les traiter autrement que via la selection d'enregistrements dans laquelle l'utilisation de CASE LOGIC est visiblement impossible.

    dois-je chercher du côté des champs expressions SQL ou existe-t-il un autre moyen d'arriver à mes fins,

    je continue de chercher, si vous pouvez me mettre sur la voie je serais ravi.

    Zyco

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    j'ai tenté avec la requête suivante dans une commande SQL, mais j'obtiens une erreur de syntaxe (ORA-00923: Mot-clé FROM absent à l'emplacement prévu)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    T_METER.MDMT_CODE,
    T_METER.MDMT_DEFAULT_VALUE,
    T_METER.MDMT_UNIT,
    METER_READING.MDMR_READ_VALUE,
    (CASE METER_READING.MDMR_READ_VALUE 
        WHEN NULL THEN 'indefini' 
      END)
    METER_READING.MDMR_DATE
    FROM COLLCG33.T_METER
    LEFT JOIN COLLCG33.METER_READING ON T_METER.MDMT_CODE=METER_READING.MDMR_METER
    de plus je ne sais pas si c'est la bonne méthode pour arriver à mon résultat

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Salut,
    Je ne sais pas si ca peut être la source de ton message d'erreur, mais il manque une virgule après ton "END)"
    Ne pas oublier de mette un ELSE dans ton CASE pour définir quoi faire si le champ n'est pas NULL

    Sinon dans CR tu n'es pas obligé de monter toi même ta requête SQL, si tes tables et tes liaisons sont bien faites (c'est à dire ta jointure gauche, ce qui peut se faire avec l'assistant sans avoir à écrire de code SQL). Ensuite tu crée une formule @MDMR_Formaté qui reprend le code de mon premier post, et c'est @MDMR_Formaté qu'il te faut faire afficher dans ton rapport et non MDMR_READ_VALUE

  8. #8
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 202
    Points : 258
    Points
    258
    Par défaut
    Bonjour,
    pour votre commande SQL, il faut utiliser:

    nvl(METER_READING.MDMR_READ_VALUE,'indefini')

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    encore merci !

    la fonction nvl semble mieux fonctionner que le CASE (tout au moins elle ne renvoie pas d'erreur), cependant mon problème persiste toujours, dés que j'ajoute le critère de date, même avec jointure, dans mon expert selection je n'ai plus aucun résultat (alors que ça fonctionne si j'ai bien des enregistrements dans ma table relevés - METER_READING).

    là franchement je bloque....

  10. #10
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 202
    Points : 258
    Points
    258
    Par défaut
    Le fait qu'il y ait un filtre sur les date fait que la requete se comporte comme si vous avez fait une jointure normale ( alors que vous auriez voulu une jointure gauche ).


    Au lieu de :
    AND {METER_READING.MDMR_DATE} IN{@Date_Debut} TO {@Date_Fin}

    Essayez:

    AND (IF NOT ISNULL({METER_READING.MDMR_DATE}) THEN ({METER_READING.MDMR_DATE} IN{@Date_Debut} TO {@Date_Fin}) ELSE TRUE)

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Bonjour et merci bcp "GaelleH" pour votre requete qui m'a permis de résoudre mon problème, couplée à une formule me permettant de choisir la valeur à renvoyer.

    j'avais essayé d'intégrer une structure conditionnelle dans mon éditeur de sélection mais n'avait obtenu que des erreurs, certainement un probleme de syntaxe.

    Encore merci à vous et au forum developpez, j'attends encore qq jours avant de clore, on n'est jamais trop prudents !!!

    Zyco

Discussions similaires

  1. [postgresql] Requête sans résultat
    Par speedev dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 08/11/2007, 15h01
  2. retourner zero sur une requète sans résultat
    Par kelek33 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/10/2007, 17h27
  3. Problème : requêtes sans résultat
    Par cirtey dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/05/2007, 20h43
  4. Requête sans résultat
    Par lito74 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/09/2006, 16h16
  5. RecordSource avec une requête sans résultat
    Par temar dans le forum Access
    Réponses: 4
    Dernier message: 23/05/2006, 19h13

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