Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Je pense que c'est le rowcount de la datawindow principale. Mais cela veut dire que ta DW report est construite.
Autre test :
ajoute un event ue_post_retrieve() à ton controle DW.
Codes y ta ligne de modify du label.
Dans ton ue_print lances un this.Post ue_post_retrieve()
Pour voir...
Hors ligne





Comme j'avais un doute sur où il fallait placer ce nouvel event, j'en ai placé une copie dans :
- w_sheet_account, qui est ma sheet principale, celle qui déclenche et gère mon ue_print()
- dw_print, qui est ma datawindow qui contient le report
messagebox("", "w_sheet_account") string ls_expression ls_expression = dw_print.object.rpt_users.Describe("user_number_t.text") messagebox("Expression", ls_expression)
Donc c'est bien celui de ma w_sheet_account qui est appelé, mais :
- l'appel se fait à la création/affichage de ma fenêtre
- forcément j'ai un autre appel lorsque je demande l'impression
- dans les deux cas j'ai droit au message d'erreur de type "accessing external property"
Dernière modification par Nyphel (07-05-2008 09:41:17)
Hors ligne
Petite question. Comment est affecté le dataobject à ton control DW de ta fenêtre d'impression avant le retrieve ?
Hors ligne





Voici ce qui se passe dans mon événement ue_print() de ma sheet w_sheet_account :
[...] // Initialisation des variables dw_print.settransobject(SQLCA) //translate datawindow guo_message.Event ue_translate_datawindow(dw_print) //retrieve dw_print.Retrieve(il_accountnumber, ll_number_null, ls_null) [...] // La partie qui me pose soucis, // avec modification des titres de colonnes de // dw_print.object.rpt_users.object.xxx
D'accord, merci pour le GetChild... J'avoue que ça me travaillait !
Dernière modification par Nyphel (07-05-2008 09:58:52)
Hors ligne
Ta datawindow dw_print à un dataobject fixe associé directement dans le DW painter ?
Hors ligne





Voici le processus de traduction :
w_sheet_account -> événement ue_print() :
guo_message.Event ue_translate_datawindow(dw_print)
uo_message -> événement ue_translate_datawindow(ref datawindow adw_datawindow) :
guo_language.of_translate_label(adw_datawindow)
uo_language -> function of_translate_label(readonly datawindow ad_datawindow) inherited from uo_base_language :
integer li_max integer li_loop string ls_object_text integer li_object_tag string ls_description string ls_objectname[] uo_base_string luo_string integer li_datawindow_tag string ls_translated_label // is it useful to translate? IF ii_targetlanguage = ii_defaultlanguage THEN RETURN li_datawindow_tag = dec(ad_datawindow.tag) ls_description = ad_datawindow.describe('dataWindow.Objects') luo_string.of_parsetoarray(ls_description,'~t',ls_objectname) li_max = upperbound(ls_objectname) FOR li_loop=1 TO li_max ls_translated_label = space(255) IF right(ls_objectname[li_loop],2) = '_t' THEN li_object_tag = dec(ad_datawindow.describe(ls_objectname[li_loop]+'.tag')) ls_object_text = ad_datawindow.describe(ls_objectname[li_loop]+'.text') ls_translated_label = this.of_get_labels( li_datawindow_tag, li_object_tag, ls_object_text ) IF trim(ls_translated_label) <> '' THEN ad_datawindow.Modify(ls_objectname[li_loop]+".text = '"+ls_translated_label+"'") END IF NEXT
Hors ligne





Et ma datawindow dw_print a un report directement associé dans le painter :
properties -> onglet "General" -> report -> et là j'indique mon report de type d_account_user_print, qui est nommé rpt_users.
Hors ligne
Nyphel a écrit:
Voici le processus de traduction :
w_sheet_account -> événement ue_print() :Code: pb
guo_message.Event ue_translate_datawindow(dw_print)
uo_message -> événement ue_translate_datawindow(ref datawindow adw_datawindow) :Code: pb
guo_language.of_translate_label(adw_datawindow)
uo_language -> function of_translate_label(readonly datawindow ad_datawindow) inherited from uo_base_language :Code: pb
integer li_max integer li_loop string ls_object_text integer li_object_tag string ls_description string ls_objectname[] uo_base_string luo_string integer li_datawindow_tag string ls_translated_label // is it useful to translate? IF ii_targetlanguage = ii_defaultlanguage THEN RETURN li_datawindow_tag = dec(ad_datawindow.tag) ls_description = ad_datawindow.describe('dataWindow.Objects') luo_string.of_parsetoarray(ls_description,'~t',ls_objectname) li_max = upperbound(ls_objectname) FOR li_loop=1 TO li_max ls_translated_label = space(255) IF right(ls_objectname[li_loop],2) = '_t' THEN li_object_tag = dec(ad_datawindow.describe(ls_objectname[li_loop]+'.tag')) ls_object_text = ad_datawindow.describe(ls_objectname[li_loop]+'.text') ls_translated_label = this.of_get_labels( li_datawindow_tag, li_object_tag, ls_object_text ) IF trim(ls_translated_label) <> '' THEN ad_datawindow.Modify(ls_objectname[li_loop]+".text = '"+ls_translated_label+"'") END IF NEXT
Ce script de traduction ne tient pas compte des sous-reports (une petite fonction récursive aurait été du meilleur effet).
C'est dommage. Mais c'est un autre problème...
Hors ligne





En effet, c'est d'ailleurs suite à cela que j'en viens à traduire le sous-report column par column... :-/
Hors ligne
Argl, ça vaut peut-être le coup de modifier la méthode pour quelle prenne en compte les sous-reports alors
Hors ligne





Je ne peux pas vraiment intervenir sur cette méthode : elle est héritée dans des dizaines et des dizaines de sheets/responses windows sur un projet qui a plus de 7 ans. Si je la modifie je devrai non seulement tester l'ensemble de l'application, mais aussi modifier les appels de traduction de titre de colonnes individuelles... Et cela je ne peux pas le faire, tant par manque d'expérience/capacité que par manque de temps :-/
Hors ligne
Nyphel a écrit:
Je ne peux pas vraiment intervenir sur cette méthode : elle est héritée dans des dizaines et des dizaines de sheets/responses windows sur un projet qui a plus de 7 ans. Si je la modifie je devrai non seulement tester l'ensemble de l'application, mais aussi modifier les appels de traduction de titre de colonnes individuelles... Et cela je ne peux pas le faire, tant par manque d'expérience/capacité que par manque de temps :-/
Par contre tu peux peut-être créer une méthode identique avec un datawindowchild en paramètre (tant pis pour la récurcivité ) et faire appel à cette méthode après avoir fait ton getchild (sur la colonne du user report )_
.
Ca t'éviterait de traduire label par label ta DWC...
Hors ligne





Oui c'est une bonne idée... Je préfèrerai comprendre résoudre le problème, mais le cas échéant je me tournerai probablement vers cette solution ;-)
Hors ligne








Vue que ton report est dans le detail band, tu peux essayer ça pour voir si cela fonctionne pour le premier report :
dw_print.object.rpt_users[1].object.user_number_t.text = 'essai'
Si ca fonctionne, il suffira d'une petite boucle sur dw_print.rowcount()..mais bon, on en est pas là.
Hors ligne





Ceci ne génère pas d'erreur :
dw_print.object.rpt_users[1].object.user_number_t.text = 'essai'
Toutefois, initialement il y avait cela :
dw_print.object.rpt_users.object.user_number_t.text = 'essai'
Ce qui générait - parfois - des erreurs, sur certains postes uniquement.
J'avoue que j'ai donc quelques réserves à me contenter de cette solution, d'autant plus que je ne sais pas pourquoi on indique cet indice [1] ?
Dernière modification par Nyphel (07-05-2008 11:58:26)
Hors ligne
Ha mais il y a une nouvelle information là !
Si le plantage a lieu que sur certains postes, il faut peut-être regarder du côté du runtime...
Pour ce qui est de la syntaxe les deux sont bonne. Celle de hellkinder permet de modifier le contenu pour une instance (une ligne de la DW principale) de la DWC, ta syntaxe d'origine permet de modifier pour toutes les instances d'un coup. Le paramètre [row] est facultatif.
Examples
Example 1 Suppose that a DataWindow has the Composite presentation style and includes a report called rpt_employee. The report includes a column emp_id. This expression gets the validation expression for the column:
string ls_valid
ls_valid = dw_composite.Object.rpt_employee.&
Object.emp_id.Validation
Example 2 In a Composite DataWindow, one of the reports rpt_1 has a graph gr_1. This example turns on grid lines for the category axis of that graph. The example sets an instance variable to a default value of "not found." If the expression fails and triggers the Error event, the ExceptionSubstituteReturnValue! action causes the text "not found" to be returned so that the second assignment succeeds:
is_dwvalue = "not found"
dw_1.Object.rpt_1.Object.&
gr_1.Category.MajorGridline = 5
st_status.Text = dw_1.Object.rpt_1.Object.&
gr_1.Category.MajorGridline
The script for the Error event includes these lines:
action = ExceptionSubstituteReturnValue!
returnvalue = is_dwvalue
Example 3 Suppose that a DataWindow called dw_emp is a base report with employee information. The detail band includes a nested report of salary history called rpt_salary. This means there is a separate report with its own properties in each row.
The script checks whether the employee belongs to management (the value in the rank column in the base report is M). If so, the script assigns a DataWindow expression to the Color property of the salary column in the rpt_salary nested report. The expression highlights salaries that are over $60,000 in red.
Another statement sets the salary column's Mode property so the color change will be visible:
integer li_row
FOR li_row = 1 to RowCount( )
IF dw_emp.Object.rank.Primary[li_row] = "M" THEN
dw_emp.Object.rpt_salary[li_row].Object.&
salary.Background.Color = &
'255 ~t If(salary > 60000, 255, 0)'
dw_emp.Object.rpt_salary[li_row].Object.&
salary.Background.Mode = 0
END IF
NEXT
Example 4 In this example there is a graph in the summary band of a base report called dw_emp. The graph is a nested report called rpt_graph_salaries. Although the graph is not related to a particular row, you still need to provide the row number associated with the summary band when you refer to its properties. This statement turns on autoscaling for the values axis:
dw_emp.Object.rpt_graph_salaries.Object.&
gr_1.Values.AutoScale = 1
Example 5 If a column has a DropDownDataWindow edit style, there are properties that affect the column's appearance. Using nested object syntax, you can also change properties of the child DataWindow for the column. In this example, the DataWindow dw_gift allows a clerk at a nonprofit organization to record donations. The clerk can pick a standard donation amount from a drop-down DataWindow.
This example makes the drop-down DataWindow column called amount a required value and changes the display format for the dollars column in the child DataWindow:
dw_gift.Object.amount.dddw.Required = "Yes"
dw_gift.Object.amount.Object.dollars.Format = "$#,##0"
Hors ligne








En fait, ton report est dans la detail band, donc si ta dw retourne plusieurs row, il faut peut être indiquer le report de quel row tu veux modifier.
l'indice [1] signifie que tu vas toucher au champs texte du report du premier enregistrement.
donc si tu veux toucher à tous les reports, de chacun des enregistrements :
for i = 1 to dw_print.rowcount() dw_print.object.rpt_users[i].object.user_number_t.text = 'essai' next
si tu as un seul report pour toute ta datawindow, met le dans la bande summury ou footer..
Enfin, je propose, je dis pas que ca marche...
Hors ligne








Chrnico a écrit:
Pour ce qui est de la syntaxe les deux sont bonne. Celle de hellkinder permet de modifier le contenu pour une instance (une ligne de la DW principale) de la DWC, ta syntaxe d'origine permet de modifier pour toutes les instances d'un coup. Le paramètre [row] est facultatif.
Tu es sûr que pour les reports, ça se comporte comme une colonne classique?
Perso, j'essairais quand même...pour ce que ca coute.. la petite boucle
if dw_print.rowcount() > 0 then for i = 1 to dw_print.rowcount() dw_print.object.rpt_users[i].object.user_number_t.text = 'essai' next end if
Hors ligne
Oui je suis sur
Préciser la ligne permet de faire des modifs différentes dans la DWC pour chaque ligne de la DW principale.
Dans son cas (traduction des labels), la modif est la même pour toutes les instances de la DWC.
Je pencherai plus pour un prob de runtime vu les dernières infos (fonction du poste) : la pbdwe par exemple...
Hors ligne





Et bien ma DW ne retourne qu'un seul row, donc ça ça va.
Merci beaucoup, j'y vois déjà beaucoup plus clair avec vos précisions
En effet, j'aurais peut-être du spécifier que ça plantait sur certaines machines et pas sur d'autres... Mais comme j'avais déjà eu une erreur similaire sur un cas plus simple que j'avais résolu avec un Modify(), j'étais persuadé qu'en fait le Modify() était la façon "propre" d'alterrer les propriétés des DW/Reports et qu'il fallait éviter les notations par points (dw.object.control.property). J'en avais donc déduis que c'était normal que ça lève l'erreur sur certains postes, en fonction des versions/environnements plus ou moins tatillons...
Hors ligne





La solution finalement trouvée fut :
string ls_test ls_test = dw_print.object.rpt_users[i].object.user_number_t.text ls_test = 'huhu' dw_print.object.rpt_users[i].object.user_number_t.text = ls_test
Oui... C'est étrange, mais ça fonctionne. Si quelqu'un sait pourquoi, ça m'intéresse
Merci pour le coup de main !
Hors ligne





Après de nombreux tests, le problème ne s'avère pas résolu. Même cause, même symptômes :-/
J'ai donc décidé de remédier au problème en reprenant la fonction qui se charge normalement de faire ce travail pour les datawindows de l'application. Je rapelle que cette fonction récupère tous les objets de la datawindow et traduit/met à jour les labels en récupérant la bonne valeur dans la base de données. Toutefois cette fonction n'étant pas récursive, elle ne traduit pas les datawindows/reports qui sont eux-même inclus dans la datawindow en cours de traduction.
C'est pourquoi, jusqu'alors, j'essayais de traduire "directement" les noms de colonnes d'un rapport qui est inclus dans une datawindow, elle même dans une sheet.
La traduction se fait avec la fonction of_get_labels( datawindow à traduire, control lu, label du control).
Chaque control donc le nom se termine par "_t" est destiné à être traduit.
Voici donc la fonction qui traduit l'ensemble des labels des controls d'une datawindow :
of_translate_labels(ref datawindow ad_datawindow)
integer li_max integer li_loop string ls_object_text integer li_object_tag string ls_description string ls_objectname[] uo_base_string luo_string integer li_datawindow_tag string ls_translated_label // is it useful to translate? IF ii_targetlanguage = ii_defaultlanguage THEN RETURN li_datawindow_tag = dec(ad_datawindow.tag) ls_description = ad_datawindow.describe('dataWindow.Objects') luo_string.of_parsetoarray(ls_description,'~t',ls_objectname) li_max = upperbound(ls_objectname) FOR li_loop=1 TO li_max ls_translated_label = space(255) IF right(ls_objectname[li_loop],2) = '_t' THEN li_object_tag = dec(ad_datawindow.describe(ls_objectname[li_loop]+'.tag')) ls_object_text = ad_datawindow.describe(ls_objectname[li_loop]+'.text') ls_translated_label = this.of_get_labels( li_datawindow_tag, li_object_tag, ls_object_text ) IF trim(ls_translated_label) <> '' THEN ad_datawindow.Modify(ls_objectname[li_loop]+".text = '"+ls_translated_label+"'") END IF NEXT
Maintenant je décide de modifier cette fonction pour qu'elle traite le cas particulier des controls dont le nom se termine par "_myt", et je renomme mon rapport "rpt_users" en "rpt_users_t".
integer li_max integer li_loop string ls_object_text integer li_object_tag string ls_description string ls_objectname[] uo_base_string luo_string integer li_datawindow_tag string ls_translated_label // is it useful to translate? IF ii_targetlanguage = ii_defaultlanguage THEN RETURN li_datawindow_tag = dec(ad_datawindow.tag) ls_description = ad_datawindow.describe('dataWindow.Objects') luo_string.of_parsetoarray(ls_description,'~t',ls_objectname) li_max = upperbound(ls_objectname) FOR li_loop=1 TO li_max ls_translated_label = space(255) IF right(ls_objectname[li_loop],2) = '_t' THEN li_object_tag = dec(ad_datawindow.describe(ls_objectname[li_loop]+'.tag')) ls_object_text = ad_datawindow.describe(ls_objectname[li_loop]+'.text') ls_translated_label = this.of_get_labels( li_datawindow_tag, li_object_tag, ls_object_text ) IF trim(ls_translated_label) <> '' THEN ad_datawindow.Modify(ls_objectname[li_loop]+".text = '"+ls_translated_label+"'") // -------------------------------------------------------------------------------------------------------------- ELSEIF right(ls_objectname[li_loop],4) = '_myt' THEN ... // -------------------------------------------------------------------------------------------------------------- END IF NEXT
Et je bloque là...
Je ne parviens pas à récupérer le rapport en tant qu'objet, pour le manipuler ensuite. Je pourrais ainsi rappeler cette fonction sur lui, pour traduire ses controls.
Le but serai de pouvoir faire ce genre de choses, ou bien même rappeler la fonction de façon récursive :
string ls_my_description ls_my_description = ls_objectname[li_loop].describe('dataWindow.Objects')
Il y a bien [ ad_datawindow.describe(ls_objectname[li_loop]+'.name') ] qui me retourne "rpt_users_myt", mais ensuite je souhaite accéder à cet objet. Je me suis tourné vers GetChild() sans succès.
J'ai bien conscience qu'il s'agit probablement d'un problème basique, mais pourriez-vous m'aider s'il vous plait ?
Dernière modification par Nyphel (14-05-2008 17:50:58)
Hors ligne














je suppose que tu as essayé :
Integer li_ok DataWindowChild dwc_nested li_ok = ad_datawindow.GetChild( ls_objectname[li_loop], dwc_nested ) If li_ok = -1 Then MessageBox( 'Erreur', 'GetChild ' + ls_objectname[li_loop] )
Hors ligne





Oui, ce qui me retourne bien l'erreur :-/
Hors ligne





Puisque ça ne fonctionne pas dans ma fonction de traduction, je vais voir ce que je peux faire directement depuis ma sheet... Là où j'esssayais jusqu'alors d'accéder directement aux columns du rapport.
Integer li_ok DataWindowChild dwc_rpt_users li_ok = dw_print.GetChild("rpt_users_myt", dwc_rpt_users ) If li_ok = -1 Then MessageBox( 'GetChild', 'ERREUR : GetChild du rapport ') else MessageBox( 'GetChild', 'OK : GetChild du rapport ') string ls_description ls_description = dwc_rpt_users.describe('dataWindow.Objects') messagebox("Describe dwc_rpt_users", ls_description) end if
Cela échoue aussi.
Toutefois - dans le doute et à l'encontre de ce qui est spécifié dans la documentation - j'ai passé ma datawindow (dw_print) et mon report (rpt_users/rpt_users_myt) en "composite" au lieu de "form/tabular"... Et là ça fonctionne. Toutefois il est à noter que :
- ça ne fonctionne toujours pas si je fais mon GetChild directement dans ma fonction de traduction
- ça fonctionne si je laisse mon report en "form/tabular" (donc seul ma datawindow (dw_print) est passée en composite
Je vais donc poursuivre dans cette voie, et voir jsuqu'où je peux aller... Mais déjà ceci ne fonctionne pas :
guo_message.Event ue_my_translate_datawindow(dwc_rpt_users)
Error C0174: Type of actual parameter cannot be ancestor of formal reference parameter type.
Comme conseillé plus haut, je vais déclarer un second argument à ma fonction, pour lui passer du DataWindowChild... Voir même une nouvelle fonction recevant en paramètre directement un DataWindowChild plutôt qu'un DataWindow.
Cette solution semble fonctionner, j'en saurai un peu plus demain après les tests multi-machines.
Dernière modification par Nyphel (15-05-2008 10:09:32)
Hors ligne