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 edit/append delphi7/mysql4/ODBC


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Par défaut pb edit/append delphi7/mysql4/ODBC
    Salut à tous,

    j'ai un souci lorsque je veux mettre à jour un enregistrement dans une table mysql, voici mon 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
    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
     
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('SELECT AP_ID_Lecteur, AP_Type_support, EXTRACT(YEAR FROM AP_Date_Pret) AS annee, COUNT( * )');
      ADOQuery1.SQL.Add('FROM archives_prets');
      ADOQuery1.SQL.Add('GROUP BY annee,AP_ID_Lecteur,AP_Type_support');
      ADOQuery1.SQL.Add('ORDER BY annee,AP_ID_Lecteur,AP_Type_support');
      ADOQuery1.Active;
      ADOQuery1.Open;
      ProgressBar1.Visible := True;
      ProgressBar1.Position := 0;
      ProgressBar1.Max := ADOQuery1.RecordCount;
      ADOQuery1.first;
      while not ADOQuery1.Eof do
      begin
        xidlect := ADOQuery1.Fields[0].AsInteger;
        xsupport := ADOQuery1.Fields[1].AsString;
        xannee := ADOQuery1.Fields[2].AsInteger;
        xcount := ADOQuery1.Fields[3].AsInteger;
        if pret_annee.Locate('Id_Lect;Annee', VarArrayOf([xidlect, xannee]), [loCaseInsensitive]) then
          pret_annee.Edit
        else pret_annee.Append;
     
        pret_annee.Fields[8].AsInteger := xidlect; //id_lect
        pret_annee.Fields[1].AsInteger := xannee; //annee
        if xsupport = '1' then
          pret_annee.Fields[2].AsInteger := xcount; //pret_mono
        if xsupport = '2' then
          pret_annee.Fields[3].AsInteger := xcount; //pret_perio
        if xsupport = '3' then
          pret_annee.Fields[4].AsInteger := xcount; //pret_son
        if xsupport = '4' then
          pret_annee.Fields[5].AsInteger := xcount; //pret_video
        if xsupport = '5' then
          pret_annee.Fields[6].AsInteger := xcount; //pret_mmedia
        if xsupport = '6' then
          pret_annee.Fields[7].AsInteger := xcount; //pret_autres
        pret_annee.Post;
        ADOQuery1.Next;
      end;
      label24.Visible := True;
      ProgressBar1.Visible := False;
    end;
     
    procedure TfrmAcqui.archives_prets_BtClick(Sender: TObject);
    begin
      Label26.Visible := False;
      ActiveTable(Self);
      ProgressBar1.Visible := True;
      ProgressBar1.Position := 0;
      ProgressBar1.Max := Table029.RecordCount;
      Table029.First;
      while not Table029.Eof do
      begin
        FindLect(Table029.Fields[19].AsString); //id_lecteur
        if id_lect <> '0' then
        begin
          if expl.Locate('N_Inventaire', Table029.Fields[0].AsString, [loCaseInsensitive]) then
          begin
            archives_prets.Append;
            archives_prets.Fields[8].AsString := expl.Fields[3].AsString; //id_notice
            notices.Filter := 'ID_Notice=''' + expl.Fields[3].AsString + '''';
            notices.Filtered := True;
            archives_prets.Fields[9].AsString := notices.Fields[1].AsString; //titre
            if langue.Locate('Id_Langue', notices.Fields[2].AsString, [loCaseInsensitive]) then
              archives_prets.Fields[10].AsString := langue.Fields[2].AsString; //langue
            archives_prets.Fields[11].AsString := notices.Fields[5].AsString; //vedette
            archives_prets.Fields[12].AsString := notices.Fields[9].AsString; //type_xsupport
            archives_prets.Fields[26].AsString := notices.Fields[7].AsString; //type_ved
     
            if notices.Fields[7].AsString = '1' then
            begin
              if not_ved.Locate('ID_Notice', expl.Fields[3].AsString, [loCaseInsensitive]) then
                archives_prets.Fields[25].AsString := not_ved.Fields[2].AsString; //id_ved
            end
            else if notices.Fields[7].AsString = '2' then
            begin
              if ved_col.Locate('Collectivite', notices.Fields[5].AsString, [loCaseInsensitive]) then
                archives_prets.Fields[25].AsString := ved_col.Fields[0].AsString; //id_ved
            end;
            archives_prets.Fields[13].AsString := expl.Fields[0].AsString; //id_expl
            if cotes.Locate('ID_Cote', expl.Fields[4].AsString, [loCaseInsensitive]) then
              archives_prets.Fields[14].AsString := cotes.Fields[1].AsString; //cote
            if bullet.Locate('ID_Expl', expl.Fields[0].AsString, [loCaseInsensitive]) then
            begin
              archives_prets.Fields[15].AsString := bullet.Fields[3].AsString; //fascicule
              archives_prets.Fields[24].AsString := bullet.Fields[0].AsString; //id_bul
            end;
            archives_prets.Fields[23].AsString := Table029.Fields[0].AsString; //n_inventaire
            if lecteurs.Locate('Id_Lect', id_lect, [loCaseInsensitive]) then
            begin
              archives_prets.Fields[1].AsString := id_lect;
              archives_prets.Fields[2].AsString := lecteurs.Fields[5].AsString; //nom_lect
              archives_prets.Fields[3].AsString := lecteurs.Fields[6].AsString; //prenom_lect
              archives_prets.Fields[4].AsString := lecteurs.Fields[2].AsString; //type_lect 1:pers;2:collec
              archives_prets.Fields[5].AsString := lecteurs.Fields[3].AsString; //type_public 1:ad;2:enf
              archives_prets.Fields[6].AsString := lecteurs.Fields[7].AsString; //datenais
              archives_prets.Fields[7].AsString := lecteurs.Fields[48].AsString; //civilité
              archives_prets.Fields[19].AsString := lecteurs.Fields[43].AsString; //id_csp
              if csp.Locate('ID_csp', lecteurs.Fields[43].AsString, [loCaseInsensitive]) then
                archives_prets.Fields[20].AsString := csp.Fields[1].AsString; //lib_csp
            end;
            archives_prets.Fields[21].AsString := '1'; //id_bib
            if pret.Locate('Id_Lecteur;Id_Expl', VarArrayOf([id_lect, expl.Fields[0].AsString]), [loCaseInsensitive]) then
            begin
              archives_prets.Fields[16].AsString := pret.Fields[0].AsString; //id_pret
              archives_prets.Fields[17].AsString := pret.Fields[3].AsString; //date_pret
              archives_prets.Fields[18].AsString := pret.Fields[4].AsString; //date_retour
            end
            else
            begin
              archives_prets.Fields[17].AsString := Table029.Fields[2].AsString; //date_pret
              archives_prets.Fields[18].AsString := Table029.Fields[15].AsString; //date_retour
              archives_prets.Fields[21].AsString := '1'; //pret.Fields[8].AsString; //id_bib
            end;
            if not_edi.Locate('ID_Notice', notices.Fields[0].AsString, [loCaseInsensitive]) then
            begin
              archives_prets.Fields[28].AsString := not_edi.Fields[2].AsString; //id_edi
              if editeurs.Locate('Id_Edi', not_edi.Fields[2].AsString, [loCaseInsensitive]) then
                archives_prets.Fields[27].AsString := editeurs.Fields[1].AsString; //editeur
            end;
            if not_ens.Locate('ID_Notice', notices.Fields[0].AsString, [loCaseInsensitive]) then
            begin
              archives_prets.Fields[30].AsString := not_ens.Fields[2].AsString; //id_tens
              if ens.Locate('Id_Ens', not_ens.Fields[2].AsString, [loCaseInsensitive]) then
                archives_prets.Fields[29].AsString := ens.Fields[1].AsString; //titre_ens
              archives_prets.Fields[31].AsString := not_ens.Fields[3].AsString; //tome
            end;
            if stitres.Locate('ID_Notice', notices.Fields[0].AsString, [loCaseInsensitive]) then
              archives_prets.Fields[32].AsString := stitres.Fields[1].AsString; //sous_titre
            archives_prets.Post;
          end;
        end;
        ProgressBar1.Position := ProgressBar1.Position + 1;
        Table029.Next;
      end;
    Voilà, je suis sous Delphi7, mysql avec ODBC.
    Merci de m'aider le plus vite possible, c'est très très urgent. Mon Client attend et je dois finir aujourd'hui de l'installer.
    Merci d'avance.
    [Balises CODE rajoutées par Pedro. Merci d'y penser à l'avenir]

  2. #2
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    salut

    commence par utiliser les balises de code (le dièse # en haut de la fenêtre de rédaction du message) ensuite évite de poster 500 lignes de code en affirmant que "ça ne marche pas" : poste uniquement la partie qui ne fonctionne pas et explique ce qui ne va pas (un message d'erreur, un comportement inattendu, ça ne compile pas ?)

    je te souhaite bon courage

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Par défaut Correction
    Ok, désolée d'avoir tout mis sans préciser le pb réellement.
    Donc voilà le pb:

    Je passe une 1° fois, je passe par le pret_annee.append, j'enregistre dans ma table les données, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      pret_annee.Fields[8].AsInteger := 1 ; //id_lect
      pret_annee.Fields[1].AsInteger := 2004 ; //annee
      pret_annee.Fields[2].AsInteger := 6 ; //pret_mono
    Ensuite, je passe une 2° fois, et je fais un pret_annee.edit parce que je trouve ma ligne avec id_lect = 1 et annee = 2004.
    Je veux enregistrer dans la table le champ pret_annee.fields[3].asinteger = 4.

    Quand je fais mon pret_annee.post, j'ai un message d'erreur:
    "La ligne n'a pas pu être trouvée pour la mise à jour. Certaines valeurs ont peut-être changé depuis leur dernière lecture".

    Voilà, maintenant, la question est plus précise: Pourquoi ça marche pas?
    Je suis peut-être complètement à la masse mais ça fait des semaines que je travaille dessus et je ne vois pas d'où vient le pb.
    JE VOUS EN SUPPLIE AIDEZ MOI!!!!!!!!!!!!!

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Par défaut
    Pourquoi tu passes par des Append/Post alors qu'avec un requete Insert tu gagnerais en simplicité et en temps de traitement.

    Petite remarque :
    Tu utilises Fields[x] et après tu mets en commentaire le nom du champs.
    Pour un soucis de lisibilité n'aurait il pas mieux valut que tu utilises FieldByName('Nom_du_champ'), ca rendrait ton code largement plus lisible.
    De plus, en cas ou l'utilisateur modifie la base de données et intervertie 2 champs, tu n'auras pas à chercher des heures d'où vient le problème.
    Modérateur Delphi

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

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Par défaut
    OK,

    Pour l'insert j'ai déjà essayé mais cela ne marche pas plus non plus.
    Pouvez vous me donner une reponse avec l'une ou l'autre méthode????

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    Par défaut
    Je te fais un exmeple mais il aura surmeent des chose à modifier (Nom des tables)

    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
     
    begin
    With AdoQuery1 do
    begin
     Close;
      SQL.Clear;
      SQL.Add('SELECT AP_ID_Lecteur, AP_Type_support, EXTRACT(YEAR FROM AP_Date_Pret) AS annee, COUNT( * ) as Total');
      SQL.Add('FROM archives_prets');
      SQL.Add('GROUP BY annee,AP_ID_Lecteur,AP_Type_support');
      SQL.Add('ORDER BY annee,AP_ID_Lecteur,AP_Type_support');
      Open;
     
      ProgressBar1.Visible := True;
      ProgressBar1.Position := 0;
      ProgressBar1.Max := RecordCount;
      first;
      while not Eof do
      begin
        xidlect := FieldByName('AP_ID_Lecteur').AsInteger;
        xsupport := FieldByName('AP_Type_support').AsString;
        xannee := FieldByName('annee').AsInteger;
        xcount := FieldByName('Total').AsInteger;
        if pret_annee.Locate('Id_Lect;Annee', VarArrayOf([xidlect, xannee]), [loCaseInsensitive]) then
        begin
          AdoQEdit.Close;
          AdoQEdit.SQL.Clear;
          AdoQEdit.SQL.Add('Update pret_annee set');
          AdoQEdit.SQL.Add('annee = :CAnnee,');
          Case StrTointF(xsupport ,0) of
            0: Showmessage('Erreur');
            1:   AdoQEdit.SQL.Add('pret_mono = :Cpret');
            2:   AdoQEdit.SQL.Add(pret_perio = :Cpret');
            3:   AdoQEdit.SQL.Add('pret_son = :Cpret');
            4:   AdoQEdit.SQL.Add('pret_video = :Cpret');
            5:   AdoQEdit.SQL.Add('pret_mmedia = :Cpret');
            6:   AdoQEdit.SQL.Add('pret_autres = :Cpret');
          end;// case
          AdoQEdit.SQL.Add('Where id_lect = :CIDLECT');
          AdoQedit.ParamCheck := True;
          AdoQEdit.Parameters.ParamByName('Cpret').Value := xcount;
          AdoQEdit.Parameters.ParamByName('CAnnee').Value := xannee;
          AdoQEdit.Parameters.ParamByName('CIDLECT').Value := xidlect;
          try
            AdoQEdit.ExecSQL;
          Except on E:Exception do
            Showmessage('Erreur Update : ' + E.Message');
          end;//try
        end// if
        else begin
          AdoQNew.Close;
          AdoQNew.SQL.Clear;
          AdoQNew.SQL.Add('Insert into pret_annee(id_lect,annee,');
          Case StrTointF(xsupport ,0) of
            0: Showmessage('Erreur');
            1:   AdoQNew.SQL.Add('pret_mono)');
            2:   AdoQNew.SQL.Add(pret_perio)');
            3:   AdoQNew.SQL.Add('pret_son)');
            4:   AdoQNew.SQL.Add('pret_video)');
            5:   AdoQNew.SQL.Add('pret_mmedia)');
            6:   AdoQNew.SQL.Add('pret_autres)');
          end;// case
          AdoQNew.SQL.Add(Values(:CIDLECT,:CANNEE,:XCOUNT)');
          AdoQNew.ParamCheck := True;
          AdoQNew.Parameters.ParamByName('CIDLECT').Value := xidlect;
          AdoQNew.Parameters.ParamByName('CANNEE').Value := xannee;
          AdoQNew.Parameters.ParamByName('XCOUNT').Value := xcount;
          try
            AdoQNew.ExecSQL;
          Except on E:Exception do
            Showmessage('Erreur Update : ' + E.Message');
          end;// try
      end;// if
       Next;
      label24.Visible := True;
      ProgressBar1.Visible := False;
    end;// with
    A tester j'ai peut être fait quelques erreur car je ne peux pas tester totalement le code.

    Faudrait aussi modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if pret_annee.Locate('Id_Lect;Annee', VarArrayOf([xidlect, xannee]), [loCaseInsensitive]) then
    et en faire un function qui te retourne vrai ou faux au lieu d'ouvrir une table au debut et qu'il faudrait rafraichir à chaque fois qu'on ajoute dedans.
    Modérateur Delphi

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

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

Discussions similaires

  1. Pb insert sous delphi7/mysql4/ODBC
    Par Mawie dans le forum Bases de données
    Réponses: 1
    Dernier message: 22/06/2006, 12h57
  2. Edition des états sous Delphi7
    Par amtdev dans le forum Delphi
    Réponses: 3
    Dernier message: 13/05/2006, 15h28
  3. pour Insert Edit et Append
    Par djouahra.karim1 dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/06/2005, 11h20
  4. Clé autoincrémentée sous [ACCESS] [ODBC] [DELPHI7]
    Par Unusual_FL dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/04/2005, 11h46

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