Quoi, tu ne connais pas PB ? Va falloir parcourir tout le forum alors !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 12-02-2009 16:38:45

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

faire un planning en crosstab

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

 

#2 12-02-2009 17:46:21

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: faire un planning en crosstab

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

 

#3 13-02-2009 08:37:41

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#4 13-02-2009 08:48:11

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

ben147 a écrit:

en fait je me demande si je vais pas ne pas passer par une dw ...

la douleur t'égare, cher ami 


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 13-02-2009 09:17:20

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

ç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

 

#6 13-02-2009 09:33:18

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

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 :

Code: sql

SELECT ID_ETAPE,DATE_ETAPE,1 AS NB 
FROM PLANNING
WHERE DATE_ETAPE BETWEEN :DATE_DEBUT AND :DATE_FIN 

         et cette structure :

http://img152.imageshack.us/img152/2790/51655190hj8.png

on obtient, brut de coffrage :

http://img152.imageshack.us/img152/7384/xt2lr1.png

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)


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#7 13-02-2009 09:56:45

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#8 13-02-2009 17:33:51

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#9 14-02-2009 09:04:18

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

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 :

Code: sql

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 :

Code: sql

SELECT * FROM TABLE( F_CALENDRIER( debut , fin ) )


donc en joignant ça avec l'autre requête :

Code: sql

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 :

http://img201.imageshack.us/img201/6228/xt3oh7.png

y'a plus qu'à arranger un peu et c'est dans la poche


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#10 16-02-2009 08:38:32

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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 :

http://farm4.static.flickr.com/3314/3283537063_cd45f8074a_o.jpg

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 :

Code: mssql

  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 :
http://farm4.static.flickr.com/3358/3284370518_20debfac9d_o.jpg

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

 

#11 16-02-2009 09:00:59

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

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


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#12 16-02-2009 10:05:04

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#13 16-02-2009 10:27:11

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

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 :

http://farm4.static.flickr.com/3358/3284370518_20debfac9d_o.jpg


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#14 16-02-2009 10:44:47

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#15 16-02-2009 10:52:40

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

et en version hard-codée dans la requête : 

Code: mssql

  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

N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#16 16-02-2009 11:05:29

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

... 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

 

#17 16-02-2009 11:15:02

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

dans ce cas utilise un DW grid avec source de données external....


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#18 16-02-2009 14:02:24

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#19 16-02-2009 14:06:17

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

le plus simple : ajoute une colonne normalement et regarde dans la syntaxe de la DW


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#20 16-02-2009 14:11:05

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

j'pense que je vais passer pour un rigolo mais bon ....
on la chope ou la syntaxe ? on exporte la dw c'est ça ?

Hors ligne

 

#21 16-02-2009 14:37:41

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

on exporte, ou plus simple, clic droit sur le DWO et Edit source


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#22 16-02-2009 15:04:47

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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):

Code: pb

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

 

#23 16-02-2009 15:13:50

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: faire un planning en crosstab

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 ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#24 16-02-2009 15:36:44

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

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

 

#25 16-02-2009 15:46:24

ben147  
Membre Geek
Lieu: Paris
Date d'inscription: 20-06-2008
Messages: 66
Pépites: 303
Banque: 0
Site web

Re: faire un planning en crosstab

"non" ....

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22