PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Recherche en lot
Recherche en lot
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.

Serge
Message 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 adapter
Message 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