Merci pour cette longue explication, ça résume parfaitement ce que j'ai besoin de savoir et tellement bien expliqué que je vais l'imprimer. Je bosse dessus et je reviens vers toi si j'ai un problème!
Version imprimable
Merci pour cette longue explication, ça résume parfaitement ce que j'ai besoin de savoir et tellement bien expliqué que je vais l'imprimer. Je bosse dessus et je reviens vers toi si j'ai un problème!
Ok donc j'ai bien compris ce que tu as écrit mais dans un première temps je dois importer les champs de la ligne d'enregistrement dans les 3 TEdit tels qu'ils sont, c'est après avoir cliqué sur un autre bouton de mise à jour que la requête UPDATE se fera.
Donc pour récupérer les infos, j'ai donc fait un simple SELECT:
Code:
1
2
3
4
5
6
7
8
9
10
11 void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString numClient= Query1->FieldByName( "NUMERO_CLIENT" )->AsString ; QModif->Active = false; QModif->SQL->Clear(); Form2->Edit1->Text=QModif->SQL->Add( "SELECT NOM FROM CLIENT WHERE NUMERO_CLIENT= " + numClient ) ; QModif->ExecSQL() ; Form2->Show(); }
* Mon Query1 est celui que tu appelles QSelect, je le renommerais plus tard
Il y a du progrès, maintenant au lieu de rien avoir dans le Edit1, j'ai "0".
Le code utilisé est ci-dessus.
Cette ligne est complètement incohérente, normal qu'elle ne donne rien:
Regarde ce que retourne la fonction Add (via l'aide F1) et tu comprendra ton erreur. De plus, tu fais un ExecSQL sur un SELECT.Code:Form2->Edit1->Text = QModif->SQL->Add( "SELECT NOM FROM CLIENT WHERE NUMERO_CLIENT= " + numClient ) ;
Mais si je comprend pas trop ce que tu essai de faire...
Si tu veux récupérer le contenu de la ligne sélectionnée dans un Edit:
Code:Form2->Edit1->Text = Query1->FieldByName( "NOM" )->AsString;
En fait ce que je cherche à faire :
Quand l'utilisateur clique sur un bouton sur le form1, ça ouvre le form 2:
http://nsa20.casimages.com/img/2010/...5757477306.jpg
Et je voudrais que dans ces 3TEdit, s'affiche les 3 champs de la ligne sélectionnée dans le DBGrid.
Après, les modifications peuvent être faites et le user aura la possibilité de cliquer sur un autre bouton en dessous pour sauvegarder les modifications et les envoyer dans la table. ( mais ça, j'ai compris, c'est pour afficher dans les TEdit que je sais pas comment m'y prendre )
Donc il suffit de faire au moment où tu affiche ta Form2:
Code:
1
2
3 Form2->Edit1->Text = Query1->FieldByName( "NOM" )->AsString; Form2->Edit2->Text = Query1->FieldByName( "GSM" )->AsString; Form2->Edit3->Text = Query1->FieldByName( "MATRICULE" )->AsString;
Franchement, je comprend pas pourquoi ça marche pas, quand je relis, ça suit mais la logique mais on doit pas avoir la même avec le PC.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void __fastcall TForm1::Button2Click(TObject *Sender) { //Récupération de la ligne sélectionnée dans le DBGrid: //Query1->SQL->Clear(); AnsiString numClient2= Query1->FieldByName( "NUMERO_CLIENT" )->AsString ; QModif->Active = false; QModif->SQL->Clear(); QModif->SQL->Add( "SELECT * from client" ) ; QModif->SQL->Add( "WHERE NUMERO_CLIENT= " + numClient2 ) ; ShowMessage( Form1->Query1->SQL->Text ); ShowMessage( Form1->QModif->SQL->Text ); QModif->ExecSQL() ; Form2->Edit1->Text = QModif->FieldByName( "NOM" )->AsString; Form2->Edit2->Text = QModif->FieldByName( "NUMERO" )->AsString; Form2->Edit3->Text = QModif->FieldByName( "MATRICULE" )->AsString; }
Query1 est l'équivalent de ton Qselect qui affiche dans le ShowMessage : select * from client order by nom
QModif est l'équivalent de ton QUpdate et affiche bien dans le ShowMessage:
Select * from client where NUMERO_CLIENT =11 ( par exemple )
Quand je clique sur le bouton qui declenche l'évènement de cette fonction, j'ai une erreur classe d'exception, il ne reconnait pas le champ "NOM" à cette ligne :
Alors que le champ NOM est bien correct evidemment...Code:Form2->Edit1->Text = QModif->FieldByName( "NOM" )->AsString;
Si tu vois pas, je crois que je vais laisser tomber...
thx
C'est normal!!! Tu mélange un peu tout.
=> pas de ExecSQL avec un SELECT
=> QModif doit te servir pour faire un UPDATE, pas pour faire un SELECT puisque tu as déjà Query1 pour le SELECT.
=> Les champs de la ligne sélectionnée dans ton DBGrid peuvent être récupérés directement via un FieldByName
Pour afficher les infos dans ta deuxième fenêtre:
Pour enregistrer les modifications:Code:
1
2
3
4
5
6
7
8 void __fastcall TForm1::Button2Click(TObject *Sender) { // POUR RECUPERER LA LIGNE SELECTIONNÉ DE TON DBGRID //(si bien sûr ton DBGrid est connecté à Query1!!!) Form2->Edit1->Text = Query1->FieldByName( "NOM" )->AsString; Form2->Edit2->Text = Query1->FieldByName( "NUMERO" )->AsString; Form2->Edit3->Text = Query1->FieldByName( "MATRICULE" )->AsString; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12 void __fastcall TForm1::BtnUpdateClick(TObject *Sender) { //Récupération de la ligne sélectionnée dans le DBGrid: AnsiString numClient= Query1->FieldByName( "NUMERO_CLIENT" )->AsString ; QModif->Active = false; QModif->SQL->Clear(); QModif->SQL->Add( "UPDATE CLIENTS" ) ; QModif->SQL->Add( "SET NOM = " + QuotedStr( Edi1->Text ) + " , " ) ; QModif->SQL->Add( " MATRICULE = " + QuotedStr( Edi3->Text ) ) ; QModif->SQL->Add( "WHERE NUMERO_CLIENT= " + numClient ) ; QModif->ExecSQL() ; }
Ok, c'est déjà plus clair dans ma tête.
En tout cas ça marche, et j'ai fait la suppression qui marche aussi.
Je crois que ce qui m'induit en erreur c'est FielByName: sur l'aide C++Builder, j'ai trouvé ça :
Citation:
Appelez FieldByName pour obtenir les informations sur un champ quand vous en connaissez le nom.
FieldName est le nom d'un champ existant.
Mais ce que je comprend pas trop c'est la manière dont il sait de quelle ligne on parle parce que "obtenir les informations sur un champ" ok , mais de quelle ligne ?
ça me parle pas trop leur définition.
C'est pour ça que je faisais un autre SELECT, j'étais convaincu qu'il fallait en faire un autre pour situer vraiment la bonne ligne.
Bon je bosse tout ça .
Thanks à toi une fois encore
C'est parce que ton DBGrid n'est qu'un affichage de ton TQuery.
Lorsque tu sélectionne une ligne dans ton DBGrid, en faite ton TQuery se place sur l'enregistrement correspondant, et c'est celui là que tu récupère via FieldByName.
Merci pour la précision,
Sinon, tu sais si il y a un moyen de virer le champ "NUMERO_CLIENT" du DBGrid car du coup il me l'affiche avec les 3 autres champs. Ce qui est normal d'un coté comme j'affiche les données du DBGrid grâce à un SELECT * sur ma table.
Mais si je fais un SELECT champvoulu1,champvoulu2 par exemple sans mettre le champ "NUMERO_CLIENT" il n'aime pas dans le code comme on l'utilise ce champ.
EDIT: pour cacher la colonne, j'ai trouvé j'utilise:
(3 est la colonne en question)Code:DBGrid1->Columns->Items[3]->Visible = false;