PB à toute heure et à tout moment. (à parcourir avec modération)

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 20-02-2012 15:47:40

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Compute field contenant la concaténation des valeurs d'un champ

Bonjour à tous,

j'explique mon problème avec l'exemple suivant :

ma datawindow (dw_test) contient les données suivantes, je veux avoir un compute field dont le texte est la concaténation des valeurs de la colonne TEST1

==> compute_test = valeur1.1 , valeur1.2 , valeur1.3 , valeur1.4 

-------------------------------
TEST1         |       TEST2   |
--------------|--------------- | 
valeur1.1    |    valeur2.1  |
valeur1.2    |    valeur2.2  |
valeur1.3    |    valeur2.3  |
valeur1.4    |    valeur2.4  |
-------------------------------

est ce que je peux renseigner le champ compute_test  sans avoir recours à une boucle, mais plutôt à une expression qu'on peut appliquer à une DW.


Merci d'avance ;)

Hors ligne

 

#2 20-02-2012 16:56:20

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

Bonjour,
une bidouille juste comme çà :

Code: pb

dw_1.object.co_magic_1.expression="if(getrow()>1, describe('evaluate(~"co_magic_1~",'+string(getrow()-1)+')')+' , '+test1, test1 )"


Il faut lire la valeur du compute sur la dernière ligne.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#3 21-02-2012 09:07:49

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

Bonjour,

Merci xlat pour ta réponse. en fait j'ai utilisé l'expression suivante au niveau de la DW : 

Code: pb

if(getrow()>1, describe ( "evaluate ('test1'," + String(getrow()-1)+" )" )  +"," + String(test1), String(test1))


puis au niveau du code :

Code: pb

ls_resultat1 = dw_1.getItemstring(dw_1.rowcount(), "co_magic_1")


le résultat obtenus est : ls_resultat1 = " valeur1.3 , valeur1.4 " ==> uniquement les 2 dernières valeurs

j'ai changé alors l'expression de ma DW comme suit :

Code: pb

if(getrow()>1, describe ( "evaluate ('co_magic_1'," + String(getrow()-1)+" )" )  +"," + String(test1), String(test1))


mais au niveau du code lorsque le système exécute l'instruction suivante, l'application se ferme brutalement sans même un msg d'erreur

Code: pb

ls_resultat1 = dw_1.getItemstring(dw_1.rowcount(), "co_magic_1") 


Certainement il y a qcq chose qui ne va pas dans l'expression du compute field.

Veuillez m'aider à résoudre ce problème.


Merci d'avance

Dernière modification par dydo (21-02-2012 10:07:16)

Hors ligne

 

#4 21-02-2012 10:17:57

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

dydo a écrit:

Code: pb

ls_resultat1 = dw_1.getItemstring(dw_1.rowcount(), "co_magic_1") 


Certainement il y a qcq chose qui ne va pas dans l'expression du compute field.

Veuillez m'aider à résoudre ce problème.

Merci d'avance

La doc pb au sujet des computes :
onglet "Contents", Datawindow Reference > Accessing Data in Code > Techniques for accessing data > Syntaxes for DataWindow data expressions > Syntax for a range of data  in a named column :

sur le paramétre datasource :

documentation a écrit:

Original - The values that were initially retrieved from the database. For a computed field, you must specify Original (because computed fields cannot be changed and do not have current values)

Optes donc plutôt la syntaxe suivante :

Code: pb

ls_resultat1 = dw_1.object.co_magic_1.original[ dw_1.rowcount() ]

ou encore :

Code: pb

ls_resultat1 = dw_1.describe("evaluate('co_magic_1', "+ string(dw_1.rowcount()) + ")")

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#5 21-02-2012 10:34:20

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

Bonjour,

Actuellement l'expression suivante est celle que j'utilise sur le champ co_magic_1:

Code: pb

if(getrow()>1, describe ( "evaluate ('co_magic_1'," + String(getrow()-1)+" )" )  +"," + String(test1), String(test1))


et l'instruction suivante au niveau du code :

Code: pb

ls_resultat1 = dw_1.object.co_magic_1.original[ dw_1.rowcount() ]


mais lorsque le système exécute l'instruction ci dessus, l'application se ferme brutalement sans même un msg d'erreur.

je pense qu'on doit pas faire un evaluate dans l'expression du champ lui même !!

Est ce que vous avez une explication !!?

Merci.

Hors ligne

 

#6 21-02-2012 10:53:26

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

j’espère que dw_1.rowcount() > 0

sinon ca donne quoi avec la methode describe ?

Code: :pb

ls_resultat1 = dw_1.describe("evaluate('co_magic_1', "+ string(dw_1.rowcount()) + ")") 

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#7 21-02-2012 11:26:09

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

Oui dw_1.rowcount() est bien > 0

la ligne suivante pose aussi problème

Code: :pb

ls_resultat1 = dw_1.describe("evaluate('co_magic_1', "+ string(dw_1.rowcount()) + ")") 


mais lorsque je remplace l'expression du champ co_magic_1 par l'expression suivante :

Code: :pb

ls_resultat1 = dw_1.describe("evaluate('test1', "+ string(dw_1.rowcount()) + ")") 


Le système fonctionne normalement et le résultat sera la concaténation des 2 dernières valeurs du champ "test1"

Vraiment je ne trouve aucune explication !!

Je compte sur vous

Merci

Dernière modification par dydo (21-02-2012 11:26:26)

Hors ligne

 

#8 21-02-2012 12:48:51

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

l'explication c'est que "test1[ avant-dernière-ligne ] + ',' + test1[ dernière-ligne ]" correspond bien à ton expression sur test1, c'est pour cela que j'utilise le compute co_magic_1, pour le "récursion", ce qui semble poser problème chez toi.
- C'est quoi ta version de PB ?
- T'as combien de lignes ?
- si tu peux joindre le résultat de ceci :

Code: pb

string ls_syntax
ls_syntax = dw_1.describe("datawindow.syntax~r~ndatawindow.syntax.data")
clipboard( ls_syntax )
messagebox("dw syntax", ls_syntax )

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#9 21-02-2012 13:21:38

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

Bonjour,

j'utilise la Version PB11.5
ma dw contient 75000 ligne
oui effectivement la récursion est celle qui pose problème.

bon pour la syntaxe, ma requête est très compliquée, en + ma dw contient bcp de champs et de computed field ==> j'ai voulu prendre l'exemple TEST pour simplifier la compréhention de mon problème.

Merci.

Hors ligne

 

#10 21-02-2012 13:45:03

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

alors fait une boucle car 75 000 lignes c'est beaucoup trop pour la bricole que je proposais (je pensais à une dizaine maxi).

Code: pb

string ls_values[], ls_result
long i, count
count = dw_1.rowcount()
ls_values[] = dw_1.object.test1
for i = 1 to count
  if i>1 then ls_result += ', '
  ls_result += ls_values[i]
next

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#11 21-02-2012 15:54:15

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

Bonjour,

en fait, même avec une dw de 3 ou 4 lignes la bricole ne marchait pas.

j'ai voulu éviter de parcourir cette dw parceque ce parcours dure environ 4 min, je pensais à une bricole qui me fais gagner du temps surtout mon projet consiste à optimiser un traitement trop lourd.

Merci en tt cas

Hors ligne

 

#12 21-02-2012 16:24:09

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

Bizarre, j'avais tester en pb115 la bidouille qui fonctionnait

Sinon, la version boucle que je propose est plus performante que de boucler sur des getitemstring(...) ou de faire object.test1[row] puisque l'on récupère toute les données d'un coup dans un tableau qui est plus rapide à parcourir (mais plus gourmand, donc utiliser une variable locale pour le tableau ou pense à le vider après usage!).

_ Encore un truc; pense à mettre [RESOLU] dans le titre du post.

Dernière modification par xlat (21-02-2012 16:24:55)


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#13 28-02-2012 09:55:22

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

xlat a écrit:

Sinon, la version boucle que je propose est plus performante que de boucler sur des getitemstring(...) ou de faire object.test1[row] puisque l'on récupère toute les données d'un coup dans un tableau qui est plus rapide à parcourir (mais plus gourmand, donc utiliser une variable locale pour le tableau ou pense à le vider après usage!).

Bonjour j'ai essayé cette version de boucle et ça fonctionne très bien sauf que j'ai changé quelques choses .

Encore 2 petites questions :

1/ En fait, le tableau ne doit pas être de type "String" mais de type "any" sinon une erreur at runtime se déclanche.

2/ si je fais

Code: pb

any    ls_values[]
lany_values[] = dw_1.object.Data


j'obtient un tableau à 2 dimension
comment pourrais-je accéder à ces éléments


Merci beaucoup pour votre aide

Dernière modification par dydo (28-02-2012 10:19:01)

Hors ligne

 

#14 28-02-2012 10:12:17

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

Re: Compute field contenant la concaténation des valeurs d'un champ

ça serait pas plutot :

Code: pb

any    ls_values[]
lany_values = dw_1.object.Data


NB : pour la balise code PB il faut mettre code=pb


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

Hors ligne

 

#15 28-02-2012 10:29:58

dydo  
Membre Geek
Date d'inscription: 25-04-2011
Messages: 21
Pépites: 98
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ



savez vous comment pourrais-je accéder aux valeurs de mon tableau à 2 dimension ?

j'ai essayer ces 3 écritures mais une erreur de compilation s'affiche :

Code: pb

ls_test1 = lany_values[1].test1 // Erreur
ls_test1 = String(lany_values[1].test1) // Erreur
ls_test1 = lany_values[1,1] // Erreur


qu'en pensez vous ?

Merci d'avance

Dernière modification par dydo (28-02-2012 10:30:34)

Hors ligne

 

#16 28-02-2012 10:56:32

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

si ca plantait sur la syntaxe

Code: pb

ls_values[] = dw_1.object.test1

pourquoi ne pas avoir changé uniquement le type de données string => any ?

car la syntaxe

Code: pb

lany_values = dw_1.object.Data

retourne toutes les colonnes, donc multidimensionnel.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#17 28-02-2012 13:41:00

dydo01  
Membre
Date d'inscription: 21-09-2010
Messages: 10
Pépites: 58
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

Code: pb

lany_values = dw_1.object.Data

retourne toutes les colonnes, donc multidimensionnel.

Oui exactement c'est ce que j'ai besoin, parceque j'ai plusieurs colonnes dont je veux retrouver les valeurs.

comment je peut accéder aux valeurs de chaque colonne ? sachant que mon tableau est bidimentionnel.

Merci

Hors ligne

 

#18 28-02-2012 13:51:17

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

Re: Compute field contenant la concaténation des valeurs d'un champ

l'élement {i,j} du tableau est tableau[i,j]


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

Hors ligne

 

#19 28-02-2012 16:38:04

dydo01  
Membre
Date d'inscription: 21-09-2010
Messages: 10
Pépites: 58
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

erasorz a écrit:

l'élement {i,j} du tableau est tableau[i,j]

Oui effectivement c'est ce que devrait être fait, mais selon mon code :

Code:

any    lany_values[]
lany_values = dw_1.object.Data

mon tableau est considédré comme un tableau de structures (peut être assimilé à un tableau bidimentionnel) .

mais je ne peut pas accéder aux éléments de mon tableau en utilisant la syntaxe :  lany_values[i,j] ==> (erreur de compilation: Referencing 1 dimensional array with 2 subscripts), et ce parceque ce tableau n'a pas été déclaré de la façon suivante :

Code:

any    lany_values[1000 , 2]

une idée??

Hors ligne

 

#20 28-02-2012 21:34:01

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Compute field contenant la concaténation des valeurs d'un champ

en fait tu récupères un tableau d'une dimension, qui contient des sous tableaux à une dimension.

par exemple, si tu as dans ta datawindow/datastore :

Code:

| TEST1        |      TEST2    |
|--------------|---------------|
| valeur1.1    |    valeur2.1  |
| valeur1.2    |    valeur2.2  |
| valeur1.3    |    valeur2.3  |
| valeur1.4    |    valeur2.4  |

faire

Code: pb

any lany_values[]
lany_values[] = dw_1.object.Data


donnerait:

lany_values[1] = { "valeur1.1", "valeur2.1" }
lany_values[2] = { "valeur1.2", "valeur2.2" }
lany_values[3] = { "valeur1.3", "valeur2.3" }
lany_values[4] = { "valeur1.4", "valeur2.4" }

donc, pour accéder à "valeur2.3", il faudrait faire :

Code: pb

string ls_23
//ls_23 = lany_values[3][2] //Ne compile pas: Subscripted expression not an array
//Car c'est un tableau de tableau et non un tableau multidimensionnel comme on pourrait le définir par la_quelconque[ 4, 9 ]

//il faut donc passer par une variable intermédiaire
any la_subarray[]
la_subarray[] = lany_values[3]
ls_23 = la_subarray[2]



aller pour la route une démo à tester en copier/coller:

Code: pb

any lany_values[]
lany_values[] = dw_1.object.Data
/*
lany_values[1] = { "valeur1.1", "valeur2.1" }
lany_values[2] = { "valeur1.2", "valeur2.2" }
lany_values[3] = { "valeur1.3", "valeur2.3" }
lany_values[4] = { "valeur1.4", "valeur2.4" }
*/
string ls_23
any la_subarray[]
la_subarray[] = lany_values[3]
ls_23 = la_subarray[2]
messagebox( "Ligne n°3, colonne n°2", ls_23 )

Dernière modification par xlat (28-02-2012 21:36:54)


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#21 01-03-2012 13:28:32

dydo01  
Membre
Date d'inscription: 21-09-2010
Messages: 10
Pépites: 58
Banque: 0

Re: Compute field contenant la concaténation des valeurs d'un champ

ça marche Nickel !!

Merci Beaucoup pour votre aide!!  vous êtes vraiement génial   

Hors ligne

 

#22 01-03-2012 13:39:14

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

Re: Compute field contenant la concaténation des valeurs d'un champ

N'oublie pas le [RESOLU].


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

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22