Page 1 sur 1

Afficher data à partir de la saisie

Publié : mer. 25/mai/2016 12:23
par omega
Bonjour

Je souhaiterais afficher la liste des clients sur une grille au fur et à mesure que l'utilisateur saisit le mot clé caractère par caractère.
Exemple : Dès que l'utilisateur commence à saisir le texte : (en commençant par la lettre P par exemple) alors toute la liste des clients commençant par P sera affichée, ensuite dès que l'utilisateur ajoute le caractère suivant (la lettre A par exemple), c'est la liste commençant par PA qui sera affichée ect jusqu'à ce que l'utilisateur sélectionne sur la grille le client qui l'intéresse, je ne connais pas l'évènement qui fera ça. J'ai essayé ceci:

Code : Tout sélectionner

Enumeration
#WinSelCF
#SelCF_Grid
#Winstock
;Livraisons-------------------------------------------------------
#fbl_Titre
#fbl_FrameDoc
#fbl_new
#fbl_TxtNumDoc
#fbl_NumDoc
#fbl_selNumDoc
#fbl_TxtDate
#fbl_Date
#fbl_selDate
#fbl_TxtBc
#fbl_Bc
#fbl_TxtDocSource
#fbl_DocSource
#fbl_TxtCF
#fbl_Cf
#fbl_selCf
#fbl_FrameMaj
#fbl_TxtFam
#fbl_Fam
#fbl_selFam
#fbl_TxtRef
#fbl_Ref
#fbl_selRef
#fbl_TxtProd
#fbl_Prod
#fbl_selProd
#fbl_TxtUm
#fbl_Um
#fbl_selUm
#fbl_TxtQte
#fbl_Qte
#fbl_TxtPu
#fbl_Pu
#fbl_TxtMnt
#fbl_Mnt
#fbl_Valider
#fbl_Supprimer
#fbl_Imprimer
#fbl_AnnulerDoc
#fbl_grid
#fbl_FrameTotal
#fbl_TxtHT
#fbl_HT
#fbl_TxtFrais
#fbl_Frais
#fbl_TxtRemise
#fbl_Remise
#fbl_TxtTTC
#fbl_TTC
#fbl_FrameVer
#fbl_TxtModep
#fbl_Modep
#fbl_CheckEsp
#fbl_CheckCheq
#fbl_CheckVir
#fbl_Checkaterme
#fbl_FrameChauf
#fbl_FrameCamion
#fbl_Framemat
#fbl_Chauf
#fbl_Camion
#fbl_Mat
#fbl_selChauf
#fbl_selCamion
#fbl_selmat
#fbl_FrameStock
#fbl_StockDisp
#fbl_Pmp
#fbl_EnregistrerDoc
endEnumeration

Procedure AfficherGridSelCF()
OpenWindow(#WinSelCF, 0,0, 500, 200, "Sélectionnez un client-fournisseur",#PB_Window_SystemMenu |#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#WinSelCF))
   wrow=20
   ListIconGadget(#SelCF_Grid, 10, wrow, 480, 180, "Code", 40, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
   AddGadgetColumn(#SelCF_Grid,1, "Client - fournisseur", 200)
   AddGadgetColumn(#SelCF_Grid,2, "Adresse", 100)
   AddGadgetColumn(#SelCF_Grid,3, "Rc", 100)
   AddGadgetColumn(#SelCF_Grid,4, "MF", 100)
   AddGadgetColumn(#SelCF_Grid,5, "ART",100)
   AddGadgetColumn(#SelCF_Grid,6, "NIS",100)
EndIf

;Remplir le grid en fonction des caractères saisis
input$=UCase(input$)
wtaille=Len(input$)
sql="select * from fcf order by cf"
CheckDatabaseQuery(idcf,sql)
While NextDatabaseRow(idcf)
  codecf$=GetDatabaseString(idcf,0)
  cf$=UCase(GetDatabaseString(idcf,1))
  ad$=UCase(GetDatabaseString(idcf,2))
  rc$=UCase(GetDatabaseString(idcf,4))
  mf$=UCase(GetDatabaseString(idcf,5))
  art$=UCase(GetDatabaseString(idcf,6))
  nis$=UCase(GetDatabaseString(idcf,7))
  If (Left(cf$,wtaille) = input$)
     AddGadgetItem(#SelCf_grid,-1,codecf$+Chr(10)+cf$+Chr(10)+ad$+Chr(10)+rc$+Chr(10)+mf$+Chr(10)+art$+Chr(10)+nis$)
  EndIf
Wend
     
wquitSelCF=0
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
   Select EventGadget()
   Case #SelCf_grid
         wrow=GetGadgetState(#SelCf_grid)
         If wrow>=0 And wrow<CountGadgetItems(#SelCf_grid)
            codecf$=GetGadgetItemText(#SelCf_grid,wrow,0) 
            cf$=GetGadgetItemText(#SelCf_grid,wrow,1) 
            ad$=GetGadgetItemText(#SelCf_grid,wrow,2) 
            rc$=GetGadgetItemText(#SelCf_grid,wrow,3) 
            mf$=GetGadgetItemText(#SelCf_grid,wrow,4) 
            art$=GetGadgetItemText(#SelCf_grid,wrow,5) 
            nis$=GetGadgetItemText(#SelCf_grid,wrow,6) 
            SetGadgetText(#fbl_cf,cf$)
            wquitSelCF=1
       endif
   EndSelect
EndIf   
Until wquitSelCF=1
CloseWindow(#winSelCF)
EndProcedure

Procedure Run_stock()
quitWinstock=0
wMask$=FormatDate("%dd/%mm/%yyyy", Date())
date$=wMask$
ExamineDesktops()
Wlargeur=DesktopWidth(0)
Whauteur=DesktopHeight(0)
OpenWindow(#Winstock, 0,0,0,0, "Logiciel de gestion commerciale - stocks", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_Maximize)
WLar=Wlargeur-50:WHaut=Whauteur-100 
If CreateGadgetList(WindowID(#Winstock))
   PanelGadget(#Panel, 10,10, WLar, WHaut)
   AddGadgetItem (#Panel, -1, " LIVRAISON ");***************************************************
   TextGadget(#fbl_Titre, 20, 20, 560, 30, "BON DE LIVRAISON")
   wrow=50
   Frame3DGadget(#fbl_FrameDoc, 10, wrow, 940,80, "",#PB_Frame3D_Flat)
   wrow=wrow+20
   TextGadget(#fbl_TxtNumDoc, 20, wrow, 60, 20, "N° BL:")
   StringGadget(#fbl_NumDoc, 80, wrow, 60, 20, "")
   TextGadget(#fbl_TxtDate,160, wrow, 60, 20, "Date:")
   StringGadget(#fbl_Date,190, wrow, 90, 20, date$)
   DateGadget(#fbl_SelDate,190, wrow+25, 90, 20,"%dd/%mm/%yyyy")
   TextGadget(#fbl_TxtCF, 650, wrow, 110, 20, "CLIENT:")
   StringGadget(#fbl_CF, 740, wrow, 200, 20, "",#PB_String_UpperCase)
   wrow=wrow+60
   Frame3DGadget(#fbl_FrameMaj, 10, wrow, 940,110, "",#PB_Frame3D_Flat)
   wrow=wrow+20
   TextGadget(#fbl_Txtfam,20, wrow, 80, 20, "Famille:")
   StringGadget(#fbl_fam,80, wrow, 150, 20, "")
   ComboBoxGadget(#fbl_selFam,80, wrow+25, 150, 100)
   TextGadget(#fbl_Txtref,290, wrow, 80, 20, "Référence:")
   StringGadget(#fbl_ref,350, wrow, 80, 20, "")
   ComboBoxGadget(#fbl_selref,350, wrow+25, 80, 100)
   TextGadget(#fbl_TxtProd,470, wrow, 120, 20, "Désignation:")
   StringGadget(#fbl_prod,540, wrow, 400, 20, "")
   ComboBoxGadget(#fbl_selProd,540, wrow+25, 400, 100)
   wrow=wrow+60
   TextGadget(#fbl_TxtUm,20, wrow, 50, 20, "UM:")
   StringGadget(#fbl_Um,80, wrow,70, 20,"") 
   ComboBoxGadget(#fbl_selUm,160, wrow, 70, 100)
   TextGadget(#fbl_TxtQte,300, wrow, 60, 20, "Quantité:")
   StringGadget(#fbl_Qte,350, wrow, 80, 20,"")
   TextGadget(#fbl_TxtPu,470, wrow,100, 20,"Prix unitaire:")
   StringGadget(#fbl_pu,540, wrow, 100,20,"")
   TextGadget(#fbl_TxtMnt,770, wrow,70, 20,"Montant:")
   StringGadget(#fbl_Mnt,840, wrow, 100, 20,"")
   wrow=wrow+40
   ButtonGadget(#fbl_Imprimer, 10, wrow, 100, 30, "Imprimer")
   ButtonGadget(#fbl_AnnulerDoc, 250, wrow, 120, 30, "Annuler la livraison")
   ButtonGadget(#fbl_supprimer, 400, wrow, 160, 30, "Supprimer la ligne sélectionnée")
   ButtonGadget(#fbl_New, 600, wrow, 120, 30, "Nouvelle livraison")
   ButtonGadget(#fbl_Valider, 850, wrow, 100, 30, "Valider")
   wrow=wrow+35
   ListIconGadget(#fbl_Grid, 10, wrow, 940, 150, "Code", 40, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
   AddGadgetColumn(#fbl_Grid,1, " Désignation du produit", 300)
   AddGadgetColumn(#fbl_Grid,2, " U.M.", 90)
   AddGadgetColumn(#fbl_Grid,3, " Quantité", 80)
   AddGadgetColumn(#fbl_Grid,4, " Prix unitaire", 100)
   AddGadgetColumn(#fbl_Grid,5, " Montant", 100)
   wrow=wrow+160: wlig=wrow
   Frame3DGadget(#fbl_FrameVer,10, wrow, 500, 60, "")
   wrow=wrow+15
   TextGadget(#fbl_TxtModep,20, wrow, 140, 20, "Mode de payement:")
   StringGadget(#fbl_Modep,140, wrow, 300, 20,"", #PB_String_UpperCase)
   wrow=wrow+20
   OptionGadget(#fbl_CheckEsp,20, wrow, 100, 20,"ESPECE")
   OptionGadget(#fbl_CheckCheq,120, wrow, 100, 20,"CHEQUE")
   OptionGadget(#fbl_CheckVir,220, wrow, 140, 20,"VIREMENT BANCAIRE")
   OptionGadget(#fbl_CheckAterme,390, wrow, 100, 20,"A TERME")
   wrow=wrow+30
   Frame3DGadget(#fbl_FrameChauf,10, wrow, 170, 65, "Chauffeur")
   Frame3DGadget(#fbl_FrameCamion,190, wrow, 160, 65, "Camion")
   Frame3DGadget(#fbl_FrameMat,360, wrow, 150, 65, "Matricule")
   wrow=wrow+15
   StringGadget(#fbl_chauf,20, wrow, 150, 20,"", #PB_String_UpperCase)
   StringGadget(#fbl_Camion,200, wrow,140, 20,"", #PB_String_UpperCase)
   StringGadget(#fbl_Mat,370, wrow,130, 20,"", #PB_String_UpperCase)
   wrow=wrow+22
   ComboBoxGadget(#fbl_selchauf,20, wrow, 150,30)
   ComboBoxGadget(#fbl_selcamion,200, wrow, 140,30)
   ComboBoxGadget(#fbl_selmat,370, wrow, 130,30)
   wrow=wlig
   Frame3DGadget(#fbl_FrameStock,515, wrow, 100, 130, "Stock disponible")
   TextGadget(#fbl_StockDisp,520, wrow+20,80, 20, "",#PB_Text_Center)
   TextGadget(#fbl_Pmp,520, wrow+70,80, 20, "",#PB_Text_Center)
   wrow=wlig
   Frame3DGadget(#fbl_FrameTotal,620, wrow, 310, 130, "")
   TextGadget(#fbl_TxtHT,640, wrow+20, 140, 20, "TOTAL HT :")
   StringGadget(#fbl_Ht,750, wrow+20, 120, 20,"",#PB_String_ReadOnly | #PB_Text_Right)
   wrow=wrow+25
   TextGadget(#fbl_TxtFrais,640, wrow+20, 140, 20, "FRAIS ET TAXES :")
   StringGadget(#fbl_Frais,750, wrow+20, 120, 20,"",#PB_Text_Right)
   wrow=wrow+25
   TextGadget(#fbl_TxtRemise,640, wrow+20, 140, 20, "REMISE :")
   StringGadget(#fbl_Remise,750, wrow+20, 120, 20,"",#PB_Text_Right)
   wrow=wrow+25
   TextGadget(#fbl_TxtTTC,640, wrow+20, 140, 20, "TOTAL TTC :")
   StringGadget(#fbl_TTC,750, wrow+20, 120, 20,"",#PB_String_ReadOnly | #PB_Text_Right)
   ButtonGadget(#fbl_EnregistrerDoc, 620, wrow+60, 310, 30, "ENREGISTRER LE BON DE LIVRAISON")
   AddGadgetItem (#Panel, -1, " FERMER");***************************************************
EndIf

quitWinstock=0

Repeat
EventId=WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
   quitWinstock=1
EndIf

If EventID = #PB_Event_Gadget
   Select EventGadget()

   Case #fbl_seldate
        wdate=GetGadgetState(#fbl_seldate)
        date$=FormatDate("%dd/%mm/%yyyy", wDate)
        SetGadgetText(#fbl_date,date$)
   
   Case #fbl_selnumdoc
        n=GetGadgetState(#fbl_selnumdoc)
        If n>=0
           numdoc$=GetGadgetText(#fbl_selnumdoc)
           If numdoc$<>""
              SetGadgetText(#fbl_numdoc,numdoc$)
              fbl_afficherDoc()
           EndIf
        EndIf

  ;ça se psse ici..............................
   Case #fbl_cf
         input$=GetGadgetText(#fbl_cf)
         If Len(input$)>0
            doc$="BL"
            AfficherGridSelCF()
         EndIf      


   ;:----------------------------------------------------------------------------------------------------------

   Case #jstock_reorganiser
         jstock_reorganiser()
         
   Case #jstock_afficher
         jstock_afficher()

   Case #jstock_imprimer
         Print_jstockPmp()

   ;:----------------------------------------------------------------------------------------------------------
   Case #panel
        wpanel=GetGadgetState(#panel)
        If wpanel=7
           quitwinstock=1
        EndIf
         
   EndSelect
EndIf            
Until  quitwinstock=1
CloseWindow(#Winstock)
EndProcedure


D'abord l'utilisateur ne veut pas appuyer sur tache (ENTREE) après avoir saisi le mot clé, il préfère que la liste des clients sera affichée au fur et à mesure qu'il tape les caractères du mot clé (à chaque nouveau caractère saisi, une liste sera affichée), voici ce qui se passe avec mon code:

Quand l'utilisateur tape la 1ère lettre, la liste des clients est affichée et le contenu est correct, mais l'utilisateur ne pourra plus ajouter d'autres lettres??

Qu dois je faire ?

Merci de votre aide

Re: Afficher data à partir de la saisie

Publié : mer. 25/mai/2016 13:07
par microdevweb
Voici un exemple avec un petit filtre, si j'ai bien compris ta question

Code : Tout sélectionner

UseSQLiteDatabase()
Global Db=OpenDatabase(#PB_Any,":memory:","","")
Enumeration 
    #MainForm
    #MainList
    #Filters
EndEnumeration
Procedure CreateTable()
    Protected query.s
    query="CREATE TABLE client ("
    query+"name TEXT)"
    If DatabaseUpdate(Db,query)=0
        MessageRequester("Database Error","Can not create table")
        ProcedureReturn #False
    EndIf
    ProcedureReturn #True
EndProcedure
Procedure FillTable(name.s)
    Protected query.s
    query="INSERT INTO client ("
    query+"name) VALUES ("+Chr(34)+name+Chr(34)+")"
    If DatabaseUpdate(Db,query)=0
        MessageRequester("Database Error",DatabaseError())
        ProcedureReturn #False
    EndIf
    ProcedureReturn #True
EndProcedure
Procedure MakeClient()
    FillTable("Grumeaux")
    FillTable("Maurico")
    FillTable("Grosard")
    FillTable("Foulard")
EndProcedure
Procedure FillList()
    Protected Filters.s=GetGadgetText(#Filters)
    Protected query.s
    query="SELECT name FROM client"
    ; Si il y à un filtre je l'ajoute
    If Filters<>""
        query+" WHERE name LIKE '"+Filters+"%'"
    EndIf
    If DatabaseQuery(Db,query)=0
        MessageRequester("Database Error",DatabaseError())
        ProcedureReturn #False
    EndIf
    ClearGadgetItems(#MainList)
    While NextDatabaseRow(Db)
        AddGadgetItem(#MainList,-1,GetDatabaseString(Db,0))
    Wend
EndProcedure
Procedure Exit()
    End
EndProcedure
Procedure OpenMainForm()
    Protected flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
    Protected X=10,Y=0,WF=800,HF=600
    OpenWindow(#MainForm,0,0,WF,HF,"Teste filtre",flag)
    TextGadget(#PB_Any,X,Y,100,30,"Filtre:")
    Y+40
    StringGadget(#Filters,X,Y,100,30,"")
    Y+40
    ListViewGadget(#MainList,X,Y,WF-20,HF-(Y+10))
    BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)
    BindGadgetEvent(#Filters,@FillList())
    FillList()
EndProcedure
; Création de la table
CreateTable()
; Création de quelques clients
MakeClient()

; Ouverture de la fenêtre
OpenMainForm()

; MainLoop
Repeat:WaitWindowEvent():ForEver


Re: Afficher data à partir de la saisie

Publié : mer. 25/mai/2016 19:16
par venom
J'aurais chercher du côté de CountString(Chaine$, ChaineATrouver$)







@++

Re: Afficher data à partir de la saisie

Publié : jeu. 26/mai/2016 7:50
par Marc56
@ microdevweb

J'aime ta façon de procéder :)

Code : Tout sélectionner

    If Filters<>""
        query+" WHERE name LIKE '"+Filters+"%'"
    EndIf

Code : Tout sélectionner

BindGadgetEvent(#Filters,@FillList())
Simple, clair, efficace, sans appel aux API. Bravo 8)

Perso, j'avais envisagé d'utiliser tout le jeu des raccourcis claviers, lettre par lettre :mrgreen: Ta méthode est bien plus élégante et logique :idea:

Re: Afficher data à partir de la saisie

Publié : jeu. 26/mai/2016 10:00
par Ar-S
tu peux jeter un oeil à la méthode que j'ai utilisé pour mon petit : xyloglotus
C'est de l'auto-complétion.