Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
J'aimerais ajouter un contrôle DropDownListBox indépendant dans un DataWindow FreeForm.
Je n'arrive pas à ajouter un contrôle directement alors j'ai copier/coller un autre contrôle Text que je modifie avec Edit > Style Type > DropDownListBox et j'ai ajouté une liste de valeurs. Le problème c'est qu'il est lié aux données, j'aimerais faire la même chose mais qu'il ne soit pas lié aux données du DW.
D'avance merci.
PS: C'est mon premier post sur ce forum alors un peu d'indulgence avec mon ignorance ;-)
Fab
Dernière modification par thefab (25-09-2008 11:22:04)
Hors ligne
Bonjour et
En passant par une pseudo-colonne, ça devrait marcher tout seul:
Dans la source de ta datawindow (bouton SQL):
SELECT ID_COLUMN, LIB_COLUMN, '' AS MY_DDLBOX // Pseudo-colonne FROM MY_TABLE
Ensuite, il ne te reste plus qu'à appliquer la valeur "Dropdownlistbox" à la propriété "Edit" de ta pseudo-colonne.
Hors ligne
Salut foon,
Merci pour ta réponse rapide, mais c'est mon premier dev en PB: heu c'est quoi une pseudo-colonne ?
J'ai essayé d'ajouter une colonne mais ça me demande de choisir un champs de la base de données...
Hors ligne
Voir mon post ci-dessus. Il faut que tu passes en mode "syntaxe" (par défaut, tu es en mode "graphique") pour pouvoir afficher et modifier le SQL directement.
Hors ligne
Note que le type de la pseudo-colonne générée est dépendant du type de la valeur initiale assignée dans le SQL à cette pseudo-colonne.
Dans mon exemple, la valeur assignée étant une chaîne de caractères vide, la pseudo-colonne est reconnues comme étant de type string par PB.
Pour un type numérique, il aurait fallu faire la déclaration suivante (par exemple):
SELECT ID_COLUMN, LIB_COLUMN, 0 AS MY_DDLBOX // Pseudo-colonne de type numérique FROM MY_TABLE
Même remarque pour les autres types... (Il existe différents exemples sur ce forum)
Hors ligne
Re,
Ok je vois l'idée mais je ne peux pas éditer mon SQL. Je n'arrive pas à lui ajouter des colonnes il a l'air d'être en lecture seule ?
Hors ligne
Et en mode "graphique", tu arrives à modifier ta requête?
Tu es sur quelle version de PB, quel SGBD, quel mode de connection à la base de données utilises-tu (Natif, ODBC...)?
Hors ligne
thefab a écrit:
Re,
Ok je vois l'idée mais je ne peux pas éditer mon SQL. Je n'arrive pas à lui ajouter des colonnes il a l'air d'être en lecture seule ?
Attention, es-tu sur d'être bien en mode syntaxe? Parce que souvent j'ai des collegues qui croient l'être et me disent que leur DW est en lecture seule, alors qu'il sont en mode graphique, sur l'onglet SQL... Menu Design->Syntax, ou quelque chose comme ca...
Hors ligne
Je suis passé en mode syntaxe et j'ai ma pseudo-colonne maintenant, merci.
Maintenant comment je récupère l'élément sélectionné de la liste ?
// OK MessageBox("firstname", dw_contacts.GetItemString(1, "firstname")) // Ne trouve pas le champs MessageBox("filter", dw_contacts.GetItemString(1, "filter"))
PB 10
SQL Server 2008 Express Edition
Connection ODBC
NB :
Hors ligne
Tu as bien pensé à faire un AcceptText avant ton GetItemString sur ta pseudo-colonne?
Hors ligne
Merci,
Tout fonctionne à présent, je ne doit pas utiliser GetItemString() mais GetItemNumber() car c'est une valeur numérique dans mon SQL
SELECT contact.id, contact.firstname, contact.lastname, 0 as filter FROM contact
Ça me retourne bien la valeur sélectionnée dans le DDLB
MessageBox("filter", String(dw_contacts.GetItemNumber(1, "filter")))
Un grand merci !
Fab
Hors ligne
Bonjour,
J'aimerais faire la même chose mais depuis une procédure stockée à présent !
Du coup je ne peux plus passer en mode SQL (il est désactivé), ni en mode syntaxe, je ne peux donc plus ajouter ma pseudo-colonne.
Edit: Est-ce que je peux ajouter ma pseudo-colonne dans "Column Specification", c'est bien la liste des champs disponibles dans le DW ?
J'aimerais pourtant simplement ajouter un contrôle DDLB sur un DW mais il n'apparaît pas dans la liste des contrôles ???
D'avance merci
PB 9 cette fois
Dernière modification par thefab (26-09-2008 06:44:28)
Hors ligne
Il faut ajouter la pseudo colonne dans le select de ta procedure stockée, ainsi que dans le curseur retourné si tu en retourne un.
Ensuite tu vas de nouveau sous l'onglet SQL ou COLUMNS de ta datawindow, et tu ajoute une colonne (clic-droit -> add). Ta nouvelle colonne doit pointer sur celle ajoutée dans la procédure stockée (même position dans la liste des colonnes), et ça devrait fonctionner
Si tu te contente d'ajouter la colonne sous Pb, et pas dans ta procédure stockée, je pense que ça fonctionnera aussi... Jusqu'au jour où ta procédure stockée sera modifiée (par exemple en ajoutant une colonne). Pour qu'il n'y aie pas d'ambiguïté, il est préférable de prendre la peine de l'ajouter dans ta procédure stockée aussi ;)
Une fois qu'une colonne est ajoutée sous Pb, tu peux ensuite la "dessiner" dans l'onglet "Design" de ta datawindow. L'inverse n'est pas possible !
Quand tu ajoute une colonne dans l'onglet COLUMS SPECIFICATIONS, le champ n'est pas automatiquement dessiné (en fait ce dépend du type de datawindow et de requête, mais bon...). Ça te permet d'avoir 10 colonnes, mais seulement 2 d'affichées par exemple.
Dernière modification par Nyphel (26-09-2008 07:19:48)
Hors ligne
Merci Nyphel.
Bon j'aurai quand même voulu éviter de devoir réécrire la procédure stockée juste pour ajouter une liste déroulante qui ne fait même pas partie des données...
C'est quand même assez hallucinant que l'on ne puisse pas ajouter simplement un contrôle indépendant dans un DW ! (pas de débat, merci)
J'ai ajouté une colonne en plus dans l'onglet COLUMS SPECIFICATIONS, j'ai ajouté un contrôle lié sur le DW, nickel ça fonctionne bien...
Mais (il y a toujours un mais) j'ai un autre DW (master/detail) basé sur la même procédure qui ne fonctionne plus lui !!! Grrr, j'ai essayé de lui ajouter aussi cette colonne supplémentaire mais il n'aime pas du tout (bizarre...)
Fab
Hors ligne
Il y a un truc que j'ai remarqué avec l'onglet COLUMNS SPECIFICATION : l'ordre des colonnes doit être exactement le même que l'ordre des colonnes retournées par ta procédure stockée. Il faut donc oublier les "Select * from..." ;).
Si jamais tu as 10 colonnes et que tu en ajoute une nouvelle en position 5, alors la plupart du temps il faut supprimer les colonnes 5-6-7-8-9-10, ajouter ta colonne en position 5 et rajouter de nouveau tes anciennes colonnes en positions 6-7-8-9-10-11... Ce qui est très contraignant, car quand tu supprime une colonne, les control associé est supprimé lui aussi dans l'onglet DESIGN !
Hors ligne
thefab a écrit:
J'ai ajouté une colonne en plus dans l'onglet COLUMS SPECIFICATIONS, j'ai ajouté un contrôle lié sur le DW, nickel ça fonctionne bien...
Mais (il y a toujours un mais) j'ai un autre DW (master/detail) basé sur la même procédure qui ne fonctionne plus lui !!! Grrr, j'ai essayé de lui ajouter aussi cette colonne supplémentaire mais il n'aime pas du tout (bizarre...)
Fab
Problème de Sharedata lié au fait que tes colonnes ne sont pas identiques entre la master et la détail. Je te conseille de faire un sous PB à propos du sharedata, et de consulter les nombreux posts à ce sujet sur le forum.
Hors ligne
Salut,
Nyphel: oui effectivement c'est assez contraignant...
foon: non ce n'est pas ça le problème car ce ne sont pas des donnés partagées (à confirmer) et j'ai bien ajouter la même colonne dans les 2 DW !
En tout cas merci pour vos précieux conseils.
Fab
Hors ligne
Bonjour,
J'ai suivi les conseils de Nyphel et j'ai ajouté un paramètre supplémentaire a ma procédure stockée ainsi qu'un champs de plus a mon select de retour. Mais comment lui dire de passer ce paramètre maintenant ? Lorsque j'exécute le code il me dit que 46 paramètres sont attendus mais seulement 45 sont fournis: ou est fait le lien entre les noms des paramètres et les noms des contrôles de la fenêtre ?
Exemple: mon paramètre de la SP s'appelle @p_filtre et mon contrôle sur la fenêtre s'appelle filtre
Hors ligne
Je ne comprends pas bien pourquoi tu veux ajouter un paramètre à la procédure, m'enfin bon...
Si tu en as ajouté un à la procédure, il faut en effet l'ajouter à ta datawindow sous PowerBuilder : columns specifications -> clic-droit -> stored procedure -> arguments -> add
Ensuite tu ajoutes aussi ce paramètre lorsque tu appelles le retrieve sur ta datawindow, depuis la fenêtre qui contient cette datawindow : ma_datawindow.retrieve(parm1, parm2, ..., parm45, parm46)
Dernière modification par Nyphel (01-10-2008 10:35:26)
Hors ligne
Nyphel a écrit:
Je ne comprends pas bien pourquoi tu veux ajouter un paramètre à la procédure, m'enfin bon...
Parce que c'est toi qui me l'a conseillé :-) mais surtout car j'en ai besoin
Nyphel a écrit:
ma_datawindow.retrieve(parm1, parm2, ..., parm45, parm46)...
Oui, après coup je me suis rendu compte que ma question était totalement stupide, si si...Maintenant il me dit: an illegal value of 50 given for parameter item, je passe 46 paramètres et je reçois 50 champs, je pense qu'il y a une erreur sur le dernier champs mais quoi ?? de quoi ça peut venir car le type de données est correct.
Le type est correct mais pas l'ordre, il m'a pas ajouté le dernier paramètre en dernière position !! Donc les paramètres 49 et 50 sont intervertis dans la vue master et detail, grrrr.
Merci d'avance
Dernière modification par thefab (01-10-2008 11:36:22)
Hors ligne
Heu non non... Il ne sert à rien d'ajouter un paramètre pour afficher une colonne virtuelle
il m'a pas ajouté le dernier paramètre en dernière position
Qui ça "il" ? Tu n'est pas en procédure stockée ?
En tous cas il est important de restaurer le bon ordre, même si c'est contraignant à faire :-/
Hors ligne
Nyphel a écrit:
Heu non non... Il ne sert à rien d'ajouter un paramètre pour afficher une colonne virtuelle
Oui mais du coup c'est plus une colonne virtuelle vu qu'elle se trouve dans le resultat du select.
En fait c'est un paramètre que je passe à la procédure stockée mais que je retourne aussi dans le jeu de résultats.
Nyphel a écrit:
Qui ça "il" ? Tu n'est pas en procédure stockée ?
Ben PB tiens ;-) j'ai ajouté une colonne Insert Row au lieu d'ajouter Append Row ce qui fait que ma colonne a été ajoutée ou je me trouvais, càd pas à la fin... evidement !
Nyphel a écrit:
En tous cas il est important de restaurer le bon ordre, même si c'est contraignant à faire :-/
Oui dommage car c'est vraiment contraignant.
Bon cette fois le problème est vraiment résolu, merci beaucoup... jusqu'à la prochaine ;-)
Hors ligne