|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
Débuté par Serge Beaulieu, 23 avr. 2018 21:43 - 13 réponses |
| |
| | | |
|
| |
Membre enregistré 6 messages |
|
Posté le 23 avril 2018 - 21:43 |
Bonjour, j'essaye de programmer une recherche pour un lot de mot dans un répertoire et tous ces sous répertoires. Dans le champ de saisie je voudrais faire une recherche. Ex: 8088Sh01R02 8089Sh01R04
Présentement si je faire ma recherche avec seulement un item sa fonctionne. Aussitôt que j'écris plus d'une ligne, j'ai un message d'erreur qui indique qu'il à rien trouver. comment je peux faire pour qu'il cherche le premier mot, ensuite le 2e....
étant donné que la recherche est pour des fichiers PDF est ce qu'il y aurait moyen de prendre la liste trouver et de les imprimé en lot.
Merci pour votre aide.
Serge |
| |
| |
| | | |
|
| | |
| |
Posté le 23 avril 2018 - 22:03 |
bonjour
cela dépend si votre recherche est premier mot et deuxième mot etc ou alors premier ou deuxièmement
faut voir le code
apres faut voir on peux faire un PDFFusionne pour imprimer l'ensemble puis le detruire |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
Posté le 23 avril 2018 - 22:21 |
voici le code de mon bouton:
sCléParcours sont des chaînes nDessin est un entier sDessin est une chaîne
tabListefichier est un tableau de chaînes
sDessin = SAI_Recherche_lot_et_Impression[[1 À 3]]
ListeSupprimeTout(LISTE_Recherche_lot_et_imprime) SI sDessin = "r20" ALORS nDessin = -1 SINON nDessin = SAI_Recherche_lot_et_Impression FIN
sDessin = SAI_Recherche_lot_et_Impression
sCléParcours = HFiltreContient(ListeFichier,Fichier,sDessin) HLitPremier(ListeFichier,sCléParcours) TANTQUE PAS HEnDehors() TableauAjoute(tabListefichier,ListeFichier.Fichier) HLitSuivant(ListeFichier,sCléParcours) //tabListepdf est un tableau de chaînes FIN
POUR TOUT sFichier DE tabListefichier ListeAjoute(LISTE_Recherche_lot_et_imprime, sFichier) i est un entier = i + 1 FIN
SI i = 0 ALORS Erreur("Aucun dessin trouvé!") FIN
//si i = 1 alors // LISTE_Dessins = 1 // ExécuteTraitement(BTN_Imprimer,trtClic) // info("Dessins imprimer") //FIN
//fini: |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 566 messages Popularité : +222 (260 votes) |
|
Posté le 24 avril 2018 - 09:37 |
Bonjour,
Tu peux faire ceci
sMaRequete est une Requête SQL = [ SELECT Fichier FROM ListeFichier WHERE Fichier LIKE %{pFichier}% ]
sMaRequete.pFichier = SAI_Recherche_lot_et_Impression HExécuteRequête(sMaRequete) POUR TOUT sMaRequete ListeAjoute(LISTE_Recherche_lot_et_imprime, sMaRequete.Fichier) FIN
SI LISTE_Recherche_lot_et_imprime..Occurrence = 0 ALORS Erreur("Aucun dessin trouvé!") FIN
ou ça qui fonctionne très bien chez moi
sCléParcours est une chaîne = HFiltreContient(ListeFichier,Fichier,SAI_Recherche_lot_et_Impression) HLitPremier(ListeFichier,sCléParcours) TANTQUE PAS HEnDehors() ListeAjoute(LISTE_Recherche_lot_et_imprime,ListeFichier.Fichier) HLitSuivant(ListeFichier,sCléParcours) FIN
La rubrique fichier est-elle une clé du fichier ?
-- Cordialement,
Philippe SAINT-BERTIN Géode Informatique |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
Posté le 24 avril 2018 - 14:30 |
Bonjour Philippe, ton code fonctionne très bien pour afficher tous les .pdf qu'il existe. cependant j'ai besoin qu'il recherche une liste en particulier. j'ai donc un champ de saisie. si dans ce champ de recherche, il y a seulement un nom il le trouve mais s'il y en as 2. J'ai un message qui indique qu'il na rien trouver. si je les cherche un par un il les trouve.
Ce que j'aimerais faire c'est qu'il trouve tous les .pdf que j'ai écris dans le champ de saisie.
Merci beaucoup pour ton aide |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 566 messages Popularité : +222 (260 votes) |
|
Posté le 24 avril 2018 - 15:40 |
Alors le filtre ne peut pas fonctionner, il faut que tu passes par une requête
sMaRequete est une Requête SQL = [ SELECT Fichier FROM ListeFichier WHERE Fichier IN ({pFichier}) ]
sMaRequete.pFichier = Remplace(SAI_Recherche_lot_et_Impression,RC,";") HExécuteRequête(sMaRequete) POUR TOUT sMaRequete ListeAjoute(LISTE_Recherche_lot_et_imprime, sMaRequete.Fichier) FIN
SI LISTE_Recherche_lot_et_imprime..Occurrence = 0 ALORS Erreur("Aucun dessin trouvé!") FIN
-- Cordialement,
Philippe SAINT-BERTIN Géode Informatique |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
Posté le 24 avril 2018 - 19:11 |
Merci pour le nouveau code mais il ne fonctionne pas. Il ne trouve rien et me donne le message rien trouver. si je prend ton premier code que tu as fait, sa fonctionne si je demande une seule requête. si je fais juste un "enter" après le mot que je recherche j'ai automatiquement l'erreur. c'est comme s'il ne cherchait pas plusieurs ligne.
SergeMessage modifié, 24 avril 2018 - 19:36 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 190 messages Popularité : +21 (23 votes) |
|
Posté le 24 avril 2018 - 22:25 |
Bonjour
avec le code proposé de Philippe SB ça devrait le faire en remplaçant
Remplace(SAI_Recherche_lot_et_Impression,RC,";") par
Remplace(SAI_Recherche_lot_et_Impression,RC,",") |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 566 messages Popularité : +222 (260 votes) |
|
Posté le 25 avril 2018 - 05:20 |
Il y a en effet une erreur, il faut se mettre à apprendre le sql ça peut aider… J'ai aussi retiré les valeurs vides pour ne pas être embêté.
sMaRequete est une Requête SQL = [ SELECT Fichier FROM ListeFichier WHERE Fichier IN ({pFichier}) ]
sParametre est une chaîne
POUR TOUTE chaîne sFichier de SAI_Recherche_lot_et_Impression SEPAREE PAR RC SI sFichier ~= "" ALORS CONTINUER sParametre += [";"] + "'" + sFichier + "'" FIN sMaRequete.pFichier = sParametre HExécuteRequête(sMaRequete) POUR TOUT sMaRequete ListeAjoute(LISTE_Recherche_lot_et_imprime, sMaRequete.Fichier) FIN
SI LISTE_Recherche_lot_et_imprime..Occurrence = 0 ALORS Erreur("Aucun dessin trouvé!") FIN
-- Cordialement,
Philippe SAINT-BERTIN Géode Informatique |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
Posté le 25 avril 2018 - 13:47 |
Nicolas CAILLIEZ et Philippe, Merci encore pour votre aide mais sa ne fonctionne toujours pas. Est ce qu'il y a un moyen pour que je vous montre le problème? sa serait peut être plus simple.
Serge |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 96 messages Popularité : +18 (20 votes) |
|
Posté le 25 avril 2018 - 18:13 |
Bonjour, attention, votre code initial utilise HFiltreContient. Cette syntaxe est l'équivalent du LIKE en SQL. Je pense qu'il est assez compliqué de traiter en une seule requête SQL ou un seul parcours la recherche sur plusieurs critères.
Si votre code fonctionne sur un seul critère, vous pouvez tout simplement faire plusieurs fois votre recherche sur un critère à la fois.
POUR TOUTE chaîne sDessinRecherché DANS sDessin SEPAREE PAR RC sCléParcours = HFiltreContient(ListeFichier,Fichier,sDessinRecherché) HLitPremier(ListeFichier,sCléParcours) TANTQUE PAS HEnDehors() TableauAjoute(tabListefichier,ListeFichier.Fichier) HLitSuivant(ListeFichier,sCléParcours) FIN FIN
Mais attention ! si on regarde l'aide de HFiltreContient, on peut lire : "Ce filtre n’utilise pas d’index, il parcourt tout le fichier de données." Donc, l'option que je vous propose n'est pas optimisée car on parcourt le fichier autant de fois qu'il y a de critères.
Une meilleure solution est donc de parcourir le fichier une fois complètement et de vérifier si chaque enregistrement correspond au critère. Avec une recherche contient, vous n'avez pas vraiment le choix que de tout parcourir dans tous les cas.
Ce qui donnerait (code non testé):
HLitPremier(ListeFichier) TANTQUE PAS HEnDehors() POUR TOUTE chaîne sDessinRecherché DANS sDessin SEPAREE PAR RC SI Position(sDessinRecherché, ListeFichier.Fichier, 1, SansCasse) > 0 DANS ListeFichier.Fichier ALORS TableauAjoute(tabListefichier,ListeFichier.Fichier) SORTIR FIN FIN
HLitSuivant(ListeFichier) FIN
Si la casse est importante, je vous invite à supprimer le paramère SansCasse.
J'espère que cet exemple fonctionnera et vous aidera à avancer.
Je vous souhaite une bonne soirée.
-- Johjo aka Jonathan Laurent
Mon blog sur WinDev : http://blog.ytreza.org Me contacter par Twitter : @Johjo07 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 6 messages |
|
Posté le 25 avril 2018 - 21:40 |
Johjo: merci pour les explications. cependant, est ce que je peux prendre le code que vous avez écris? est ce que sa devrait fonctionner?
merci Serge |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 190 messages Popularité : +21 (23 votes) |
|
Posté le 25 avril 2018 - 22:28 |
Bonjour
pas bien compris si c est une recherche à l'identique ou contient...
les idées précédentes sont bonnes, en adaptant celle de Philippe en utilisant LIKE, ca devait le faire
data_pdf est une Source dede Données param_pdf est une chaîne req_pdf est une chaîne = [ SELECT Fichier FROM ListeFichier %1 ] POUR TOUTE chaîne sFichier de SAI_Recherche_lot_et_Impression SEPAREE PAR RC SI sFichier ~= "" ALORS CONTINUER SI param_pdf = "" ALORS param_pdf = ChaîneConstruit("WHERE Fichier LIKE '%%1%'", sFichier ) SINON param_pdf += ChaîneConstruit(" OR Fichier LIKE '%%1%'", sFichier ) FIN FIN SI PAS HExécuteRequêteSQL(data_pdf , hRequêteDéfaut, ChaîneConstruit(req_pdf , param_pdf )) ALORS Erreur("Anomalie requete...") SINON POUR TOUT data_pdf ListeAjoute(LISTE_Recherche_lot_et_imprime, data_pdf.Fichier) FIN FIN
A tester, la requete est construite dynamiquement. Si pas de parametres, l'entierete de la table fichier est ramené. A adapterMessage modifié, 25 avril 2018 - 22:35 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 96 messages Popularité : +18 (20 votes) |
|
Posté le 26 avril 2018 - 08:44 |
@Serge Beaulieu : j'espère que ça fonctionne, mais n'ayant pas pu le tester, je ne peux pas vous le garantir. La réponse la plus simple, c'est de tester directement dans votre code et surtout, essayez de comprendre ce qui a été ajouté.
L'idée principale (suggérée par tout le monde), c'est d'extraire les paramètres avant de les utiliser dans votre recherche. Vos paramètres sont dans un champ de saisie et un retour chariot vous permet de les séparer. La syntaxe POUR TOUT ... SEPAREE PAR RC vous permet de traiter chaque paramètre dans une boucle. J'ai rajouté un SansEspace par précaution au cas où l'utilisateur saisirait des espaces avant de faire le retour chariot.
@Nicolas CAILLIEZ : Le HFiltreContient fait une recherche contient et non à l'identique. Je trouve que votre idée de créer la requête dynamiquement répond à la demande.
Bonne journée à tous !
-- Johjo aka Jonathan Laurent
Mon blog sur WinDev : http://blog.ytreza.org Me contacter par Twitter : @Johjo07 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|