IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

HAjoute et clé composée [WD18]


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut HAjoute et clé composée
    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

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 556
    Points : 1 198
    Points
    1 198
    Par défaut
    Bonjour,

    Le comportement constaté est tout à fait normal.

    Si je traduis votre code :

    1 - vous affecter des valeurs à la table CADuMois
    2 - vous faites une recherche dans la table CAduMois --> donc vous ré-initialisez toutes vos valeurs avec le résultat du HLitRecherchePremier()
    3 - vous tentez un ajout qui sera donc en doublon...

    Il vous faut donc décaler l'affectation des rubriques de CaDuMois au bon endroit.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    D'abord, merci pour l'intérêt que vous portez à mon problème.

    Votre solution marcherai si dans mon code j'avais

    "SI HLitRecherchePremier(....)...."

    Mais ici, j'ai: "SI PAS HLitRecherchePremier(....)...."

    Les valeurs que je donne aux rubriques du fichier CADumois ne devraient donc pas être réinitialisées au moment du HAjoute puisque le HLitRecherchePremier doit retourner Faux pour aller chercher cette ligne de code.

    Aussi, cela n'explique pas pourquoi certaines des premières informations de mon fichier s'ajoutent correctement, et pas les autres !

    Cordialement,

    Ludovic Marquet

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    J'ai tout de même essayé d'attribuer les valeurs du nouvel enregistrement de CADuMois juste avant le HAjoute, et ce la fonctionne, comme vous le disiez ! Merci !

    Mais je dois avouer que je ne comprend pas pourquoi ça marche. Les valeurs des rubriques de CADuMois prennent les valeurs du premier enregistrement du fichier lors d'un HLitRecherchePremier qui retourne faux ?

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Voici le contenu de l'aide :

    Après l'exécution de la fonction HLitRecherchePremier, plusieurs cas peuvent se présenter :
    •un enregistrement correspondant à la condition a été trouvé, bloqué (si nécessaire) et chargé en mémoire : la fonction HTrouve renvoie Vrai.
    •s'il n'existe pas d'enregistrement correspondant à la condition mais s'il existe un enregistrement de valeur supérieure : l'enregistrement est lu, la fonction HEnDehors renvoie Faux et la fonction HTrouve renvoie Faux.
    •le fichier de données est vide : aucune lecture n'est effectuée, la fonction HEnDehors renvoie Vrai et la fonction HTrouve renvoie Faux.
    •la fonction tente de bloquer un enregistrement déjà bloqué en lecture : aucune lecture n'est effectuée, la fonction HErreurBlocage renvoie Vrai et la fonction HEnDehors renvoie Vrai.
    Comme tu peux le lire, s'il n'existe pas d'enregistrement, il se place sur l'enregistrement supérieur par rapport à la condition !
    D'où le fait qu'il aille sur un enregistrement quand même ...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    556
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 556
    Points : 1 198
    Points
    1 198
    Par défaut
    Si vous voulez conserver votre algorithme, c'était un HRecherchePremier() et pas un HLitRecherchePremier()

    La nuance de ces 2 fonctions est le déplacement du curseur pour les 2 cas, mais la lecture d'un enreg. dans 1 seul cas.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    D'accord, tout s'éclaire ! Merci beaucoup pour vos réponses, problème résolu.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/06/2002, 00h15
  2. Existe t'il un composant permettant de jouer un son wav?
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/06/2002, 14h10
  3. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10
  4. Installer ses composants
    Par Geronimo dans le forum C++Builder
    Réponses: 14
    Dernier message: 18/06/2002, 14h51
  5. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo