Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
bonjour !
alors ... j'ai un soucis (oui forcément, vous me direz ...)
je vais faire de mon mieux pour expliquer ça ...
en gros dans ma dw j'ai un tableau qui doit se composer comme ceci :
1ere colonne : contient la liste des etapes d'un processus dont la partie finale (enfin plus ou moins) se deroulera un jour J.
colonnes 2 à n : correspondent aux jours entre la premiere etape et ce jour J.
j'ai les données suivantes à ma disposition :
- la liste des étapes (ça ça pose pas de probleme, il y a un nombre d'enregistrements fixe, tout va bien)
- les délais entre les etapes ... en gros , par exemple 3 jours entre l'etape 1 et l'etape 2, 5 jours entre l'etape 2 et l'etape 3, etc ....
le tableau, en gros se presenterait comme ceci (euh je pense qu'il faut mettre la fenetre en grand pour visualiser, là):
Etape : J - 12 : J - 11 : J - 10 :[etc etc ... ]: J -1 : J : J + 1 : J + 2 (oui parce qu'une étape doit se derouler après le jour J)
etape 1 : X
etape 2 : X
etape 3 : X
etape ... : X
etc etc .... (y'a 8 etapes)
bref mon soucis c'est de pouvoir creer ces colonnes "J - n" et "J + n"
voilà .... le but du jeu est de montrer les espacements entre les étapes, en jour.
donc du coup je dois creer ces colonnes en fonction des delais que j'ai, et j'avoe avoir un peu de mal ...
j'ai essayé de comprendre le dw_1.modify(create column etc ...), mais j'ai du mal ...
alors je sais pas, quelqu'un pourrait m'eclairer ici, peut-etre ?
merci d'avance
Hors ligne
Bonjour,
J'ai lu en diagonale. Mais, il me semble que pour réaliser ce type de présentation la datawindow crosstab soit particulièrement adapté à ton problème.
Avec la crosstab, les colonnes sont construites dynamiquement en fonction des données disponibles.
Il te faudra peut-être retravailler tes données pour les injecter dans une table temporaire pour construire le crosstab et obtenir le résultat escompté.
Hors ligne
oui j'ai tenté ça avant d'ecrire ce sujet, mais c'est assez compliqué à utiliser les crosstab, et je me disais qu'une solution plus simple serait p't'etre pas plus mal ...
en fait je me demande si je vais pas ne pas passer par une dw ...
Hors ligne
ben147 a écrit:
en fait je me demande si je vais pas ne pas passer par une dw ...
la douleur t'égare, cher ami
Hors ligne
ça doit etre ça !
non mais normalement je dois rendre ce truc ce soir, alors plus la journée avance, plus j'ai du mal à réfléchir ...
bon bon je vais re-essayer une dw crosstab ... au secours ...
Hors ligne
Je pense que c'est assez simple avec un crosstab. Avec une requête renvoyant ces données par exemple :
ID_ETAPE DATE_ETAPE
1 08/02/2009
2 10/02/2009
3 11/02/2009
4 11/02/2009
5 12/02/2009
6 13/02/2009
7 14/02/2009
8 15/02/2009
un DW crosstab avec la même requête + la valeur 1 et deux arguments dates début et fin :
SELECT ID_ETAPE,DATE_ETAPE,1 AS NB FROM PLANNING WHERE DATE_ETAPE BETWEEN :DATE_DEBUT AND :DATE_FIN
et cette structure :
on obtient, brut de coffrage :
Ensuite tu peux colorier,encadrer,etc la cellule en fonction de la valeur.
Et peut-être arranger la requête pour avoir aussi des valeurs 0 les jours vides si tu veux les afficher (par exemple sur une étape 0 qui sera masquée)
Hors ligne
ah oui effectivement y'a p't'etre moyen de faire quelque chose, là .... je viens de faire un essai avec un truc dans le genre et ça me semble pas trop mal à part quelques bricoles .... merci beaucoup !!!
j'crois qu'on peut considerer le probleme résolu.
Hors ligne
bon .... euh .... pardon ....
en fait j'ai encore un p'tit soucis ... j'ai bien réussi à faire un tableau avec les etapes et les dates et tout ... sauf que voilà ...
mon chef voudrait qu'on mette les jours sans etape egalement , intercalés entre les jours des etapes .... et là, je bloque .... j'ai demandé autour de moi, on voit pas trop comment faire ...
on m'a parlé de cette fonction sinon : f_creersyntaxedsanalysemet
bon là j'crois que c'est mort pour ce soir
Hors ligne
ben147 a écrit:
mon chef voudrait qu'on mette les jours sans etape egalement , intercalés entre les jours des etapes .... et là, je bloque
c'est ce que je prévoyais :
erasorz a écrit:
Et peut-être arranger la requête pour avoir aussi des valeurs 0 les jours vides si tu veux les afficher (par exemple sur une étape 0 qui sera masquée)
pas de méthode directe, il faut avoir une table avec toutes les dates, ou alors mieux sous Oracle avec les pipelines :
CREATE OR REPLACE TYPE T_DATE AS TABLE OF DATE; CREATE OR REPLACE FUNCTION F_CALENDRIER(DATE_DEBUT DATE, DATE_FIN DATE) RETURN T_DATE PIPELINED IS BEGIN FOR I IN 0..DATE_FIN - DATE_DEBUT LOOP PIPE ROW( DATE_DEBUT + I ); END LOOP; RETURN ; END ;
grâce à ça, la requête suivante te renverra toutes les jours entre deux date données :
SELECT * FROM TABLE( F_CALENDRIER( debut , fin ) )
donc en joignant ça avec l'autre requête :
SELECT ID_ETAPE AS ID_ETAPE, TO_CHAR(DATE_ETAPE,'DD/MM/YYYY') AS DATE_ETAPE, 1 AS NB FROM PLANNING WHERE DATE_ETAPE BETWEEN SYSDATE - 6 AND SYSDATE + 4 UNION SELECT 0 AS ID_ETAPE, TO_CHAR( COLUMN_VALUE, 'DD/MM/YYYY') AS DATE_ETAPE, 0 AS NB FROM TABLE( F_CALENDRIER( SYSDATE - 6, SYSDATE + 4 ) )
on obtient les données suivantes :
ID_ETAPE DATE_ETAPE NB
0 08/02/2009 0
0 09/02/2009 0
0 10/02/2009 0
0 11/02/2009 0
0 12/02/2009 0
0 13/02/2009 0
0 14/02/2009 0
0 15/02/2009 0
0 16/02/2009 0
0 17/02/2009 0
0 18/02/2009 0
1 08/02/2009 1
2 10/02/2009 1
3 11/02/2009 1
4 11/02/2009 1
5 12/02/2009 1
6 13/02/2009 1
7 14/02/2009 1
8 15/02/2009 1
en modifiant dans le crosstab, et on obtient, tada :
y'a plus qu'à arranger un peu et c'est dans la poche
Hors ligne
pfiou ... bon déjà merci de te pencher sur mon probleme aussi serieusement ...
ta solution, alors, elle implique de passer par une procédure stockée, non ? pas moyen de faire ça direct derrière la dw ?
pis je suis sous sybase pas oracle, alors j'sais pas trop si ça va marcher ...
là pour l'instant j'arrive à ça :
les etapes en fait , sont appelées jalon ... et c'est pas vraiment des dates mais des "J - ..." ... mais bon ça change pas grand chose ...
la requete que j'ai derrière :
SELECT jaloncaloffrepdvgen_t.jalon_id, jaloncaloffrepdvgen_t.jalongen_delai as delai_n, case when jaloncaloffrepdvgen_t.jalon_id = 7 then 'J' when jaloncaloffrepdvgen_t.jalon_id < 7 then 'J-' + convert (varchar(3), jaloncaloffrepdvgen_t.jalongen_delai) when jaloncaloffrepdvgen_t.jalon_id > 7 then 'J+' + convert (varchar(3), jaloncaloffrepdvgen_t.jalongen_delai) end as delai, 1 as NB FROM jaloncaloffrepdvgen_t where calgen_id = :al_calgen_id
et la crosstab :
voilà ou j'en suis ... je suis pas sur de pouvoir utiliser ta solution pour les trucs intercalés, du coup ... peut-etre que je devrais tout repenser ?
Hors ligne
ben147 a écrit:
pis je suis sous sybase pas oracle, alors j'sais pas trop si ça va marcher ...
voilà ou j'en suis ... je suis pas sur de pouvoir utiliser ta solution pour les trucs intercalés, du coup ... peut-etre que je devrais tout repenser ?
Je ne sais pas si tu peux trouver une solution "élégante" en Sybase, dans ce cas :
erasorz a écrit:
il faut avoir une table avec toutes les dates,
et ajouter la requête union comme je l'ai fait pour avoir tous les jours
ben147 a écrit:
pas moyen de faire ça direct derrière la dw ?
ou alors ajouter à la DW par le code PB les données manquantes, mais ça sera beaucoup plus lourd
Hors ligne
wahlàlà le stress ... en plus quand je bloque trop longtemps sur un truc je panique un peu et j'ai du mal à réfléchir ...
bon ... je vais essayer de reprendre à zéro, p't'etre en passant par du code pb ... merci en tout cas erasorz, c'est sympa, franchement.
Hors ligne
ben147 a écrit:
je vais essayer de reprendre à zéro, p't'etre en passant par du code pb
bah, pas la peine de reprendre à zéro... et si tu peux éviter du code PB supplémentaire c'est mieux
il suffit de créer une table CALENDRIER avec un champ date DATE_JOUR, d'y insérer tous les jours de l'année et d'ajouter ce qu'il faut dans ta requête.
NB1 : en regardant la requête, je vois que tu as toujours jour=J pour jalon=7 (?)
NB2 : en principe il ne devrait pas avoir jalon_id dans columns :
Hors ligne
erasorz a écrit:
bah, pas la peine de reprendre à zéro... et si tu peux éviter du code PB supplémentaire c'est mieux
il suffit de créer une table CALENDRIER avec un champ date DATE_JOUR, d'y insérer tous les jours de l'année et d'ajouter ce qu'il faut dans ta requête.
le truc c'est que je dois pas prendre en compte une date réelle ... c'est un truc générique en fait ... donc il faut se baser sur le jour J, et les differents jalons, les delais sont en fonction de ce jour J.
erasorz a écrit:
NB1 : en regardant la requête, je vois que tu as toujours jour=J pour jalon=7 (?)
oui effectivement le jour J correspond au 7eme jalon ... les délais pour les 6 jalons précédents sont à soustraire à J, et pour le 8 eme jalon il faut ajouter le delais ... enfin bon ...
Hors ligne
et en version hard-codée dans la requête :
SELECT jaloncaloffrepdvgen_t.jalon_id, jaloncaloffrepdvgen_t.jalongen_delai as delai_n, case when jaloncaloffrepdvgen_t.jalon_id = 7 then 'J' when jaloncaloffrepdvgen_t.jalon_id < 7 then 'J-' + convert (varchar(3), jaloncaloffrepdvgen_t.jalongen_delai) when jaloncaloffrepdvgen_t.jalon_id > 7 then 'J+' + convert (varchar(3), jaloncaloffrepdvgen_t.jalongen_delai) end as delai, 1 as NB FROM jaloncaloffrepdvgen_t where calgen_id = :al_calgen_id union select 0,'J-8',0 union select 0,'J-7',0 union select 0,'J-6',0 union select 0,'J-5',0 union select 0,'J-4',0 union select 0,'J-3',0 union select 0,'J-2',0 union select 0,'J-1',0 union select 0,'J',0 union select 0,'J+1',0 union select 0,'J+2',0
Hors ligne
... j'vais p't'etre arreter de t'embeter avec ça
"J" en fait c'est pour "jour" pas pour "jalon" ... il peut y avoir plusieurs jours entre 2 jalons ... on peut pas mettre les delais en dur ... on sait pas à l'avance ...
j'crois que je vais essayer de passer par une datawindow grid normale sans aucune donnée, genre :
SELECT jaloncaloffrepdvgen_t.jalon_id
FROM jaloncaloffrepdvgen_t
where 1 = 0
et ensuite j'vais utiliser dans pb la fonction modify pour ajouter des colones en fonction des delais et j'ferai des insertrow et setitem après , depuis pb ... c'est bourrin comme méthode mais ça pourrait marcher p't'etre.
Hors ligne
dans ce cas utilise un DW grid avec source de données external....
Hors ligne
oui voilà j'ai fait ça ...
par contre quelqu'un connait la syntaxe pour le create column ?
impossible de trouver un truc précis ni sur le net, ni dans l'aide PB.
j'ai trouvé ça sur un forum :
dw_1.modify('create column(name=new_column visible="1" band=detail id=' + s_id + ' x=.........')
mais ça me parait un peu léger, là ...
Hors ligne
le plus simple : ajoute une colonne normalement et regarde dans la syntaxe de la DW
Hors ligne
on exporte, ou plus simple, clic droit sur le DWO et Edit source
Hors ligne
ouais ok trouvé ....
donc dans l'export y'a ça, pour la colonne qui avait été créée :
column(band=detail id=1 alignment="0" tabsequence=10 border="0" color="33554432" x="14" y="8" height="64" width="485" format="[general]" html.valueishtml="0" name=jalon visible="1" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="MS Sans Serif" font.height="-8" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" )
du coup j'ai fait ça , en fonction de la ligne dans l'export (j'ai juste modifié l'id):
ls_mod_string = 'create column(band=detail id=2 alignment="0" tabsequence=10 border="0" color="33554432" x="14" y="8" height="64" width="485" format="[general]" html.valueishtml="0" name=jalon visible="1" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="MS Sans Serif" font.height="-8" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" )'
dw_frise.Modify(ls_mod_string)
--> le retour du modify me balance un syntax error ... bouhouhou ...
Hors ligne
pour que ça marche, il faut aussi que la colonne soit définie dans le buffer (ie dans table(column=(type=xxx updatewhereclause=xxx name=xxx dbname="xxx" )...)
ne serait-il pas plus simple de créer "à la main" un nombre suffisant de colonnes puis de les rendre visibles/invisibles selon le besoin ?
Hors ligne
erasorz a écrit:
pour que ça marche, il faut aussi que la colonne soit définie dans le buffer (ie dans table(column=(type=xxx updatewhereclause=xxx name=xxx dbname="xxx" )...)
ne serait-il pas plus simple de créer "à la main" un nombre suffisant de colonnes puis de les rendre visibles/invisibles selon le besoin ?
hmmm ouais tiens je vais demandé à celui qui a fait les spec' si y'a un nombre de jour qui ne peut pas etre dépassé ... ça pourrait etre pas mal, ça ... merci pour la suggestion ....
Hors ligne