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

Delphi Discussion :

Manipulation des données et opération arithmétique par DBEdit


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Manipulation des données et opération arithmétique par DBEdit
    J'ai vraiment besoin d'aide
    Au fait je voudrais savoir comment je pourrais faire pour par exemple avec une table facture ayant des colonnes Quantite Prix_unitaire et Prix_total tous relié à des DBEdit calculé automatiquement le Prix_total qui s'afficherait dans DBEdit pile au moment où on saisit la quantité.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour et la bienvenue semble de mise,

    Avant tout
    une table facture ayant des colonnes Quantite Prix_unitaire et Prix_total
    ceci me fait tiquer Prix_total est une valeur calculée (Quantite*Prix_unitaire) donc ne devrait pas faire partie de la table (sauf en tant que COMPUTED BY si le SGBD le permet et encore )
    et ce serait peut-être plus une table lignes de facture que facture (qui contiendrait code client etc...).
    OK, je m'arrête j'ai l'impression de chipoter ! Mais comme vous êtes étudiant mieux vaut partir sur de bonnes bases

    Bon, me direz-vous mais comment fais-je alors pour afficher le prix total ? Perso, ma première réponse serait en n'utilisant pas de TTable mais des TQuery mais c'est un autre débat.

    Maintenant d'un point de vue pratique, avec le peu d'informations (version Delphi, SGBD, Composants de Connexion)

    je vais partir sur un TTable BDE "classique".
    Le plus simple est de :
    - déclarer les champs
    - ajouter un champ calculé.
    Nom : Capture_1.PNG
Affichages : 451
Taille : 11,0 Ko

    Nom : Capture.PNG
Affichages : 437
Taille : 26,4 Ko

    - programmer l'évènement OnCalcField
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
    Dataset['total']:=Dataset['PRIX']*Dataset['QTE'];
    end;
    Bon, bien évidemment au design vous ne verrez pas le total, mais à l'exécution pas de souci. Une modification de la quantité ou du prix unitaire (avec sortie de zone) modifiera le montant.

    Une autre solution implique LiveBindings mais je ne pense pas que je doive l'exposer, quoique, juste pour le fun
    Nom : Capture_2.PNG
Affichages : 430
Taille : 24,6 Ko
    Dans ce cas, le champ calculé est inutile, le calcul est fait dans le customformat du lien


    NB. aux lecteurs, j'ai utilisé la version 10.3.2, une base Firebird 3 et le BDE m'a largement étonné, un numeric(10,2) est devenu un champ de type TBytes et je ne vous parle même pas d'un problème d'ODT !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'ai utilisé les composants Fire DAC àsavoir TFDQuery, TFDConnexion et les datasources. j'ai eu l'idée d'utiliser un Edit simple et d'utiliser le concepteur liveBindings pour le faire mais il affiche un tout autre calcul et malgré le faux calcul effectué il considère la colonne prix total comme vide.

    J'ai donc essayé ceci après


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TfmFacture.DBEdit4DblClick(Sender: TObject);
    begin
    dm.tabfacture['Totalapayer']:= dm.tabfacture['Quantite']*dm.tabfacture['Prixapayer'];
    end;
    mais sans résultat
    Mais avec un Fieldbyname il considère l'élément de réponse donné au prix total mais celui-ci est toujours et toujours 0

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Je vous garantis que ma partie Livebindings fonctionne (que ce soit VCL ou FMX).
    Vous n'avez ni déclaration de colonne calculée, ni d'évènement à coder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    unit Unittest;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls,
      Data.DB, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,
      FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
      FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.FB, FireDAC.Phys.FBDef,
      FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
      FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client, System.Rtti,
      System.Bindings.Outputs, Vcl.Bind.Editors, Data.Bind.EngExt,
      Vcl.Bind.DBEngExt, Data.Bind.Components, Data.Bind.DBScope;
     
    type
      TForm126 = class(TForm)
        DBEdit1: TDBEdit;
        DBEdit2: TDBEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        FDConnection1: TFDConnection;
        FDTable1: TFDTable;
        DataSource1: TDataSource;
        FDTable1QTE: TIntegerField;
        FDTable1PRIX: TCurrencyField;
        Montant: TEdit;
        BindSourceDB1: TBindSourceDB;
        BindingsList1: TBindingsList;
        LinkControlToField1: TLinkControlToField;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form126: TForm126;
     
    implementation
     
    {$R *.dfm}
     
    end.
    comme vous le constaterez, pas une ligne de code
    et voilà le dfm pour info
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    object Form126: TForm126
      Left = 0
      Top = 0
      Caption = 'Form126'
      ClientHeight = 315
      ClientWidth = 578
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 56
        Top = 133
        Width = 42
        Height = 13
        Caption = 'Quantit'#233
      end
      object Label2: TLabel
        Left = 210
        Top = 134
        Width = 18
        Height = 13
        Caption = 'Prix'
      end
      object Label3: TLabel
        Left = 369
        Top = 133
        Width = 40
        Height = 13
        Caption = 'Montant'
      end
      object DBEdit1: TDBEdit
        Left = 56
        Top = 152
        Width = 121
        Height = 21
        DataField = 'QTE'
        DataSource = DataSource1
        TabOrder = 0
      end
      object DBEdit2: TDBEdit
        Left = 208
        Top = 152
        Width = 121
        Height = 21
        DataField = 'PRIX'
        DataSource = DataSource1
        TabOrder = 1
      end
      object Montant: TEdit
        Left = 369
        Top = 152
        Width = 121
        Height = 21
        TabOrder = 2
        Text = '25,54'
      end
      object FDConnection1: TFDConnection
        Params.Strings = (
          'Database=base'
          'User_Name=SYSDBA'
          'Password=masterkey'
          'DriverID=FB')
        Connected = True
        Left = 32
        Top = 24
      end
      object FDTable1: TFDTable
        Active = True
        Connection = FDConnection1
        UpdateOptions.UpdateTableName = 'FACTURE'
        TableName = 'FACTURE'
        Left = 112
        Top = 24
        object FDTable1QTE: TIntegerField
          FieldName = 'QTE'
          Origin = 'QTE'
        end
        object FDTable1PRIX: TCurrencyField
          FieldName = 'PRIX'
          Origin = 'PRIX'
        end
      end
      object DataSource1: TDataSource
        DataSet = FDTable1
        Left = 192
        Top = 24
      end
      object BindSourceDB1: TBindSourceDB
        DataSet = FDTable1
        ScopeMappings = <>
        Left = 296
        Top = 200
      end
      object BindingsList1: TBindingsList
        Methods = <>
        OutputConverters = <>
        Left = 220
        Top = 197
        object LinkControlToField1: TLinkControlToField
          Category = 'Liaisons rapides'
          DataSource = BindSourceDB1
          FieldName = 'QTE'
          Control = Montant
          Direction = linkDataToControl
          Track = True
          CustomFormat = '%s*DataSet.PRIX.value'
        end
      end
    end

    Par contre, vous n'avez pas à mettre de colonne Totalapayer dans la table.
    De plus votre code, qui a du s'inspirer de ce que j'ai pu écrire pour le OnCalcField, je l'aurais écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dm.tabfacture.FieldByName('Totalapayer').asCurrency:= dm.tabfacture.FieldByName('Quantite').as _____ *dm.tabfactur.FieldByName('Prixapayer').asCurrency;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Nom : Capture d’écran 2021-05-01 122613.png
Affichages : 392
Taille : 35,8 Ko

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Au niveau du Costum value je mets quoi exactement ?

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Au niveau de la table, AMHA il ne devrait pas y avoir cette colonne. C'est une colonne calculée donc non nécessaire.

    votre table table devrait n'avoir que les colonnes ID,NOM,Medicament,Quantite,PrixaPayer

    Si vous voulez quand même la garder il faut que le lien soit en controltodata et non en bidirectionnal, j'ai essayé mais franchement je déconseille.
    Vous n'avez pas indiqué votre SGBD
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'utilise SQLite

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    SQlite, si version 3.31.0 vous avez la possibilité d'avoir des colonnes calculées https://www.sqlite.org/draft/gencol.html
    donc votre table peut avoir la structure suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE FACTURE_ITEMS
    (
    ID  INTEGER  PRIMARY KEY AUTOINCREMENT
                                          NOT NULL,
    ID_FACTURE INTEGER,
    NOM  TEXT, -- NVARCHAR(n) 
    Medicament TEXT, -- ou NVARCHAR(n)
    Quantite INTEGER NOT NULL,
    PrixUnitaire NUMERIC(8,2) NOT NULL,
    total NUMERIC(10,2) GENERATED ALWAYS AS (Quantite*PrixUnitaire) STORED,  ---
       FOREIGN KEY (
            ID_FACTURE
        )
        REFERENCES FACTURE (id) ON DELETE CASCADE
                                          ON UPDATE CASCADE
    );
    Mais je le répéte, une requête est tout aussi efficace
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour votre aide avec tout ce que vous m'avez proposé comme aide j'ai finalement pu le faire avec la première méthode que vous m'avez proposé pour les champs calculés. Le calcul s'éffectue correctement mais mon champ Total est un not null il ne prend pas en compte le résultat du champ calculé. Donc je me demandais s'il serait possible de d'affecter le résultat du champ calculé à la colonne Total
    Comme par exemple


    Dataset ['Totalapayer']:= tabfacture.Fieldbyname.....ou une proprieté qui représentera directement la valeur de la colonne Totalapayer de tabfacture

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    j'ai finalement pu le faire avec la première méthode que vous m'avez proposé pour les champs calculés.
    Si vous utilisez un champ calculé, je ne comprends pas comment vous avez pu mettre un not null quelque part

    Donc à mon avis c'est que vous persistez à mettre une colonne totalapayer dans la table. ELLE N'A RIEN A Y FAIRE.
    Si vous voulez obtenir cette valeur il suffit de faire un SQL ou même, s'il s'agit d'affichage, d'un lien (customformat %value*Dataset.PRIX.Value)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/07/2010, 19h46
  2. [Mail] Renvoi des données d'un formulaire par mail
    Par ox@na dans le forum Langage
    Réponses: 6
    Dernier message: 11/01/2007, 22h02
  3. Réponses: 3
    Dernier message: 26/07/2006, 14h58
  4. [MySQL] Modification des données d'une base par les membres
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/03/2006, 17h25
  5. [xml]manipuler des données xml sous Oracle9i
    Par crazy dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2004, 11h40

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