Le forum (ô combien francophone) des utilisateurs de Powerbuilder.





Bonjour,
Je dispose d'une fenêtre de type response dans laquelle j'ai une datawindow.
Lors de son ouverture, je fais un retrieve (procédure stockée) pour afficher le contenu de ma datawindow.
Problème : je décide de n'ouvrir ma fenêtre que si il y a du contenu à afficher.
J'ai d'abord voulu la masquer à l'ouverture, et l'afficher si il y avait du contenu...
Mais j'ai alors un soucis : cette fenêtre s'ouvre quand mon utilisateur clic sur le bouton de soumission d'un formulaire de création de compte, et elle lui indique les compte similaires déjà existants. Si l'utilisateur reste appuyé sur la touche ENTER, alors ma fenêtre s'ouvre et - même si elle se masque tout seule - elle reçoit un ENTER elle aussi... Ce qui va entrainer des traitements non désirés.
Nouvelle solution : avant d'ouvrir ma fenêtre, je créée un datastore qui va vérifier en base si il y aura quelque chose à afficher. Dès lors je n'ouvre ma fenêtre que si nécessaire. Si j'ouvre ma fenêtre, cette dernière fait son retrieve().
Nouveau problème : j'ai effectué 2 fois la même requête... 1 fois pour savoir si elle retournerait quelque chose, 1 fois pour afficher les données.
datastore lds_search_name lds_search_name = create datastore lds_search_name.dataobject = 'd_search_name' lds_search_name.SetTransObject(SQLCA ) lds_search_name.Retrieve(ll_null, ls_account_owner_name, ls_account_owner_address, ls_account_owner_postalcode) IF (lds_search_name.rowcount() > 0) THEN OpenWithParm(lw_response_similar_accounts, ref lstr_account, calling_window) END IF
Comment puis-je donc passer mon datastore à ma fenêtre, pour que cette dernière remplisse sa datawindow avec, sachant que je lui passe déjà une structure de données ?
Ma structure de données ne gère pas les datastores, je suis donc bien ennuyé.
J'ai essayé de passer par un event :
- création d'un event set_datastore(ref mon_datastore) dans ma fenêtre à afficher
- appel de l'event :
OpenWithParm(lw_response_similar_accounts, ref lstr_account, calling_window) lw_response_similar_accounts.Post dynamic Event set_datastore(ref lds_search_name)
Hormis le fait que j'ai des erreurs, le problème c'est que mon event n'est envoyé que lorsque ma fenêtre est fermée (Ok/Cancel). Il est trop tard, il faut que mon datastore soit transmis dès l'ouverture pour que je puisse m'en servir ;).
J'ai entendu parler d'une solution visant à déclarer un UserObject sans interface, dans lequel je mettrais mon datastore en variable d'instance, de même que ma structure de données. Ensuite je passerais le UserObject en paramètre à la fenêtre.
2 problèmes :
- 1 ça devient un peu tordu ! ma fenêtre de compte fera appel à mon UO, qui fera appel à un autre UO pour le passer en paramètre à une fenêtre
- 2 il m'a été signifié que c'était sortir l'artillerie lourde pour bien peu de choses et que ca allait alourdir la structure du projet
Je souhaite donc éviter cette solution ;)
Auriez-vous un conseil ?
Merci d'avance, et désolé pour le pavé.
Dernière modification par Nyphel (25-07-2008 16:24:58)
Hors ligne
c'est quoi le nom de ta fenetre ? calling_window ?

Hors ligne





J'ai ma fenêtre de création de compte, nommé "w_response_new_account".
Quand je clic sur OK, j'utilise un UserObject qui contrôle la validité des champs saisis et vérifie qu'un compte similaire n'existe pas déjà. Ce UserObject c'est "uo_data_new_account".
La fenêtre qui me pose alors soucis, celle que j'affiche depuis mon UserObject pour informer l'utilisateur qu'il y a déjà des comptes similaires enregistrés, c'est "w_response_similar_accounts".
En pratique ca donne donc ceci :
w_response_new_account -----ok-----> uo_data_new_account -----open-----> w_response_similar_accounts -----> OK/CANCEL
"calling_window" c'est donc une référence sur "w_response_new_account" que je transmets à "w_response_similar_accounts".
Comme les 2 fenêtres sont de types response, ça permet à Pb de gérer les focus.
Hors ligne
ta datastore, tu ne peux pas la declarer en variable d'instance ?
en locale, elle est detruite...

Hors ligne





Oui ça fonctionnera surement mieux, mais ça ne résoudra pas le problème
Hors ligne
le but est d'avoir la main sur ta fenetre principale depuis ta fenetre response. apres, tu en fais ce que tu veux de tes données.

Hors ligne





Je ne comprends rien :-o
Hors ligne














si ta DS est en instance dans w_response_new_account, p.ex ids_search_name
pour y accéder dans w_response_similar_accounts il te suffit de faire calling_window.ids_search_name
Hors ligne





Oooooh ! D'accord ! Je ne savais pas que les variables d'instances étaient visibles depuis les objets enfants !
Oui ca résoudrait vraiment tous les problèmes, j'essaie ça immédiatement et je vous tiens informés.
Merci à vous, une fois encore ;)
Hors ligne














oui si la variable est définie en PUBLIC (ce qui est le cas par défaut)
attention, ça n'est pas très orienté programmation objet tout ça
d'aucuns te diront qu'il vaut mieux déclarer la variable en PRIVATE et de faire un getter PUBLIC of_get_datastore() qui retourne la DS
Hors ligne





Oui je ferai un getter() par la suite, lorsque ça fonctionnera bien ;)
Mais pour le moment ça ne fonctionne pas et voici comment je m'y prends :
Déclaration du datastore en instance, dans ma fenêtre du formulaire : "w_sheet_response_account"
public datastore ids_search_name
Lorsque l'on clique sur OK pour soumettre le formulaire de création de compte dans : "w_response_new_account"
Appel du UserObject qui possède les events de contrôle des données/contraintes :
uo_data_new_account luo_data_new_account luo_data_new_account.Event ue_ckeck_address(dw_new_account, this)
Les paramètres sont : la datawindow du formulaire, la fenêtre response elle-même.
Dans l'event de mon UserObject : "uo_data_new_account"
ue_ckeck_address(ref datawindow adw_datawindow, window calling_window)
calling_window.ids_search_name = create datastore calling_window.ids_search_name.dataobject = 'd_search_name' calling_window.ids_search_name.SetTransObject(SQLCA ) calling_window.ids_search_name.Retrieve(ll_null, ls_account_owner_name, ls_account_owner_address, ls_account_owner_postalcode)
Donc là j'essaie de faire en sorte que mon UO puisse utiliser le datastore.
Ensuite je devrai transmettre ce datastore à la fenêtre ouverte par mon UO : "w_response_similar_accounts"
Problème : dans mon UserObject il n'apprécie pas les références au datastore :
"Incompatible property ids_search_name" for type window."
Ais-je fait quelque chose de travers ?
Hors ligne














je suppose que ton calling_window est déclaré en Window
or il faut le déclarer en w_response_similar_accounts si tu veux accéder à ses variables d'instance
Hors ligne





Le painter ne le permettant pas, j'ai directement éditer le code source pour faire la modification.
Maintenant mon message d'erreur est le suivant :
"Incompatible property ids_search_name" for type w_response_similar_accounts."
:-/
Hors ligne














DS déclaré dans w_sheet_response_account (vs w_response_similar_accounts)...
Hors ligne





o_O
Je suis confus, mille excuses... Et le pire c'est que je bataille depuis tout à l'heure sans voir la chose -_-'
Du coup cela fonctionne et mon UO voit bien le datastore. Je vais maintenant tenter de le faire voir à la fenêtre qu'il ouvre.
Encore merci pour votre patience ;)
J'ai pu modifier ma structure de données qui lie mon UO ("uo_data_new_account") et ma fenêtre ("w_response_similar_accounts") pour y déclarer un objet de type "w_response_new_account".
A partir de là tout fonctionne parfaitement.
Il ne me reste plus qu'à traiter mon datastore pour afficher les données dans la datawindow
Merci pour vos conseils, votre aide et votre patience : ce fut très instructif !
Dernière modification par Nyphel (25-07-2008 16:24:41)
Hors ligne