home *** CD-ROM | disk | FTP | other *** search
- { See the comments in MAIN.PAS for information about this project }
- unit Edorders;
-
- interface
-
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Dialogs, Forms, StdCtrls, DBGrids, DBCtrls, DBTables, DB, Buttons, Mask, Grids,
- DBLookup, ExtCtrls;
-
- type
- TOrderForm = class(TForm)
- Orders: TTable;
- Cust: TTable;
- Items: TTable;
- Parts: TTable;
- OrdersSource: TDataSource;
- CustSource: TDataSource;
- ItemsSource: TDataSource;
- PartsPartNo: TFloatField;
- PartsVendorNo: TFloatField;
- PartsOnHand: TFloatField;
- PartsOnOrder: TFloatField;
- PartsCost: TCurrencyField;
- PartsListPrice: TCurrencyField;
- OrdersTaxTotal: TCurrencyField;
- NextOrd: TTable;
- NextOrdNewKey: TFloatField;
- HeaderPanel: TPanel;
- CustNameEdit: TDBEdit;
- ShipToAdd1Edit: TDBEdit;
- ShipToAdd2Edit: TDBEdit;
- CustAdd1Edit: TDBEdit;
- CustAdd2Edit: TDBEdit;
- ShipToCompanyEdit: TDBEdit;
- CustCityEdit: TDBEdit;
- CustStateEdit: TDBEdit;
- CustZipEdit: TDBEdit;
- ShipToCityEdit: TDBEdit;
- ShipToStateEdit: TDBEdit;
- ShipToZipEdit: TDBEdit;
- ModeIndicator: TLabel;
- POEdit: TDBEdit;
- TermsCombo: TDBComboBox;
- PaymentCombo: TDBComboBox;
- ShipViaCombo: TDBComboBox;
- Speedbar: TPanel;
- DBNavBtns: TDBNavigator;
- SaleDateEdit: TDBEdit;
- OrderNoEdit: TDBEdit;
- InvisiblePanel: TPanel;
- DBEditBtns: TDBNavigator;
- OrdersOrderNo: TFloatField;
- OrdersCustNo: TFloatField;
- OrdersShipToContact: TStringField;
- OrdersShipToAddr1: TStringField;
- OrdersShipToAddr2: TStringField;
- OrdersShipToCity: TStringField;
- OrdersShipToState: TStringField;
- OrdersShipToZip: TStringField;
- OrdersShipToCountry: TStringField;
- OrdersShipToPhone: TStringField;
- OrdersShipVIA: TStringField;
- OrdersPO: TStringField;
- OrdersTerms: TStringField;
- OrdersPaymentMethod: TStringField;
- OrdersItemsTotal: TCurrencyField;
- OrdersTaxRate: TFloatField;
- OrdersFreight: TCurrencyField;
- OrdersAmountPaid: TCurrencyField;
- CustCustNo: TFloatField;
- CustCompany: TStringField;
- CustAddr1: TStringField;
- CustAddr2: TStringField;
- CustCity: TStringField;
- CustState: TStringField;
- CustZip: TStringField;
- CustCountry: TStringField;
- CustPhone: TStringField;
- CustTaxRate: TFloatField;
- CustContact: TStringField;
- ItemsItemNo: TFloatField;
- ItemsOrderNo: TFloatField;
- ItemsPartNo: TFloatField;
- ItemsQty: TIntegerField;
- ItemsSellPrice: TCurrencyField;
- ItemsDiscount: TFloatField;
- PartsDescription: TStringField;
- ActiveSource: TDataSource;
- CustUpdate: TTable;
- CustUpdateCustNo: TFloatField;
- ItemsExtPrice: TCurrencyField;
- OrdersAmountDue: TCurrencyField;
- CustNoEdit: TDBEdit;
- OrdersSaleDate: TDateTimeField;
- OrdersShipDate: TDateTimeField;
- OrdersEmpNo: TIntegerField;
- CustLastInvoiceDate: TDateTimeField;
- CustFAX: TStringField;
- ItemsDescription: TStringField;
- SoldByEdit: TDBLookupCombo;
- Emps: TTable;
- EmpsSource: TDataSource;
- EmpsEmpNo: TIntegerField;
- EmpsLastName: TStringField;
- EmpsFirstName: TStringField;
- EmpsPhoneExt: TStringField;
- EmpsHireDate: TDateTimeField;
- EmpsSalary: TFloatField;
- EmpsFullName: TStringField;
- CustUpdateLastInvoiceDate: TDateTimeField;
- ItemsGrid: TDBGrid;
- AmountPaidEdit: TDBEdit;
- TotalEdit: TDBEdit;
- TaxTotalEdit: TDBEdit;
- FreightEdit: TDBEdit;
- AmountDueEdit: TDBEdit;
- TaxRateEdit: TDBEdit;
- CloseBtn: TButton;
- CancelBtn: TButton;
- PostBtn: TButton;
- BrowsePartsBtn: TSpeedButton;
- SearchCustBtn: TSpeedButton;
- PopupCalBtn: TSpeedButton;
- Image1: TImage;
- PrintBtn: TSpeedButton;
- LastItemQuery: TQuery;
- Label7: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure OrdersCalcFields(DataSet: TDataSet);
- procedure OrdersAfterPost(DataSet: TDataSet);
- procedure ItemsCalcFields(DataSet: TDataSet);
- procedure ItemsBeforeEdit(DataSet: TDataSet);
- procedure ItemsBeforeInsert(DataSet: TDataset);
- procedure ItemsAfterPost(DataSet: TDataSet);
- procedure OrdersNewRecord(DataSet: TDataSet);
- procedure ItemsNewRecord(DataSet: TDataSet);
- procedure ItemsAfterDelete(DataSet: TDataSet);
- procedure ItemsBeforePost(DataSet: TDataSet);
- procedure ItemsAfterInsert(DataSet: TDataset);
- procedure PickPartNo(Sender: TObject);
- procedure OrdersAfterCancel(DataSet: TDataSet);
- procedure OrdersBeforeDelete(DataSet: TDataSet);
- procedure OrdersCustNoChange(Sender: TField);
- procedure ItemsGridEnter(Sender: TObject);
- procedure ActiveSourceStateChange(Sender: TObject);
- procedure ItemsSourceStateChange(Sender: TObject);
- procedure PickCustNo(Sender: TObject);
- procedure ItemsGridExit(Sender: TObject);
- procedure OrdersBeforeCancel(DataSet: TDataset);
- procedure EmpsCalcFields(DataSet: TDataset);
- procedure CancelBtnClick(Sender: TObject);
- procedure OrdersSourceStateChange(Sender: TObject);
- procedure PostBtnClick(Sender: TObject);
- procedure CloseBtnClick(Sender: TObject);
- procedure OrdersBeforeOpen(DataSet: TDataset);
- procedure ItemsBeforeOpen(DataSet: TDataset);
- procedure OrdersSaleDateValidate(Sender: TField);
- procedure CustNoEditKeyPress(Sender: TObject; var Key: Char);
- procedure OrdersCustNoValidate(Sender: TField);
- procedure OrdersFreightValidate(Sender: TField);
- procedure ItemsPartNoValidate(Sender: TField);
- procedure ItemsQtyValidate(Sender: TField);
- procedure ItemsBeforeClose(DataSet: TDataset);
- procedure OrdersBeforeInsert(DataSet: TDataset);
- procedure OrdersBeforeClose(DataSet: TDataset);
- procedure OrdersAfterDelete(DataSet: TDataset);
- procedure BrowsePartsBtnClick(Sender: TObject);
- procedure ItemsGridKeyPress(Sender: TObject; var Key: Char);
- procedure PickDate(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure PrintBtnClick(Sender: TObject);
- procedure SaleDateEditKeyPress(Sender: TObject; var Key: Char);
- procedure ItemsBeforeDelete(DataSet: TDataset);
- private
- { Used to update Parts.OnOrder after an edited Item has been posted }
- PrevPartNo: Double; { remembers Item's previous part# }
- PrevQty: Longint; { remembers Item's previous qty }
- DeletingItems: Boolean; { suppress totals calc. if deleting items }
- AddedItems: Boolean; { flag: only prompt Orders.Cancel if items were added }
- NoCommit: Boolean; { flag: don't commit wwhen posting on order insertion }
- procedure UpdateTotals;
- procedure DeleteItems;
- public
- procedure Enter;
- procedure Edit(OrderNo: Double);
- end;
-
- var
- OrderForm: TOrderForm;
-
- implementation
-
- uses Main, BrModal, CustOrd, Pickdate, edCust;
-
- {$R *.DFM}
-
- const
- DatasetStates: array[TDataSetState] of string[11] =
- ('Not active', 'Browsing', 'Editing', 'Inserting',
- 'Setting key', 'Calculating');
- HelpTopicEdit = 2;
- HelpTopicBrowse = 3;
-
-
- procedure TOrderForm.FormCreate(Sender: TObject);
- begin
- Orders.Open;
- end;
-
- procedure TOrderForm.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- if Orders.State in [dsEdit, dsInsert] then
- begin
- MessageDlg('Cancel edits or post this order before closing',
- mtInformation, [mbOK], 0);
- Action := caNone;
- Exit;
- end;
- Orders.Close;
- if MainForm.Database.IsSQLbased then MainForm.Database.Commit;
- end;
-
-
- {+++++++++++++ PUBLIC methods ++++++++++++++++}
-
- { On SQL databases, always start a transaction before any tables are open and
- ensure that there is always an active transaction by starting one here and
- restarting one after a commit or rollback. }
- procedure TOrderForm.Enter;
- begin
- if MainForm.Database.IsSQLbased then Mainform.Database.StartTransaction;
- Orders.Open;
- Orders.Insert;
- ShowModal;
- end;
-
- { On SQL databases, always start a transaction before any tables are open and
- ensure that there is always an active transaction by starting one here and
- restarting one after a commit or rollback. }
- procedure TOrderForm.Edit(OrderNo: Double);
- begin
- if MainForm.Database.IsSQLbased then Mainform.Database.StartTransaction;
- Orders.Open;
- Orders.FindKey([OrderNo]);
- ShowModal;
- end;
-
- {+++++++++++++ field calculation routines ++++++++++++++++}
-
- { Calculate the order's tax totals and amount due }
- procedure TOrderForm.OrdersCalcFields(DataSet: TDataSet);
- begin
- OrdersTaxTotal.Value := OrdersItemsTotal.Value * (OrdersTaxRate.Value / 100);
- OrdersAmountDue.Value := OrdersItemsTotal.Value + OrdersTaxTotal.Value +
- OrdersFreight.Value - OrdersAmountPaid.Value;
- end;
-
- { Concatenate last name + first name for the order's SoldBy DBLookupCombo }
- procedure TOrderForm.EmpsCalcFields(DataSet: TDataset);
- begin
- EmpsFullName.Value := Format('%s, %s', [EmpsLastName.Value, EmpsFirstName.Value]);
- end;
-
- { Lookup PartNo info for the item; calculate its extended price }
- procedure TOrderForm.ItemsCalcFields(DataSet: TDataSet);
- begin
- if Parts.FindKey([ItemsPartNo]) then
- begin
- ItemsDescription.Value := PartsDescription.Value;
- ItemsSellPrice.Value := PartsListPrice.Value;
- end;
- ItemsExtPrice.Value := ItemsQty.Value *
- ItemsSellPrice.Value * (100 - ItemsDiscount.Value) / 100;
- end;
-
- { Steps through Items and gathers sum of ExtPrice. After OrdersItemsTotal
- is calculated, OrdersCalcFields is automatically called (which
- updates other calculated fields. }
- procedure TOrderForm.UpdateTotals;
- var
- TempTotal: Extended;
- PrevRecord: TBookmark;
- begin
- if DeletingItems then Exit; { don't calculate if deleting all items }
- PrevRecord := Items.GetBookmark; { returns nil if table is empty }
- try
- Items.DisableControls;
- Items.First;
- TempTotal := 0; { use temp for efficiency }
- while not Items.EOF do
- begin
- TempTotal := TempTotal + ItemsExtPrice.Value;
- Items.Next;
- end;
- OrdersItemsTotal.Value := TempTotal;
- finally
- Items.EnableControls;
- if PrevRecord <> nil then
- begin
- Items.GoToBookmark(PrevRecord);
- Items.FreeBookmark(PrevRecord);
- end;
- end;
- end;
-
- {+++++++++++++ orders routines ++++++++++++++++}
-
- { Inititializes the record values as a result of an Orders.Insert.
- Gets a unique OrderNo. On SQL databases, a transaction is active. Commit
- the post of the NextOrd table and then start another transaction. }
- procedure TOrderForm.OrdersNewRecord(DataSet: TDataSet);
- begin
- { get next OrderNo }
- NextOrd.Open; { open = exclusive }
- NextOrd.Edit;
- try
- OrdersOrderNo.Value := NextOrdNewKey.Value;
- NextOrdNewKey.Value := NextOrdNewKey.Value + 1;
- NextOrd.Post; { release lock }
- if MainForm.Database.IsSQLbased then
- begin
- MainForm.Database.Commit;
- MainForm.Database.StartTransaction;
- end;
- finally
- NextOrd.Cancel;
- NextOrd.Close;
- end;
- OrdersSaleDate.Value := Date;
- OrdersShipVia.Value := 'UPS';
- OrdersTerms.Value := 'net 30';
- OrdersPaymentMethod.Value := 'Check';
- OrdersItemsTotal.Value := 0;
- OrdersTaxRate.Value := 0;
- OrdersFreight.Value := 0;
- OrdersAmountPaid.Value := 0;
- AddedItems := False; { clear flag }
- end;
-
- { Post new LastInvoiceDate to CUST table. On SQL databases, commit the
- transaction and start another one. }
- procedure TOrderForm.OrdersAfterPost(DataSet: TDataSet);
- begin
- if (CustUpdate.FindKey([OrdersCustNo])) and
- (CustUpdateLastInvoiceDate.Value < OrdersShipDate.Value) then
- begin
- CustUpdate.Edit;
- CustUpdateLastInvoiceDate.Value := OrdersShipDate.Value;
- CustUpdate.Post;
- end;
- if MainForm.Database.IsSQLbased and (not NoCommit) then
- begin
- MainForm.Database.Commit;
- MainForm.Database.StartTransaction;
- end;
- end;
-
- { On SQL databases, whether inserting or editing, use transaction
- processing to cancel all changes. On desktop databases, delete all the
- items (for new orders only). Note when an existing order on desktop
- databases, all changes to the items table (insert, delete, edit)
- are permanent. }
- procedure TOrderForm.OrdersAfterCancel(DataSet: TDataSet);
- begin
- if MainForm.Database.IsSQLbased then
- begin
- MainForm.Database.Rollback;
- Orders.Refresh;
- Items.Refresh;
- MainForm.Database.StartTransaction;
- end
- else if Orders.State = dsInsert then DeleteItems; { new orders only }
- end;
-
- procedure TOrderForm.OrdersBeforeDelete(DataSet: TDataSet);
- begin
- if MessageDlg('Delete order and line items?',
- mtConfirmation, [mbYes,MbNo], 0) <> mrYes then Abort;
- DeleteItems;
- end;
-
- { New customer: clear SHIP TO fields, get TaxRate }
- procedure TOrderForm.OrdersCustNoChange(Sender: TField);
- begin
- OrdersShipToContact.Value := '';
- OrdersShipToPhone.Value := '';
- OrdersShipToAddr1.Value := '';
- OrdersShipToAddr2.Value := '';
- OrdersShipToCity.Value := '';
- OrdersShipToState.Value := '';
- OrdersShipToZip.Value := '';
- OrdersShipToCountry.Value := '';
- OrdersTaxRate.Value := CustTaxRate.Value;
- end;
-
- procedure TOrderForm.OrdersBeforeInsert(DataSet: TDataset);
- begin
- if Orders.State in [dsInsert, dsEdit] then
- begin
- if MessageDlg('An order is being processed. Post changes before inserting new order?',
- mtInformation, mbOKCancel, 0) = mrOK then Orders.Post
- else Abort;
- end;
- end;
-
- procedure TOrderForm.OrdersBeforeClose(DataSet: TDataset);
- begin
- Items.Close;
- Emps.Close;
- CustUpdate.Close;
- Cust.Close;
- end;
-
- { On SQL databases, commit the delete and start another transaction. }
- procedure TOrderForm.OrdersAfterDelete(DataSet: TDataset);
- begin
- if MainForm.Database.IsSQLbased then
- begin
- MainForm.Database.Commit;
- MainForm.Database.StartTransaction;
- end;
- end;
-
- procedure TOrderForm.OrdersBeforeCancel(DataSet: TDataset);
- begin
- if (Orders.State = dsInsert) and not (Items.BOF and Items.EOF) then
- if MessageDlg('Cancel order being inserted and delete all line items?',
- mtConfirmation, mbOKCancel, 0) <> mrOk then Abort;
- end;
-
- {+++++++++++++ items routines ++++++++++++++++}
-
- procedure TOrderForm.ItemsAfterDelete(DataSet: TDataSet);
- begin
- UpdateTotals;
- end;
-
- { New item. Zero the "prev" buckets, initialize the key }
- procedure TOrderForm.ItemsNewRecord(DataSet: TDataSet);
- begin
- PrevPartNo := 0;
- PrevQty := 0;
- ItemsOrderNo.Value := OrdersOrderNo.Value;
- ItemsQty.Value := 1;
- ItemsDiscount.Value := 0;
- end;
-
- { When a change to the detail table affects a field in the master, always make
- sure the master table is in edit or insert mode before allowing the
- detail table to be modified. }
- procedure TOrderForm.ItemsBeforeDelete(DataSet: TDataset);
- begin
- Orders.Edit;
- end;
-
- { Remember previous PartNo and Qty for updating Parts.OnOrder after post.
- When a change to the detail table affects a field in the master, always make
- sure the master table is in edit or insert mode before allowing the
- detail table to be modified. }
- procedure TOrderForm.ItemsBeforeEdit(DataSet: TDataSet);
- begin
- Orders.Edit;
- PrevPartNo := ItemsPartNo.Value;
- PrevQty := ItemsQty.Value;
- end;
-
- { For data integrity purposes:
-
- o On SQL databases: the order must exist before an item may be posted;
- if the user selects CANCEL, rollback will be used to back out all changes.
- o On the desktop, force a valid customer number before allowing a new item;
- if the user selects CANCEL, all items will be deleted.
-
- When a change to the detail table affects a field in the master, always make
- sure the master table is in edit or insert mode before allowing the
- detail table to be modified.
- }
- procedure TOrderForm.ItemsBeforeInsert(DataSet: TDataset);
- begin
- if Orders.State = dsInsert then
- begin
- { Don't commit until the whole order is ready, but for SQL and non-SQL,
- referential integrity requires the master posted before a detail. }
- NoCommit := True;
- Orders.Post;
- Orders.Edit;
- NoCommit := False;
- end else Orders.Edit;
- end;
-
- { Update the order totals and the Parts table }
- procedure TOrderForm.ItemsAfterPost(DataSet: TDataSet);
-
- { Reduce/increase Parts table's OnOrder field }
- procedure UpdateParts(PartNo: Double; Qty : Longint);
- var DisplayVerb: string[10];
- begin
- if Qty < 0 then DisplayVerb := 'reducing'
- else DisplayVerb := 'increasing';
- try
- if not Parts.FindKey([ItemsPartNo]) then
- raise Exception.CreateFmt('Cannot find PartNo %G', [ItemsPartNo.Value]);
- Parts.Edit;
- PartsOnOrder.Value := PartsOnOrder.Value + ItemsQty.Value;
- Parts.Post;
- except
- on E: Exception do
- ShowMessage(
- Format('The following error occurred while %S PartNo %G''s OnOrder field by %D units: %S',
- [DisplayVerb, PartNo, Qty, E.Message]));
- end;
- end;
-
- begin
- UpdateTotals;
- { Reduce previous Part#'s OnOrder field by previous Qty }
- UpdateParts(PrevPartNo, PrevQty);
- { Increase Part#'s OnOrder by new Qty }
- UpdateParts(ItemsPartNo.Value, ItemsQty.Value);
- end;
-
- { Complete the item's key by initializing its NextItemNo field }
- procedure TOrderForm.ItemsBeforePost(DataSet: TDataSet);
- begin
- if Items.State = dsInsert then { fetch new ItemNo for the key }
- begin
- LastItemQuery.Close;
- LastItemQuery.Open;
- { SQL servers return Null for some aggregates if no items are present }
- with LastItemQuery.Fields[0] do
- if IsNull then ItemsItemNo.Value := 1
- else ItemsItemNo.Value := AsFloat + 1;
- end;
- end;
-
- procedure TOrderForm.DeleteItems;
- begin
- DeletingItems := True; { suppress recalc of totals during delete }
- Items.DisableControls; { for faster table traversal }
- try
- Items.First;
- while not Items.EOF do Items.Delete;
- finally
- DeletingItems := False;
- Items.EnableControls; { always re-enable controls after disabling }
- end;
- end;
-
- { This two methods enable the navigators to service both the Orders
- and Items tables by switching the ActiveSource between them. }
- procedure TOrderForm.ItemsGridEnter(Sender: TObject);
- begin
- ActiveSource.Dataset := Items;
- BrowsePartsBtn.Enabled := True;
- end;
-
- procedure TOrderForm.ItemsGridExit(Sender: TObject);
- begin
- ActiveSource.Dataset := Orders;
- BrowsePartsBtn.Enabled := False;
- end;
-
- {+++++++++++++ state change routines ++++++++++++++++}
-
- procedure TOrderForm.ActiveSourceStateChange(Sender: TObject);
- begin
- with ActiveSource do
- begin
- if Dataset <> nil then ModeIndicator.Caption :=
- Format('[%S: %S]', [Dataset.Name, DatasetStates[State]]);
- if State in [dsEdit, dsInsert] then
- begin
- HelpContext := HelpTopicEdit;
- ModeIndicator.Font.Color := clRed;
- end
- else
- begin
- HelpContext := HelpTopicBrowse;
- ModeIndicator.Font.Color := clBlue;
- end;
- end;
- end;
-
- { Tab exits grid when browsing, goes to next column when editing/inserting }
- procedure TOrderForm.ItemsSourceStateChange(Sender: TObject);
- begin
- if Items.State = dsBrowse then ItemsGrid.Options := ItemsGrid.Options - [dgTabs]
- else ItemsGrid.Options := ItemsGrid.Options + [dgTabs];
- end;
-
- { Manage the enabling and disabling of the order form's buttons }
- procedure TOrderForm.OrdersSourceStateChange(Sender: TObject);
- begin
- PostBtn.Enabled := Orders.State in [dsEdit, dsInsert];
- CancelBtn.Enabled := PostBtn.Enabled;
- CloseBtn.Enabled := Orders.State = dsBrowse;
- end;
-
- {+++++++++++++ table open/close routines ++++++++++++++++}
-
- { These open and close routines "cascade" (opening Orders opens Items first,
- which first opens Parts, etc.) }
- procedure TOrderForm.OrdersBeforeOpen(DataSet: TDataset);
- begin
- Cust.Open;
- CustUpdate.Open;
- Emps.Open;
- Items.Open;
- end;
-
- procedure TOrderForm.ItemsBeforeOpen(DataSet: TDataset);
- begin
- Parts.Open;
- end;
-
- procedure TOrderForm.ItemsBeforeClose(DataSet: TDataset);
- begin
- Parts.Close;
- end;
-
- { Set flag used for deletion }
- procedure TOrderForm.ItemsAfterInsert(DataSet: TDataset);
- begin
- AddedItems := True;
- end;
-
- {+++++++++++++ validation routines ++++++++++++++++}
-
- { Alternatively, could set the Qty field's Min and Max values in code
- or in the Object Inspector. }
- procedure TOrderForm.ItemsQtyValidate(Sender: TField);
- begin
- if ItemsQty.Value < 1 then raise Exception.Create('Must specify quantity');
- end;
-
- procedure TOrderForm.OrdersCustNoValidate(Sender: TField);
- begin
- if not CustUpdate.FindKey([OrdersCustNo]) then
- begin
- CustNoEdit.SetFocus;
- raise Exception.Create('You must specify a valid CustNo.'#10 +
- 'Click the search button to pick from a list');
- end;
- end;
-
- { Alternatively, could set the Freight field's Min and Max values in code
- or in the Object Inspector. }
- procedure TOrderForm.OrdersFreightValidate(Sender: TField);
- begin
- if OrdersFreight.Value < 0 then
- raise Exception.Create('Freight cannot be less than zero');
- end;
-
- procedure TOrderForm.ItemsPartNoValidate(Sender: TField);
- begin
- if not Parts.FindKey([ItemsPartNo]) then
- raise Exception.Create('You must specify a valid PartNo');
- end;
-
- procedure TOrderForm.OrdersSaleDateValidate(Sender: TField);
- begin
- if OrdersSaleDate.Value > Now then
- raise Exception.Create('Cannot enter a future date');
- end;
-
- {+++++++++++++ Click events ++++++++++++++++}
-
- { Browse a calendar to pick an invoice date }
- procedure TOrderForm.PickDate(Sender: TObject);
- begin
- BrDateForm.Date := OrdersSaleDate.Value; { start with current date }
- if BrDateForm.ShowModal = mrOk then
- begin
- Orders.Edit;
- OrdersSaleDate.Value := BrDateForm.Date;
- SaleDateEdit.SelectAll;
- end;
- end;
-
- { Browse Cust table, fetch CustNo }
- procedure TOrderForm.PickCustNo(Sender: TObject);
- begin
- if OrdersCustNo.Value <> 0 then
- PickDlg.CustNo := OrdersCustNo.Value; { start with current CustNo }
- if PickDlg.ShowModalCust = mrOk then
- begin
- Orders.Edit;
- OrdersCustNo.Value := PickDlg.CustNo;
- CustNoEdit.SelectAll;
- end;
- end;
-
- { Browse Parts table, fetch PartNo }
- procedure TOrderForm.PickPartNo(Sender: TObject);
- begin
- if ItemsGrid.SelectedField = ItemsPartNo then { PartNo column only }
- begin
- if ItemsPartNo.Value <> 0 then
- PickDlg.PartNo := ItemsPartNo.Value; { start with current PartNo }
- if PickDlg.ShowModalParts = mrOk then
- begin
- Items.Edit;
- ItemsPartNo.Value := PickDlg.PartNo;
- end;
- end;
- end;
-
- { Ctrl+Enter in the SaleDate edit control brings up PickDate dialog }
- procedure TOrderForm.SaleDateEditKeyPress(Sender: TObject; var Key: Char);
- begin
- if Key = ^J then
- begin
- PickDate(Sender);
- Key := #0;
- end;
- end;
-
- { Ctrl+Enter in the CustNo edit control brings up PickCustNo dialog }
- procedure TOrderForm.CustNoEditKeyPress(Sender: TObject; var Key: Char);
- begin
- if Key = ^J then
- begin
- PickCustNo(Sender);
- Key := #0;
- end;
- end;
-
- { Ctrl+Enter in the PartNo column of the items grid brings up PickPartNo dialog }
- procedure TOrderForm.ItemsGridKeyPress(Sender: TObject; var Key: Char);
- begin
- if (ItemsGrid.SelectedField = ItemsPartNo) and (Key = ^J) then
- begin
- PickPartNo(Sender);
- Key := #0;
- end;
- end;
-
- { Clicking on the PARTS button brings up PickPartNo dialog }
- procedure TOrderForm.BrowsePartsBtnClick(Sender: TObject);
- begin
- ItemsGrid.SelectedField := ItemsPartNo;
- PickPartNo(nil);
- end;
-
- { Begins a series of cascading Before and After post events }
- procedure TOrderForm.PostBtnClick(Sender: TObject);
- begin
- Orders.Post;
- end;
-
- { Closes the form window. Only enabled if the order is in browse mode }
- procedure TOrderForm.CloseBtnClick(Sender: TObject);
- begin
- Close;
- end;
-
- { Cancels insert or edit on the Orders table }
- procedure TOrderForm.CancelBtnClick(Sender: TObject);
- begin
- Orders.Cancel;
- end;
-
- { Prints snapshot of the form. An invoice report is available via the Main window }
- procedure TOrderForm.PrintBtnClick(Sender: TObject);
- begin
- if MessageDlg('Print image of this form window?', mtConfirmation,
- [mbYes, mbNo], 0) = mrYes then Print;
- end;
-
-
- end.
-