Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1 2
Bonjour à tous
Alors voilà.
J'ai une Datawindow principale (Composite) qui comprend plusieurs Report avec un cadre (Box).
Pour certains report, il se peut que leur requête ne ramène aucune ligne -- Leur rowcount est donc à 0.
Dans ce cas là, dans la datawindow principale, le report ramenant aucune ligne, n'est pas visible, il n'y a même pas son cadre.
Or j'aimerai d'une part que le report soir visible (que l'on voit le cadre) dans le cas où il ne ramène aucune ligne, et faire apparaître un message du type "Aucun domaine disponible",
La solution que j'ai trouvé, c'est de modifier dans le report la requête pour que celle-ci me ramène toujours au moins une ligne:
J'ai rajouté à ma requête un UNION SELECT NULL , 1 FROM DUAL
(il y a 2 champs dans ma requête d'origine)
Comme ça, j'ai toujours au moins une ligne en retour.
Et dans le report, j'ai ajouté un champs Computed field contenant le texte "Aucun Domaine diponible" qui sera affiché si je n'ai qu'une seule ligne avec NULL dans le premier champs et j'ai un champs Domaine qui sera affiché autant de fois qu'il y aura de domaines en retour de la requête (Je joue avec la propriété Visible)
ça fonctionne très bien: J'ai soit ma liste de domaines avec un cadre autour du report, soit j'ai mon message "Aucun domaine disponible" avec le cadre autour du report. Le report est dans tous les cas visible.
Seulement si ma datawiondow principale ramène plusieurs lignes (ou fiches), j'ai des décalages ou des superpositions de zones à partir de la deuxième fiche de la datawindow principale. Le cadre du report des domaines s'agrandit bizarement. Enfin, ça fout le bordel dans certains cas. Et c'est bien du à ma modification de requête dans le report.
Bref., ma question n'est pas de savoir pourquoi ça fait ça, mais plutôt ma question serait de savoir si vous aviez une autre idée pour que mon report reste visible (avec son cadre) même si la requête n'apporte aucune ligne.
J'espère avoir été assez clair.
Merci à vous..
Kalini
Hors ligne
tu peux aussi faire un decode dans ta requête pour que ca te ramène quelque chose quand le rowcount est égal à zéro
Hors ligne
thezerg a écrit:
tu peux aussi faire un decode dans ta requête pour que ca te ramène quelque chose quand le rowcount est égal à zéro
C'est à dire, qu'appelles tu un "decode" ?
Tu peux me donner un exemple ?
merci
Dernière modification par Kalini (09-02-2007 14:10:54)
Hors ligne
Select decode(count(*), 0, 0, 1)
Ceci te ramène 0 si la valeur retournée est 0 sinon on retourne 1.J'espère être clair, sinon je te ferai un autre exemple
Hors ligne
thezerg a écrit:
Code:
Select decode(count(*), 0, 0, 1)
NB : si DECODE() existe dans ton SGBDR (Oracle) sinon CASE WHEN ou autres
Sinon rajouter une couche avec un DW composite "container" qui contient le report et qui affiche le message "Aucun domaine disponible" le cas échéant
Hors ligne
thezerg a écrit:
Code:
Select decode(count(*), 0, 0, 1)Ceci te ramène 0 si la valeur retournée est 0 sinon on retourne 1.J'espère être clair, sinon je te ferai un autre exemple
Alors, le decode a l'air d'exister, car si j'exécute la requête suivante,
SELECT decode(count(*), 0, 0, 1) WHERE "AA_ZONE_ACTION"."PK_ASSOCIATION" = 7258;
ça me ramène 1
Mais par contre, dans mon report, ma requête est la suivante :
SELECT AA_ZONE_ACTION.PK_QUARTIER,
AA_ZONE_ACTION.PK_ASSOCIATION
FROM AA_ZONE_ACTION
WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association
Comment dois-je utiliser le decode ? Comment dois-je faire ma requête avec le decode ?
Hors ligne
eRaSorZ a écrit:
NB : si DECODE() existe dans ton SGBDR (Oracle) sinon CASE WHEN ou autres
Sinon rajouter une couche avec un DW composite "container" qui contient le report et qui affiche le message "Aucun domaine disponible" le cas échéant
OK pour le deuxième cas. Je pense comprendre ce que tu veux dire. Mettre, dans la DW principale, un report qui contient le message "Aucun domaine ..." et le report où il y a ma requête des domaines.
C'est bien ça ?
Mais je ne vois pas de composite "container" ? Tu trouves ça où ?
Je suis en PB 8 ?
Hors ligne
avec le decode sinon ca doit donner ca :
SELECT AA_ZONE_ACTION.PK_QUARTIER, decode(count(*),0,'Aucun domaine'), AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association group by AA_ZONE_ACTION.PK_QUARTIER
Hors ligne
Kalini a écrit:
OK pour le deuxième cas. Je pense comprendre ce que tu veux dire. Mettre, dans la DW principale, un report qui contient le message "Aucun domaine ..." et le report où il y a ma requête des domaines.
C'est bien ça ?
:yes:
Kalini a écrit:
Mais je ne vois pas de composite "container" ? Tu trouves ça où ?
Je suis en PB 8 ?
en fait oublie composite"container", c'est juste une DW tabular (p.ex) avec le count(*) tu mets ton report en faisant passer ton argument :an_association + un compute qui affiche le message "aucun domaine" selon le nb de lignes retournées
j'ma ben fait comprendre ?
Hors ligne
thezerg a écrit:
avec le decode sinon ca doit donner ca :
Code:
SELECT AA_ZONE_ACTION.PK_QUARTIER, decode(count(*),0,'Aucun domaine'), AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association group by AA_ZONE_ACTION.PK_QUARTIER
t'es sur de toi thezerg ?
je sens un AA_ZONE_ACTION.PK_ASSOCIATION n'est pas une expression GROUP BY...
Hors ligne
autant pour moi
SELECT AA_ZONE_ACTION.PK_QUARTIER, decode(count(*),0,'Aucun domaine'), AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association group by AA_ZONE_ACTION.PK_QUARTIER, AA_ZONE_ACTION.PK_ASSOCIATION
Hors ligne
thezerg a écrit:
autant pour moi
Code:
SELECT AA_ZONE_ACTION.PK_QUARTIER, decode(count(*),0,'Aucun domaine'), AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association group by AA_ZONE_ACTION.PK_QUARTIER, AA_ZONE_ACTION.PK_ASSOCIATION
en fait, je crois que ça ne te renvoie aucune ligne si le where n'est pas vérifié...
Hors ligne
En effet c'est pas faux... je refléchi à autre chose alors
Hors ligne
eRaSorZ a écrit:
thezerg a écrit:
autant pour moi
Code:
SELECT AA_ZONE_ACTION.PK_QUARTIER, decode(count(*),0,'Aucun domaine'), AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association group by AA_ZONE_ACTION.PK_QUARTIER, AA_ZONE_ACTION.PK_ASSOCIATIONen fait, je crois que ça ne te renvoie aucune ligne si le where n'est pas vérifié...
Effectivement, j'ai testé, si le where n'est pas vérifié, je n'ai aucune ligne en retour, donc, on en revient au départ.
eRaSorZ a écrit:
en fait oublie composite"container", c'est juste une DW tabular (p.ex) avec le count(*) tu mets ton report en faisant passer ton argument :an_association + un compute qui affiche le message "aucun domaine" selon le nb de lignes retournées
j'ma ben fait comprendre ?
Pour la solution de eRaSorz, j'ai une petite question :
Comment récupérer dans le premier report où il y a le message "Aucun domaine..", le nombre de lignes du dernier report (celui contenant la requête des domaines) ?
Hors ligne
dans ta proc, tu ne peux pas faire des tests ?
genre
SELECT @nb_lignes = count(*) FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association if @nb_lignes > 0 SELECT AA_ZONE_ACTION.PK_QUARTIER, AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association else SELECT "VIDE", "VIDE"
un truc de ce genre quoi...
Hors ligne
pick ouic a écrit:
dans ta proc, tu ne peux pas faire des tests ?
genre
SELECT @nb_lignes = count(*)
FROM AA_ZONE_ACTION
WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association
if @nb_lignes > 0
SELECT AA_ZONE_ACTION.PK_QUARTIER,
AA_ZONE_ACTION.PK_ASSOCIATION
FROM AA_ZONE_ACTION
WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association
else
SELECT "VIDE",
"VIDE"
un truc de ce genre quoi...
Alors, en fait, il n'y a pas de procédure stockée.
Tout se fait via PB..
Dernière modification par Kalini (09-02-2007 16:08:58)
Hors ligne
Kalini a écrit:
Pour la solution de eRaSorz, j'ai une petite question :
Comment récupérer dans le premier report où il y a le message "Aucun domaine..", le nombre de lignes du dernier report (celui contenant la requête des domaines) ?
en fait c'est un peu tiré par les cheveux car il faudrait pouvoir faire un "d_report.rowcount()" mais je ne sais pas comment dans une expression de compute ? (si qq'un sait je suis prenneur... )
donc la fin justifiant les moyens tu fais un tabular avec un count(*) et le même where... et tu colles ton report dedans...
( en plus niveau optimisation c'est pas le top vu que la requête est exécutée deux fois... )
mieux en SQL avec juste un report:
SELECT 0 AS VISIBLE, COUNT(*) AS NB, '' AS PK_QUARTIER, '' AS PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association UNION SELECT 1 AS VISIBLE, 0 AS NB, AA_ZONE_ACTION.PK_QUARTIER AS PK_QUARTIER,AA_ZONE_ACTION.PK_ASSOCIATION AS PK_ASSOCIATION FROM ENTETE_OP WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association
soit tu n'as pas de données => une seule ligne dans la datawindow , facile à tester pour le message
soit tu as n données => n+1 lignes dans la datawindow, ne pas afficher la ligne avec le count(*)
(la requête est aussi exécutée deux fois... )
Hors ligne
eRaSorZ a écrit:
en fait c'est un peu tiré par les cheveux car il faudrait pouvoir faire un "d_report.rowcount()" mais je ne sais pas comment dans une expression de compute ? (si qq'un sait je suis prenneur... )
donc la fin justifiant les moyens tu fais un tabular avec un count(*) et le même where... et tu colles ton report dedans...
( en plus niveau optimisation c'est pas le top vu que la requête est exécutée deux fois... )
C'est exactement ça que j'aimerai faire, tout à fait. Dans un computed field, récupérer le rowcount du report. Or, ça ne fonctionne pas en mettant le nom du report devant le rowcount.
eRaSorZ a écrit:
mieux en SQL avec juste un report:
Code:
SELECT 0 AS VISIBLE, COUNT(*) AS NB, 'Aucun domaine' AS PK_QUARTIER, '' AS PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association UNION SELECT 1 AS VISIBLE, 0 AS NB, AA_ZONE_ACTION.PK_QUARTIER AS PK_QUARTIER,AA_ZONE_ACTION.PK_ASSOCIATION AS PK_ASSOCIATION FROM ENTETE_OP WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_associationsoit tu n'as pas de données => une seule ligne dans la datawindow , facile à tester pour le message
soit tu as n données => n+1 lignes dans la datawindow, ne pas afficher la ligne avec le count(*)
(la requête est aussi exécutée deux fois... )
Je vais essayé ça, mais c'est vrai qu'une requête exécutée 2 fois, c'est pas le top. Surtout que le report sera lancé autant de fois qu'il y aura de lignes dans la DW principale, c'est à dire + de 3000 fois .. donc * 2 = + de 6000 fois..
Hors ligne
tiens, voici ma requete...
SELECT QUARTIER = AA_ZONE_ACTION.PK_QUARTIER, ASSOCIATION = AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association UNION SELECT QUARTIER = "Aucun Domaine", ASSOCIATION = "Aucun Domaine" FROM AA_ZONE_ACTION WHERE 1 = 1 AND (SELECT count(*) FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association) = 0
Hors ligne
pick ouic a écrit:
Code:
SELECT QUARTIER = AA_ZONE_ACTION.PK_QUARTIER, ASSOCIATION = AA_ZONE_ACTION.PK_ASSOCIATION FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association UNION SELECT QUARTIER = "Aucun Domaine", ASSOCIATION = "Aucun Domaine" FROM AA_ZONE_ACTION WHERE 1 = 1 AND (SELECT count(*) FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association) = 0
Pick je ne te félicite pas pour cette requête...
quand count(*)=0 la deuxième partie de la requête (après UNION) renverra autant de lignes que la table AA_ZONE_ACTION (utilise plutot DUAL)
d'ailleurs pourquoi "1 = 1 AND" ??
<maitre capelloracle>
si c'est Oracle : QUARTIER = AA_ZONE_ACTION.PK_QUARTIER renvoie une erreur...
"Aucun Domaine" : aussi, (entre guillemets=nom de colonne, il faut utiliser les quotes pour les chaines...)
</maitre capelloracle>
Hors ligne
j'ai testé ca sous sqlanywhere, et ca fonctionne bien.
apres, il faut adapter et optimiser suivant la base...
Belle reactivité
Hors ligne
pick ouic a écrit:
j'ai testé ca sous sqlanywhere, et ca fonctionne bien.
apres, il faut adapter et optimiser suivant la base...
Belle reactivité
Salut à tous les 2.
Me revoila.
Tout d'abord, merci déjà de prendre sr votre temps poir chercher avec moi.
Donc, je vais essayer cette requête tout de suite et je vous tiens au courant..
A tout à l'heure.
Kalini
Hors ligne
Alors ?????
T'en es ou ?
Hors ligne
Salut..
Désolé, j'étais pris par un autre soucis et j'arrive enfin à finir mon état.. Ouf.
Alors, pour en revenir à la requête ci-dessus, je l'ai donc testé en l'adaptant un peu:
SELECT AA_ZONE_ACTION.PK_QUARTIER AS QUARTIER AA_ZONE_ACTION.PK_ASSOCIATION AS ASSOCIATION ' ' AS MESSAGEINFO FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association UNION SELECT ' ' AS QUARTIER, 0 AS ASSOCIATION, ' AUCUN QUARTIER DISPONIBLE' AS MESSAGEINFO FROM AA_ZONE_ACTION WHERE 1 = 1 AND (SELECT count(*) FROM AA_ZONE_ACTION WHERE AA_ZONE_ACTION.PK_ASSOCIATION = :an_association) = 0
La requête fonctionnait parfaitement bien. (je rappelle que c'est une requête écrite directement dans la DW, et nondans une Procédure stockée). J'ai joué avec la propriété visible des champs pour les faire apparaître ou non. (MESSAGEINFO était visible quand il ASSOCIATION = 0 etc..)
Bref, j'avais toujours mon report qui apparaîssait avec soit une ligne contenant le message d'info ou alors plusieurs lignes avec mes quartiers.
Seulement, j'avais toujours des décalages de report suivants qui apparaissaient dans certains cas.
C'est cet UNION que PB a du mal à gérer quand on affiche plusieurs report dans une DW contenant plusieus lignes... Enfin, assez difficile à cerner..
Donc, il a fallu par n'importe quel moyen trouver une requête qui donne le même résultat mais ne contenant pas d'UNION .
Et la voici grâce à votre DECODE donné plus haut, j'ai fait ceci:
SELECT AA_ZONE_ACTION.PK_QUARTIER AS QUARTIER, AA_ZONE_ACTION.PK_ASSOCIATION AS ASSOCIATION, DECODE(AA_ZONE_ACTION.PK_ASSOCIATION,NULL,'AUCUN QUARTIER DISPONIBLE','') AS MESSAGEINFO FROM AA_ASSOCIATION, AA_ZONE_ACTION WHERE AA_ASSOCIATION.PK_ASSOCIATION = AA_ZONE_ACTION.PK_ASSOCIATION (+) AND AA_ASSOCIATION.PK_ASSOCIATION = :an_association
Donc, dans un cas, j'ai la jointure qui se fait, et donc PK_ASSOCIATION de la table AA_ZONE_ACTION qui n'est pas nul. Le MESSAGEINFO sera alors NULL. Et dans l'autre cas, je n'ai pas de jointure, mais j'ai quand même une ligne en sortie, celle de la table AA_ASSOCIATION. Dans ce cas, le MESSAGEINFO prend pour valeur le message d'avertissement.
Je joue ensuite sur la propriété visible des champs pour les faire apparaître ou non (si le message est null ou i le message est renseigné)
Voila
ça fonctionne super bien, je n'ai plus d'UNION, et plus de décalage..
Après peut-être que ce "bug" n'existe pas dans les versions plus récentes de PB..
En tout cas, merci beaucoup à vous 2, car c'est grâce à vous si j'ai avancé..
Kalini
PS: j'espère avoir été assez clair dans mes explications..
Dernière modification par Kalini (14-02-2007 16:50:17)
Hors ligne
on etait 3...
ok, tout est résolu alors
Hors ligne
Pages: 1 2