TSqlite3 Master Detail Example/fr

From Lazarus wiki
Jump to navigationJump to search

English (en) français (fr)
Exemple de relation Maître/Détail pour TSqlite3.

A propos de la démo

Cette démo est un exemple fonctionnel de comment utiliser le composant DataSet TSqlite3 de SQLite dans une relation Maître/Détail.

Light bulb  Remarque: Ce composant ne fait pas partie des composants de base de données généraux de la SQLDB. SQLDB fournit TSQLite3Connection qui correspond à d'autres connecteurs de bases de données. Il est fortement recommandé de regarder dans TSQLite3Connection du fait de la facilité de changement vers une autre base de données ; utilisez seulement TSQLite3 si cela est réellement demandé.

Voir MasterDetail pour des instructions sur comment implémenter des relations Maître/Détail en utilisant des composants SQLdb standards (p.ex. sqlite3).

Auteur

David Stewart .. davesimplewear at yahoo dot com
NdT : Merci à Dave Stewart pour cet article.

Composants utilisés

  • TSqlite3
  • Standard Lazarus database components

License

  • Vous êtes libres de l'utiliser comme vous le voulez.

Téléchargement

L'exemple TSQLite3 peut être téléchargé depuis L'emplacement de téléchargement Lazarus-CCR de SF. Aussi depuis Freeware de David.

Captures d'écran

Screenshot-Master Detail Example - SQLLite3.png

Screenshot-Master Detail Example - SQLLite3-1.png

Screenshot-Master Detail Example - SQLLite3-2.png

Screenshot-Select Customer Name.png

Screenshot-Select Item Number.png

Cette capture d'écran montre la configuration de la table pour le Mapître/Détail.

Screenshot.png

Code du programme d'exemple

unit uMain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, sqlite3ds, FileUtil, LResources, Forms, Controls,
  Graphics, Dialogs, ComCtrls, ExtCtrls, Menus, DbCtrls, StdCtrls, DBGrids;

type

  { TfMain }

  TfMain = class(TForm)
    btnSelCust: TButton;
    btnAddSale: TButton;
    btnSaveEntry: TButton;
    btnDelEntry: TButton;
    DBNavigator3: TDBNavigator;
    dsCust: TDatasource;
    dsSales: TDatasource;
    dsStock: TDatasource;
    DBEdit1: TDBEdit;
    DBEdit10: TDBEdit;
    DBEdit12: TDBEdit;
    DBEdit13: TDBEdit;
    DBEdit14: TDBEdit;
    DBEdit15: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    dgSales: TDBGrid;
    DBNavigator1: TDBNavigator;
    DBNavigator2: TDBNavigator;
    Label1: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    miClose: TMenuItem;
    miFile: TMenuItem;
    mmMain: TMainMenu;
    nbMain: TNotebook;
    Panel1: TPanel;
    pnlSales: TPanel;
    pnlStock: TPanel;
    pnlCustomer: TPanel;
    pnlSelectCust: TPanel;
    pStock: TPage;
    pCustomer: TPage;
    pSales: TPage;
    sbMain: TStatusBar;
    TCustAddr: TStringField;
    TCustCustName: TStringField;
    TCustcustState: TStringField;
    TCustID: TAutoIncField;
    TCustpostCode: TStringField;
    TCustSuburb: TStringField;
    TSalescustID: TLongintField;
    TSalesID: TAutoIncField;
    TSalesitem: TStringField;
    TSalesitemNum: TStringField;
    TSalesprice: TFloatField;
    TSalessaleDate: TDateField;
    TSalesshipDate: TDateField;
    TStock: TSqlite3Dataset;
    TSales: TSqlite3Dataset;
    TCust: TSqlite3Dataset;
    TStockID: TAutoIncField;
    TStockitem: TStringField;
    TStockitemNum: TStringField;
    TStockprice: TFloatField;
    procedure btnAddSaleClick(Sender: TObject);
    procedure btnDelEntryClick(Sender: TObject);
    procedure btnSaveEntryClick(Sender: TObject);
    procedure btnSelCustClick(Sender: TObject);
    procedure dgSalesEditButtonClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure miCloseClick(Sender: TObject);
    private
    { private declarations }
  public
    { public declarations }
  end; 

var
  fMain: TfMain;

implementation
uses uCust, uSales;
{ TfMain }

procedure TfMain.miCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
   CanClose := MessageDlg('Are You Sure ?',mtConfirmation,[mbYes,mbNo],0)=mrYes;
end;

procedure TfMain.FormCreate(Sender: TObject);
var
n:integer;
c:TComponent;
FName:string;
begin
    fName := ExtractFilePath(ParamStr(0)) +'data/md.db3';
for n := 0 to ComponentCount -1 do
    begin
     c := Components[n];
     if c is TSqlite3Dataset then
     TSqlite3Dataset(c).FileName:= fName;
    end;
 for n := 0 to ComponentCount -1 do
    begin
     c := Components[n];
     if c is TSqlite3Dataset then
     TSqlite3Dataset(c).Open;
    end;
end;

procedure TfMain.FormDestroy(Sender: TObject);
var
n:integer;
c:TComponent;
begin
  for n := 0 to ComponentCount -1 do
    begin
     c := Components[n];
     if c is TSqlite3Dataset then
     TSqlite3Dataset(c).Close;
    end;
end;

procedure TfMain.FormShow(Sender: TObject);
begin
  nbMain.PageIndex:=0;
end;

procedure TfMain.dgSalesEditButtonClick(Sender: TObject);
begin
  if SearchDlg.ShowModalParts =mrOk then
     begin
       TSales.Edit;
       TSalesItemNum.Value := SearchDlg.PartNum;
       TSalesItem.Value := TStockitem.Value;
       TSalesPRICE.Value:= TStockPrice.Value;
     end;
end;

procedure TfMain.btnSelCustClick(Sender: TObject);
begin
  custDlg.CustName := TCustCUSTNAME.Value ;
     if CustDlg.ShowModalCust =mrOk then
     begin
       TCust.Edit;
       TCustCUSTNAME.Value := custDlg.CustName;
    end;
end;

procedure TfMain.btnAddSaleClick(Sender: TObject);
begin
  TSales.Append;
end;

procedure TfMain.btnDelEntryClick(Sender: TObject);
begin
  TSales.Delete;
end;

procedure TfMain.btnSaveEntryClick(Sender: TObject);
begin
  TSales.ApplyUpdates;
end;

initialization
  {$I uMain.lrs}

end.

uMain.lfm (edité)

object fMain: TfMain
  Left = 395
  Height = 332
  Top = 218
  Width = 534
  ActiveControl = nbMain
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = bsSingle
  Caption = 'Master Detail Example - SQLLite3'
  ClientHeight = 305
  ClientWidth = 534
  Font.Height = -13
  Font.Name = 'Sans'
  Menu = mmMain
  OnCloseQuery = FormCloseQuery
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnShow = FormShow
  Position = poScreenCenter
  LCLVersion = '0.9.27'
  object sbMain: TStatusBar
    Left = 0
    Height = 19
    Top = 286
    Width = 534
    AutoHint = True
    Panels = <>
  end
  object nbMain: TNotebook
    Left = 0
    Height = 286
    Top = 0
    Width = 534
    Align = alClient
    PageIndex = 0
    TabOrder = 1
    object pSales: TPage
      Caption = 'Sales'
      ClientWidth = 532
      ClientHeight = 259
      object Label3: TLabel
        Left = 0
        Height = 18
        Top = 241
        Width = 532
        Align = alBottom
        Caption = 'Select Customer First, then click in item number field to select item, then save'
        ParentColor = False
      end
      object pnlSelectCust: TPanel
        Left = 15
        Height = 216
        Top = 14
        Width = 232
        BevelInner = bvLowered
        BevelWidth = 2
        ClientHeight = 216
        ClientWidth = 232
        TabOrder = 0
        object Label1: TLabel
          Left = 4
          Height = 18
          Top = 4
          Width = 224
          Align = alTop
          Alignment = taCenter
          Caption = 'Customer Detail'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsBold, fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object Label2: TLabel
          Left = 24
          Height = 18
          Top = 31
          Width = 73
          Caption = 'First Name'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object DBEdit1: TDBEdit
          Left = 24
          Height = 23
          Hint = 'Cust name'
          Top = 48
          Width = 184
          DataField = 'CustName'
          DataSource = dsCust
          ReadOnly = True
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 0
        end
        object DBEdit3: TDBEdit
          Left = 24
          Height = 23
          Hint = 'Address'
          Top = 72
          Width = 184
          DataField = 'Addr'
          DataSource = dsCust
          ReadOnly = True
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 1
        end
        object DBEdit4: TDBEdit
          Left = 24
          Height = 23
          Hint = 'Suburb/Town'
          Top = 96
          Width = 184
          DataField = 'Suburb'
          DataSource = dsCust
          ReadOnly = True
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 2
        end
        object DBEdit5: TDBEdit
          Left = 24
          Height = 23
          Hint = 'Postal Code'
          Top = 120
          Width = 80
          DataField = 'postCode'
          DataSource = dsCust
          ReadOnly = True
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 3
        end
        object DBEdit6: TDBEdit
          Left = 128
          Height = 23
          Hint = 'State'
          Top = 119
          Width = 80
          DataField = 'custState'
          DataSource = dsCust
          ReadOnly = True
          CharCase = ecUppercase
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 4
        end
        object btnSelCust: TButton
          Left = 24
          Height = 25
          Hint = 'Click to select a Customer'
          Top = 176
          Width = 184
          Caption = 'Select Customer'
          OnClick = btnSelCustClick
          ParentShowHint = False
          ShowHint = True
          TabOrder = 5
        end
        object DBNavigator3: TDBNavigator
          Left = 30
          Height = 22
          Top = 150
          Width = 170
          BevelOuter = bvNone
          ClientHeight = 22
          ClientWidth = 170
          DataSource = dsCust
          TabOrder = 6
          VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast]
        end
      end
      object pnlSales: TPanel
        Left = 255
        Height = 216
        Top = 14
        Width = 260
        BevelInner = bvLowered
        BevelWidth = 2
        ClientHeight = 216
        ClientWidth = 260
        TabOrder = 1
        object Label4: TLabel
          Left = 4
          Height = 18
          Top = 4
          Width = 252
          Align = alTop
          Alignment = taCenter
          Caption = 'Sales Detail'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsBold, fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object btnAddSale: TButton
          Left = 16
          Height = 25
          Hint = 'Add Another Sale'
          Top = 176
          Width = 72
          Caption = 'Add Sale'
          OnClick = btnAddSaleClick
          ParentShowHint = False
          ShowHint = True
          TabOrder = 0
        end
        object Panel1: TPanel
          Left = 4
          Height = 13
          Top = 22
          Width = 252
          Align = alTop
          BevelOuter = bvNone
          TabOrder = 1
        end
        object dgSales: TDBGrid
          Left = 4
          Height = 125
          Hint = 'Click Item Number Button to Select Item'
          Top = 35
          Width = 252
          Align = alTop
          Columns = <          
            item
              ButtonStyle = cbsEllipsis
              Title.Caption = 'item Number'
              Width = 100
              FieldName = 'itemNum'
            end          
            item
              Width = 150
              FieldName = 'item'
            end          
            item
              FieldName = 'price'
            end          
            item
              Title.Caption = 'sale Date'
              FieldName = 'saleDate'
            end          
            item
              Title.Caption = 'ship Date'
              FieldName = 'shipDate'
            end>
          DataSource = dsSales
          ShowHint = True
          TabOrder = 2
          TitleFont.Height = -13
          TitleFont.Name = 'Sans'
          OnEditButtonClick = dgSalesEditButtonClick
        end
        object btnSaveEntry: TButton
          Left = 95
          Height = 25
          Hint = 'Save Entry'
          Top = 176
          Width = 51
          Caption = 'Save'
          OnClick = btnSaveEntryClick
          ParentShowHint = False
          ShowHint = True
          TabOrder = 3
        end
        object btnDelEntry: TButton
          Left = 168
          Height = 25
          Hint = 'Delete Entry'
          Top = 176
          Width = 75
          Caption = 'Delete'
          OnClick = btnDelEntryClick
          ParentShowHint = False
          ShowHint = True
          TabOrder = 4
        end
      end
    end
    object pCustomer: TPage
      Caption = 'Customer'
      ClientWidth = 532
      ClientHeight = 259
      object pnlCustomer: TPanel
        Left = 95
        Height = 194
        Top = 30
        Width = 339
        BevelInner = bvLowered
        BevelWidth = 2
        ClientHeight = 194
        ClientWidth = 339
        TabOrder = 0
        object Label5: TLabel
          Left = 72
          Height = 18
          Top = 31
          Width = 73
          Caption = 'First Name'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object Label7: TLabel
          Left = 4
          Height = 18
          Top = 4
          Width = 331
          Align = alTop
          Alignment = taCenter
          Caption = 'Customer Entry'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsBold, fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object DBEdit10: TDBEdit
          Left = 72
          Height = 23
          Hint = 'Cust name'
          Top = 48
          Width = 184
          DataField = 'CustName'
          DataSource = dsCust
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 0
        end
        object DBEdit12: TDBEdit
          Left = 72
          Height = 23
          Hint = 'Address'
          Top = 72
          Width = 184
          DataField = 'Addr'
          DataSource = dsCust
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 1
        end
        object DBEdit13: TDBEdit
          Left = 72
          Height = 23
          Hint = 'Suburb/Town'
          Top = 96
          Width = 184
          DataField = 'Suburb'
          DataSource = dsCust
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 2
        end
        object DBEdit14: TDBEdit
          Left = 72
          Height = 23
          Hint = 'Postal Code'
          Top = 120
          Width = 80
          DataField = 'postCode'
          DataSource = dsCust
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 3
        end
        object DBEdit15: TDBEdit
          Left = 176
          Height = 23
          Hint = 'State'
          Top = 119
          Width = 80
          DataField = 'custState'
          DataSource = dsCust
          CharCase = ecUppercase
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 4
        end
        object DBNavigator2: TDBNavigator
          Left = 45
          Height = 25
          Top = 154
          Width = 241
          BevelOuter = bvNone
          ClientHeight = 25
          ClientWidth = 241
          DataSource = dsCust
          TabOrder = 5
        end
      end
    end
    object pStock: TPage
      Caption = 'Stock'
      ClientWidth = 532
      ClientHeight = 259
      object pnlStock: TPanel
        Left = 95
        Height = 218
        Top = 22
        Width = 339
        BevelInner = bvLowered
        BevelWidth = 2
        ClientHeight = 218
        ClientWidth = 339
        TabOrder = 0
        object Label8: TLabel
          Left = 4
          Height = 18
          Top = 4
          Width = 331
          Align = alTop
          Alignment = taCenter
          Caption = 'Stock Entry'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsBold, fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object Label9: TLabel
          Left = 75
          Height = 18
          Top = 24
          Width = 83
          Caption = 'Part Number'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object Label10: TLabel
          Left = 75
          Height = 18
          Top = 72
          Width = 75
          Caption = 'Description'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object Label11: TLabel
          Left = 75
          Height = 18
          Top = 128
          Width = 33
          Caption = 'Price'
          Font.Height = -13
          Font.Name = 'Sans'
          Font.Style = [fsItalic]
          ParentColor = False
          ParentFont = False
        end
        object DBEdit7: TDBEdit
          Left = 75
          Height = 23
          Top = 40
          Width = 181
          DataField = 'itemNum'
          DataSource = dsStock
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 0
        end
        object DBEdit8: TDBEdit
          Left = 75
          Height = 23
          Top = 89
          Width = 181
          DataField = 'item'
          DataSource = dsStock
          MaxLength = 8192
          ParentShowHint = False
          ShowHint = True
          TabOrder = 1
        end
        object DBEdit9: TDBEdit
          Left = 75
          Height = 23
          Top = 145
          Width = 181
          DataField = 'price'
          DataSource = dsStock
          ParentShowHint = False
          ShowHint = True
          TabOrder = 2
        end
        object DBNavigator1: TDBNavigator
          Left = 48
          Height = 25
          Top = 183
          Width = 241
          BevelOuter = bvNone
          ClientHeight = 25
          ClientWidth = 241
          DataSource = dsStock
          ParentShowHint = False
          ShowHint = True
          TabOrder = 3
        end
      end
    end
  end
  object mmMain: TMainMenu
    left = 16
    top = 277
    object miFile: TMenuItem
      Caption = '&File'
      object miClose: TMenuItem
        Caption = '&Close'
        GlyphShowMode = gsmAlways
        Hint = 'Close Application'
        OnClick = miCloseClick
      end
    end
  end
  object dsCust: TDatasource
    DataSet = TCust
    left = 16
    top = 53
  end
  object dsSales: TDatasource
    DataSet = TSales
    left = 16
    top = 141
  end
  object dsStock: TDatasource
    DataSet = TStock
    left = 16
    top = 214
  end
  object TCust: TSqlite3Dataset
    AutoIncrementKey = True
    Options = []
    PrimaryKey = 'ID'
    SaveOnClose = True
    SaveOnRefetch = True
    SQL = 'Select * from cust;'
    TableName = 'cust'
    FieldDefs = <    
      item
        Name = 'ID'
        DataType = ftAutoInc
        Precision = -1
        Size = 0
      end    
      item
        Name = 'CustName'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'Addr'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'Suburb'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'postCode'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'custState'
        DataType = ftString
        Precision = -1
        Size = 8192
      end>
    left = 66
    top = 53
    object TCustID: TAutoIncField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'ID'
      Index = 0
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
    end
    object TCustCustName: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'CustName'
      Index = 1
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TCustAddr: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'Addr'
      Index = 2
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TCustSuburb: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'Suburb'
      Index = 3
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TCustpostCode: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'postCode'
      Index = 4
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TCustcustState: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'custState'
      Index = 5
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
  end
  object TSales: TSqlite3Dataset
    AutoIncrementKey = True
    IndexFieldNames = 'CustID'
    Options = []
    PrimaryKey = 'ID'
    SaveOnClose = True
    SaveOnRefetch = True
    SQL = 'Select * from sales;'
    TableName = 'sales'
    MasterSource = dsCust
    MasterFields = 'ID'
    FieldDefs = <    
      item
        Name = 'itemNum'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'ID'
        DataType = ftAutoInc
        Precision = -1
        Size = 0
      end    
      item
        Name = 'custID'
        DataType = ftInteger
        Precision = -1
        Size = 0
      end    
      item
        Name = 'saleDate'
        DataType = ftDate
        Precision = -1
        Size = 0
      end    
      item
        Name = 'shipDate'
        DataType = ftDate
        Precision = -1
        Size = 0
      end    
      item
        Name = 'item'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'price'
        DataType = ftFloat
        Precision = -1
        Size = 0
      end>
    left = 66
    top = 141
    object TSalesitemNum: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'itemNum'
      Index = 0
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TSalesID: TAutoIncField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'ID'
      Index = 1
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
    end
    object TSalescustID: TLongintField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'custID'
      Index = 2
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
    end
    object TSalessaleDate: TDateField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'saleDate'
      Index = 3
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
    end
    object TSalesshipDate: TDateField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'shipDate'
      Index = 4
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
    end
    object TSalesitem: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'item'
      Index = 5
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TSalesprice: TFloatField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'price'
      Index = 6
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Currency = True
      MaxValue = 0
      MinValue = 0
      Precision = -1
    end
  end
  object TStock: TSqlite3Dataset
    AutoIncrementKey = True
    Options = []
    PrimaryKey = 'ID'
    SaveOnClose = True
    SaveOnRefetch = True
    SQL = 'Select * from stock;'
    TableName = 'stock'
    FieldDefs = <    
      item
        Name = 'ID'
        DataType = ftAutoInc
        Precision = -1
        Size = 0
      end    
      item
        Name = 'item'
        DataType = ftString
        Precision = -1
        Size = 8192
      end    
      item
        Name = 'price'
        DataType = ftFloat
        Precision = -1
        Size = 0
      end    
      item
        Name = 'itemNum'
        DataType = ftString
        Precision = -1
        Size = 8192
      end>
    left = 66
    top = 214
    object TStockID: TAutoIncField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'ID'
      Index = 0
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
    end
    object TStockitem: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'item'
      Index = 1
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
    object TStockprice: TFloatField
      DisplayWidth = 10
      FieldKind = fkData
      FieldName = 'price'
      Index = 2
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Currency = True
      MaxValue = 0
      MinValue = 0
      Precision = -1
    end
    object TStockitemNum: TStringField
      DisplayWidth = 8192
      FieldKind = fkData
      FieldName = 'itemNum'
      Index = 3
      LookupCache = False
      ProviderFlags = [pfInUpdate, pfInWhere]
      ReadOnly = False
      Required = False
      Size = 8192
    end
  end
end
unit uCust;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, Buttons, DBGrids,DB;

type

  { TcustDlg }

  TcustDlg = class(TForm)
    cancelBtn: TButton;
    dgCust: TDBGrid;
    edSearch: TEdit;
    Label1: TLabel;
    okBtn: TButton;
    pnlCust: TPanel;
    sbSearch: TSpeedButton;
    procedure dgCustDblClick(Sender: TObject);
    procedure edSearchChange(Sender: TObject);
    procedure sbSearchClick(Sender: TObject);
  private
    function GetCust: String;
    procedure SetCust(const AValue: String);
    { private declarations }
  public
    { public declarations }
    property CustName: String Read GetCust Write SetCust;
    function ShowModalCust:integer;
  end; 

var
  custDlg: TcustDlg;

implementation
uses uMain;
{ TcustDlg }

procedure TcustDlg.edSearchChange(Sender: TObject);
begin
  sbSearch.Enabled:=edSearch.Text<>'';
end;

procedure TcustDlg.dgCustDblClick(Sender: TObject);
begin
  ModalResult := mrOk;
end;

procedure TcustDlg.sbSearchClick(Sender: TObject);
begin
  if not fMain.TCust.Locate('CustName', edSearch.Text,[loCaseInsensitive, loPartialKey])
   then
      MessageDlg('No matching record found.', mtInformation, [mbOK], 0);
      edSearch.Color:=clRed;
end;

function TcustDlg.GetCust: String;
begin
  Result := fMain.TCustCustName.Value;
end;

procedure TcustDlg.SetCust(const AValue: String);
begin
  fMain.TCust.Locate('CustName',AValue,[loPartialKey,loCaseInsensitive]);
end;

function TcustDlg.ShowModalCust: integer;
begin
  Caption:='Select Customer Name';
  Result := ShowModal;
end;

initialization
  {$I uCust.lrs}

end.
unit uSales;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls, Buttons, DBGrids, DB;

type

  { TsearchDlg }

  TsearchDlg = class(TForm)
    cancelBtn: TButton;
    dgParts: TDBGrid;
    edSearch: TEdit;
    Label1: TLabel;
    okBtn: TButton;
    pnlParts: TPanel;
    sbSearch: TSpeedButton;
    procedure dgPartsDblClick(Sender: TObject);
    procedure edSearchChange(Sender: TObject);
    procedure sbSearchClick(Sender: TObject);
  private
    function GetPartNum: String;
    procedure SetPartNum(const AValue: String);
    { private declarations }
  public
    { public declarations }
    property PartNum:String Read GetPartNum Write SetPartNum;
    function ShowModalParts: Integer;
  end; 

var
  searchDlg: TsearchDlg;

implementation
uses uMain;
{ TsearchDlg }

procedure TsearchDlg.edSearchChange(Sender: TObject);
begin
  sbSearch.Enabled:=edSearch.Text<>'';
end;

procedure TsearchDlg.dgPartsDblClick(Sender: TObject);
begin
  ModalResult := mrOk;
end;

procedure TsearchDlg.sbSearchClick(Sender: TObject);
begin
  if not fMain.TStock.Locate('itemNum', edSearch.Text,[loCaseInsensitive, loPartialKey])
   then
      MessageDlg('No matching record found.', mtInformation, [mbOK], 0);
      edSearch.Color:=clRed;
end;

function TsearchDlg.GetPartNum: String;
begin
  Result := fMain.TStockitemNum.Value;
end;

procedure TsearchDlg.SetPartNum(const AValue: String);
begin
  fMain.TStock.Locate('itemNum',AValue,[loPartialKey,loCaseInsensitive]);
end;

function TsearchDlg.ShowModalParts: Integer;
begin
  Caption:='Select Item Number';
  Result := ShowModal;
end;

initialization
  {$I uSales.lrs}

end.