PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → saisie assistée sur un champ dans une zone répétée
saisie assistée sur un champ dans une zone répétée
Débuté par Gregory DEJENEFFE, 04 juin 2019 14:14 - 4 réponses
Membre enregistré
47 messages
Posté le 04 juin 2019 - 14:14
Bonjour,

quelqu'un a-t-il un retour d'expérience pour l'utilisation de la saisie assistée sur un champs placé dans une zone répétée ?

J'ai testé sur un fichier ou une requête mais pas de résultat affiché : on voit bien une sorte de "sablier" apparaître dans la zone de saisie tout à droite mais pas de proposition. Par contre, je prends le champ et je le sors de la ZR et c'est ok cela fonctionne.

Merci
Membre enregistré
47 messages
Posté le 05 juin 2019 - 09:04
Voici la réponse à la question de la part du ST. Comme ça si qqn fait la même recherche que moi, il saura quoi faire :merci:

Actuellement il n'est pas possible de faire une saisie assiéte avec les fonctions WEBDEV dans une zone répétée avec des valeurs de saisie différentes pour chaque ligne. 
Une suggestion existe pour ce point et a été transmise à notre service Qualité et à notre équipe de Développement
Posté le 05 juin 2019 - 15:12
Bonjour,

Code navigateur qui affiche un champ liste sous la zone de saisie, pas d'autres solutions.

Je l'ai déjà fait cela fonctionne, ne pas oublier de rendre le champ liste superposable pour pouvoir modifier par code navig les ..x et ..y.

Par contre ce genre de saisie assisté ce fait de moins en moins, pour le web on a tendance à l'entrée dans le champs de saisie, de faire un popupAffiche, et dans la popup y'a le champ de saisie plus la liste en dessous ^^.

Tout va dépendre si le site est client ou métier ^^
Posté le 08 juin 2019 - 13:37
1) Je l'utilise au quotidien avec la saisie assistée programmée et c'est fonctionnel avec des valeurs proposées différentes sur chaque ligne, (issues d'un script déclenché dans une BDD cherchant les valeurs contenant les quelques lettres tapées par l'utilisateur), sans s'embêter avec des champs listes superposables. Je suis étonné que le ST vous ai répondu cela d'autant que c'est eux qui m'ont répondu comment faire.
----
2) En revanche le script est exécuté à chaque pression d'une touche, ce qui, sur les très grosses bases de données, peut nuire à la fluidité de l'utilisateur. J'ai quelques clients dans ce cas. J'essaie de ne déclencher le script que dès que l'utilisateur s'arrête de saisir pendant une demi seconde, mais ne peut pas utiliser la fonction SaisieAssistéeOuvre dans la ZR car elle bogue, elle ouvre en même temps toutes les saisies assistées des champs de saisie situés AVANT (curieusement pas APRES) elle dans la ZR ce qui fait désordre à l'affichage (le temps de la saisie).
Sans utiliser cette fonction, cela fonctionne aussi, mais le fonctionnement est un peu curieux, il suffit de saisir quelques lettres, pauser une demi seconde, puis saisir la dernière lettre et la saisie assistée s'ouvre.
----
Code de la zone de saisie de la ZR du 1) ce champ s'appelle SAI_Text
> Initialisation de SAI_Text //hors sujet mais permet d'avoir une ligne d'aide personnalisée par zone de saisie de la ZR (merci au ST)
SAI_Text..ClasseHTML="FormPlaceHolderText1"
Entrée de champ

SI Faux ALORS //Pour charger jQuery avec la page, idem hors sujet
jQuery("")
FIN
SAI_ChampActif=ZR_Formulaire //pour mémoriser le champ appelant dans les codes suivants
SaisieAssistéeSupprimeTout(SAI_Text)
> Touche relachée OnKeyUp de SAI_Text
FinTimer(gnNumeroTimer)
gnNumeroTimer=0
gnNumeroTimer = Timer(DeclencheSaisieAssistee,500ms) //peut être appelée en direct sans timer sur les petites BDD
Touche enfoncée OnKeyDown de SAI_Text

SaisieAssistéeFerme(SAI_Text)

----
La procédure qui déclenche la saisie assistée
Elle permet aussi d'ouvrir la liste de toutes les valeurs possibles si l'utilisateur saisit * ...
Malgré son nom ATT_ComboContenuInitNavigateur est un champ texte sinon pas utilisable en code navigateur

PROCÉDURE DeclencheSaisieAssistee()

FinTimer(gnNumeroTimer)
gnNumeroTimer=0

sSousChaine est une chaîne

SI ZR_Formulaire.ATT_RequeteSQL[SAI_ChampActif]<>"" ALORS
SI Taille(SAI_Text)>1 _ET_ Gauche(SAI_Text,1)="*" ALORS //Au cas où on a commencé par saisir une étoile
SAI_Text=Milieu(SAI_Text,2)
FIN
SaisieAssistéeSupprimeTout(SAI_Text)
SI SAI_Text="*" ALORS
ZR_Formulaire.ATT_ComboContenuInitNavigateur[SAI_ChampActif]=AJAXExécute(ChargeContenuInitNavigateur,SAI_ChampActif,"")
SINON
SI SAI_Text<>"" ALORS
ZR_Formulaire.ATT_ComboContenuInitNavigateur[SAI_ChampActif]=AJAXExécute(ChargeContenuInitNavigateur,SAI_ChampActif,SAI_Text)
SINON
ZR_Formulaire.ATT_ComboContenuInitNavigateur[SAI_ChampActif]=""
FIN
FIN
SI ZR_Formulaire.ATT_ComboContenuInitNavigateur[SAI_ChampActif]<>"" ALORS
sSousChaine=ExtraitChaîne(ZR_Formulaire.ATT_ComboContenuInitNavigateur[SAI_ChampActif], rangPremier, RC)
TANTQUE sSousChaine <> EOT
SaisieAssistéeAjoute(SAI_Text,ExtraitChaîne(sSousChaine,1,Caract(27))) //Pour ne conserver que la partie visible...
sSousChaine = ExtraitChaîne(ZR_Formulaire.ATT_ComboContenuInitNavigateur[SAI_ChampActif], rangSuivant, RC)
FIN
FIN
SI SAI_Text="*" ALORS
SaisieAssistéeParamètre(SAI_Text,saFiltre,filtreAucun)
SINON
SaisieAssistéeParamètre(SAI_Text,saFiltre,filtreAucun)
SaisieAssistéeParamètre(SAI_Text,saTailleMin,1)
FIN
FIN

----
La procédure qui interroge la BDD en fonction des caractères déjà saisis par l'utilisateur
Les paramètres d'accès à la BDD sont ici stockés dans un XML (dont le script)
Les requetes renvoient une chaine + un ID unique
Exemple de script SQL :
SELECT Nom||' '||Prenom AS Element, IDUser AS IDElement FROM TUser WHERE Nom||' '||Prenom ILIKE '%[sFiltre]%' LIMIT 20
PROCÉDURE ChargeContenuInitNavigateur(nIndice,sFiltre)

xmlRequete est un xmlDocument
MaConnexionSQL est une Connexion
sCodeSQL est une chaîne
sdChargeCombo est une Source de Données
nNombreResultat est un entier

gsListe1=""

xmlRequete=XMLOuvre(ATT_RequeteSQL[nIndice],depuisChaîne)
SI PAS ErreurDétectée _ET_ xmlRequete.xRequete.xConnexion.xServeur<>"" ALORS
MaConnexionSQL..Provider=xmlRequete.xRequete.xConnexion.xProvider
MaConnexionSQL..Serveur=xmlRequete.xRequete.xConnexion.xServeur
MaConnexionSQL..BaseDeDonnées=xmlRequete.xRequete.xConnexion.xBaseDonnees
MaConnexionSQL..Utilisateur=xmlRequete.xRequete.xConnexion.xUtilisateur
MaConnexionSQL..MotDePasse=Décrypte(xmlRequete.xRequete.xConnexion.xMotDePasse,"motdepassepersonnel",crypteAnsi)
ConnexionVerifiePort(MaConnexionSQL)
sCodeSQL=XMLVersTexte(xmlRequete.xRequete.xSQL)
sCodeSQL=Remplace(sCodeSQL,"[sFiltre]",sFiltre,MotComplet+SansCasse)
sRubrique est une chaîne
SI sCodeSQL<>"" _ET_ HOuvreConnexion(MaConnexionSQL) ALORS
SI sFiltre="" ALORS
sCodeSQL=Remplace(sCodeSQL,"LIMIT 20","")
SI Position(sCodeSQL,"ORDER BY")=0 ALORS
sCodeSQL+=[RC]+"ORDER BY Element"
FIN
FIN
HLibèreRequête(sdChargeCombo)
SI PAS HExécuteRequêteSQL(sdChargeCombo, MaConnexionSQL, hRequêteSansCorrection+hRequêteSansCorrectionHF,sCodeSQL) ALORS //Traité PostgreSQL et Linux
SINON
nNombreResultat=0 //Initialisation du nombre de résultats
sRubrique=HListeRubrique(sdChargeCombo)
SI Position(sRubrique,"IDElement",1,SansCasse)>0 ALORS
POUR TOUT sdChargeCombo
SI sdChargeCombo.Element<>"" ALORS
nNombreResultat+=1
gsListe1+=[RC]+sdChargeCombo.Element+gLien(sdChargeCombo.IDElement)
FIN
FIN
SINON
POUR TOUT sdChargeCombo
SI sdChargeCombo.Element<>"" ALORS
nNombreResultat+=1
gsListe1+=[RC]+sdChargeCombo.Element
FIN
FIN
FIN
FIN
HLibèreRequête(sdChargeCombo)
HFermeConnexion(MaConnexionSQL)
SINON
FIN
SINON
FIN
ZR_Formulaire.ATT_ComboContenuInitNavigateur[nIndice]=gsListe1
//On affecte ici sinon curieusement ce n'est pas renvoyé vers le serveur
RENVOYER gsListe1
Membre enregistré
47 messages
Posté le 09 juin 2019 - 10:03
Bonjour

Merci pour le code partagé ... c'est super sympa.
J'ai contourné mon problème en changeant l'interface utilisateur (c'est une appli interne à l'entreprise, donc je suis plus libre de faire "comme je veux", sans impératif clientS) et j'ai pu avancer. Mais top pour le code et je regarderai à cela ;)