Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

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 15-02-2008 12:54:23

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

[RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

Bonjour à tous,

J'ai une datawindow pour laquelle je dois ordonner les lignes en fonction de la valeur mon champ OT :

S => 1
C => 2
R => 3
B => 4

Bien entendu, dans ma datawindow, les données sont mélangés et j'ai plusieurs lignes à S, C, R et B. Le truc c'est
que j'ai une colonne qui me sert de liaison entre chaque lignes S, C, R et B.

Or, dans ma datawindow actuelle, j'ai réussi à ordonner les codes S et C, mais je ne parviens pas à prendre en
compte les codes R et B.

Exemple :

id          OT      liaison
1           S       
2           S
3           C            1
4           S
5           C            4
6           S
7           R            3
8           S
9           C            6
10         B             7

je souhaiterai avoir ceci :
id          OT      liaison
1           S
3           C          1
7           R          3
10         B          7
2           S
4           S
5           C          4
6           S
9           C          6
8           S

Bien entendu, je ne veux faire aucune fonction de mon code PB, je ne veux faire introduire de modif que dans
mon dataobject (par le biais de computed field).

Quelqu'un a-t-il une idée ? Cela serait-il plus simple à faire par le biais d'une procédure stockée ?

Par avance, merci.

Doctor Z.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#2 15-02-2008 13:18:05

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

En triant avec un compute du type :

if(OT='S', 1000000 * id, (1000000 * id) + liaison)

Seule limitation id doit être < 1000000
Je cherche autre chose de plus sexy...

Ce qui donne dans ton exemple :
1000000 S
1000001 C
1000003 R
1000007 B
2000000 S
4000000 S
4000004 C
6000000 S
6000006 C
8000000 S

Bon ça marche avec un nom plus petit que 1000000 si les id ne montent pas si haut....
Pour éviter les nombres trop grand tu peux aussi rediviser par 1000000 : if(OT='S', 1000000 * id, (1000000 * id) + liaison) / 1000000

Ce qui donne dans ton exemple :
1.000000 S
1.000001 C
1.000003 R
1.000007 B
2.000000 S
4.000000 S
4.000004 C
6.000000 S
6.000006 C
8.000000 S


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#3 15-02-2008 13:47:36

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

Bon y a de l'idée mais je me suis planté.
Pour que le compute fonctionne il faut que l'id de l'OT 'S' soit conservé pour les lignes rattachées...
Je continue mon investigation...


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#4 15-02-2008 13:50:48

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

Merci pour ta solution, mais le problème c'est que dans mon cas, mon ID est un alphanumérique (j'ai voulu
l'exemple exposé ici simpliste, afin de bien faire comprendre ma problématique), du coup je ne peux pas
(malheureusement) appliquer ta solution.

Cependant, je vais essayer de m'en inspirer pour trouver autre chose qui se rapproche de la logique que tu as
exposé.

Je vais continuer de chercher.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#5 15-02-2008 13:54:22

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

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

salut, en gros implicitement le tri ne se fait pas sur S,C,R,B mais sur l'ID et ensuite sur les liaisons chaînées éventuelles

je ne vois pas de moyen direct en computed fields

sinon en créant une fonction récursive dans le SGBDR qui te donne le rang d'un ID donné, du genre :

Code: sql

function rang( an_id number ) return number

ln_rang, ln_liaison number ;

select liaison 
into ln_liaison
from table 
where id = an_id ;

-- pas de liaison : rang = 1000000 * id
if isnull( ln_liaison) then

  ln_rang := 1000000 * an_id ;

else -- si liaison : rang = rang du "père" + 1

  ln_rang := 1 + rang( ln_liaison )

end if ;

return ln_rang ;

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

Hors ligne

 

#6 15-02-2008 13:54:56

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,776,000
Site web

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

Du coup un truc du genre

cumulativesum(if(OT='S', 1000000 * id, 0) for all)  + liaison

me semble plus approprié

bon pour ton cas (alpha) ça ne marche pas. Mais je laisse cette piste si elle peut servir...


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#7 15-02-2008 14:38:13

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

ErAsORz a écrit:

salut, en gros implicitement le tri ne se fait pas sur S,C,R,B mais sur l'ID et ensuite sur les liaisons chaînées éventuelles

je ne vois pas de moyen direct en computed fields

sinon en créant une fonction récursive dans le SGBDR qui te donne le rang d'un ID donné, du genre :

Code: sql

function rang( an_id number ) return number

ln_rang, ln_liaison number ;

select liaison 
into ln_liaison
from table 
where id = an_id ;

-- pas de liaison : rang = 1000000 * id
if isnull( ln_liaison) then

  ln_rang := 1000000 * an_id ;

else -- si liaison : rang = rang du "père" + 1

  ln_rang := 1 + rang( ln_liaison )

end if ;

return ln_rang ;

Bonjour,

Merci pour ta solution aussi ErAsORz, mais je dois le faire obligatoirement dans la datawindow, je continue
de chercher.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#8 15-02-2008 14:41:19

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

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

tu peux faire une fonction globale équivalente en PB ?


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

Hors ligne

 

#9 15-02-2008 14:45:03

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

ErAsORz a écrit:

tu peux faire une fonction globale équivalente en PB ?

Il faut que soit fait uniquement au niveau de la base et j'avais privilégié pour cela la piste du computed field dans
le dataobject.

Je ne peux donc pas faire de fonction au niveau de PB (trop lourd).


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#10 15-02-2008 14:46:33

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

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

au niveau de la base => ma solution est une fonction dans le SGBDR


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

Hors ligne

 

#11 25-02-2008 10:33:56

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

Bonjour,

J'ai résolu mon problème autrement.

Dans la procédure stockée permettant d'alimenter ma datawindow external, je me suis créé une table temporaire
dans laquelle j'ai rajouté, en plus des champs que je dois afficher, un champ qui me permet de recevoir les ID
de lignes en fonction de l'ID de ma ligne ayant un OT à S (nommé pour l'exemple id_liaison). Dans ma datawindow
external, j'ai rajouté un computed field me permettant de trier sur la colonne OT (nommé tri pour l'exemple). Pour
être plus concret, avant j'avais ceci :

id          OT      liaison
1           S       
2           S
3           C            1
4           S
5           C            4
6           S
7           R            3
8           S
9           C            6
10         B             7


Maintenant j'ai cela :

id        OT      liaison       id_liaison          tri
1           S                            1                    1
3           C            1              1                    2
7           R            3              1                    3
10         B             7             1                    4
2           S                            2                    1
4           S                            4                    1
5           C            4              4                    2
6           S                            6                    1
9           C            6              6                    2
8           S                            8                    1


Du coup, dans ma datawindow external, comme je tri sur id_liaison et sur la colonne tri,
j'ai bien les données dans l'ordre souhaité.

Dans ma procédure stockée, j'ai fait des update sucessifs dans ma table temporaire, de
manière à renseigner la valeur id_liaison.

Et voilà.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#12 25-02-2008 11:10:12

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

J'ai une autre solu

Soit la table TEST_JCZ avec les champs  "ID" , "OT" , "LI"

Code: sql

select ID, OT , 0, ID
from TEST_JCZ
where LI is null

union all

select TEST_JCZ1.ID ,  TEST_JCZ1.OT,   TEST_JCZ1.li, TEST_JCZ2.ID
from TEST_JCZ TEST_JCZ1, TEST_JCZ TEST_JCZ2
where TEST_JCZ2.ID = TEST_JCZ1.LI and
       TEST_JCZ2.LI is null
union all

select TEST_JCZ1.ID ,  TEST_JCZ1.OT,   TEST_JCZ1.li, TEST_JCZ3.ID
from TEST_JCZ TEST_JCZ1, TEST_JCZ TEST_JCZ2, TEST_JCZ TEST_JCZ3
where TEST_JCZ2.ID = TEST_JCZ1.LI and 
    TEST_JCZ3.ID = TEST_JCZ2.LI and
     TEST_JCZ3.LI is null

union all

select TEST_JCZ1.ID ,  TEST_JCZ1.OT,   TEST_JCZ1.li, TEST_JCZ4.ID
from TEST_JCZ TEST_JCZ1, TEST_JCZ TEST_JCZ2, TEST_JCZ TEST_JCZ3, TEST_JCZ TEST_JCZ4
where TEST_JCZ2.ID = TEST_JCZ1.LI and 
    TEST_JCZ3.ID = TEST_JCZ2.LI and 
    TEST_JCZ4.ID = TEST_JCZ3.LI and
     TEST_JCZ4.LI is null
order by 4, 3

Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#13 25-02-2008 11:16:13

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

JCZ a écrit:

J'ai une autre solu

Soit la table TEST_JCZ avec les champs  "ID" , "OT" , "LI"

Code: sql

select ID, OT , 0, ID
from TEST_JCZ
where LI is null

union all

select TEST_JCZ1.ID ,  TEST_JCZ1.OT,   TEST_JCZ1.li, TEST_JCZ2.ID
from TEST_JCZ TEST_JCZ1, TEST_JCZ TEST_JCZ2
where TEST_JCZ2.ID = TEST_JCZ1.LI and
       TEST_JCZ2.LI is null
union all

select TEST_JCZ1.ID ,  TEST_JCZ1.OT,   TEST_JCZ1.li, TEST_JCZ3.ID
from TEST_JCZ TEST_JCZ1, TEST_JCZ TEST_JCZ2, TEST_JCZ TEST_JCZ3
where TEST_JCZ2.ID = TEST_JCZ1.LI and 
    TEST_JCZ3.ID = TEST_JCZ2.LI and
     TEST_JCZ3.LI is null

union all

select TEST_JCZ1.ID ,  TEST_JCZ1.OT,   TEST_JCZ1.li, TEST_JCZ4.ID
from TEST_JCZ TEST_JCZ1, TEST_JCZ TEST_JCZ2, TEST_JCZ TEST_JCZ3, TEST_JCZ TEST_JCZ4
where TEST_JCZ2.ID = TEST_JCZ1.LI and 
    TEST_JCZ3.ID = TEST_JCZ2.LI and 
    TEST_JCZ4.ID = TEST_JCZ3.LI and
     TEST_JCZ4.LI is null
order by 4, 3

Bonjour,

Avant tout chose merci pour ta solution alternative.
Cependant, j'ai une question. Les select sucessifs avec des union ne sont pas moins
performants que 3 update ?


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#14 25-02-2008 11:22:57

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

Doctor Z a écrit:

Bonjour,

Avant tout chose merci pour ta solution alternative.
Cependant, j'ai une question. Les select sucessifs avec des union ne sont pas moins
performants que 3 update ?

Tu veux dire insert + curseur ( je suppose )+ update ?
Tu peux faire des tests pour voir
chez moi avec une table de 10 enreg c'est super rapide


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#15 25-02-2008 11:31:26

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: [RÉSOLU] Tri d'un dataobject en fonction de la valeur d'une colonne

JCZ a écrit:

Doctor Z a écrit:

Bonjour,

Avant tout chose merci pour ta solution alternative.
Cependant, j'ai une question. Les select sucessifs avec des union ne sont pas moins
performants que 3 update ?

Tu veux dire insert + curseur ( je suppose )+ update ?
Tu peux faire des tests pour voir
chez moi avec une table de 10 enreg c'est super rapide

Non, je n'ai pas de curseur, je fais cela en assembliste et je peux avoir 15000
enregistrements ou plus.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22