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

C++Builder Discussion :

Modifier un enregistrement.


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut Modifier un enregistrement.
    • Je suis en train de construire un programme qui stocke les paramètre météo et permettra de les ressortir sous formes de courbes et autres.
      Je prend les données sur internet.


    Mon programme:
    Dans une première partie, j'ai deux table, une avec des stations et leur adresse associé puis une autre dans laquelle je met les stations dont je veut récupérer les données.

    Lorsque j'ajoute une station, pas de problème.


    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
    //Ajout d'une station à mettre à jour
    void __fastcall TPrincipale::cmdAjClick(TObject *Sender)
    {
     
    //Modification de la Table Station
    //Mise en écriture de la table.
    DBTable->Edit();
    //Sélection et écriture de l'enregistrement.
    DBTable->FindField(NumAj);
    DBTable->Fields->Fields[2]->AsString="1";
    DBTable->Post();
    DBTable->Refresh();
     
    //Création d'un nouvel enregistrement
    DBTable2->AppendRecord(ARRAYOFCONST((NumAj,DBTable->Fields->Fields[1]->AsString,Date.DateString())));
    DBTable2->Close();
    DBTable2->Open();
    //Création d'une table pour cet enregistrement.
    DBTable3->Active= false;
    DBTable3->TableName = NumAj;
    if (!DBTable3->Exists)
            {
            DBTable3->FieldDefs->Clear();
            //Pointeur pour créer champ
            TFieldDef *pNewDef = DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Date";
            pNewDef->DataType=ftDate;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "TempMaxi";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "TempMini";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Temp12";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Hygrometrie12";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Pluviometrie";
            pNewDef->DataType=ftInteger;
     
            //Création de la table
            DBTable3->CreateTable();
            }
     
    else
            MessageBox(0, "La table de donnée existe déja. Erreur N°1", "Erreur N°1", MB_ICONERROR|MB_OK);
    }
    Mais lorsque je veut en supprimer une, j'ai un soucis:

    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
    //suppression d'une station à mettre à jour.
    void __fastcall TPrincipale::cmdSpClick(TObject *Sender)
    {
     
    //modification de la Table StationMAJ
    //suppression d'un enregistrement
    DBTable2->FindField(NumSp);
    DBTable2->Delete();
     
    //Modification de la Table Station
    //Mise en écriture de la table.
    DBTable->Edit();
    //Sélection et écriture de l'enregistrement.
    DBTable->FindField(NumSp);
    DBTable->Fields->Fields[2]->AsString="0";
    DBTable->Post();
    DBTable->Refresh();
     
    //Suppresion de la table associé à l'enregistrement.
    DBTable3->Active = false;
    DBTable3->TableName = NumSp;
     
    if (DBTable3->Exists)
            DBTable3->DeleteTable();
     
    else
    MessageBox(0, "Le table ne peut être supprimé car elle n'existe pas. Erreur N°2", "Erreur N°2", MB_ICONSTOP|MB_OK);
    }
    En effet, le codesuivant ne marche pas comme je voudrais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DBTable->FindField(NumSp);
    DBTable->Fields->Fields[2]->AsString="0";
    (Extrait de la partie suppession du programme)

    La fonction FindFieldme sert à sélectionner l'enregistrement.
    La ligne suivante modifie une valeur de cet enregistrement. Or mon problème est le suivant:
    La ligne ne modifie pas l'enregistrement que je veut mais le suivant.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Salut,

    c'est moi ou y'a un truc que je pige pas ?
    FindField sert à retrouver un champ (colonne) dans la table et pas un enregistrement.
    Pour ça, il faut utiliser Locate par exemple.

    ton code, ecrit "0" dans le champs 2 (donc le troisième champs de la table ) de l'enregistrement en cours.

    FindField renvoie un TField qui est non null s'il trouve le champs passé en paramètre.

    Du coup je vois pas trop a quoi sert ton code : :

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Pourrait tu donner un exemple d'utilisation de la fonction locate
    J'ai un problème de compilation.
    Et aussi, pourrait tu expliquer les paramètre car je trouve l'aide très opaque.
    Merci d'avance

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    J'ai testé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Form1->DataSource2->DataSet->Locate("Prenom", "kirikou", TLocateOptions() << loCaseInsensitive);
    ShowMessage(Form1->DataSource2->DataSet->Fields->Fields[0]->AsString);
    afin de m'assurer cette fois ci que je ne disais pas de betises...
    Le premier paramètre représente le nom (ou les noms) du (ou ds champs) sur lesquels se portera la recherche, le second la valeur 'cible', le troisième une option permettant de spécifier le 'comportement' lors de la recherche; ici dans ce cas, il ne fait pas de distinction entre majuscules et minuscules.

    En espérant t'etre utile, @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Désolé, mais mon problème n'est pas résolu.
    Toujours pareil.

  6. #6
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut
    Salut,

    Peux-tu nous en dire un peu plus, rabbi-jaccob ? Ton problème actuel est-il l'utilisation de Locate, ou toujours le problème des suppressions ?

    Pour Locate, c'est vrai que ce n'est pas très évident la première fois qu'on l'utilise, mais si tu ne recherches que sur un seul champ, la méthode et les explications de Cantrelle devraient te permettre d'y parvenir... Si c'est là ton problème, donne-nous l'erreur de compil que tu obtiens, ainsi que la partie de code exacte.

    Si c'est ton problème de suppression, je vois mal... Peut-être l'enregistrement que tu crois pouvoir trouver n'existe pas ? Tu peux tester s'il a été trouvé ou non par la valeur booleenne renvoyée par Locate() : elle doit être à true, sinon tu as tenté de te positionner sur un enregistrement inexistant...
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    En effet, Locate ne trouve pas l'enregistrement désiré.
    Mais, je suis sur d'avoir donné le bon nom de colonne, et le bon nom de champ.
    Une idée pourquoi il ne me le trouve pas.
    J'ai même essayer en marquant un nom que j'ai rentrée à la mais dans la base de donnée et il ne le connait pas.

  8. #8
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut
    Re...

    Donne-nous des détails STP !
    Messages d'erreur éventuel, quel type de BDD, quels composants, extraits de code etc...

    Locate fonctionne très bien, je te l'assure : je m'en sers presque quotidiennement... Par contre, j'ai eu rencontré des bugs dans les composants d'accès aux BDD, et vu des tas d'erreurs de code (y compris dans le mien ) alors que l'auteur était absolument sûr de lui...

    Quoi qu'il en soit, le dépannage à distance n'est déjà pas chose aisée, alors, sans détails, ce n'est même pas la peine de tenter
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Tout d'abord, ma base de donnée est une base de donnée Access
    Pour me connecter, j'utilise le driver Microsoft Access Driver (*.mdb)
    Cette base de donnée contient 2 tables principales et d'autre crée et supprimé par le programme.

    La fenêtre contient 2 boutons pour ajouter ou suprimmer des stations à mettre à jour.

    Losqu'on choisi d'ajouter une station, on met dans la première table un champ à 1 puis on crée un enregistrement dans la table 2 avec le nom de la station et différent renseignement puis on crée une troisième table qui enregistrere la météo quotidienne de la station.

    Lorsqu'on supprime une table, on revient comme au début.

    Pour visualiser les stations qui peuvent et qui sont mise à jour, j'utilise 2 TDBGrid pour afficher le contenu de mes 2 tables principales.

    Programme:

    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
    void __fastcall TPrincipale::FormCreate(TObject *Sender)
    {
    //Ouverture des connexion à la base de donnée.
    DBMeteo->Open();
    DBMeteoBD->Open();
    DBTable->Open();
    DBTable2->Open();
    //Copie des nom des champs sélectionné pour éviter une erreur.
    NumAj= DBListStNMAJ->SelectedField->DisplayText;
    NumSp= DBListStMAJ->SelectedField->DisplayText;
    Date=EncodeDate(2002, 11, 1);
    }
    //---------------------------------------------------------------------------
    //Quitter l'application
    void __fastcall TPrincipale::cmdQuitterClick(TObject *Sender)
    {
    Close();
    }
    //---------------------------------------------------------------------------
    //Ceci copie le nom des stations sélectionner dans les grids dans 2 AnsiString.
    void __fastcall TPrincipale::DBListStNMAJCellClick(TColumn *Column)
    {
    //Copie le nom de la station
    NumAj= DBListStNMAJ->SelectedField->DisplayText;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TPrincipale::DBListStMAJCellClick(TColumn *Column)
    {
     //Copie le nom de la station
    NumSp=DBListStMAJ->SelectedField->DisplayText;
    }
    //---------------------------------------------------------------------------
    //Ajout d'une station à mettre à jour
    void __fastcall TPrincipale::cmdAjClick(TObject *Sender)
    {
    //Modification de la Table Station
    //Mise en écriture de la table.
    DBTable->Edit();
    //Sélection et écriture de l'enregistrement.
    DBTable->FindField(NumAj);
     
    //Ici, la modification de la table 1 marche très bien.
    DBTable->Fields->Fields[2]->AsString="1";
    DBTable->Post();
     
    //Création d'un nouvel enregistrement
    DBTable2->AppendRecord(ARRAYOFCONST((NumAj,DBTable->Fields->Fields[1]->AsString,Date.DateString())));
    DBTable2->Close();
    //Création d'une table pour cet enregistrement.
    DBTable3->Active= false;
    DBTable3->TableName = NumAj;
    if (!DBTable3->Exists)
            {
            DBTable3->FieldDefs->Clear();
            //Pointeur pour créer champ
            TFieldDef *pNewDef = DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Date";
            pNewDef->DataType=ftDate;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "TempMaxi";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "TempMini";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Temp12";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Hygrometrie12";
            pNewDef->DataType=ftInteger;
     
            pNewDef=DBTable3->FieldDefs->AddFieldDef();
            pNewDef->Name= "Pluviometrie";
            pNewDef->DataType=ftInteger;
     
            //Création de la table
            DBTable3->CreateTable();
            }
     
    else
            MessageBox(0, "La table de donnée existe déja. Erreur N°1", "Erreur N°1", MB_ICONERROR|MB_OK);
     
    DBTable2->Open();
    }
    //---------------------------------------------------------------------------
    //suppression d'une station à mettre à jour.
    void __fastcall TPrincipale::cmdSpClick(TObject *Sender)
    {
    bool essaie;
    essaie=false;
    //modification de la Table StationMAJ
    //suppression d'un enregistrement
    essaie=DBTable2->Locate("Station",NumSp,TLocateOptions() << loCaseInsensitive);
    DBTable2->Delete();
    essaie=false;
    //Modification de la Table Station
    //Mise en écriture de la table.
    //Sélection et écriture de l'enregistrement.
    essaie=DBTable->Locate("Station",NumSp,TLocateOptions() << loCaseInsensitive);
    DBTable->Edit();
    DBTable->Fields->Fields[2]->AsString="0";
    DBTable->Post();
     
    //Suppresion de la table associé à l'enregistrement.
    DBTable3->Active = false;
    DBTable3->TableName = NumSp;
     
    if (DBTable3->Exists)
            DBTable3->DeleteTable();
     
    else
    MessageBox(0, "Le table ne peut être supprimé car elle n'existe pas. Erreur N°2", "Erreur N°2", MB_ICONSTOP|MB_OK);
     
    }
    En résumé:
    Losque j'ajoute une station le code de modification de la table 1 marche très bien. mais lorsque je veut supprimer une station, le même code ne marche plus.
    Il doit retrouver le même enregistrement avec le même nom, mais cela ne marche pas.

    Si tu veut d'autre précision demande.
    Merci

  10. #10
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Etant donné que ce que tu cherches à faire est de simplement supprimer un enregistrement de ta table, peut-être pourrais-tu utliliser un TQuery et passer ta requête de suppression directement.

    Dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Query->SQL="delete from MaTable where Station="+AnsiString(NumSp);
    Query->ExecSQL();
    Je garantie pas l'exactitude du code à 100 %, ca dépend de la base et du type de composant que tu utilise (BDE,ADO,DBExpress,..) mais ces méthodes sont relativement similaires d'un composant à l'autre.

  11. #11
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut
    Salut,

    Bon, entre trop et pas assez, on va peut-être finir par y arriver... Dis-toi bien qu'on ne connait pas du tout ton application et que ça ne nous intéresse pas de la connaitre : ce dont on a besoin, c'est juste d'avoir tous les éléments pour t'aider sur le problème que tu rencontres. Ainsi, la partie "création" de ton code était inutile et le rend fastidieux à lire (à nous d'extraire ce qui peut nous intéresser...), par contre une indication plus précise de ton problème (ça plante où exactement ? Il y a 2 appels à Locate, lequel ne positionne pas où tu voudrais ?) nous éviterait de sortir la boule de cristal...

    A priori, je ne vois pas trop, mais je n'ai toujours pas les bons éléments pour comprendre ce qui se passe...

    Tu devrais - au moins pendant le débuggage - vérifier le contenu de ta variable "essaie" juste après les appels à Locate. Ca te permettrait de situer si l'un ou l'autre échoue. Et aussi vérifier que ta variable NumSp contienne bien la bonne valeur : on ne peut pas vérifier si la fonction DBListStMAJCellClick() est appelée correctement et au bon moment, puisque c'est certainement un événement qui la déclenche et donc invisible dans ton code...
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Je l'ai fait, et c'est ce que je dis, dans la fonction de suppression, la variable booléenne
    dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    essaie=DBTable->Locate("Station",NumSp,TLocateOptions() << loCaseInsensitive);
    est à false après la recherche, donc c'est qu'il ne trouve pas l'enregistrement.Pourquoi, c'est un mistère car je suis sûr qu'il existe.

    J'ai même essayé de remettre le pointeur sur l'enregistrement au début de la table au cas ou il ne fasse une recherche qu'après mais ça ne marche toujours pas.

    Est ce que cela ne pourrait pas venir du fait que j'ai deux table ouverte en même temps.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    essaie=DBTable2->Locate("Station",NumSp,TLocateOptions() << loCaseInsensitive);
    Car je fait une recherche sur l'autre table précédement?

    Pour précision, la première recherche de la fonction suppression, celle sur la table 2 marche (essaie = true après la recherche) mais plus celle sur la table1.
    Et dans la fonction de création, la recherche sur la table1 marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBTable->FindField(NumAj);

  13. #13
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Je suis décolé d'être aussi direct mais ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Modification de la Table Station
    //Mise en écriture de la table.
    DBTable->Edit();
    //Sélection et écriture de l'enregistrement.
    DBTable->FindField(NumAj);
     
    //Ici, la modification de la table 1 marche très bien.
    DBTable->Fields->Fields[2]->AsString="1";
    DBTable->Post();
    ne rime à rien

    Explication de texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DBTable->Edit(); // passe DBTable en édition (sur quelle ligne ?? -> celle en cours, donc la première)
     
    DBTable->FindField(NumAj); // on recherche le champs portant le nom contenu dans NumAJ donc un champ qui s'appelerai 1 ou 2 ou 3 ou ... On se contrefou du resultats renvoyé dans un TField. Cette ligne est COMPLETEMENT inutile dans le programme car inexploité. En aucun le curseur de la table n'est déplacé.
     
    DBTable->Fields->Fields[2]->AsString="1"; // cette ligne met "1" dans le champs 2 de la ligne en cours (la première)
     
    DBTable->Post(); // enregistre les modifs
    Traduit ça donne:

    1 je passe ma table en édition
    2 je me demande si une colonne porant le nom qu'un entier existe
    3 je met "1" dans le champs 2 de la ligne en cours
    4 je valide

    Selon tout vraisemblance, ce bout de code est déjà faux.
    Pas surprement que tu retouves pas tes billes ensuite.

    Contacte-moi en MP. Faudrait essayer de m'envoyer ton projet avec ta base. Je me ferais un plaisir de t'aider

  14. #14
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut
    Salut,

    sebgui a raison : il faut probablement voir ton application dans son ensemble. Quand tu dis que tu es sûr que ton enregistrement existe, c'est pourquoi ? Parce que tu es sûr de l'avoir créé ou parce que tu as vérifié qu'il est bien dans la table ?

    Le fait que tu as deux tables ouvertes n'a pas d'importance. Si Locate() ne trouve pas ton enregistrement, c'est qu'il n'y est pas, ou que tu ne cherches pas celui que tu penses trouver, parce que ta variable NumSp ne contient pas la valeur voulue...

    Probablement, sebgui est en train de t'aider à voir plus clairement comment construire ton application. Si ce n'était pas le cas, on y arrivera bien quand même, mais il faut que tu cesses de te focaliser sur le "mystère" de l'enregistrement non trouvé.

    C'est un peu ce que j'ai fait moi aussi : je n'ai prêté aucune attention aux parties de code autres que celles directement concernées. sebgui, lui, a fait une analyse plus globale et a peut-être bien découvert que le "mystère" est tout simplement dû au fait que ton code ne fait pas toujours ce que tu crois...

    Alors, prends les choses bien dans l'ordre. Visualise le contenu de tes tables après création, avant suppression, ainsi que le contenu de tes variables. Le bug n'est probablement pas où tu crois !
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Patience...

    sebgui va s'y mettre...

    Faut d'abord qu'il termine ce pourquoi son patron le paie

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Quand je dis que je suis sur, c'es que je l'aie crée moi même sous access.
    Je croit que c'est une assurance béton.

  17. #17
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 26
    Points : 30
    Points
    30
    Par défaut
    Allez la réponse pour tous le monde

    Effectivement, le problème n'était pas là où on le cherchait.

    En fait, la variable NumSp qui comme son nom ne l'indique pas est une chaine de caractère contenant le nom de la station à supprimer.

    Cette variable prend sa valeur ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall TPrincipale::DBListStMAJCellClick(TColumn *Column)
    {
     //Copie le nom de la station
     NumSp=DBListStMAJ->SelectedField->DisplayText;
    }
    Hors cet évènement n'est pas déclenché lors d'une insertion par programme. Seulement sur un Click.

    Donc NumSp ne contient pas forcément le nom de la station selectionnée dans la DBGrid.

    En fait, plus simple que cela, il suffit d'initialiser NumSP en entrée de la fonction de suppression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //suppression d'une station à mettre à jour.
    void __fastcall TPrincipale::cmdSpClick(TObject *Sender)
    {
    bool essaie;
    essaie=false;
    NumSp=DBTable2->FieldByName("Station")->AsString;
    ...
    Maintenant, on est sûr d'avoir la bonne valeur dans NumSP.

    Et ça marche

    Ton premier locate fonctionnait, lui, car la table Station contient le nom de toutes les stations donc quelque soit la valeur de NumSp (tant que c'est un nom de station) il trouvait quelquechose.

    Pour le second, évidemment, ça ne marchait pas à tous les coups.

    Tant que j'y suis, je te conseille vivement d'utiliser les composants ADO au lieu du BDE.
    Tu n'auras pas besoin d'installer le BDE avec ton appli (tout le nécessaire pour les accès ADO est déjà installé par défaut par Windows) et se sera moins compliqué à configurer (pas d'alias ODBC...)
    Ton appli sera d'ailleurs au moins aussi stable
    Je te conseille aussi de te documenter sur les bases de données.
    Une réorganisation à base de clé pourrais t'être utile.
    De même tu créé et supprime beaucoup de tables.
    Hors ACCESS ne libère pas l'espace utilisé par ces tables (cela doit être fait manuellement).
    Ca risque à terme de faire gonfler artificiellement la taille de la base.

    Enfin ce qui compte c'est de se lancer

    Je te souhaite donc bonne chance pour la suite.

    PS : le debugger est ton ami !
    PS2 : pour le FindField, je persiste à dire qu'il ne fait que chercher une colonne et qu'en aucun cas il ne te place sur un enregistrement.
    Essai dans Excel : sélectionne la colonne "D", OK ? T'es sur quelle numéro de ligne ? bah aucune vu que t'as sélectionné une colonne.
    FindField, c'est pareil. De toute façon, j'ai vu que tu avais modifié la ligne dans ton prog

    Bou sebgui fatigué, sebgui trop tapé caractères sur clavier

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    Points : 57
    Points
    57
    Par défaut
    Merci à tous pour votre aide

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

Discussions similaires

  1. Modifier un enregistrement
    Par frevale dans le forum Access
    Réponses: 2
    Dernier message: 19/04/2006, 11h21
  2. Réponses: 4
    Dernier message: 22/03/2006, 12h19
  3. Réponses: 7
    Dernier message: 29/11/2005, 11h07
  4. [MySQL] Un formulaire pour afficher et modifier un enregistrement
    Par Atchoum_002 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/09/2005, 14h13
  5. Réponses: 11
    Dernier message: 30/08/2005, 09h31

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