Lire et ecrire dans une base interbase

Résolu
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007 - 14 mars 2007 à 10:39
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 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

16 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 mars 2007 à 11:31
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
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
15 mars 2007 à 23:38
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
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 mars 2007 à 19:13
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
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
14 mars 2007 à 23:21
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 mars 2007 à 09:18
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
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 mars 2007 à 09:20
NB : pour le (3) il existe également la méthode AppendRecord....

Et pour tout faire, il existe aussi le SQL

Simon
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
15 mars 2007 à 10:48
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
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 mars 2007 à 11:45
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
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
17 mars 2007 à 14:19
oui mais denis730, ce n'est plus une question c'est un programme !
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
17 mars 2007 à 14:47
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.
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
17 mars 2007 à 18:47
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..

@+
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
29 mars 2007 à 14:48
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...
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 mars 2007 à 15:18
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
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
29 mars 2007 à 16:52
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.
denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007
29 mars 2007 à 16:58
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.
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 mars 2007 à 17:25
ah ! tu vois !

Simon
Rejoignez-nous