TSqlite3 Master Detail Example

From Lazarus wiki
Jump to navigationJump to search

English (en) français (fr)
TSqlite3 Master Detail Example

About Demo

This demo is a working example of how to use the SQLite TSqlite3 dataset component in a master detail relationship.

--- sorry, it is NOT working, try to compile it with the latest version! ---

Light bulb  Note: this component is not part of the general SQLDB database components. SQLDB provides TSQLite3Connection that match other databases connectors. You are strongly recommended to look into using TSQLite3Connection because of the ease of switching to other databases; only use TSQlite3 if it is really needed.

See MasterDetail for instructions on how to implement master/detail relationships using standard sqldb (e.g. sqlite3) components.

Author

David Stewart .. davesimplewear at yahoo dot com


Components Used

  • TSqlite3
  • Standard Lazarus database components

Licence

  • Free to use as you will


Download

The TSQLite3 example can be downloaded from The Lazarus -ccr sf download location. Also from David's Freeware.

        1. these examples are written with LCL 0.9.27 and do NOT compile with modern Lazarus Versions i.e. 3.4 ####

Screen shots

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

This screenshot shows the table setting for master detail

Screenshot.png

Example program code

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 (edited) 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.