PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Importation depuis excel : doublon
Importation depuis excel : doublon
Débuté par Calimero, 18 avr. 2022 20:31 - 14 réponses
Membre enregistré
90 messages
Posté le 18 avril 2022 - 20:31
Bonjour,

Je suis tout nouveau depuis quelques jours et j'ai "mangé" 2 formations où on trouve que tout est super facile quand on regarde et qu'on fait les exercices et en fait, devant la feuille blanche, on se rend compte qu'on ne connait rien. C'est comme le GPS, quand il nous amene du point A au point B, on est incapable de retrouver la route tout seul:)

Sur ces points philosophiques, voilà ce qui m'amène sur ce forum.

J'ai un un fichier "catalogue_fournisseurs" sur Excel qui comporte 15 000 articles avec seulement 2 colonnes : référence et stock

Sur Windev, mon fichier de données ( catalogue_fournisseurs) comporte également ces 2 rubriques qui s'affichent sur ma table TA_stocksFournisseurs

reference de type texte qui est la clé unique et
stock de type numérique.

Si je commence à remplir le fichier de données manuellement, reference AAA, stock 10, BBB, 25, CCC 22 etc... pas de problème.

Quand je fais l'import depuis Excel ( TableAjouteLigne ), tout fonctionne et les stocks s'affichent bien sur le tableau mais quand je veux exporter vers le fichier de données, j'ai un message de doublon.

J'ai essayé plein de choses et si je mets un Hajoute, j'ai un message qui me dit "cet ajout aurait provoqué un doublon sur la clé <reference>, ecranversfichier ne fonctionne pas : je suis perdu

Je galère depuis ce matin donc si quelqu'un pouvait me dire quelle est la fonction qui me permet de mettre les données dans le fichier et pourquoi j'ai ce message de doublon ?

Merci beaucoup
Message modifié, 18 avril 2022 - 20:33
Membre enregistré
1 046 messages
Posté le 18 avril 2022 - 21:56
Bonjour Calimero,
Pour pouvoir t'aider, peux-tu nous montrer le code qui pose problème et éventuellement une copie d'écran du début du fichier excel?
cordialement
Posté le 18 avril 2022 - 23:08
ce message indique :

1. que dans ton analyse, pour ce fichier, tu as déclaré un champ comme étant une clé unique (sans doublon)

2. que lors de ton hajoute, la valeur placée dans cette clé unique existe déjà dans le fichier

Ca peut être parce que :
- tu as fait le traitement plusieurs fois sans vider le fichier destination
- ton code est incorrect et la zone clé unique n'est pas renseignée (donc au deuxième enreg avec la valeur à blanc, doublon)
- les données de ton fichier de départ contiennent des doublons
- ta boucle est incorrecte et tu ajoute deux fois la même ligne
- ...
Membre enregistré
90 messages
Posté le 19 avril 2022 - 02:33
Bonjour,

Merci pour vos réponses. Le problème est résolu en ajoutant TableEnregistre.

Pour le problème de doublons, en fait, je me suis aperçu qu'un de mes fournisseurs avait mis une quarantaine de doublons dans ses références. J'aurais dû vérifier avant, je me suis battu plusieurs heures pour rien.

Je les ai supprimées du fichier Excel mais j'ai toujours 4 erreurs de doublons alors qu'il n'y en n'a plus et là, je ne comprenais plus.
En fait, j'ai par exemple la référence B1062 et la référence B106.2 ou alors B13603 et B1.3603 et windev les prends comme identiques. Comment faire pour qu'il les différencie ?

Encore merci. je viens de me mettre à Windev après plusieurs années de Filemaker, je sens que vous n'avez pas fini de me voir;)
Posté le 19 avril 2022 - 07:18
bonjour,

je pense que dans la description de ton fichier il y a une case à cocher pour respecter la casse.

bonne journée

j marie
Posté le 19 avril 2022 - 08:46
Bonjour Calimero,

Indépendamment de Windev, c'est l'analyse de ton besoin qui te permet de savoir si B106.2 et B1062 son les mêmes données ou des données distinctes.

Dé là découle le modèle de données et donc ensuite le comportement de ton application en insertion, avec mise en place les contrôles applicatifs permettant d'identifier les erreurs des fichiers des fournisseurs, pour détecter les doublons AVANT tentative d'insertion (et pourquoi pas faire un update plutôt qu'un insert si cela se justifie).

A savoir qu'on a beau nous annoncer des fichiers sources ci ou ça, il est bien rare qu'il n'y ait pas un jour ou l'autre un cas qui sort du cadre promis => toujours anticiper et prévoir les cas hors scope "promis"

Bon dev
Membre enregistré
90 messages
Posté le 19 avril 2022 - 12:45
"je pense que dans la description de ton fichier il y a une case à cocher pour respecter la casse."

Merci Jean Marie, c'est tout à fait ça. Il y a effectivement une case à cocher "sensible à la casse" et ça fonctionne.

"pourquoi pas faire un update plutôt qu'un insert si cela se justifie"

Flef, je ne veux pas faire d'update parce qu'il peut y avoir de nouveaux produits ou des produits en fin de vie. C'est en fonction de ces nouvelles références que je fais mes nouvelles fiches produits. Si il y a une référence du catalogue fournisseurs qui n'est pas dans ma liste de produits alors nouveau produit.

Merci à tous pour votre précieuse aide. ça me fait avancer et malgré de nombreuses recherches sur internet, et dans mes formations, on ne trouve pas toujours la solution aux problèmes rencontrés.
Membre enregistré
90 messages
Posté le 19 avril 2022 - 18:44
Bon, c'est encore moi. je ne sais pas ce que fabrique un de mes fournisseurs en ce moment, il me met plein de doublons dans ses fichiers. Je peux bien entendu les supprimer sur le fichier Excel mais le but est que ce soit Windev qui le gère.
Maintenant que j'ai coché la case "sensible à la casse", je voudrais qu'à la lecture d'un doublon, ça n'enregistre pas et que ça passe à la référence suivante.
J'ai essayé plein de choses avec HErreurDoublon mais je n'y arrive pas. J'ai suivi des "solutions" sur internet mais sans succès. Voici mon code, si vous pouviez me dire où le mettre et comment.

HSupprimeTout(Catalogues_Fournisseurs) // Commence avec un fichier vide

fichierfournisseurs est un xlsDocument = xlsOuvre(SAI_Fichier_catalogue_fournisseur)
sKu est une chaîne
nStock est un entier


SI ErreurDétectée ALORS
Erreur("Une erreur a été détectée pendant la récupération des données.")
RETOUR
FIN

xlsFeuilleEnCours(fichierfournisseurs,1) // fichier catalogue fournisseur 1ère feuille

POUR i = 2 À xlsNbLigne(fichierfournisseurs) //lit à partir de la ligne 2 jusqu'à la fin du fichier

sKu = xlsDonnée(fichierfournisseurs,i,1) // Lit la ligne i, colonne 1
nStock = xlsDonnée(fichierfournisseurs,i,3) //// Lit la ligne i, colonne 3

TableAjouteLigne(TABLE_StocksFournisseurs,sKu,nStock) // Remplit le tableau stockfournisseurs
TableEnregistre(TABLE_StocksFournisseurs) // enregistre dans le fichier stockfournisseurs
FIN

xlsFerme(fichierfournisseurs)


Merci
Membre enregistré
1 046 messages
Posté le 20 avril 2022 - 01:06
Bonjour Calimero
Voici un code qui va désactiver l'erreur des doublons, insérer les enregistrements dans le fichier "catalogues_fournisseurs" puis rafraichir la table "TABLE_StocksFournisseurs".
Réactivation des erreurs en fin de procédure.
Les lignes Excel en erreur sont affichées dans la trace.

i est un entier
HSupprimeTout(catalogues_fournisseurs) // Commence avec un fichier vide

fichierfournisseurs est un xlsDocument = xlsOuvre(SAI_Fichier_catalogue_fournisseur)
sKu est une chaîne
nStock est un entier

xlsFeuilleEnCours(fichierfournisseurs,1) // fichier catalogue fournisseur 1ère feuille

HSurErreur("catalogues_fournisseurs",hErrDoublon,"") // Désactivation de l'erreur Doublon

POUR i = 2 _À_ xlsNbLigne(fichierfournisseurs) //lit à partir de la ligne 2 jusqu'à la fin du fichier

sKu = xlsDonnée(fichierfournisseurs,i,1) // Lit la ligne i, colonne 1
nStock = xlsDonnée(fichierfournisseurs,i,3) //// Lit la ligne i, colonne 3

catalogues_fournisseurs.reference = sKu
catalogues_fournisseurs.stock = nStock

SI HAjoute(catalogues_fournisseurs) = FAUX ALORS
SI HErreurDoublon() = VRAI ALORS
Trace("Doublon ligne " + i + " du fichier Excel, référence " + sKu) // Affiche les lignes en erreur dans trace
FIN
FIN

FIN

xlsFerme(fichierfournisseurs)
TableAffiche(TABLE_StocksFournisseurs)
HSurErreur("catalogues_fournisseurs", hErrTout) // réactivation des erreurs
Posté le 20 avril 2022 - 01:17
d'abord, si tes références sont du style 150.2 ET 1502 et que ce sont bien DEUX références différentes , ce n'est pas la sensibilité à la casse, mais à la ponctuation que tu dois changer dans l'analyse

Ensuite, tu peux tout simplement faire un hlitrecherche avant de faire le hajout si tu ne trouve pas la référence
Membre enregistré
90 messages
Posté le 20 avril 2022 - 18:35
argus a écrit :
> d'abord, si tes références sont du style 150.2 ET 1502 et que ce sont bien DEUX références différentes , ce n'est pas la sensibilité à la casse, mais à la ponctuation que tu dois changer dans l'analyse

Merci. J'avais coché les 2 en fait.
Par contre, je ne sais pas comment contourner les doublons que mes fournisseurs peuvent laisser dans leurs fichiers.
Pour l'instant j'ai fait un HGereDoublon faux mais ce n'est pas le but.
Le but de ce fichier est de mettre les stocks à jour, donc le doublon ne me dérange pas mais je préfèrerais avoir une table propre
Membre enregistré
1 046 messages
Posté le 20 avril 2022 - 19:15
As tu essayé le code que je t'ai laissé ci-dessus. Il permet d'importer le fichier Excel sans les blocages de doublon.
Comme l'a précisé argus, il est possible de faire autrement avec un HLitRecherche.
Membre enregistré
90 messages
Posté le 21 avril 2022 - 01:26
Alors un grand, grand Mea Culpa et un grand merci à Cédric_34, je n'avais pas vu le code que tu avais mis. J'ai pourtant bien coché de recevoir les notifications mais je ne reçois rien, ni dans mes spams.

Vu que je débute, j'avais pris ce code d'import Excel sur une vidéo youtube et je vois qu'on peut importer autrement. C'est très intéressant. je le décortique pour comprendre un peu le fonctionnement.
ça va me servir pour plein d'autres imports que j'ai à faire.
Un grand merci
Posté le 21 avril 2022 - 11:38
Bonjour Calimero,

Je passerais pour ma part par un tableau/table temporaire, avec épuration des codes + recherche.

Pour chaque ligne lue de ton fichier fournisseur, tu commences par lire le code et le stocker dans une variable locale.
Tu épures/nettoies ensuite cette variable, par exemple avec un chaineFormate sansespace+sansponctuation etc... pour supprimer les . notamment.

Eventuellement, si les codes "épurés" sont forcément numériques, tu peux en plus te faire une procédure qui retire tout ce qui n'est pas de type numérique.... (Vérif par expression régulière par exemple)

Une fois ton code fournisseur "propre", tu recherches dans ton tableau temporaire si ce code existe déjà :
NON : nouvelle valeur jamais rencontrée => tu l'insères dans ton tableau
OUI : valeur déjà rencontrée et ajoutée dans ton tableau => à voir selon ton besoin (Soit tu gères une trace, une alerte, un log pour info et selon ton besoin tu ignores cette valeur en ne faisant rien d'autre ou bien tu mets à jour l'élément déjà présent de ton tableau : si valeur de stock, le doublon doit avoir la même valeur sinon c'est étrange)

Lorsque tu as fini de lire le fichier, ton tableau temporaire ne contient que des valeurs contrôlées et non doublonnées.
Tu peux alors le parcourir pour remplir ta table finale HF.