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 :

Besoin de conseils pour créer une appli de gestion de base de données Sqlite Linux transposable sous Windows [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut Besoin de conseils pour créer une appli de gestion de base de données Sqlite Linux transposable sous Windows
    Bonjour,
    j'ai besoin de conseils pour obtenir un bon résultat dans mes petits développements d'applications de gestion de données avec Sqlite sous Lazarus en base sous Linux mais transposable sous Windows par recompilation de l'appli sous Windows.
    Par habitude ancienne, je crée une fiche principale et au lieu d'utiliser une barre de menu j'utilise un panel avec des boutons dont "le click" ouvre une autre fiche par une commande Fnouvellefiche.show. Quand je quitte cette fiche, je reviens à la fiche principale.
    Jusque là pas de problème.
    Les problèmes viennent que pour utiliser des données sous Sqlite, j'utilise un data.module qui comprend les sqlite3dataset et les datasource pour chaque table de ma base.
    Toujours pas de problème si je définis à la création de mon appli les Filename Name sql etc pour chaque table.
    Le problème vient de plusieurs points :
    le premier est que le chemin de l'installation de l'appli dépend de l'utilisateur et de son système d'exploitation : chemin du fameux FileName.
    Avec de l'aide sur un autre post, j'ai résolu une partie de mon problème en créant à l'éxecution une base et un fichier contenant les informations : chemin de l'application, chemin du Filename, séparateur etc ...
    Information que j'utilise après pour déclarer les infos nécessaire à l'ouverture des tables du datamodule.
    J'espère être clair.
    Le premier problème vient qu'au début de chaque fiche j'ouvre mes tables avec un ordre différent avec un order by ... que je mets dans un événement à l'affichage de la fiche par FormActivate ou FormShow (Windows ne semble pas aimer l'utilisation du FormActivate).
    Le FormActive fonctionne bien sous Linux mais pas sous Windows. Cet événement semble rechercher des infos sur le datamodule qui ne sont pas encore disponibles pour la fiche et me renvoie un message d'erreur Sqlite.
    Si j'ouvre la fiche simplement et que l'action sur la manipulation de la table se réalise via un bouton ou un click sur la fiche ouverte, pas de problème.
    Mes questions pour lancer cette manipulation sur une table dès le début de l'affichage de cette fiche sans avoir le message d'erreur comment faire, j'ai bien essayé l'événement FormPaint mais c'est très lent.
    Et pourquoi cette différence du résultat du FormActivate entre Linux et Windows ; comment éviter une réécriture pour chaque système ?
    Merci d'avance pour vos précieux conseils et mode opératoire si ma façon d'organiser mes développement n'est pas conseillée.
    A+

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    Les problèmes viennent que pour utiliser des données sous sqlite j'utilise un data.module qui comprend les sqlite3dataset et les datasource pour chaque table de ma base.
    Ca ne devrait pas en être un...

    Pour le Datamodule, veilles à ce qu'il soit créé avant les fiches qui l'utilise (sauf cas particulier).

    Toujours pas de problème si je définie à la création de mon appli les Filename Name sql etc pour chaque table.
    c'est pas clair, normalement une base SqLite contient une ou plusieurs tables mais dans un seul fichier.

    le premier est que le chemin de l'installation de l'appli dépend de l'utilisateur et de son système d'exploitation : chemin du fameux FileName.
    Avec de l'aide sur un autre post j'ai résolu une partie de mon problème en créant à l'éxecution une base et un fichier contenant les informations : chemin de l'application, chemin du Filename, séparateur etc ...
    Avec les nouvelles versions de Windows, il est recommandé de placer les fichiers de données utilisateur (ta base donc) dans les dossiers des utilisateurs (il existe une API Windows pour cela, ShellAPI). Avec XP, il était encore possible de placer les données dans le dossier d'installation du programme. Sur Linux, tu peux utiliser $HOME ou ~/. pour atteindre le dossier utilisateur si mes souvenirs sont bons.

    Il faut aussi avoir une idée claire de l'utilisation des données, sont-elles destinées à tous les utilisateurs du poste (données partagées) ou sont-ces des données privatives pour chaque utilisateur. Il va te falloir utiliser des directives du type $IFDEF WIN32 pour isoler le code spécifique aux plateformes. Au début, tu peux faire comme si tu ne travaillais que sur Windows et ensuite étendre le code à Linux en isolant les instructions spécifiques (voir la doc de Lazarus et FreePascal).

    Le premier problème vient qu'au début de chaque fiche j'ouvre mes tables avec un ordre différent avec un order by .... que je mets dans un événement à l'affichage de la fiche par FormActivate ou FormShow.( windows ne semble pas aimer l'utilisation du FormActivate)
    Le FormActive fonctionne bien sous linux mais pas sous windows. Cet événement semble recherché des infos sur le datamodule qui ne sont pas encore disponible pour la fiche et me renvoi un message d'erreur sqlite.Le premier problème vient qu'au début de chaque fiche j'ouvre mes tables avec un ordre différent avec un order by .... que je mets dans un événement à l'affichage de la fiche par FormActivate ou FormShow.( windows ne semble pas aimer l'utilisation du FormActivate)
    Le FormActive fonctionne bien sous linux mais pas sous windows. Cet événement semble recherché des infos sur le datamodule qui ne sont pas encore disponible pour la fiche et me renvoi un message d'erreur sqlite.
    C'est pour cela qu'il faut t'assurer que ton Datamodule est bien chargé avant la fiche. En ce qui concerne les problèmes d'événement, si tu as des opérations qui à faire qui ne doivent pas avoir d'impact au démarrage de la fiche, il est possible de désactiver temporairement les datasource (méthode DisableControls, attention cela perturbe les relations maître/détails) et donc des événements liés aux objets visuels sensibles aux données qui ne sont peut-être pas encore visibles.
    L'ouverture d'une requête en soi ne devrait poser de problème si la connexion est ouverte et les données disponibles, par contre on peut imaginer des gestionnaires d'événements parasites.
    L'événement Formpaint est à utiliser au compte-goutte car très (trop??) souvent déclenché sous le contrôle de Windows.

    Et pourquoi cette différence du résultat du FormActivate en linux et windows comment éviter une réécriture pour chaque système
    je ferai une réponse bête, Windows n'est pas linux...

    Si le code n'est pas trop gros, exhibes-nous les morceaux sur lesquels tu as des doutes.

    Désolé de ne pas plus précis mais je n'ai pas Lazarus sous la main au travail et je ne m'en sers pas tous les jours non plus.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci pour tes réponses que je vais étudier de près n'étant pas un spécialiste et je compléterais cette réponse.
    le premier point pour que le datamodule soit créé avant les fiches, le séquencement se fait via la déclaration dans le projet je suppose donc dans mon essai de projet dont voici la copie
    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
    program pbank;
     
    {$mode objfpc}{$H+}
     
    uses
      {$IFDEF UNIX}{$IFDEF UseCThreads}
      cthreads,
      {$ENDIF}{$ENDIF}
      Interfaces, // this includes the LCL widgetset
      Forms, sqlite3laz, ubank, udata, uservice, uoutils
      { you can add units after this };
     
    {$R *.res}
     
    begin
      RequireDerivedFormResource := True;
      Application.Initialize;
      Application.CreateForm(TFbank, Fbank);
      Application.CreateForm(Tdata, data);
      Application.CreateForm(TFservice, Fservice);
      Application.Run;
    end.
    il faudrait que je déplace la ligne Tdata, data juste après Initialize ou bien cela ne suffit pas ?
    Ce projet est sous linux, profitant de la prrésentation de ce code, l'unité principale ubank fait beaucoup d'opérations non visibles et pendant ce temps c'est la fiche Fservice qui est affichée, pourquoi pour y remédier j'ai trouvé une solution au lancement de l'appli ouvrir la fiche bank avec un bouton qui par un clik lance l'appli mais je ne trouve pas cela très correct ci-dessous le texte de cette unité non finalisée
    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
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    unit ubank;   // nouvelle unité bank avec initialisation via CONFIG.sdb
                  // le 04 octobre 2013 vers 20h20
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Sqlite3DS, db, sqldb, sqlite3conn, FileUtil, Forms,
      Controls, Graphics, Dialogs, ExtCtrls, Buttons, DbCtrls, StdCtrls,
      udata, uoutils, uservice;
     
    type
     
      { TFbank }
     
      TFbank = class(TForm)
        BArchiver: TBitBtn;
        BAutomat: TBitBtn;
        BCalculMois: TBitBtn;
        BConsulter: TBitBtn;
        BCorriger: TBitBtn;
        BEntrer: TBitBtn;
        BFermer: TButton;
        BFichiers: TBitBtn;
        BImporter: TBitBtn;
        Binit: TBitBtn;
        BPointer: TBitBtn;
        BQuitter: TBitBtn;
        BRechercher: TBitBtn;
        BReorganiser: TBitBtn;
        BTransferer: TBitBtn;
        DBEdit3: TDBEdit;
        DBEdit4: TDBEdit;
        Edit2: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        OpenDialog: TOpenDialog;
        Pbank: TPanel;
        PBoutons: TPanel;
        PTitre: TPanel;
        Sinit: TDatasource;
        Pinit2: TPanel;
        init: TSqlite3Dataset;
        InitConnection: TSQLite3Connection;
        InitTransaction: TSQLTransaction;
        procedure BArchiverClick(Sender: TObject);
        procedure BAutomatClick(Sender: TObject);
        procedure BCalculMoisClick(Sender: TObject);
        procedure BConsulterClick(Sender: TObject);
        procedure BCorrigerClick(Sender: TObject);
        procedure BEntrerClick(Sender: TObject);
        procedure BFermerClick(Sender: TObject);
        procedure BFichiersClick(Sender: TObject);
        procedure BImporterClick(Sender: TObject);
        procedure BinitClick(Sender: TObject);
        procedure BPointerClick(Sender: TObject);
        procedure BQuitterClick(Sender: TObject);
        procedure BRechercherClick(Sender: TObject);
        procedure BReorganiserClick(Sender: TObject);
        procedure BTransfererClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
        procedure CreerConfig;
        procedure EnregistrementConfig;
        procedure InitAppli;
        procedure LectureInit;
        procedure PrepareTables;
        procedure VideTables;
        procedure EcritureTables;
        procedure LancementAppli;
        procedure TransfertPossible;
        procedure FutureSauvegarde;
      end;
     
    var
      Fbank: TFbank;
      MDETAIL1,MDETAIL2,MVALEUR1,MVALEUR2:String;
      MQ,MQ0,MQ1,MQ2,Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,QA,QB,QC,QD,QE:string;
      MREP_SAUVE,MSAUVE_A,MSAUVE_B,MSAUVE_C,MSAUVE_D,MSAUVE_E,MSAUVE_F:String;
      MSAUVE_X,MTOTAL,MSOURCE,MSOURCE2,MCOPIE,MCOPIE2,MDESTINATION:String;
      MPOS,MLONG,XSAUVE_X:integer;
      XTOTAL:Double;
      MTRANSFERT:Boolean;
     
    const
      MVIDE='';
     
    implementation
     
    {$R *.lfm}
     
    { TFbank }
     
    procedure TFbank.FormCreate(Sender: TObject);
    begin
        // préparation de l'environnement
      defaultFormatSettings.ShortDateFormat:='DD/MM/YYYY';
      defaultFormatSettings.DateSeparator:='/';
      defaultFormatSettings.DecimalSeparator:=',';
    end;
     
    procedure TFbank.FormShow(Sender: TObject);
    begin
     //InitAppli;
    end;
     
    procedure TFbank.BinitClick(Sender: TObject);
    begin
      InitAppli; // pour afficher la fiche principale dès le début
    end;
     
     
    procedure TFbank.InitAppli;
    begin
     // prépare la tableinit de CONFIG.sdb
     MREP_APPLI:= ExtractFilePath(application.ExeName);
     MLONG:=Length(MREP_APPLI);
     MSEPARATEUR:=Copy(MREP_APPLI,MLONG,1);
     if FileExists(MREP_APPLI+MSEPARATEUR+'CONFIG.sdb') then
     begin
     //la table init de CONFIG.sdb existe, donc on va la lire;
    LectureInit;
    PrepareTables;
      end
     else
     begin
     OpenDialog.Execute;
     MREP_IMPORT:=Opendialog.FileName;
     MREP_IMPORT:=ExtractFileDir(MREP_IMPORT)+MSEPARATEUR;
     MPOS:= Pos('source',MREP_APPLI);
     MREP_SAUVE:=Copy(MREP_APPLI,1,MPOS-1);
     MREP_TABLE:=MREP_SAUVE+'tables'+MSEPARATEUR;
     // création de la base CONFIG.sdb
     CreerConfig;
     // enregistrement des infos d'init dans CONFIG.sdb
     EnregistrementConfig;
     PrepareTables;
     VideTables;
     EcritureTables;
     end;
     // lancement application, tronc commun
     
     LancementAppli;
    end;
     
    procedure TFbank.CreerConfig;
    begin
     // création de la base CONFIG.sdb
     initConnection.DatabaseName:=MREP_APPLI+MSEPARATEUR+'CONFIG.sdb'; // fichier inexistant
     initConnection.Transaction := InitTransaction; // si pas défini en conception
     initConnection.Open; // ou SQLite3Connection.Connected:=True; // crée la base
     InitTransaction.DataBase := initConnection; // si pas défini en conception
     InitTransaction.StartTransaction;
     MDETAIL1:='( K_INIT INTEGER PRIMARY KEY , REP_APPLI char(45) , REP_IMPORT char(45), REP_TABLE char(45) ';
     MDETAIL2:=', REP_SAUVE char(45), SEPARATEUR char(1))';
     initConnection.ExecuteDirect('CREATE TABLE INIT '+MDETAIL1+MDETAIL2);
     InitTransaction.Commit; // crée la table
    end;
     
    procedure TFbank.EnregistrementConfig;
    begin
     // enregistrement des infos d'init dans CONFIG.sdb
     init.FileName:=MREP_APPLI+MSEPARATEUR+'CONFIG.sdb';
     init.PrimaryKey:='K_INIT';
     init.TableName:='INIT';
     init.SQL:='Select * from INIT';
     init.Active:=True;
     init.ExecSQL;
     Q1:=quotedstr(MREP_APPLI);
     Q2:=quotedstr(MREP_IMPORT);
     Q3:=quotedstr(MREP_TABLE);
     Q4:=quotedstr(MREP_SAUVE);
     Q5:=quotedstr(MSEPARATEUR);
     MQ:='INSERT INTO INIT VALUES(NULL,'+Q1+','+Q2+','+Q3+','+Q4+','+Q5+')';
     init.SQL:=MQ;
     init.ExecSQL;
     init.ApplyUpdates;
     init.Close;
     MQ:='Select * from INIT';
     init.SQL:=MQ;
     init.Open;
     init.ExecSQL;
     // la table init de CONFIG.sdb vient d'être créée il faut préparer les tables de data
     PrepareTables;
    end;
     
    procedure TFbank.LectureInit;
    begin
     init.FileName:=MREP_APPLI+MSEPARATEUR+'CONFIG.sdb';
     init.PrimaryKey:='K_INIT';
     init.TableName:='INIT';
     init.SQL:='Select * from INIT';
     init.Active:=True;
     init.ExecSQL;
     MREP_APPLI:=Init.FieldByName('REP_APPLI').AsString;
     MREP_IMPORT:=Init.FieldByName('REP_IMPORT').AsString;
     MREP_TABLE:=Init.FieldByName('REP_TABLE').AsString;
     MSEPARATEUR:=Init.FieldByName('SEPARATEUR').AsString;
     MREP_SAUVE:=Init.FieldByName('REP_SAUVE').AsString;
    end;
     
    procedure TFbank.PrepareTables;
    begin
     data.archive.FileName:=MREP_TABLE+MBASE;
     data.archive.PrimaryKey:='K_ARCHIVE';
     data.archive.TableName:='ARCHIVE';
     data.archive.SQL:='Select * from archive';
     data.archive.Active:=True;
     data.archive.ExecSQL;
     data.automat.FileName:=MREP_TABLE+MBASE;
     data.automat.PrimaryKey:='K_AUTOMAT';
     data.automat.TableName:='AUTOMAT';
     data.automat.SQL:='Select * from automat';
     data.automat.Active:=True;
     data.automat.ExecSQL;
     data.bank.FileName:=MREP_TABLE+MBASE;
     data.bank.PrimaryKey:='K_BANK';
     data.bank.TableName:='BANK';
     data.bank.SQL:='Select * from bank';
     data.bank.Active:=True;
     data.bank.ExecSQL;
     data.divers.FileName:=MREP_TABLE+MBASE;
     data.divers.PrimaryKey:='K_DIVERS';
     data.divers.TableName:='DIVERS';
     data.divers.SQL:='Select * from divers';
     data.divers.Active:=True;
     data.divers.ExecSQL;
     data.genre.FileName:=MREP_TABLE+MBASE;
     data.genre.PrimaryKey:='K_GENRE';
     data.genre.TableName:='GENRE';
     data.genre.SQL:='select * from genre order by genre';
     data.genre.Active:=True;
     data.genre.ExecSQL;
     data.import.FileName:=MREP_TABLE+MBASE;
     data.import.PrimaryKey:='K_IMPORT';
     data.import.TableName:='IMPORT';
     data.import.SQL:='Select * from import';
     data.import.Active:=True;
     data.import.ExecSQL;
     data.libelle.FileName:=MREP_TABLE+MBASE;
     data.libelle.PrimaryKey:='K_LIBELLE';
     data.libelle.TableName:='LIBELLE';
     data.libelle.SQL:='Select * from libelle order by libelle';
     data.libelle.Active:=True;
     data.libelle.ExecSQL;
    end;
     
    procedure TFbank.VideTables;
    begin
      data.archive.SQL:='Delete from archive';
      data.archive.ExecSQL;
      data.archive.ApplyUpdates;
      data.automat.SQL:='Delete from automat';
      data.automat.ExecSQL;
      data.automat.ApplyUpdates;
      data.bank.SQL:='Delete from bank';
      data.bank.ExecSQL;
      data.bank.ApplyUpdates;
      data.divers.SQL:='Delete from divers';
      data.divers.ExecSQL;
      data.divers.ApplyUpdates;
      data.genre.SQL:='Delete from genre';
      data.genre.ExecSQL;
      data.genre.ApplyUpdates;
      data.import.SQL:='Delete from import';
      data.import.ExecSQL;
      data.import.ApplyUpdates;
      data.libelle.SQL:='Delete from libelle';
      data.libelle.ExecSQL;
      data.libelle.ApplyUpdates;
    end;
     
    procedure TFbank.EcritureTables;
    begin
     // ****************écriture dans divers
     Q0:=quotedstr(MVIDE); // pour la date du relevé
     Q1:=quotedstr('99,99');  // pour le total du relevé
     Q2:=quotedstr('99,99');  // pour le total disponible
     Q3:=quotedstr('1111111111'); // pour chèque_A
     Q4:=quotedstr('2222222222'); // pour chèque_B
     Q5:=quotedstr('3333333333'); // pour chèque_C
     Q6:=quotedstr('1'); // pour sauve_x
     Q7:=quotedstr('tablesA'+MSEPARATEUR); // pour sauve_A
     Q8:=quotedstr('tablesB'+MSEPARATEUR); // pour sauve_B
     Q9:=quotedstr('tablesC'+MSEPARATEUR); // pour sauve_C
     QA:=quotedstr('tablesD'+MSEPARATEUR); // pour sauve_D
     QB:=quotedstr('tablesE'+MSEPARATEUR); // pour sauve_E
     QC:=quotedstr('tablesF'+MSEPARATEUR); // pour sauve_F
     QD:=quotedstr(MVIDE); // pour ZA
     QE:=quotedstr(MVIDE); // pour ZB
     MQ1:='(NULL,'+Q0+','+Q1+','+Q2+','+Q3+','+Q4+','+Q5+','+Q6+','+Q7+','+Q8+'';
     MQ2:=','+Q9+','+QA+','+QB+','+QC+','+QD+','+QE+')';
     MQ:='INSERT INTO DIVERS VALUES'+MQ1+MQ2;
     data.divers.SQL:=MQ;
     data.divers.ExecSQL;
     data.divers.ApplyUpdates;
     data.divers.Close;
     data.divers.SQL:='Select * from divers';
     data.divers.Open;
     data.divers.ExecSQL;
     // *************************écriture genre
     Q0:=quotedstr('CHEQUE');
     MQ1:='(NULL,'+Q0+')';
     MQ:='INSERT INTO GENRE VALUES'+MQ1;
     data.genre.SQL:=MQ;
     data.genre.ExecSQL;
     data.genre.ApplyUpdates;
     Q0:=quotedstr('DIVERS');
     MQ1:='(NULL,'+Q0+')';
     MQ:='INSERT INTO GENRE VALUES'+MQ1;
     data.genre.SQL:=MQ;
     data.genre.ExecSQL;
     data.genre.ApplyUpdates;
     Q0:=quotedstr('PRELEVEMENT');
     MQ1:='(NULL,'+Q0+')';
     MQ:='INSERT INTO GENRE VALUES'+MQ1;
     data.genre.SQL:=MQ;
     data.genre.ExecSQL;
     data.genre.ApplyUpdates;
     Q0:=quotedstr('VIREMENT');
     MQ1:='(NULL,'+Q0+')';
     MQ:='INSERT INTO GENRE VALUES'+MQ1;
     data.genre.SQL:=MQ;
     data.genre.ExecSQL;
     data.genre.ApplyUpdates;
     data.genre.Close;
     data.genre.SQL:='select * from genre order by genre';
     data.genre.Open;
     data.genre.ExecSQL;
     // *************************écriture dans libellé
     Q0:=quotedstr('DIVERS'); // pour le genre du libelle
     Q1:=quotedstr('.AUTRE');  // pour le libellé
     Q2:=quotedstr('OUI');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('DIVERS'); // pour le genre du libelle
     Q1:=quotedstr('DEPOT D''ESPECES');  // pour le libellé
     Q2:=quotedstr('OUI');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('DIVERS'); // pour le genre du libelle
     Q1:=quotedstr('DEPOT CHEQUE');  // pour le libellé
     Q2:=quotedstr('OUI');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('DIVERS'); // pour le genre du libelle
     Q1:=quotedstr('ECHEANCE');  // pour le libellé
     Q2:=quotedstr('NON');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('DIVERS'); // pour le genre du libelle
     Q1:=quotedstr('RETRAIT CARTE');  // pour le libellé
     Q2:=quotedstr('NON');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('PRELEVEMENT'); // pour le genre du libelle
     Q1:=quotedstr('.AUTRE');  // pour le libellé
     Q2:=quotedstr('NON');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('VIREMENT'); // pour le genre du libelle
     Q1:=quotedstr('.AUTRE');  // pour le libellé
     Q2:=quotedstr('OUI');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('VIREMENT'); // pour le genre du libelle
     Q1:=quotedstr('DEPUIS CE COMPTE');  // pour le libellé
     Q2:=quotedstr('NON');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     Q0:=quotedstr('VIREMENT'); // pour le genre du libelle
     Q1:=quotedstr('VERS CE COMPTE');  // pour le libellé
     Q2:=quotedstr('OUI');  // pour positif
     MQ:='INSERT INTO LIBELLE VALUES (NULL,'+Q0+','+Q1+','+Q2+')';
     data.libelle.SQL:=MQ;
     data.libelle.ExecSQL;
     data.libelle.ApplyUpdates;
     data.libelle.Close;
     data.libelle.SQL:='Select * from libelle order by libelle';
     data.libelle.Open;
     data.libelle.ExecSQL;
    end;
     
    procedure TFbank.LancementAppli;
    begin
     // lancement de l'application, tronc commun
     Pinit2.Visible:=False;
     Pbank.Visible:=True;
     FutureSauvegarde;
    end;
     
    procedure TFbank.FutureSauvegarde;
    begin
      MSAUVE_A:=data.divers.FieldByName('SAUVE_A').AsString;
      MSAUVE_B:=data.divers.FieldByName('SAUVE_B').AsString;
      MSAUVE_C:=data.divers.FieldByName('SAUVE_C').AsString;
      MSAUVE_D:=data.divers.FieldByName('SAUVE_D').AsString;
      MSAUVE_E:=data.divers.FieldByName('SAUVE_E').AsString;
      MSAUVE_F:=data.divers.FieldByName('SAUVE_F').AsString;
      MSAUVE_X:=data.divers.FieldByName('SAUVE_X').AsString;
      XSAUVE_X:=StrToInt(MSAUVE_X);
        Case XSAUVE_X of
        1:
          begin
          MDESTINATION:='tablesA'+MSEPARATEUR;
          MSAUVE_X:='2';
          end;
        2:
          begin
          MDESTINATION:='tablesB'+MSEPARATEUR;
          MSAUVE_X:='3';
          end;
        3:
          begin
          MDESTINATION:='tablesC'+MSEPARATEUR;
          MSAUVE_X:='4';
          end;
        4:
          begin
          MDESTINATION:='tablesD'+MSEPARATEUR;
          MSAUVE_X:='5';
          end;
        5:
          begin
          MDESTINATION:='tablesE'+MSEPARATEUR;
          MSAUVE_X:='6';
          end;
        6:
          begin
          MDESTINATION:='tablesF'+MSEPARATEUR;
          MSAUVE_X:='1';
          end;
        end;
    Edit2.Text:=MDESTINATION;
    Edit2.Update;
    end;
     
    procedure TFbank.BQuitterClick(Sender: TObject);
    begin
      if MMODIFICATION='OUI' then
      begin
      Q1:=quotedstr(MSAUVE_X);
      MQ:='update divers set SAUVE_X='+Q1+' where K_DIVERS=1';
      data.divers.SQL:=MQ;
      data.divers.ExecSQL;
      data.divers.ApplyUpdates;
      Edit2.Text:=MDESTINATION;
      Edit2.Update;
      BQuitter.Enabled:=False;
      BFermer.Visible:=True;
      end
      else Close;
    end;
     
    procedure TFbank.BRechercherClick(Sender: TObject);
    begin
     
    end;
     
    procedure TFbank.BReorganiserClick(Sender: TObject);
    begin
     
    end;
     
    procedure TFbank.BTransfererClick(Sender: TObject);
    begin
     
    end;
     
    procedure TFbank.BFermerClick(Sender: TObject);
    begin
       BFermer.Visible:=False;
      // fermeture des tables pour la copie de la base surtout pour la version windows
      data.SourceArchive.DataSet.Free;
      data.SourceAutomat.DataSet.Free;
      data.SourceBank.DataSet.Free;
      data.SourceDivers.DataSet.Free;
      data.SourceGenre.DataSet.Free;
      data.SourceImport.DataSet.Free;
      data.SourceLibelle.DataSet.Free;
      Sinit.DataSet.Free;
      MSOURCE:=MREP_TABLE+MBASE;
      MSOURCE2:=MREP_APPLI+MBASE2;
      MCOPIE:=MREP_SAUVE+MDESTINATION+MBASE;
      CopyFile (MSOURCE,MCOPIE,False);
      MCOPIE2:=MREP_SAUVE+MDESTINATION+MBASE2;
      // copy de la base CONFIG.sdb
      CopyFile (MSOURCE2,MCOPIE2,False);
      BQuitter.Enabled:=True;
      close;
    end;
     
    procedure TFbank.BFichiersClick(Sender: TObject);
    begin
       // consulter et corriger les fichiers de service
      if MTRANSFERT=False then TransfertPossible;
      Fservice.Show;
    end;
     
    procedure TFbank.BImporterClick(Sender: TObject);
    begin
      // import fichier téléchargé de LCL
      {if MTRANSFERT=False then TransfertPossible;
      Fimporter.show;}
    end;
     
     
    procedure TFbank.BPointerClick(Sender: TObject);
    begin
        // pointage des données
      {if MTRANSFERT=False then TransfertPossible;
      Fpointer.Show;}
    end;
     
    procedure TFbank.BConsulterClick(Sender: TObject);
    begin
       // consulter les fichierd de données ordinaires
      {if MTRANSFERT=False then
     Fconsulter.show;}
    end;
     
    procedure TFbank.BCorrigerClick(Sender: TObject);
    begin
       // corriger des données
      {if MTRANSFERT=False then TransfertPossible;
      Fcorriger.Show;}
    end;
     
    procedure TFbank.BAutomatClick(Sender: TObject);
    begin
         // création opérations automatiques
      {if MTRANSFERT=False then TransfertPossible;
      Fautomat.Show;}
    end;
     
    procedure TFbank.BCalculMoisClick(Sender: TObject);
    begin
        // consulter et corriger les fichiers de service
     { if MTRANSFERT=False then TransfertPossible;
      Fdmois.show;}
    end;
     
    procedure TFbank.BArchiverClick(Sender: TObject);
    begin
       // archivage des données supérieures à 300 jours et validées
      {if MTRANSFERT=False then TransfertPossible;
      Farchiver.Show;}
    end;
     
    procedure TFbank.BEntrerClick(Sender: TObject);
    begin
         // entrée des nouvelles opérations
     { if MTRANSFERT=False then TransfertPossible;
      Fentrer.show;}
    end;
     
     
    procedure TFbank.TransfertPossible;
    begin
      Q0:=quotedstr(FloatToStr(Date()+6));
      data.automat.Close;
      MQ:='Select * from AUTOMAT WHERE CODEDATE< ('+Q0+')';
      data.automat.SQL:=MQ;
      data.automat.Open;
      data.automat.ExecSQL;
      if data.automat.RecordCount<>0 then
      begin
      MMESSAGE:='Il y a des opérations transférables';
      MessageInformation;
      MTRANSFERT:=True;
      end;
    end;
     
     
     
    end.
    Merci et A+

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour Jean,

    Ma réponse va peut-être paraître un peu absurde : je n'utilise pas de datamodule...
    Quand j'ai commencé avec Lazarus, j'ai rencontré ce genre de problème et des pertes ou des impossibilités de connexions avec les datamodules... Cela a dû s'arranger depuis. Je n'ai pas testé. Dans tous mes programmes, il y a une fMain qui reste présente. C'est là qu'est placé le connecteur principal ou les connecteurs principaux. S'il y a besoin de Forms particulières, SplashScreen ou par exemple une Form d'identification au lancement du programme, je déclare une chaîne de connexion sans "déposer" d'ailleurs de connecteur sur la Form, ni de Dataset. Elle est déclarée en lignes de code, totalement autonome et utilisable d'un programme à l'autre et pas forcément avec le même SGDBR que celui du programme.

    En général chaque Form dispose de ses propres SQLquery (un pour les SELECT et un pour les INSERT et autres UPDATE).

    Je travaille toujours dans les 2 environnements Nux et Win pour mes développements et avec cette solution, je ne rencontre pas de problème que ce soit en pgSQL, mySQL ou même maintenant en SQLite. Il reste dans cette configuration simplement à se concentrer sur les quelques différences d'ordre dans les séquences d'ouverture des méthodes des fenêtres entre Nux et Win mais je crois qu'on en a déjà parlé.

    Bonne continuation. Gilles
    Dernière modification par Invité ; 06/10/2013 à 11h23.

  5. #5
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Bonjour Gilles,
    Habituellement hors le problème d'événements réagissant différemment entre linux et win objet d'un autre post entre nous, je n'ai jusqu'ici pas eu de problème particulier avec le datamodule qui me permet depuis chaque form d'avoir accès aux données selon l'usage recherché.
    Jusqu'ici je déclarais les paramètres concernant les tables du datamodule à la conception et l'adaptant au système d'exploitation, mais cela imposait des chemins fixés à l'avance.
    Souhaitant proposer à un de mes petits enfants, nouvel étudiant éloigné de son domicile, un outil de gestion financière simple je me suis rendu compte que mon approche devait être modifiée pour permettre à l'utilisateur de l'adapter à son système d'exploitation et à son environnement d'où mon apprentissage et mes recherches et naturellement quelques interrogations.
    Par contre je ne suis pas bien ta méthode et comme on dit un dessin vaut mieux qu'un long discours si tu peux joindre à ta réponse un exemple. Je comprends vite mais il me faut du temps les neurones avec l'âge sont un peu paresseux.
    A+

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

    je confirme à la lecture du forum lazarus que le maniement des datamodules semble toujours ne pas être évident : http://forum.lazarus.freepascal.org/...&action=search [champ de recherche : Search for -> datamodule]

    Pour le reste, il n'y a pas besoin de beaucoup d'explications...
    La fenêtre fMain ouvre le connecteur principal sur laquelle il est "déposé" ainsi que le transactionnel. Sont déclarées dans les uses de son interface les fenêtres secondaires : fSlave1, fSlave2... Dans chaque implementation des fenêtres secondaires est déclarée un "uses fMain;" pour éviter les références circulaires... A partir de là, toute fenêtre secondaire a accès aux composants de fMain ainsi qu'à ses variables publiques.

    Cordialement. Gilles
    Dernière modification par Invité ; 07/10/2013 à 11h26. Motif: Orthographe

  7. #7
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci Gilles
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour Créer une appli
    Par skyrider26 dans le forum XCode
    Réponses: 1
    Dernier message: 28/07/2012, 18h05
  2. Besoin de conseils pour créer une page avec un avatar
    Par cedric/copy dans le forum ASP
    Réponses: 5
    Dernier message: 02/04/2009, 13h46
  3. Réponses: 4
    Dernier message: 06/12/2006, 10h46
  4. Quelques conseils pour créer une application 3D
    Par mister3957 dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 13/03/2006, 22h45
  5. un conseil pour démarrer une appli graphique SVP.
    Par dprevots dans le forum Langage
    Réponses: 6
    Dernier message: 22/01/2006, 17h49

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