bonjour,comment enregistrer dans une table un champ calculé?
merci
bonjour,comment enregistrer dans une table un champ calculé?
merci
Est ce que tu peux explique un peu plus ou bien ecrire ton code pour t'aider.Envoyé par tomm
dans une feuille(saisie^pour chaque personne) ou il y a des champs reliés à une table,j'en ai un champ date de naissance et j'ai ajouter un champ calculé dans ma table1 "age" pour calculer l'age de chaque personne
et j'ai mis un DBedit avec l'evenement oncalcfield( code Table1age.AsInteger := Trunc((date()-Table1Datedenaissance.asDateTime)/365); )
qui me calcule pour chaque personne son age.Le probleme est que je voudrais que ce soit enregistré dans ma table pour pouvoir l'exploiter ou alors je ne sais si c'est possible utiliser sql avec un champ calculé.
Dasn tous les cas ,soyez tres simple et tres clair avec moi .Je débute.
merci
Le plus simple est de rajouter une colonne Age dans ta table.
Comme ça pas de problème, ça marchera.
merci mais le probleme dans la table paradox a t on la possibilité de créer un champ calculé?
merci
Se serait une colonne comme les autres.
Tu le valorisera dans ton code à la saisie avant stockage dans la BD.
Pas besoin de compliquer les choses.
Pour Paradox, je ne sait pas ?
Dans le cas ou tu changerais de BD cela fonctionnera tout pareil.
"Tu le valorisera dans ton code à la saisie avant stockage dans la BD. "
Que veux tu dire par valoriser dans ton code.Moi ce que j'ai essayé:j'ai créé un nouveau dans ma table .db puis je l'ai rajouté à ma table,mis un DBedit que j'ai connecté à ce nouveau champ,rajouté mon code dans oncalfield mais ça il n'affichearit rien dans le champ quand je l'execute.pourrais tu m'expliquer ce que je dois faire?
merci
Salut,
Le problème avec un champ calculé qui donne l'âge, c'est que par nature cette donnée change tous les jours. Il vaut mieux utiliser un champ persistant dans ta table avec delphi.
Pout toi ce sera transparent, c'est à dire que ce sera un champ comme un autre (sauf qu'il ne sera pas stocké dans la base mais recalculé avant chaque affichage, ce qui ne change rien du tout quant à son utilisation dant tes traitements).
Actuellement je choisissais comme type float et champ calculé quand j'ajoutais un nouveau champ.que me conseilles tu ?C'est un quoi un champ persistant?Que dois je choisir?
merci
Tu fais un clic droit sur ton Ttable puis tu choisis l'éditeur de champs.
clic droit dans l'éditeur de champ Puis Nouveau Champ.
Tu créée un champ de type Calculé que tu nomme age.
(il faut aussi 'ajouter tous les champs' pour avoir accès aux autres champs car à partir du moment ou tu utilises l'éditeur de champs, seuls les champs présents ici seront disponibles à tes Datasources.
Une fois ton champs calculé créé l'évènement OnCalcField de ton Ttable sera fonctionnel pour calculer les champs de type 'champs calculé'.
Bon courage![]()
salut,en fait c'est ce que je faisais .L'age type float cahmp calculé dans un dbedit relié au champ age marche parfairement .Le probleme c'est que je souhaite dans une autre feuille trier cette table avec ce champ qui n'y est pas en fonction de l'âge.
Merci
Ha oui, en effet, je ne pense pas qu'il soit possible de trier sur un champ calculé, par contre tu pourrais peut-être te contenter de trier sur le champ Datedenaissance puisque l'âge est, par nature, fonction de la date de naissance.Envoyé par tomm
Bon courage.
Là, tu y étais presque.Moi ce que j'ai essayé:j'ai créé un nouveau dans ma table .db puis je l'ai rajouté à ma table,mis un DBedit que j'ai connecté à ce nouveau champ,rajouté mon code dans oncalfield mais ça il n'affichearit rien dans le champ quand je l'execute.pourrais tu m'expliquer ce que je dois faire?
Le OnCalcFields est exécuté que si le DataSet contient un champ calculé ou de référence, si je ne me trompe pas.
Une ruse serait de créer comme même une champ calculé fictif uniquement pour que le gestionnaire OnCalcFiels soit appelé.
Dans le gestionnaire, tu profitera pour mettre à jour le champ Age.
Je pense que cela devrait faire le boulot.
[/quote]
Salut !
je crois que vous compliquez un peu non ?! On ne met jamais de données calculées dans une base (sauf cas particulier de données calculées non stables). Surtout comme ça a été dit l'age qui varie tout les jours.
solution: Tu stocke la date de naissance
tu double clic sur ton DataSet pour ajouter tout les champs de ta table
puis tu ajoute ton champ calculé Age que tu calcul dans le OnCalcFields
Il me semble aussi qu'il y a la propriété Value pour chaque champ d'un ensemble de données (A utiliser à la place de Tabler1Age.AsInteger).
Regarde aussi dans DateUtils ... tu devrais avoir une fonction pour calculer l'age ... ce sera toujours mieux que ta formule (qui fonctionne surement)
Avec ça tu aura toujours l'age à jour.
Bon j'espère que j'ai pas raconté trop de bétise, bon courage !
Dixit tomm
Une autre solution qui n'impose pas la création d'une colonne Age dans la table, serait de créer une vue de ta table dans la BD qui elle contiendrait la colonne.je voudrais que ce soit enregistré dans ma table
je souhaite dans une autre feuille trier cette table avec ce champ qui n'y est pas en fonction de l'âge
Tu bases ensuite ton DataSet sur cette vue plutôt que sur la table réelle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Create TaVue as Select *, 0 Age from TaTable;
Puis tu fais comme précédemment.
je ne connais pas cette fonction .pourrais tu m'expliquer un peu plus?une vue de ta table dans la BD qui elle contiendrait la colonne.
merci
Tout d'abord, j'ai tester le tri sur un champ calculé avec la propriété IndexFieldNames, ça marche. Donc ce que tu disais précédemment est faux
Je dois partir, je reviendrai pour te donner plus d'explication sur les vues.
Merci
Dis-nous quels sont les composants que tu utilises ?
Suivant le cas, la stratégie est différente.
Moi, je privilégie TClientDataSet pour les ensembles de données et en BD j'ai Oracle que j'attaque avec ADO en tant que source de données.
C'est une base paradox et delphi. MA table c'est la table1(group.db)
Merci pour toute ton aide.
L' autre probleme est que je fais appel à cette table et je suis dans une autre form .Mais tu dois avoir raison sur le tri car dans la meme form j'ai pu l'editer(imprimer avec report)pour chaque individu.
merci
Partager