Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
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
Bonjour,
une bidouille juste comme çà :
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.
Hors ligne
Bonjour,
Merci xlat pour ta réponse. en fait j'ai utilisé l'expression suivante au niveau de la DW :
if(getrow()>1, describe ( "evaluate ('test1'," + String(getrow()-1)+" )" ) +"," + String(test1), String(test1))
puis au niveau du code :
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 :
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
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
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 :
ls_resultat1 = dw_1.object.co_magic_1.original[ dw_1.rowcount() ]
ou encore :
ls_resultat1 = dw_1.describe("evaluate('co_magic_1', "+ string(dw_1.rowcount()) + ")")
Hors ligne
Bonjour,
Actuellement l'expression suivante est celle que j'utilise sur le champ co_magic_1:
if(getrow()>1, describe ( "evaluate ('co_magic_1'," + String(getrow()-1)+" )" ) +"," + String(test1), String(test1))
et l'instruction suivante au niveau du code :
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
j’espère que dw_1.rowcount() > 0
sinon ca donne quoi avec la methode describe ?
ls_resultat1 = dw_1.describe("evaluate('co_magic_1', "+ string(dw_1.rowcount()) + ")")
Hors ligne
Oui dw_1.rowcount() est bien > 0
la ligne suivante pose aussi problème
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 :
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
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 :
string ls_syntax ls_syntax = dw_1.describe("datawindow.syntax~r~ndatawindow.syntax.data") clipboard( ls_syntax ) messagebox("dw syntax", ls_syntax )
Hors ligne
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
alors fait une boucle car 75 000 lignes c'est beaucoup trop pour la bricole que je proposais (je pensais à une dizaine maxi).
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
Hors ligne
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
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)
Hors ligne
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
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
ça serait pas plutot :
any ls_values[] lany_values = dw_1.object.Data
NB : pour la balise code PB il faut mettre code=pb
Hors ligne
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 :
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
si ca plantait sur la syntaxe
ls_values[] = dw_1.object.test1
pourquoi ne pas avoir changé uniquement le type de données string => any ?
car la syntaxe
lany_values = dw_1.object.Data
retourne toutes les colonnes, donc multidimensionnel.
Hors ligne
Code: pb
lany_values = dw_1.object.Dataretourne 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
l'élement {i,j} du tableau est tableau[i,j]
Hors ligne
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 :
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 :
any lany_values[1000 , 2]
une idée??
Hors ligne
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 :
| TEST1 | TEST2 | |--------------|---------------| | valeur1.1 | valeur2.1 | | valeur1.2 | valeur2.2 | | valeur1.3 | valeur2.3 | | valeur1.4 | valeur2.4 |
faire
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 :
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:
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)
Hors ligne
ça marche Nickel !!
Merci Beaucoup pour votre aide!! vous êtes vraiement génial
Hors ligne
N'oublie pas le [RESOLU].
Hors ligne
Pages: 1