IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

calcul dans une table


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Par défaut calcul dans une table
    Bonsoir

    Je veux faire se calcul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
    table1.FieldByName('Total4').AsDateTime:=
    table1.FieldByName('Heurefin').AsDateTime
    -table1.FieldByName('Heuredeb').AsDateTime;
    end;
    le soucis est que dans mon DBgrid le résultat ne s'affiche pas.
    Par contre si je double Click sur le comp. table et que je fais 'ajouter nouveau champ' en renseignant le : nom le type et coche 'calculé' , là cela fonctionne ?

    sinon les 3 champs dans le code du dessus sont bien créer dans ma table

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 661
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    N'ayant pas indiqué le type de BDD, le fait que le champ ne soit pas un champ calculé me fait penser à une table Paradox , exact ?
    Quelle est la structure de la table (nom des champs et types)?
    Total4 ne peut être un champ de la table sauf s'il est de type calculé , mais dans ce cas nul besoin de l’événement onCalcField
    NOTE : d'un point de vue base de données total4 est un champ inutile car calculable

    si TOTAL4 ne fait pas partie des champs de la table , c'est bien cette méthode qu'il faut utiliser.
    Par contre si je double Click sur le comp. table et que je fais 'ajouter nouveau champ' en renseignant le : nom le type et coche 'calculé'

    le plus simple , au lieu de passer par une table , serait de passer par une query
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * , Heurefin-heuredebut as total4 FROM NOMTABLE;

  3. #3
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par quattro Voir le message
    Bonsoir

    Je veux faire se calcul :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
    table1.FieldByName('Total4').AsDateTime:=
    table1.FieldByName('Heurefin').AsDateTime
    -table1.FieldByName('Heuredeb').AsDateTime;
    end;
    le soucis est que dans mon DBgrid le résultat ne s'affiche pas.
    Par contre si je double Click sur le comp. table et que je fais 'ajouter nouveau champ' en renseignant le : nom le type et coche 'calculé' , là cela fonctionne ?

    sinon les 3 champs dans le code du dessus sont bien créer dans ma table
    Le OnCalcFields n'est lancé que s'il y a des champs de type 'calculé', ceci doit expliquer cela
    Si le but c'est d'enregistrer le résultat d'un champs calculé dans un vrai champ de votre base il y a plusieurs moyens.

    Le premier voir si du coté de la base on ne peut pas le faire.

    En second le faire coté client. Plusieurs possibilités, dont une serait de créer un CalcField DifTemp et gérer dans le OnCalcField son calcul. Puis dans l'évènement BeforePost vous enregistrez le FieldCalc FifTemp dans votre colonne Total4.

    Et je rejoins l'avis de SergioMaster, la plupart du temps c'est une fausse bonne idée de vouloir enregistrer dans la base un champs calculé. (Je ne parle pas des champs calculés par la base données mais des champs 'normaux' qui contiendrait un résultat d'un calcul fait pas un programme extérieur. Comme dans votre cas.)

    Idem évitez d'utiliser les composant d'accès de type table qui reviennent à faire des select * from table...

    Et préférez définir vos fields cela vous facilitera les choses :

    Plutôt de que d'utliser QueryTable.FieldByName('Heurefin').asDataTime vous aurez :

    QueryTableHeurefin.asDateTime et surtout vous aurez accès aux évènements (On change, On validate...) et propriétés du fields plus facilement.

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Par défaut
    bonsoir

    Pas familier du tout avec le SQL, je n'arrive pas a trouver la solution pour mon pb.
    J'ai déjà un comp. SQL1 qui gere la recherche de date, voici la chaine SQL renseigner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM t1.db WHERE dated BETWEEN :dated AND :fin
    moi je voudrais juste faire une soustration d'heure : H2-H1 et mettre resultat dans : total1.

    1 - puis-je réutiliser le même comp. SQL1 ou dois-je en prendre un autre?
    2 - dois je utiliser un autre composant (bouton,etc..) pour insérer le code permettant la soustraction?
    3 - a quoi ressemblerais ce code?

    sachant que j'utilise paradox et que les champ : H1,H2,total1 sont créer...
    Merci

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 661
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Je plussoie ce qu'écrit barbibulle
    Citation Envoyé par barbibulle
    la plupart du temps c'est une fausse bonne idée de vouloir enregistrer dans la base un champs calculé. (Je ne parle pas des champs calculés par la base données mais des champs 'normaux' qui contiendrait un résultat d'un calcul fait pas un programme extérieur. Comme dans votre cas.)
    une réflexion au sujet des requêtes de selection : nommer tous les champs que l'on veut est toujours préférable à un *

    Si vous ne pouvez vraiment pas vous passer de ce champ , voilà quelques pistes
    Citation Envoyé par quattro Voir le message
    1 - puis-je réutiliser le même comp. SQL1 ou dois-je en prendre un autre?
    2 - dois je utiliser un autre composant (bouton,etc..) pour insérer le code permettant la soustraction?
    3 - a quoi ressemblerais ce code?
    1- cela dépend de comment vous l'utilisez , donc difficile de confirmer quoique ce soit à ce sujet

    2- idem , ce n'est pas obligé vous pourriez par exemple le faire (le calcul)dans un évènement BeforePost

    3- s'il s'agit de faire une mise à jour du champ total1 quelque chose du genre
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update tb1.db set total1=H2-H1
    fera la mise à jour du champ total1 pour toute la table , en y ajoutant une clause where on pourra limiter cette mise à jour à l'ensemble voulu
    par exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE t1.db SET  total1=H2-H1 WHERE dated BETWEEN :dated AND :fin

    maintenant vous pourriez aussi utiliser un TUpdateSQL pour gérer cela directement avec votre composant table
    le texte ressemblerai à ça pour l'update
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    update "test.db"
    set
      H1 = :H1,
      H2 = :H2,
      Total1 =:H2-:H1
    where
      CLE = :OLD_CLE
    et à ceci pour l'insert
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    insert into "test.db"
      (H1, H2,Total1)
    values
      (:H1, :H2, :H2-:H1)
    utilisez le menu contextuel de l'updatesql pour générer les SQL puis modifiez les de façon à calculer le champ T1 comme indiqué.
    ! Attention la propriété UpdateMode a (pour cet exemple) été mise à upWhereKeyOnly , faites des essais avec les autres modes pour voir ce qui se passe au niveau de la clause Where du Update , c'est instructif

    Dernier point , si les enregistrements et tous les champs sont affichés dans une dbgrid , je ne suis pas sur qu'il ne faille pas mettre Autorefresh à true et/ou peut être travailler en cacheupdates (cela fait longtemps que je n'ai pas travaillé avec paradox et bde )

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Par défaut
    J'ai opté pour un comp. : TUpdateSQL
    par contre ou dois-je taper les deux lignes de codes ?
    Dans ses propriétés il me propose : DeleteSQL,InsertSQL,ModifySQL.
    Dans les évènement, rien..

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 661
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par quattro Voir le message
    J'ai opté pour un comp. : TUpdateSQL
    par contre ou dois-je taper les deux lignes de codes ?
    Dans ses propriétés il me propose : DeleteSQL,InsertSQL,ModifySQL.
    Dans les évènement, rien..
    vous auriez utilisé , comme suggéré , le menu contextuel de TUpdateSQL (première option : "Editeur Update SQL"), puis utilisé le bouton Generate SQL tout aurait été révélé
    bref, bien sur , c'est respectivement dans les propriétés DeleteSQL,insertSQL,ModifySQL que les sql que j'ai indiqué serait à mettre .
    Non TUpdateSQL n'a aucun événement en fait , c'est le Post , dans le cas d'un Insert ou d'un Update , ou le Delete qui font le travail .
    Considérez que les directives du TupdateSQL écrase le comportement "normal" de ces dernières instructions , pour le remplacer par le sql que vous lui avez fourni . De fait c'est plus ou moins ce qui se passe (d'où l'importance de changer le upWhereAll par un upWhereKey moins gourmand dès que la table a un index unique) . Faites des essais avec l'éditeur d'UPDateSQL , c'est édifiant

Discussions similaires

  1. colonne calculée dans une table
    Par gicquairea dans le forum WinDev
    Réponses: 6
    Dernier message: 10/10/2007, 06h10
  2. champs calculé dans une table
    Par tomas dans le forum Modélisation
    Réponses: 1
    Dernier message: 17/09/2007, 11h18
  3. Champs calculés dans une table
    Par froutloops62 dans le forum Access
    Réponses: 7
    Dernier message: 22/05/2007, 23h50
  4. [Requête/SQL]ajouter un champ calculé dans une table
    Par zougna dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/04/2007, 19h09
  5. Créer un champ calculé dans une table
    Par tigevellou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/04/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo