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

Lazarus Pascal Discussion :

MySQL et Lazarus [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le développement se poursuit après présentation de la maquette les retours sont plutôt positifs.

    L'interface semble plutôt plaire reste à faire qu'elle soit fonctionnelle

    Utilisation de la touche "Tab"
    TabOrder est correctement paramétré.

    Validation avec la touche "Entrée"
    Je suis parti sur l'idée d'utiliser un évènement OnKeyPDown commun à toutes les zones de saisie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure Tf_articles.db_art_referenceKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
         If (Key = VK_RETURN) Then
         Begin
           db_nav_article.BtnClick(nbPost);
         End ;
    end;
    Maintenant un autre défi : tester l'intégrité de la saisie avant de poster l'enregistrement (modification ou création)

    Les fiches sont organisées de la manière suivante :

    f_main : fenêtre principale

    f_article
    f_famille
    f_fede
    ... sont les fenêtres filles correspondant aux différentes fonctionnalités du logiciel.

    enfin f_dm qui est le datamodule

    Ordre de création F_main f_articles ... (f_fonctionnalités logiciel) enfin f_dm.

    Donc je ne peux pas faire appel aux tables dans les fenêtres filles les tables sont dans le Datamodule créé en dernier par contre je peux utiliser les composants de mes fenêtres filles dans le Datamodule.

    Chaque fenêtre fille comporte un TdbNavigator

    Les zones de saisies sont des objets TDbEdit ou TDbDateEdit ...

    Et là je bloque

    Je sais faire un contrôle d'intégrité avec des boutons autre qu'un TDbNavigator et des zones Tedit TDateEdit etc ... Vérification de l'intégrité de mes zones. Si Ok création de la requête SQL que j'applique. Oui mais mes TSQL sont dans le DataModule donc lors de la compilation erreur puisque celui ci est créé en dernier.

    Mais là je suis parti sur des objets DbEdit DbNavigator Ttable pensant me simplifier la gestion des données et je suis de moins en moins sûr de mon choix.



    La solution serait de rapatrier mes objets Données (Table DataSource TSql ) dans la fiche f_articles mais alors quel besoin d'avoir un datamodule. De plus je ne veux pas avoir la même table déclarée dans plusieurs unités différentes donc :

    Faut il passer plutôt par des requêtes SQL mais dans ce cas pourquoi des Ttable si ils sont si difficiles à gérer.

    De plus dans l'évènement Ttable.BeforePost je parviens à le gérer mais pas à interrompre la mise à jour si l'intégrité des données n'est pas vérifiée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure Tdm_spf.tab_articlesBeforePost(DataSet: TDataSet);
    begin
      If (Trim(f_articles.db_art_desig.Caption) = '') Or (Trim(f_articles.db_art_reference.Caption) = '') Then Begin
        ShowMessage('Le code et la désignation article doivent être renseignés ');
        tab_articles.Cancel;
      End;
    end;
    Le cancel pourrai aller si ce n'est que je perd l'ensemble de ma saisie en cours
    J'ai cherché sur le net ; je n'ai pas du savoir formuler ma question car rien de concret qui ai pu me faire avancer.

    Mes principales fiches sont déjà développées avec des objets TDBEdit etc etc mais je pense qu'en intervenant directement dans le .dfm je pourrai remplacer mes TDbEdit par des TEdit sans avoir à tout refaire.

    Je continue de chercher.

    Eric

  2. #22
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Personnellement je met tout ce qui concerne la base de donnée dans un data module.
    Pour votre problème de vérification le mieux et d'écrire dans votre data module une procédure ou une fonction qui fait la vérification des données saisies et qui les postes ou non.
    De mon point de vue le fait de faire un post dès que l'utilisateur appuis sur la touche entrée me parait dangereux. A moins qu'il n'y ai qu'un seul champ dans ta table vous risquez de vous trouver avec des levée d'exception surtout s'il y a des clef primaire ou étrangère dans votre table.
    Pour ce qui est de travailler avec les ttable c'est très facile mais ça offre moins de souplesse qu'avec des requêtes SQL.
    Si ça peux vous aider j'avais écrit un article (https://remi-gouyon.developpez.com/t...ere-appli-bdd/) qui donne de bonnes base de départ
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  3. #23
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci de votre réponse Rémi

    Pour votre problème de vérification le mieux et d'écrire dans votre data module une procédure ou une fonction qui fait la vérification des données saisies et qui les postes ou non.
    En fait le problème est que je ne parviens pas à interrompre un post si l'intégrité des données n'est pas vérifiée

    Ex :
    Dans l'évènement BeforePost de ma table article :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      If (Trim(f_articles.db_art_desig.Caption) = '') Or (Trim(f_articles.db_art_reference.Caption) = '') Then Begin
        ShowMessage('Le code et la désignation article doivent être renseignés ');
        tab_articles.Cancel;
      End;
    Le problème est que la procédure cancel annule l'ensemble de ma saisie or je veux interrompre le post mais conserver ma saisie : Abort serait idéal mais n'est pas implémenté dans le composant ZTable

    Je suis allé consulter votre doc très bien faite d'ailleurs mais je ne trouve pas la réponse à cette question comment annuler un post sans perdre la saisie.

    Je pense devoir changer mon fusil d'épaule si je n'y parviens pas.

    Sinon voici le code permettant d’effectuer le paramétrage de la base de données. Il n'est pas terminé reste la gestion ses messages et un bon nettoyage mais il y a quelque chose que je ne comprend pas. La procédure Tf_connect.Emplacement_librairieExit(Sender: TObject) ne se déclenche que lors de la seconde sortie de la zone

    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
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    unit main_connect;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
      ComCtrls, Regexpr,process  , Buttons, f_dm;
     
    type
     
      { Tf_connect }
     
      Tf_connect = class(TForm)
        bt_choix_lib: TBitBtn;
        bt_quitte_onglet: TButton;
        bt_test: TButton;
        bt_ping: TButton;
        Liste_bases: TComboBox;
        Emplacement_librairie: TEdit;
        Nom_hote: TEdit;
        Nom_utilisateur: TEdit;
        Mot_de_passe: TEdit;
        Image3: TImage;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        label_fede: TLabel;
        open_librairie: TOpenDialog;
        Panel1: TPanel;
        Panel8: TPanel;
     
     
        procedure bt_choix_libClick(Sender: TObject);
        procedure bt_pingClick(Sender: TObject);
        procedure bt_quitte_ongletClick(Sender: TObject);
        procedure bt_testClick(Sender: TObject);
        procedure Emplacement_librairieExit(Sender: TObject);
        procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
        procedure open_librairieSelectionChange(Sender: TObject);
     
      private
     
      public
     
      end;
     
    var
      f_connect: Tf_connect;
     
    implementation
     
      Uses
        main;
     
     
    {$R *.lfm}
     
      { Tf_connect }
     
     
    //************************************************
    //********** Fermeture de la fenêtre
    //************************************************
    procedure Tf_connect.bt_quitte_ongletClick(Sender: TObject);
    Begin
      f_connect.Close;
    end;
     
    procedure Tf_connect.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      f_main.Show;
    end;
     
    //************************************************
    //********** test de la connection
    //************************************************
    procedure Tf_connect.bt_testClick(Sender: TObject);
    Var
      I : Integer ;
      test : Boolean;
      reponse , adresse : string;
    Begin
       test:=True;
     
       // Vérification de l'intégrité des données
       // Zones de saisie  TEdit
       for i := 0 to pred(Panel1.ControlCount) do
       Begin
          if (Panel1.Controls[i] is TEdit) Then
          Begin
            If trim((Panel1.Controls[i] as TEdit).Text ) = '' Then test:=False;
          End;
       end;
     
       // Zone de saisie liste bases
       If Trim(Liste_bases.Text) = '' Then test:=False;
     
       // Ping de l'hôte
       // test de la présence du mot : "pas"  ... à confirmer
       If  Nom_hote.Text <> '' Then Begin
         adresse :=Nom_hote.Text;
         RunCommand('ping',['-n','1',adresse],reponse);
         if pos('pas',reponse) > 0 then test:=False;
       end;
     
       // Tests ok on passe à la connection
       If test Then Begin
         dm_spf.sgbd_connect.HostName:=Nom_hote.Text;
         dm_spf.sgbd_connect.User:=Nom_utilisateur.Text;
         dm_spf.sgbd_connect.Password:=Mot_de_passe.Text;
         dm_spf.sgbd_connect.LibraryLocation:=Emplacement_librairie.Text;
         dm_spf.sgbd_connect.Catalog:=Liste_bases.Text;
     
         // Essai de connecter la base
         try
          dm_spf.sgbd_connect.Connected:=True;
         Except;
          ShowMessage('pas de base');
         end;
     
       end;
    end;
     
    //****************************************************************
    //********** Remplissage de la liste des catalogues de la base
    //****************************************************************
    procedure Tf_connect.Emplacement_librairieExit(Sender: TObject);
    Var
      I : Integer ;
      test : Boolean;
      reponse , adresse : string;
    Begin
       test:=True;
     
       // Vérification de l'intégrité des données
       // Zones de saisie  TEdit
       for i := 0 to pred(Panel1.ControlCount) do
       Begin
          if (Panel1.Controls[i] is TEdit) Then
          Begin
            If trim((Panel1.Controls[i] as TEdit).Text ) = '' Then Begin
              test:=False;
              ShowMessage('La zone ' + (Panel1.Controls[i] as TEdit).Name + ' doit être reseignée' );
            end;
          End;
       end;
     
       // Forcer l'utilisation de la base mysql qui existe
       Liste_bases.Text:= 'mysql' ;
     
       // Ping de l'hôte
       // test de la présence du mot : pas  ... à confirmer
       If  Nom_hote.Text <> '' Then Begin
         adresse :=Nom_hote.Text;
         RunCommand('ping',['-n','1',adresse],reponse);
         if pos('pas',reponse) > 0 then Begin
          test:=False;
          Showmessage('Impossible de joindre le serveur de la base de données') ;
         End;
       end;
     
       // Test d'intégrité Ok tentative de connection
       If test Then begin
         dm_spf.sgbd_connect.HostName:=Nom_hote.Text;
         dm_spf.sgbd_connect.User:=Nom_utilisateur.Text;
         dm_spf.sgbd_connect.Password:=Mot_de_passe.Text;
         dm_spf.sgbd_connect.LibraryLocation:=Emplacement_librairie.Text;
         dm_spf.sgbd_connect.Catalog:=Liste_bases.Text;
         ShowMessage(
         Nom_hote.Text +
         Nom_utilisateur.Text +
         Mot_de_passe.Text +
         Emplacement_librairie.Text +
         Liste_bases.Text );
     
         try
           dm_spf.sgbd_connect.Connected:=True;
         Except;
            ShowMessage('Pas de connection au serveur de base de données');
            test:=False;
         end;
     
         // Connection remplissage de la base
         If test Then Begin
           dm_spf.sql_self_service.SQL.Clear;
           dm_spf.sql_self_service.SQL.Text:='show databases';
           Try
             dm_spf.sql_self_service.open;
           except
              ShowMessage('Impossible de récupérer la liste des catalogues');
              test:=False;
           end;
     
           // Si base connectée remplisasge de la liste
           If test then begin
             dm_spf.sql_self_service.First;
             Liste_bases.Items.Clear;
             while not dm_spf.sql_self_service.EOF do begin
               Liste_bases.Items.Add(dm_spf.sql_self_service.Fields[0].AsString);
               dm_spf.sql_self_service.Next;
             end;
           end;
     
         end; // Connection remplissage de la base
     
       end;  // Test d'intégrité Ok tentative de connection
     
     
    end;
     
    //************************************************
    //********** mise à jour chemin librairie mysql
    //************************************************
    procedure Tf_connect.open_librairieSelectionChange(Sender: TObject);
    begin
      Emplacement_librairie.Caption:= open_librairie.FileName;
    end;
     
    //************************************************
    //********** lancement selection chemin librairie mysql
    //************************************************
    procedure Tf_connect.bt_choix_libClick(Sender: TObject);
    begin
      open_librairie.Execute;
    end;
     
    //************************************************
    //********** ping de l'adresse du serveur
    //************************************************
    procedure Tf_connect.bt_pingClick(Sender: TObject);
    var reponse , adresse : string;
    begin
       If  Nom_hote.Text <> '' Then Begin
         adresse :=Nom_hote.Text;
         RunCommand('ping',['-n','1',adresse],reponse);
         if pos('pas',reponse) > 0 then ShowMessage('Adresse '+ adresse +' non joignable')else
         begin
           ShowMessage('L''hôte '+ adresse + ' est joignable');
         end;
       end;
     
    end;
     
    end.
    Bien je continue bon dimanche à plus tard et encore merci de vos conseils.

    Eric

  4. #24
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 076
    Points : 1 521
    Points
    1 521
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Eric4362 Voir le message

    En fait le problème est que je ne parviens pas à interrompre un post si l'intégrité des données n'est pas vérifiée
    En fait c'est très simple il faut vérifier avant de poster. Mais pas comme vous l'avez fait. Je ne sais pas comment est organisée votre interface mais je me doute qu'il y a quelque part un bouton Poster.

    Il y a plusieurs solutions par exemple:

    L'appui sur le bouton Poster envoie toutes les valeurs saisie par l'utilisateur à une fonctionre qui vérifie l'intégrité des données puis exécute une requête SQL du type INSERT INTO si cette intégrité est vérifiée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure PostData(Sender:TObject)
    begin
    if not(dataModule.PosteData(f_articles.db_art_desig.Caption,f_articles.db_art_reference.Caption)) then
     ShowMessage('Le code et la désignation article doivent être renseignés ');
    end;
    Dans dataModule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function PosteData(S1,S2:String):boolean;
    begin
     
     If (Trim(S1= '') Or (Trim(S2= '') Then 
       Result:=False
    else
    // Execution de la requête INSERT INTO avec en paramètre S1,S2...
      Result:=true;
    end;
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Lazarus] Problèmes SQLQuery MySQL et Lazarus 1.4.4 FPC 2.6.4
    Par Philippe_2010 dans le forum Lazarus
    Réponses: 9
    Dernier message: 18/01/2016, 10h35
  2. [Lazarus] Problème MySql et lazarus
    Par Biobytes dans le forum Lazarus
    Réponses: 2
    Dernier message: 07/04/2015, 22h15
  3. [Lazarus] Lazarus, Zeos, MySql et les champs autoincrémentés
    Par tintinux dans le forum Lazarus
    Réponses: 16
    Dernier message: 23/05/2010, 15h04
  4. [Lazarus] tMysqlConnection avec Mysql Embeddeb
    Par SkyWalker dans le forum Lazarus
    Réponses: 0
    Dernier message: 25/10/2007, 13h17
  5. Réponses: 5
    Dernier message: 19/05/2006, 16h22

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