Lire et ecrire dans une base interbase [Résolu]

denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 14 mars 2007 à 10:39 - Dernière réponse : sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention
- 29 mars 2007 à 17:25
J'ai une base de données Interbase.
1) Je veux mettre dans une variable le contenu du champ d'un enregistrement de ma table.
2) Je veux changer la valeur du champ d'un enregistrement de ma table.
3) Je veux creer un nouvel enregistrement dans ma table avec pour valeur des champs des variables de mon application. Ex : Champ1 Var1, Champ2 Var2 etc..

J'ai sur ma Form : SQLConnection, SQLDataSet, DataSetProvider, ClientDataSet, DataSource
J'arrive trés bien à faire ce que j'ai enoncé plus haut grace à une DBGird et des DBEdit avec DBNavigator, mais je voudrais faire tout cela exclusivement par du code...

Je sais que ma question est trivial, j'ai trouvé des elements de réponse dans le forum;  mais je pense que la réponse à ces trois fonctions élementaires pourrait aider plus d'un débutant.

Merci pour votre aide
Afficher la suite 

16 réponses

Répondre au sujet
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 15 mars 2007 à 11:31
+3
Utile
Re-Salut,

Une base de données Interbase utilise des transactions. Une transaction
est attachée à la base de données et aux différents datasets dont tu
disposes, elle "stocke" toutes les opérations que tu fais sur ta base
jusqu'à une validation (commit) ou une annulation (rollback). Commit =
Valider pour de bon les ajouts/modifs/suppression d'enregistrements,
Rollback = Annuler toutes les operations depuis le démarrage de la
transaction. Généralement, je l'utilise comme ça :

if not MyTransaction.InTransaction

    then MyTransaction.StartTransaction;

try

    MyTable.Append;

    MyTable.Fields[x].Value := [Valeur];

    ...

    MyTable.Post;

    MyTransaction.Commit; (Ou CommitRetaining = valide la transaction mais ne ferme pas la table).

Except

          MyTransaction.RollBackRetaining;

          Showmessage('Erreur à l''enregistrement');

end;


PS : Regardes du coté de Firebird, c'est la dernière version d'interbase mais gratuite et très performante.

Simon
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sp40
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 15 mars 2007 à 23:38
+3
Utile
Bonsoir...
J'ai trouvé, c'est de la forme
MyTable.ApplyUpdates(-1) avec cela je valide mes modifs dans la base.


J'ai le sentiment que ce que j'obtiens c'est du bricolage, un assemblage de recettes pris ici et là. J'ai du mal à touit saisir..le SQL par exemple, ce que j'en sais c'est des intructions servant à creer des bases par le biais du code, comment l'inclure dans le code de mon application et où trouver l'ensemble des commandes SQL....C'est comme où est l'interet de FireBird qu'est ce que cela peut m'apporter en termes de devellopement dans mon application.

Merci
Denis
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de denis730
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 14 mars 2007 à 19:13
0
Utile
Je ne vois pas bien l'intérêt de créer ici dynamiquement les compos cités car justement les avoir sur une fome permet de changer facilement leurs propriétés à moins bien sûr que l'objectif est d'apprendre..

cantador
Commenter la réponse de cs_cantador
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 14 mars 2007 à 23:21
0
Utile
Même s'il est toujours bon d'apprendre, j'ai un reel besoin pour mon application.
En fait il me faut charger, changer et completer certain champs de ma base au fur et à mesure des evenements de mon application. Si je precise que DBGird fonctionne c'est pour preciser que ma base et sa connection fonctionne, mais je ne veux pas laisser l'utilisateur se debrouiller seul avec la base de données. Je dois verifier et valider ses choix avant de renseigner la base, de meme que je dois à partir des options retenues par l'utilisateur lui proposer uniquement les données qui l'interesse.

Je me perd dans l'aide de Borland pour trouver la bonne syntaxe de ces codes...
J'ai trouvé clientdataset.findprior et findnext aprés plusieurs heures de lecture, j'aurai besoin d'un coup de pouce pour avancer plus vite dans mon devellopement.

Merci
Commenter la réponse de denis730
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 15 mars 2007 à 09:18
0
Utile
Salut,

J'ai pas bien compris pourquoi tu n'utilises pas les composants IB... mais bon, si ça marche, c'est l'essentiel.

1) Pour un champ texte :

Déclarer : MyVariable : String;

Puis affecter : MyVariable := MyTable.Fields[x].AsString; (à moduler en fonction du type de champ)

2) Vérifier que la transaction est active, positionner le curseur sur
l'enregistrement à modifier à l'aide d'un "Locate" ou "FindKey", puis:

MyTable.Edit;

MyTable.Fields[x].Value := [Valeur];

MyTable.Post;

Tenter un "Commit" sur la transaction

3) Vérifier que la transaction est active, puis :

MyTable.Append;

MyTable.Fields[0].Value := [Valeur1];

MyTable.Fields[1].Value := [Valeur2];

...

MyTable.Fields[n].Value := [Valeurn];

MyTable.Post;

Tenter un "Commit" sur la transaction.


En espérant que ça t'aidera.

Simon
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 15 mars 2007 à 09:20
0
Utile
NB : pour le (3) il existe également la méthode AppendRecord....

Et pour tout faire, il existe aussi le SQL

Simon
Commenter la réponse de sp40
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 15 mars 2007 à 10:48
0
Utile
Bonjour,

Merci de ta réponse. Je n'utilise pas les composants IB car ils ne sont pas disponibles dans ma version de Delphi.
J'ai essayé
MyTable.Append;
MyTable.Fields[0].Value := [Valeur1];
MyTable.Fields[1].Value := [Valeur2];
...
MyTable.Fields[n].Value := [Valeurn];
MyTable.Post;
Cela fonctionne, j'ai bien un nouvel eregistrement que je peux voir dans le DBGrid qui me sert de test, mais la table ne se met pas à jour dans la base. J'ai ajouté dans mon code
MyTable.UpdateRecord   (avec ClientDataSet pour MyTable) et j'ai une erreur à l'execution "ClientDataSet n'est pas en mode Edition ou Insertion", j'ai poutant mis sa propriété ReadOnly à False.

Merci pour ton aide qui me permet de voir le bout du tunnel
Commenter la réponse de denis730
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 15 mars 2007 à 11:45
0
Utile
RE RE Salut,

Si tu n'as pas de composant dispo pour les transactions, cherche du
coté des méthodes de la Database. Tu as peut être un truc du genre
MyDatabase.Commit...

Simon
Commenter la réponse de sp40
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 17 mars 2007 à 14:19
0
Utile
oui mais denis730, ce n'est plus une question c'est un programme !
Commenter la réponse de cs_cantador
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 17 mars 2007 à 14:47
0
Utile
Bonjour,

C'est effectivement tout un programme...Ce n'était pas une question, tout au plus une reflexion sur ma pietre condition. Je voulais juste laisser un note sur ApplyUpdates cela peut servir à d'autres dans mon cas.

Maintenant si quelqu'un veut laisser un cours sur le SQL ou autre, cela peut que nous interesser !

Merci à tous.
Commenter la réponse de denis730
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 17 mars 2007 à 18:47
0
Utile
Le SQL ? des tutos, il y en a bcp sur le net.. tu n'as que l'embarras du choix..
Et FireBird, je peux t'en parler vu que je l'utilise depuis longtemps.
C'est une excellente base fiable, robuste demandant peu de maintenance et comme c'est de l'OpenSource, elle est mieux mise à jour qu'Interbase (payante)..

Reste le choix des composants à utiliser pour faire le lien avec Delphi..
J'utilise TIBO (payant) mais FIB+ est très bien peut-être même un peu mieux car tu peux séparer et gérer plusieurs transactions en même temps.
Ce sont les deux compos qui arrivent en tête dans les Awards.

et tu lies tout ça avec les compos DevExpress (QG5 ou QG6)
et là tu tiens le nirvana..

@+
Commenter la réponse de cs_cantador
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 29 mars 2007 à 14:48
0
Utile
Bonjour,

J'ai encore un probleme, maintenant que j'arrive à lire et a ecrire dans une base de donné j'ai une erreur lorsque je veux effacer un enregsitrement.

MaTable.Edit;
MaTable.FinFirst;
MaTable.Delete;
MaTable.Post:
MaTable.ApplyUpdates(-1);

Me renvoie l'erreur MaTable : l'ensemble de donnée n'est pas en mode Edition ou Insertion...
Commenter la réponse de denis730
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 mars 2007 à 15:18
0
Utile
Euhhh, normalement, tu n'as pas besoin de faire un "edit" avant le
delete. Le "Edit" est utilisé pour modifier un enregistrement... Est-ce
que le message d'erreur ne serait pas plutot "L'ensemble de données est
en édition" ? Sinon, si tu dois absolument faire un edit, met le après
le findfirst car en général le fait de changer de ligne appelle la
methode "post" et donc tu sors du mode "edit"...

Simon
Commenter la réponse de sp40
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 29 mars 2007 à 16:52
0
Utile
Merci pour ta reponse qui m'a mis sur la voie.


Effectivement j'ai mis mon FindKey avant Edit, mais cela planté quand même alors j'ai inseré : 
If  MaTable.CanModify Then Beep; et je me suis appercu que c'était MaTable.Post qui me faisait tomber le mode edition. J'ai donc supprimé Post et cela marche bien mieux.
Commenter la réponse de denis730
denis730 19 Messages postés jeudi 18 novembre 2004Date d'inscription 29 mars 2007 Dernière intervention - 29 mars 2007 à 16:58
0
Utile
Quelques test plus loin...
Il faut egalement virer le Edit, il est la source d'une erreur lorsque l'on veut utiliser à nouveau le ClientDataSet de la table.
Commenter la réponse de denis730
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 mars 2007 à 17:25
0
Utile
ah ! tu vois !

Simon
Commenter la réponse de sp40

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.