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

Bases de données Delphi Discussion :

PB base de données Access


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut PB base de données Access
    j'ai fait une application avec Delphi 6 et une base de données Access 2003 (plusieurs tables) je parcourt une table et j'ecrit sur une autre table des information que je calcul de la premiere table le probleme est que l'opération se bloque aprés un moment mais ce n'est pas tjs au meme enregistrement que j'ai le bloquage des fois aprés le parcourt de 300 enregistrements d'autres fois aprés le parcourt de 100 enregistrements
    alors si qlq peut m'aider

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ca bloque comment ?
    Tu as un message d'erreur ?
    Peux tu monter la partie du code où ca bloque ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut nature du bloquage
    aucun message ne s'affiche mais si je clic sur la page j'ai le message de windows ce programme ne repond pas .
    je pense que le blocage vient de cette partie :
    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
    dcpe.Paie.Append;
    dcpe.Paie.Edit;
    dcpe.Paie.FieldValues['NumPay']:=combobox3.text+'/'+combobox2.text+'/'+ dcpe.Paie.FieldValues['NumEmp']:= code;
    dcpe.Paie.FieldValues['Prog']:= combobox1.Text;
    dcpe.Paie.FieldValues['Mois']:= strtoint(combobox3.Text);
    dcpe.Paie.FieldValues['Annee']:= strtoint(combobox2.Text);
    dcpe.Paie.FieldValues['Sb']:= Sb;
    dcpe.Paie.FieldValues['Nbj']:= nbj;
    dcpe.Paie.FieldValues['Sss']:= Sss;
    dcpe.Paie.FieldValues['Ret']:= ret;
    dcpe.Paie.FieldValues['Net']:= net;
    dcpe.Paie.FieldValues['SbP']:= SbP;
    dcpe.Paie.FieldValues['NbjP']:= nbjP;
    dcpe.Paie.FieldValues['SssP']:= SssP;
    dcpe.Paie.FieldValues['RetP']:= retP;
    dcpe.Paie.FieldValues['NetP']:= NetP;
    dcpe.Paie.FieldValues['Conso']:= conso + Sss;
    dcpe.Paie.FieldValues['ConsoP']:= ConsoP+SssP;
    //dcpe.Paie.AppendRecord([, ]);
    //dcpe.paie.edit;
    dcpe.paie.Post;

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par chakir76
    je parcourt une table et j'ecrit sur une autre table des information que je calcul de la premiere table
    Je suppose que le code ci-dessus est imbriqué dans une boucle While ou Repeat. Je pense qu'il serait intéressant de voir cette partie pour comprendre pourquoi ton traitement ne va pas jusqu'au bout !

    PS: La prochaine fois n'oublies pas d'utiliser la balise code (le bouton [#] dans l'éditeur). Merci.

    @+ Claudius

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Cl@udius
    PS: La prochaine fois n'oublies pas d'utiliser la balise code (le bouton [#] dans l'éditeur). Merci.

    @+ Claudius
    Mais euh... j'etais en train de la faire , c'est a moi de l'engueler

    Juste une remarque sur le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dcpe.Paie.Append;
    dcpe.Paie.Edit;
    Le edit sert à rien, quand tu fait un append, ca met automatiquement le Dataset en mode édition
    Et comme l'a fait remarquer Claudius, il serait bien de voir la boucle en question
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut le code complet
    avant de vous faire voir la procedure dans ca totalite je vous explique cette base de données contient plusieurs tables cette procedure utilise 3 de ces tables; la premier est la table contrat ou je stock des employes la seconde est la table piontage ou je fait le piontage des ces employes pour le calcul de leurs paie pour un mois données alors je remplis la tble piotage automatiquement en me basant sur la date de leurs contrat le max est de 22 jours puis j'affiche ca dans un dbgrd et je laisse l'utilisateur modifier le nobre d jour de travail pour ces gens enfin vient la presente pocedure dans la quel je calcul leurs paie en fonction des jours travailler voila la procedure :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
     
    procedure TN_Pointage.BitBtn2Click(Sender: TObject);
    var Sss, ret, net, SssP, retP, netP, taux, retabs, retabsP, tauxP, Sb, SbP,conso, consoP:real;
    var code,s:string;
    var nbj, nbjP:integer;
    begin
    if dcpe.Taux.Active = false then
       dcpe.Taux.Active := true;
    dcpe.pointage.IndexName:='';
    if dcpe.pointage.Active = false then
       dcpe.pointage.Active :=true;
    if dcpe.Paie.Active = false then
       dcpe.Paie.Active:=true;
    if dcpe.Contrat.Active = false then
       dcpe.Contrat.Active :=true;
    dcpe.pointage.First;
    while not dcpe.pointage.Eof do
         begin
            code:=dcpe.pointage.Fields[1].AsString;
            if dcpe.Paie.FindKey([combobox3.text+'/'+combobox2.text+'/'+code]) = false then
              if dcpe.Contrat.FindKey([dcpe.pointage.fields[1].asstring])then
                begin
                   try
                      nbj:=dcpe.pointage.Fields[8].Asinteger;
                      nbjP:=dcpe.pointage.Fields[9].Asinteger;
                      Sb:=dcpe.Contrat.Fields[22].AsFloat;
                      SbP:=dcpe.Contrat.Fields[28].AsFloat;
                      conso:=dcpe.Contrat.Fields[33].AsFloat;
                      consoP:=dcpe.Contrat.Fields[42].AsFloat;
                     //----------------PAIE CONTRAT INITIAL MOIS COMPLET--------
                     if ((nbj = 22)and(nbjP = 0)) then
                       begin
                            sss:= Sb;
                            ret := Sss * 9 /100;
                            net := Sss - ret;
                            SssP:=0; retP:=0; netP:=0;
                       end
                     //----------------PAIE CONTRAT PROROG MOIS COMPLET-------
                     else
                         if ((nbj = 0)and(nbjP = 22)) then
                           begin
                                sssP:= SbP;
                                retP := SssP * 9 /100;
                                netP := SssP - retP;
                                Sss:=0; ret:=0; net:=0;
                            end
                     //----------------PAIE CONTRAT INIATIAL INCOMPLET ---------
                         else
                            if ((nbj > 0) and(nbj < 22)and(nbjP = 0)) then
                              begin
                                   if Dcpe.Taux.FindKey([Sb])then
                                      taux:=dcpe.Taux.Fields[1].AsFloat;
                                   //retabs:= (22-nbj)* 8 * taux;
                                   sss:=nbj * 8 * taux;
                                   ret:= sss * 9/100;
                                   str(ret:10:2,s);
                                   ret:=strtofloat(s);
                                   net:= sss - ret;
                                   SssP:=0;retP:=0;netP:=0;
                              end
                     //----------------PAIE CONTRAT PROROG INCOMPLET ----------
                            else
                                if ((nbj = 0)and(NbjP > 0)and(NbjP < 22)) then
                                  begin
                                       if Dcpe.Taux.FindKey([SbP])then
                                          taux:=dcpe.Taux.Fields[1].AsFloat;
                                       //retabs:= (22-nbjP) * 8 * taux;
                                       sssP:=nbjP * 8 * taux;
                                       retP:= sssP* 9/100;
                                       str(retP:10:2,s);
                                       retP:=strtofloat(s);
                                       netP:= sssP - retP;
                                       Sss:=0; ret:=0; net:=0;
     
                                  end
                     //---------------PAIE MOITIE INITIAL MOITIE PROROG----------
                               else
                                    if ((nbj < 22)and(nbj > 0)and(nbjP < 22)and(nbjP > 0 )) then
                                      begin
                                           //--------------moitie initial--------------------
                                           if Dcpe.Taux.FindKey([Sb])then
                                              taux:=dcpe.Taux.Fields[1].AsFloat;
                                           sss:=nbj * 8 * taux;// Sb - retabs;
                                           ret:= sss* 9/100;
                                           str(ret:10:2,s);
                                           ret:=strtofloat(s);
                                           net:= sss - ret;
                                           //--------------moitie prorog-------------------
                                           if Dcpe.Taux.FindKey([SbP])then
                                              tauxP:=dcpe.taux.Fields[1].AsFloat;
                                           sssP:=nbjP * 8 * taux;//SbP - retabsP;
                                           retP:= sssP* 9/100;
                                           str(retP:10:2,s);
                                           retP:=strtofloat(s);
                                           netP:= sssP - retP;
                                     end;
                finally
                   dcpe.Paie.Append;
                   dcpe.Paie.Edit;
                   dcpe.Paie.FieldValues['NumPay']:=combobox3.text+'/'+combobox2.text+'/'+code;
                   dcpe.Paie.FieldValues['NumEmp']:= code;
                   dcpe.Paie.FieldValues['Prog']:= combobox1.Text;
                   dcpe.Paie.FieldValues['Mois']:= strtoint(combobox3.Text);
                   dcpe.Paie.FieldValues['Annee']:= strtoint(combobox2.Text);
                   dcpe.Paie.FieldValues['Sb']:= Sb;
                   dcpe.Paie.FieldValues['Nbj']:= nbj;
                   dcpe.Paie.FieldValues['Sss']:= Sss;
                   dcpe.Paie.FieldValues['Ret']:= ret;
                   dcpe.Paie.FieldValues['Net']:= net;
                   dcpe.Paie.FieldValues['SbP']:= SbP;
                   dcpe.Paie.FieldValues['NbjP']:= nbjP;
                   dcpe.Paie.FieldValues['SssP']:= SssP;
                   dcpe.Paie.FieldValues['RetP']:= retP;
                   dcpe.Paie.FieldValues['NetP']:= NetP;
                   dcpe.Paie.FieldValues['Conso']:= conso + Sss;
                   dcpe.Paie.FieldValues['ConsoP']:= ConsoP+SssP;
                   //dcpe.Paie.AppendRecord([, ]);
                   //dcpe.paie.edit;
                   dcpe.paie.Post;
                   dcpe.Contrat.Active := false;
                   dcpe.Contrat.Active := true;
                   if dcpe.Contrat.FindKey(['code'])then
                     begin
                         dcpe.Contrat.Edit;
                         dcpe.Contrat.Fields[33].AsFloat := dcpe.Contrat.Fields[33].AsFloat + Sss;
                         dcpe.Contrat.Fields[42].AsFloat := dcpe.Contrat.Fields[42].AsFloat + SssP;
                         dcpe.Contrat.Post;
                     end;
                    if dcpe.Contrat.Active = false then
                       dcpe.Contrat.Active :=true;
           end;
     
             end;
            dcpe.pointage.delete ;
         end;
           messageDlg('Operation Fini ', mtInformation, [mbOk], 0);
           bitbtn1.SetFocus;
    end;
    Hauwke : Prière d'utiliser les balises de code SVP!

  7. #7
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour,
    Avant de chercher l'erreur, je pense qu'il faudrait commencer par rationaliser votre code:
    • Eviter
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
        nbj:=dcpe.pointage.Fields[8].Asinteger
    • mais faîtes plutôt :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
       nbj := dcpe.pointage.fieldbyname('Nomdemonchamp').value;
    • En effet, tous les champs Access sont des variants, inutile de typer vos champs dans Delphi vous alourdissez votre communication avec le moteur Jet / MDAC d'Access. De plus, la nomination explicite de vos champs vous permettra de changer, améliorer l'organisation (i.e. la structure) de vos tables sans vous obliger à modifier votre code de traitement.
    • Eviter vos multiples "Else". Scindez votre code en plusieurs procédures, créez une procédure de sélection et appelez enfin la procédure concernée. Vous accélererez vos traitement et allégerez vos protocoles de recherches de bugs.
    • Commentez votre code
    • Renommez vos variables de façon à rendre leur nom plus "parlant". vous faciliterez le travail de maintenance de votre code.
    • Utilisez les threads! Avec des tables volumineuses, c'est indispensable!
    Cordialement,
    Hauwke

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Je t'invite vivement à suivre les conseils que t'a donnés Hauwke. Notamment sur l'utilisation de variables plus parlantes et celle de FieldByName.

    J'ajouterais qu'il saurait peut-être bon d'inclure tout ceci dans une transaction. Que ce passe-t-il si tu as un échec lors du post sur 'Paie' ?

    Dans ton code une chose me dérange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      dcpe.pointage.First;
      while not dcpe.pointage.Eof do
      begin
         [...]
         dcpe.pointage.delete ; // ????????????
      end;
      messageDlg('Operation Fini ', mtInformation, [mbOk], 0);
    Je ne suis pas un pro d'Access mais je doute que ce soit une bonne facon de procéder.
    Dans la boucle je ferais un Next, et la sortie de la boucle je viderais la table 'Pointage'.

    De plus, tu ne traites pas le cas où la recherche dans la table Contrat n'aboutit pas. Je dis bizarre.

    Voilà
    @+ Claudius

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut Merci
    Je tient a vous remercies tous mais mon probleme percise tjs de plus je ne connais rien sur les threads si qlq peut m'aider a en aprendre d'avantage ca ne serai tres sympa

  10. #10
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Je ne m'étendrais pas sur l'utilisation des Threads, car je ne serais sûrement pas de bon conseil, mais tu devrais trouver dans la FAQ ou les cours de quoi bien débuter.

    Mais pour revenir à ton traitement. As-tu essayé de remplacer le Delete dans la boucle par un Next? Si oui qu'est-ce que ça donne ?

    @+

  11. #11
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 20
    Points
    20
    Par défaut Tjs le meme probleme
    désoler pour le retard j'avais des problemes de conexion a intenet mais tjs j'ai le meme probleme avec ma table meme en mettant un next a la palce de delete.

Discussions similaires

  1. Accès aux bases de données Access
    Par xela dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/12/2004, 09h07
  2. [débutant] Connection à une base de donnée Access
    Par Lorenzox dans le forum JBuilder
    Réponses: 1
    Dernier message: 25/10/2004, 16h28
  3. Réponses: 15
    Dernier message: 25/10/2004, 11h50
  4. [Déploiement]Base de donnée Access
    Par Giovanny Temgoua dans le forum Bases de données
    Réponses: 9
    Dernier message: 09/08/2004, 20h48
  5. associer une base de données(access) a un dbgrid
    Par ange1708 dans le forum MFC
    Réponses: 3
    Dernier message: 11/06/2002, 12h18

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