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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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
    Membre confirm�
    Inscrit en
    F�vrier 2005
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 26
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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 �prouv�
    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 : 54
    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
    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, @ +

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

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

  6. #6
    Membre confirm� Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    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...

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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 confirm� Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    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

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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
    Membre confirm�
    Inscrit en
    F�vrier 2005
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 26
    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 confirm� Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    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...

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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
    Membre confirm�
    Inscrit en
    F�vrier 2005
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 26
    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 confirm� Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    D�tails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    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 !

  15. #15
    Membre confirm�
    Inscrit en
    F�vrier 2005
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 26
    Par d�faut
    Patience...

    sebgui va s'y mettre...

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

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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
    Membre confirm�
    Inscrit en
    F�vrier 2005
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 26
    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 confirm�
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    70
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 70
    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