Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous... et vive l'été
Alors... j'ai un léger contretemps et je viens vers vous, oui vous devant votre écran, pour m'aider (ou essayer) ;)
Donc, revenons-en à mes moutons... je m'égare, je m'égare, foufou que je suis !
J'ai donc un joli bout de code que j'aimerai optimiser...
J'ai une fonction à laquelle je passe 2 paramètres : le nom d'une propriété et un indice. Et je souhaite savoir si la propriété de ma structure globale est nulle :
boolean lb_retour lb_retour = false if trim(gstruct_maStructure[alIndice].asChamp) <> "" then lb_retour = true end if return lb_retour
Hélas, cela ne convient guère à PB qui ose m'insulter après de si nombreuses et joyeuses lignes de codes fournies !
Qu'ai-je donc fait pour mériter son mépris ?
Merci d'avance et portez-vous bien ! (Vale bien pour les Latins)
Hors ligne
Tu n'as pas publié le prototype de ta fonction.
Mais si j'ai bien compris, si tu passes "x" dans asChamp tu voudrais accéder à tastructure[tonindice].x ?
Ca n'est pas possible en pb de base.
Par contre ça l'est via CWGetField(), une fonction de l'extension PbniCW chez moi
Hors ligne
Bonjour,
Ou alors, de façon indigeste :
CHOOSE CASE as_champ CASE "as_param1" IF trim(gstruct_maStructure[alIndice].as_param1) <> "" THEN lb_retour = true CASE "as_param2" IF trim(gstruct_maStructure[alIndice].as_param2) <> "" THEN lb_retour = true END CHOOSE
Hors ligne
Ah oui, c'est comme cela qu'on faisait avant que xlat ne code CWGetField.
C'est assez lourd à maintenir (il faut penser à modifier le code chaque fois qu'on modifie la structure) mais ça peut être une solution acceptable ne nécessitant aucune extension.
Hors ligne
Une autre méthode pour compléter serait de décrire la structure dans un datastore, puis d'alimenter la datastore par la structure.
Datawindow Reference / Accessing Data in Code / Techniques for accessing data / About DataWindow data expressions / Getting and storing the data from a DataWindow data expression
F1 a écrit:
...
A structure that matches DataWindow columns In this example, a DataWindow object has four columns:
An ID (number)
A name (string)
A retired status (boolean)
A birth date (date)
A structure to hold these values has been defined in the Structure painter. It is named str_empdata and has four elements whose datatypes are integer, string, boolean, and date. To store the values of an expression that accesses some or all the rows, you need an array of str_empdata structures to hold the data:
str_empdata lstr_currdata[]
lstr_currdata = dw_1.Object.Data
After this example executes, the upper bound of the array of structures, which is variable-size, is equal to the number of rows in the DataWindow control.
...
J'ai testé çà fonctionne (sauf que j'ai pas réussi à mappé le type boolean en datawindow, si quelqu'un sait!)
çà pourrait donner çà :
boolean lb_retour lb_retour = false datastore lds lds = create datastore lds.dataobject = "dw_mastructure" //il faut la définir avec les colonnes dans le bon order et bon type de données lds.insertrow(0) lds.object.data[1] = gstruct_maStructure[alIndice] if trim(lds.GetItemString( 1, asChamp)) <> "" then lb_retour = true end if destroy lds return lb_retour
le truc avec cette méthode c'est le GetItemXXX sur la datastore; il faudrait par exemple se coder un GetItemAny( row, column ) { return object.data[row, long(describe(column+".id"))] } sur un heritier de datastore par exemple.
Hors ligne
(sauf que j'ai pas réussi à mappé le type boolean en datawindow, si quelqu'un sait!)
En SQL, ce qui se rapproche le plus serait le type BIT [NULL, 0, 1] mais il faut bien gérer le NULL.
Cela correspond au type Number dans les datawindows.
Pour les checkbox ( Checked = 1 [True] et UnChecked = 0 [False])
Lorsque nous en avons besoin de boolean dans les scripts, nous effectuons la convertion avec 2 functions :
global type f_bittoboolean from function_object end type forward prototypes global function boolean f_bittoboolean (any aa_value) end prototypes global function boolean f_bittoboolean (any aa_value);boolean lb_return if isnull(aa_value) then setnull(lb_return) else if integer(aa_value) = 0 then lb_return = false else lb_return = true end if end if return lb_return end function
global type f_booleantobit from function_object end type forward prototypes global function integer f_booleantobit (boolean ab_value) end prototypes global function integer f_booleantobit (boolean ab_value);integer li_return if isnull(ab_value) then setnull(li_return) else if ab_value = true then li_return = 1 else li_return = 0 end if end if return li_return end function
Il faut également utiliser le paramètre de connexion à la BdD "StaticBind=0"
C'est ce que nous utilisons mais il y a peut-être mieux.
Dernière modification par arkiane (05-07-2012 13:17:57)
Hors ligne
arkiane a écrit:
(sauf que j'ai pas réussi à mappé le type boolean en datawindow, si quelqu'un sait!)
En SQL, ce qui se rapproche le plus serait le type BIT [NULL, 0, 1] mais il faut bien gérer le NULL.
Cela correspond au type Number dans les datawindows.
...
Oui mais j'ai déjà tenté ma chance avec le type number pour le champ boolean et la *magie* de powerbuilder fait que l'exemple fournit dans la doc plante en runtime au moment de faire l'affectation :
lds.object.data[1] = gstruct_maStructure[alIndice]
Hors ligne