Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
C'est Un user Event qui va trouver des solutions dans la table pour les proposé à l'utilisateur. Cela fonctionne comme la barre d'adresse d'IE ou Firefox...
La partie proposée est mise en surbrillance.
En éspérant que ca serve à quelqu'un.
Si on peut l'adapter sous forme de Fonction je veux bien qu'on m'explique !
Voila le code de l'event:
//------------------------------------------------------------------------------------- // FUNCTION: ue_propose_solution_dddw // // DESCRIPTION: Propose des solutions a l'utilisateur dans une DDDW // en fonction du texte déjà entré... // // VARIABLES: ls_colonne_parent_nom - nom de la colonne en cours dans la DW parent // ls_colonne_fils_nom - nom de la colonne en cours dans la DW fille // ls_colonne_fils_type - Type de valeur dans la DDDW en cours // ls_txt_utilisateur - Texte entré par l'utilisateur // ls_txt_trouve - Solution trouvé dans la table // ll_row - Ligne ou se trouve la 1ere solution trouvée // dwc_liste - Pointeur vers la DDDW visée // // RETURNS: // // AUTHOR: //------------------------------------------------------------------------------------- String ls_colonne_parent_nom,ls_colonne_fils_nom,ls_colonne_fils_type,ls_txt_utilisateur,ls_txt_trouve long ll_row DataWindowChild dwc_liste //Récupère le nom de la colonne courante ls_colonne_parent_nom = This.getcolumnname() //On vérifie que l'on est bien dans un DDDW IF dw_fiche_info.getChild(ls_colonne_parent_nom,dwc_liste)=1 THEN //Récupère le nom et le type de la colonne courante dans le DDDW ls_colonne_fils_nom = This.describe(ls_colonne_parent_nom + ".dddw.DisplayColumn") ls_colonne_fils_type = dwc_liste.describe(ls_colonne_fils_nom + ".coltype") //On ne traite que les DDDW de type "char" IF left(ls_colonne_fils_type,4)="char" THEN IF trim(This.GetText()) ="" THEN return //On récupère le texte entré par l'utilisateur - pas le texte en surbrillance ls_txt_utilisateur = trim(left(This.GetText(), len(This.GetText()) - This.selectedlength())) messagebox("cool","cool1") //On recherche le texte dans la DDDW ll_row=dwc_liste.Find( ls_colonne_fils_nom +" LIKE '" +ls_txt_utilisateur +"%'", 1, dwc_liste.RowCount()) //On va afficher la solution en mettant en surbrillance le texte proposé, permettant à l'utilisateur de modifier la partie proposée IF ll_row > 0 THEN ls_txt_trouve= dwc_liste.GetItemString(ll_row,ls_colonne_fils_nom) This.setText(ls_txt_trouve) This.SelectText(Len(ls_txt_utilisateur)+1, Len(ls_txt_trouve)) dwc_liste.scrolltorow (ll_row) dwc_liste.selectrow (ll_row,TRUE) END IF END IF END IF
Je l'utilise avec l'event d'ID pbm_dwnkey avec ce code :
IF Key <> KeyBack! AND Key <> keyEnter! THEN This.Event ue_propose_solution_dddw()
Voila un petit exemple de ce que ca donne, j'ai tapé "ISA" et la DDDW me propose "ISAAC ASIMOV" :
Dernière modification par Jmix90 (05-09-2006 12:15:32)
Hors ligne
Mais, tres bonne initiative !!!!!
Hors ligne
'lut
J'ai essayé ce petit bout de code et tout ne fonctionne pas comme il faudrait
Quand je saisis une lettre dans ma dropdown, j'ai bien le premier mot trouvé qui s'affiche et le reste des lettres qui est sélectionné mais le curseur se met à la fin du mot donc quand je saisis une nouvelle lettre, ça écrit à la fin du mot
Hors ligne
Jmix90 : cool, tres bonne idée et merci.
Steph, on attends ta correction
Dernière modification par shahin (03-10-2006 14:42:13)
Hors ligne
Ca doit venir du ID pbm_dwnkey que je pige pas
Est-ce qu'il faut affecter cet ID à l'événement "ue_propose_solution_dddw" ou utiliser un événement existant qui possède cet ID (comme key) ?
*** EDIT 1 ***
En fait, j'ai une fenêtre qui contient une datawindow et ma dropdown est dans cette datawindow. Et le seul événement avec l'ID pbm_dwnkey est le key sur la fenêtre mais je ne peux pas récupérer les lettres tapées sur la datawindow
*** EDIT 2 ***
Bon, j'ai crée un événement avec l'ID pbm_dwnkey mais ça marche toujours pas au top
Quand je lance l'appli en mode debug, ça marche bien mais dès que je lance en mode normal, ça déconne
Je saisis une lettre et rien ne se passe par contre si après je tape sur la flèche droite, le mot s'affiche.
Dernière modification par Steph (03-10-2006 15:43:02)
Hors ligne
Voici ma correction... A tester !
//------------------------------------------------------------------------------------- // FUNCTION: ue_propose_solution_dddw // // DESCRIPTION: Propose des solutions a l'utilisateur dans une DDDW // en fonction du texte déjà entré... // // VARIABLES: ls_colonne_parent_nom - nom de la colonne en cours dans la DW parent // ls_colonne_fils_nom - nom de la colonne en cours dans la DW fille // ls_colonne_fils_type - Type de valeur dans la DDDW en cours // ls_txt_utilisateur - Texte entré par l'utilisateur // ls_txt_trouve - Solution trouvé dans la table // ll_row - Ligne ou se trouve la 1ere solution trouvée // dwc_liste - Pointeur vers la DDDW visée // // RETURNS: // // AUTHOR: //------------------------------------------------------------------------------------- String ls_colonne_parent_nom,ls_colonne_fils_nom,ls_colonne_fils_type,ls_txt_utilisateur,ls_txt_trouve long ll_row DataWindowChild dwc_liste //Récupère le nom de la colonne courante ls_colonne_parent_nom = This.getcolumnname() //On vérifie que l'on est bien dans un DDDW IF this.getChild(ls_colonne_parent_nom,dwc_liste)=1 THEN //Récupère le nom et le type de la colonne courante dans le DDDW ls_colonne_fils_nom = This.describe(ls_colonne_parent_nom + ".dddw.DisplayColumn") ls_colonne_fils_type = dwc_liste.describe(ls_colonne_fils_nom + ".coltype") //On ne traite que les DDDW de type "char" IF left(ls_colonne_fils_type,4)="char" THEN IF trim(This.GetText()) ="" THEN return //On récupère le texte entré par l'utilisateur - pas le texte en surbrillance ls_txt_utilisateur = trim(left(This.GetText(), len(This.GetText()) - This.selectedlength())) //On recherche le texte dans la DDDW ll_row=dwc_liste.Find( ls_colonne_fils_nom +" LIKE '" +ls_txt_utilisateur +"%'", 1, dwc_liste.RowCount()) //On va afficher la solution en mettant en surbrillance le texte proposé, permettant à l'utilisateur de modifier la partie proposée IF ll_row > 0 THEN ls_txt_trouve= dwc_liste.GetItemString(ll_row,ls_colonne_fils_nom) This.setText(ls_txt_trouve) This.SelectText(Len(ls_txt_utilisateur)+1, Len(ls_txt_trouve)) dwc_liste.scrolltorow (ll_row) dwc_liste.selectrow (ll_row,TRUE) END IF END IF END IF
et dans l'evenement EDITCHANGED de la datawindow
integer li_asci FOR li_asci = 65 to 90 IF KeyDown(li_asci) THEN This.PostEvent ("ue_propose_solution_dddw") EXIT END IF NEXT FOR li_asci = 48 to 57 IF KeyDown(li_asci) THEN This.PostEvent ("ue_propose_solution_dddw") EXIT END IF NEXT IF keydown(keyNumPad0!) OR keydown(keyNumPad1!) OR keydown(keyNumPad2!) OR& keydown(keyNumPad3!) OR keydown(keyNumPad4!) OR keydown(keyNumPad5!) OR& keydown(keyNumPad6!) OR keydown(keyNumPad7!) OR keydown(keyNumPad8!) OR& keydown(keyNumPad9!) THEN This.PostEvent ("ue_propose_solution_dddw") END IF
Hors ligne
Marche pas mieux
Ce que je trouve bizarre c'est quand on tape la 2ème lettre, le programme entre 2 fois dans l'événement EDITCHANGED.
Le premier coup avec la 1ère lettre saisie et le deuxième coup avec le mot complet trouvé et on donc ça rajoute la 2ème lettre à la fin du mot
Est-ce qu'il existe une fonction PB permettant de transformer un int en sa représentation ascii ??
Genre 65 en A.
Hors ligne
bizarre, car ca marche tres bien chez moi...
autant sous pb6.5 que pb7
tu l'as fait sur une datawindow simple ou héritée ?
car s'il y a d'autres scripts, la...
Hors ligne
Hors ligne
essayes de faire le test sur une fenetre non héritée, et une datawindow non héritée.
moi,c'est ce que j'ai fait.
Hors ligne
Bon je dois rater quelque chose parce que ça n'a pas l'air de marche non plus
Quand je saisie la 1ère lettre, ça fonctionne mais dès la 2ème, ça m'affiche le 1er mot de la liste
Bon, je vais reprendre depuis le début.
*** EDIT ***
Le user event, il doit être mis où ? Dans la fenêtre ? dans la datawindow ? ...
Dernière modification par Steph (05-10-2006 14:42:23)
Hors ligne
dans la datawindow...
voila un exemple ici
comme ca, tu pourras voir par toi meme...
A++
Hors ligne
Merci
J'ai fait pareil mais ça marche toujours pas
Je sèche...tant pis
Hors ligne
ce qui voudrait dire que suivant les differentes versions de pb, ca ne reagit pas pareil ?
c'est fou ca !
si d'autres personnes peuvent confirmer avec leur version de powerbuilder... merci d'avance
Hors ligne
Je me suis p'tet mal exprimé mais avec ta fenêtre ça fonctionne bien.
Je dois avoir quelque chose qui pose problème dans ma datawindow.
Est-ce que le fait d'avoir 2 champs (le nom et l'identifiant) dans la requête de ma dropdown peut foutre le bordel ?
*** EDIT 1 ***
Dans ta fenêtre, au lieu d'appeler ta dropdown (dddw_nom), j'appelle la mienne et ça ne fonctionne pas. J'en déduis que soit ma dropdown est foireuse, soit le fait d'avoir 2 champs dans la requête pose problème.
*** EDIT 2 ***
J'ai refait une dropdown à partir de ma table mais avec un seul champ et ça fonctionne.
Donc , je confirme que ça ne fonctionne pas quand on a plusieurs champs dans la requête de la dropdown
Dernière modification par Steph (06-10-2006 08:49:15)
Hors ligne
je confirme que cela fonctionne bien !
je l'ai fait avec 2 champs.
Il faut juste que le champ soit un varchar() et nom un id.
mais dans la dddw, tu peux afficher plusieurs colonnes. ca ne pose pas de probleme.
comment est construit ta datawindow et la datawindow dddw ?
Hors ligne
La dddw est une requête simple (d_dddw_liste_produit) :
SELECT "DB_PRODUIT"."LB_LONG", "DB_PRODUIT"."IS_PRODUIT" FROM "DB_PRODUIT" ORDER BY "DB_PRODUIT"."LB_LONG" ASC
J'ai une table qui a l'IS_PRODUIT en clé secondaire.
Après j'ai créé une datawindow avec tous les champs de cette table et pour le champ produit, je fais une dropdown à partir de d_dddw_liste_produit et j'ai mis lb_long dans display column et is_produit dans data column.
Hors ligne
voila pourquoi ca ne fonctionne pas...
il faut que la jointure entre la colonne et la dddw soit un libellé char et non un id_long...
à ce qu'il me semble...
Hors ligne
Oui mais moi ma jointure ne se fait pas par un varchar...donc je vais pas pouvoir utiliser ce truc
Ou alors en trouvant une parade
En tout cas, merci de tes recherches.
Si t'étais pas l'admin, je t'aurais donné des pépites :D
Ca me parait bizarre quand même
Pourquoi ça marche bien avec la première lettre et pas avec les autres.
Je pense qu'il y a un autre problème, à partir de la 2ème lettre, il passe 2 fois dans l'événement et je pense que c'est ça qui fout la pagaille.
Dernière modification par Steph (06-10-2006 09:32:03)
Hors ligne
Bon, j'ai trouvé une bidouille qui à l'air de faire fonctionner le bordel avec ma dropdown
Donc, dans le EDITCHANGED de la datawindow :
Integer li_asci IF li_test = 1 THEN // Lettres A à Z FOR li_asci = 65 to 90 IF KeyDown(li_asci) THEN This.PostEvent ("ue_propose_solution_dddw") EXIT END IF NEXT // Chiffres 0 à 9 FOR li_asci = 48 to 57 IF KeyDown(li_asci) THEN This.PostEvent ("ue_propose_solution_dddw") EXIT END IF NEXT // Chiffres 0 à 9 du pavé numérique + caractères spéciaux (espace, -, *, (, ), +, /, ., ', ") IF KeyDown(KeyNumPad0!) OR KeyDown(KeyNumPad1!) OR KeyDown(KeyNumPad2!) OR & KeyDown(KeyNumPad3!) OR KeyDown(KeyNumPad4!) OR KeyDown(KeyNumPad5!) OR & KeyDown(KeyNumPad6!) OR KeyDown(KeyNumPad7!) OR KeyDown(KeyNumPad8!) OR & KeyDown(KeyNumPad9!) OR KeyDown(KeySpaceBar!) OR KeyDown(KeyDash!) OR & KeyDown(KeySubtract!) OR KeyDown(Key8!) OR KeyDown(KeyMultiply!) OR & KeyDown(Key0!) OR KeyDown(Key9!) OR KeyDown(KeyEqual!) OR & KeyDown(KeyAdd!) OR KeyDown(KeySlash!) OR KeyDown(KeyDivide!) OR & KeyDown(KeyPeriod!) OR KeyDown(KeyDecimal!) OR KeyDown(KeyQuote!) THEN This.PostEvent ("ue_propose_solution_dddw") END IF li_test = 2 END IF
Créer un événement sur la datawindow avec le EVENT ID : pbm_dwnkey et mettre
li_test = 1
L'événement ue_propose_solution_dddw est identique à la version de base (voir posts précédents)
Ne pas oublier de déclarer li_test dans les variables d'instances
Par contre, j'ai rajouté des caractères spéciaux pour la saisie mais la recherche ne fonctionnent pas pour certains et je trouve pas pourquoi :
* : celui près de la touche entrée (celui du pavé numérique fonctionne bien)
' : l'apostrophe
espace : quand je tape espace, le caractère n'est même pas ajouté dans le champ et donc on peut pas continuer la saisie.
Dernière modification par Steph (11-10-2006 15:25:55)
Hors ligne
Personne n'a une idée pour mes caractères qui ne fonctionnent pas ??
* : celui près de la touche entrée (celui du pavé numérique fonctionne bien)
' : l'apostrophe
espace : quand je tape espace, le caractère n'est même pas ajouté dans le champ et donc on peut pas continuer la saisie (sauf si on tape un autre caractère bien sûr ;))
Hors ligne
Il me semble qu'il existe un exemple de codage de ce genre, dans C:\Program Files\Sybase\PowerBuilder xxx\Code Examples\Example App
A toi de trouver le code....
Je ferai un peu de recherche, dès que j'aurai un peu plus de temps.
A+
Hors ligne
J'ai commencé à jeter un oeil mais pour le moment je trouve pas grand chose qui correspond.
Hors ligne
peut-etre "w_select_from_list" ?
Hors ligne
essayes cette solution !
importe ce fichier , c'est un user datawindow
$PBExportHeader$u_basedw.sru forward global type u_basedw from datawindow end type end forward type us_ddkeysrch from structure string textcol datawindowchild dw string srchcol string datacol string prevtext end type global type u_basedw from datawindow int Width=494 int Height=361 int TabOrder=1 boolean LiveScroll=true event ue_ddkeysrch pbm_custom01 event ue_dwnkey pbm_dwnkey end type global u_basedw u_basedw type variables Protected: us_ddkeysrch istr_ddkeysrch[] boolean ib_ddkeysrch = false integer ii_ddkeysrch_cnt end variables forward prototypes public subroutine uf_ddkeysrch () public subroutine uf_setddkeysrch (string vs_textcol, string vs_srchcol, string vs_datacol) end prototypes on ue_ddkeysrch;if ib_ddkeysrch then uf_DDKeySrch() end on on ue_dwnkey;this.PostEvent("ue_ddkeysrch") end on public subroutine uf_ddkeysrch ();string ls_col, ls_srch, ls_found integer li_idx, li_len long ll_row, ll_found date ld_found datetime ldt_found time lt_found Yield() /************************/ /* Ignore movement keys */ /************************/ CHOOSE CASE true CASE KeyDown(keyDelete!), KeyDown(keyBack!), KeyDown(keyTab!), KeyDown(keyEnter!) return CASE KeyDown(keyDownArrow!), KeyDown(keyUpArrow!), KeyDown(keyLeftArrow!), KeyDown(keyRightArrow!) return END CHOOSE /***************************************************************************************/ /* Since multiple columns could be setup for dynamic key searching, there is an array */ /* of the columns currently setup. Search the array for the entry that matches the */ /* current column. */ /***************************************************************************************/ ls_col = this.GetColumnName() FOR li_idx = 1 TO ii_ddkeysrch_cnt if istr_ddkeysrch[li_idx].textcol = ls_col then /******************************************************************/ /* Get the typed value from the edit box and find a match for it */ /* in the dropdown list. */ /******************************************************************/ ls_srch = Lower(this.GetText()) li_len = Len(ls_srch) if li_len < 1 then Return ll_row = istr_ddkeysrch[li_idx].dw.Find("lower(left(" & + istr_ddkeysrch[li_idx].srchcol + ", " + String(li_len) & + ")) = '" + ls_srch + "'", 1, istr_ddkeysrch[li_idx].dw.RowCount()) if ll_row < 1 then Return /*************************************************************************************/ /* Find the datatype of the data column in the dddw. Use the correct GetItem... call */ /* to retrieve the value and then use SetText to place it in the edit box. */ /*************************************************************************************/ CHOOSE CASE True CASE Left(istr_ddkeysrch[li_idx].dw.Describe(istr_ddkeysrch[li_idx].datacol + ".coltype"), 4) = "char" ls_found = istr_ddkeysrch[li_idx].dw.GetItemString(ll_row, istr_ddkeysrch[li_idx].datacol) this.SetText(ls_found) CASE istr_ddkeysrch[li_idx].dw.Describe (istr_ddkeysrch[li_idx].datacol + ".coltype") = "number" ll_found = istr_ddkeysrch[li_idx].dw.GetItemNumber(ll_row, istr_ddkeysrch[li_idx].datacol) this.SetText(String (ll_found)) CASE istr_ddkeysrch[li_idx].dw.Describe (istr_ddkeysrch[li_idx].datacol + ".coltype") = "date" ld_found = istr_ddkeysrch[li_idx].dw.GetItemDate(ll_row, istr_ddkeysrch[li_idx].datacol) this.SetText(String (ld_found)) CASE istr_ddkeysrch[li_idx].dw.Describe (istr_ddkeysrch[li_idx].datacol + ".coltype") = "datetime" ldt_found = istr_ddkeysrch[li_idx].dw.GetItemDateTime(ll_row, istr_ddkeysrch[li_idx].datacol) this.SetText(String (ldt_found)) CASE istr_ddkeysrch[li_idx].dw.Describe (istr_ddkeysrch[li_idx].datacol + ".coltype") = "time" lt_found = istr_ddkeysrch[li_idx].dw.GetItemTime(ll_row, istr_ddkeysrch[li_idx].datacol) this.SetText(String (lt_found)) END CHOOSE /***********************************************************************************/ /* Select the text from the current position to the end. */ /* The next keystroke will erase the selection and substitute the typed character. */ /***********************************************************************************/ This.SelectText(li_Len + 1, 150) EXIT end if NEXT end subroutine public subroutine uf_setddkeysrch (string vs_textcol, string vs_srchcol, string vs_datacol);ib_ddkeysrch = true ii_ddkeysrch_cnt++ /*********************************************************************/ /* Add an entry to the array of columns that are currently setup */ /* for dynamic key searching. Obtain a pointer to the child */ /* datawindow of the column and set the transaction object for it. */ /* Also keep track of the search column and data column so we */ /* know which columns to search and retrieve when a value is typed. */ /*********************************************************************/ istr_ddkeysrch[ii_ddkeysrch_cnt].textcol = vs_textcol this.GetChild(vs_textcol, istr_ddkeysrch[ii_ddkeysrch_cnt].dw) istr_ddkeysrch[ii_ddkeysrch_cnt].dw.SetTransObject(SQLCA) istr_ddkeysrch[ii_ddkeysrch_cnt].srchcol = vs_srchcol istr_ddkeysrch[ii_ddkeysrch_cnt].datacol = vs_datacol end subroutine
Apres, tu herites cet objet datawindow dans ta fenetre.
pour le branchement, tu mets ca au constructor :
uf_SetDDKeySrch("nom_de_ta_colonne", "nom_de_ta_colonne_dddw", "nom_de_ta_colonne_dddwdisplay")
Dis moi si ca fonctionne bien...
ce script vient de http://stanner.com/pitstop
Hors ligne
Pages: 1