Bonjour,
Je rencontre un problème lors d'un ajout de données dans une base.
Le contexte:
J'ai une base de données HyperFileSQL avec (entre autres) un fichier :
- Contacts (ID automatique: ID_Contacts; clé unique: code)
- CADuMois (chiffre d'affaire du mois; ID automatique: ID_CADuMois; CA_montant; CA_mois; CA_annee;ID_Contacts en référence au fichier Contacts; clé composée unique: ID_Contacts,CA_mois,CA_annee)
Liaison : Contacts 0,n --------> 1,1 CADuMois
Je dois insérer des informations dans le fichier CADuMois. Ces informations sont dans un fichier texte. Elles sont classées selon la forme: "CA_montant";"Contacts.code" (exemple: pour un Contacts dont le code est CNET, il y aura une ligne 7281,46;CNET)
L'idée est que je parcours le fichier texte ligne par ligne, en lisant le montant (la première information d'une ligne), puis en faisant un HlitRecherchePremier sur le code contacts (deuxième info d'une ligne), pour mémoriser l'ID du contact.
Pour ce qui est du mois et de l'année, j'ai dans ma fenêtre une combo avec les mois de l'année, et un champ de saisie avec le numéro de l'année.
J'ai développé ce code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 contact_non_trouve est un entier = 0 rMontant est un réel id_contact est un entier = 0 compteur_erreur est un entier = 0 separateur est une chaîne = SansEspace(SAI_separateur) contenu est une chaîne = fChargeTexte(SAI_chemin_fichier) nNbrligne est un entier = ChaîneOccurrence(contenu,RC) + 1 nDepart est un entier SELON INT_premiere_ligne CAS 1: nDepart = 1 CAS 0: nDepart = 2 FIN POUR i = nDepart A nNbrligne Maxim est un entier = nNbrligne Jauge(i, Maxim, Arrondi(i*100/Maxim,2) +"%") sUne_ligne est une chaîne = ExtraitChaîne(contenu,i,RC,DepuisDébut) nNbrinfos est un entier = ChaîneOccurrence(sUne_ligne,separateur) + 1 POUR j = 1 A nNbrinfos sUne_infos est une chaîne = ExtraitChaîne(sUne_ligne,j,separateur,DepuisDébut) SELON j CAS 1: rMontant = sUne_infos CAS 2: SI HLitRecherchePremier(Contacts,con_code,sUne_infos) ALORS id_contact = Contacts.ID_contacts SINON contact_non_trouve++ FIN FIN FIN CADuMois.ID_contacts = id_contact CADuMois.CA_montant = rMontant CADuMois.CA_mois = COMBO_mois CADuMois.CA_annee = Val(SAI_annee) bufMonbuffer est un Buffer = HConstruitValClé(CADuMois,ID_contacts_mois_annee,id_contact,COMBO_mois,Val(SAI_annee)) SI PAS HLitRecherchePremier(CADuMois,ID_contacts_mois_annee,bufMonbuffer) ALORS HAjoute(CADuMois) SINON //le contact a déjà un CA pour le mois et l'année spécifié Trace("ligne numero "+i+" deja dans base") FIN FIN
Le problème:
Le premier ajout se passe bien, le deuxième aussi, puis arrivé au 3ème ajout, un code d'erreur apparait, me disant qu'une erreur de doublon sur la clé composée du fichier CADuMois a été repérée ... Je ne comprend pas la nature de cette erreur, puisque je fais un test sur la clé composée avant d'ajouter un enregistrement en base, et toutes les lignes se mon fichier texte concernent un Contacts différent.
C'est peut-être une simple étourderie de ma part, mais après avoir décortiqué le code du début jusqu'à l'erreur, en mettant des points d'arrêt, etc etc, je ne comprend toujours pas l'erreur. J'utilise pourtant d'autres fichiers avec une clé composée dans mon application, et les ajouts se font sans aucuns problèmes.
Si quelqu'un a une idée de l'origine de cette erreur, ou une suggestion d'amélioration du code d'import des données, je suis preneur.
Cordialement,
Ludovic Marquet
Partager