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

Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
- - Dernière réponse : sp40
Messages postés
1293
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
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
3
Merci
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

Merci sp40 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de sp40
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
3
Merci
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

Merci denis730 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de denis730
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
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
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
0
Merci
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
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
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
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
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
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
0
Merci
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
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
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
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
oui mais denis730, ce n'est plus une question c'est un programme !
Commenter la réponse de cs_cantador
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
0
Merci
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
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
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
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
0
Merci
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
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
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
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
0
Merci
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
Messages postés
19
Date d'inscription
jeudi 18 novembre 2004
Dernière intervention
29 mars 2007
0
Merci
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
Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
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.