Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
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.
Hors ligne
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
Hors ligne
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...
Hors ligne
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.
Hors ligne
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 :
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 ;
Hors ligne
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...
Hors ligne
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.
Hors ligne
tu peux faire une fonction globale équivalente en PB ?
Hors ligne
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).
Hors ligne
au niveau de la base => ma solution est une fonction dans le SGBDR
Hors ligne
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à.
Hors ligne
J'ai une autre solu
Soit la table TEST_JCZ avec les champs "ID" , "OT" , "LI"
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
Hors ligne
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 ?
Hors ligne
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
Hors ligne
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.
Hors ligne
Pages: 1