lazarus-ccr/examples/germesorders/uordergoods.pas
MageSlayer 05a5e2c6a2 First public commit
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@639 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2008-12-21 21:46:28 +00:00

589 lines
18 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit uOrderGoods;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Buttons, rxdbgrid, sqlite3ds, db, ComCtrls, StdCtrls, uDbTypes, memds2, ufrmParent,
contnrs;
type
TGoodShowType = (gstBusket=1, gstOrder=2);
{ TfrmOrderGoods }
TfrmOrderGoods = class(TfrmParent)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
dsrcOrderGoods: TDatasource;
dsBusket: TMemDataset;
ledtOrderSum: TLabeledEdit;
memGoodHint: TMemo;
PageControl1: TPageControl;
Panel1: TPanel;
grdBusket: TRxDBGrid;
Panel2: TPanel;
pnlKeyboard: TPanel;
TabSheet1: TTabSheet;
tbOrderSum: TTabSheet;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure dsBusketAfterEdit(DataSet: TDataSet);
procedure dsBusketAfterScroll(DataSet: TDataSet);
procedure dsBusketBeforeEdit(DataSet: TDataSet);
procedure dsBusketBeforePost(DataSet: TDataSet);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormResize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure tbOrderSumShow(Sender: TObject);
private
CopyingRecords:boolean;
FGoodShowType: TGoodShowType;
FId_Order: TDbKeyType;
DealerDefault:string;
FId_Org: TDbKeyType;
KeyboardControls:TComponentList;
{ private declarations }
procedure DealerPickListFill;
procedure SaveOrder;
procedure Reload;
procedure BusketFieldsDefine;
procedure KeyboardCreate;
procedure OnKeyboardClick(Sender:TObject);
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
{ public declarations }
property Id_Order:TDbKeyType read FId_Order write FId_Order;
property Id_Org:TDbKeyType read FId_Org write FId_Org;
property GoodShowType:TGoodShowType read FGoodShowType write FGoodShowType;
end;
var
frmOrderGoods: TfrmOrderGoods;
implementation
uses uConfig, uDebug, uUtils, uBase, variants, uOptionConst, LCLType;
{ TfrmOrderGoods }
procedure TfrmOrderGoods.BitBtn2Click(Sender: TObject);
begin
GlobalLogger.Log('Закрытие формы TfrmOrderGoods');
Close;
end;
procedure TfrmOrderGoods.dsBusketAfterEdit(DataSet: TDataSet);
begin
dsBusketAfterScroll(DataSet);
end;
procedure TfrmOrderGoods.dsBusketAfterScroll(DataSet: TDataSet);
begin
if CopyingRecords then Exit;
memGoodHint.Lines.Text:=Dataset.FieldByName('Good_Name').AsString;
memGoodHint.Invalidate;
end;
procedure TfrmOrderGoods.dsBusketBeforeEdit(DataSet: TDataSet);
var D:String;
begin
if Dataset.FieldByName('Dealer').IsNull then
begin
D:=DealerDefault;
{
//последний дилер
if D = '' then
D:=BaseConnect.OptionUser[goOptDealerCurrent];}
if D = '' then
D:='0'; //розница
Dataset.FieldByName('Dealer').AsString:=D;
end;
dsBusketAfterScroll(DataSet);
end;
procedure TfrmOrderGoods.dsBusketBeforePost(DataSet: TDataSet);
var S:String;
P:Variant;
PS:Variant;
begin
if CopyingRecords then Exit;
S:='';
if dsBusket.FieldByName('Selected').AsInteger = 1 then
begin
if dsBusket.FieldByName('Quantity').IsNull or
(dsBusket.FieldByName('Quantity').AsFloat <= 0.000001) then
begin
S:='Поле Количество не заполнено';
end;
if dsBusket.FieldByName('Dealer').IsNull then
S:='Поле Дилер должно быть заполнено'
else
begin
P:=BaseConnect.DLookup(Format('select Price from Price where Good=%d and Dealer=%d',
[dsBusket.FieldByName('ID_Good').AsInteger,
dsBusket.FieldByName('Dealer').AsInteger]), 'Price');
dsBusket.FieldByName('Price').AsVariant:=P;
if VarIsNull(P) then
begin
S:='Для Дилера не задана цена.' + #13#10 +
Format('Товар=%d, дилер=%d',
[dsBusket.FieldByName('ID_Good').AsInteger,
dsBusket.FieldByName('Dealer').AsInteger]);
PS:=null;
end
else
PS:=P*dsBusket.FieldByName('Quantity').AsFloat;
dsBusket.FieldByName('PriceSum').AsVariant:=PS;
//запоминание номера дилера
BaseConnect.OptionUser[goOptDealerCurrent]:=dsBusket.FieldByName('Dealer').AsString;
end;
end;
dsBusket.FieldByName('RemainsCurrent').AsFloat:=
dsBusket.FieldByName('Remains').AsFloat - dsBusket.FieldByName('Quantity').AsFloat;
if S <> '' then
begin
ShowMessage(S);
//снимаем выделение
dsBusket.FieldByName('Selected').AsInteger:=0;
end;
end;
procedure TfrmOrderGoods.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
CloseAction:=caHide;
end;
procedure TfrmOrderGoods.FormResize(Sender: TObject);
begin
KeyboardCreate;
end;
procedure TfrmOrderGoods.FormShow(Sender: TObject);
begin
GlobalLogger.Log('Открытие формы TfrmOrderGoods');
Reload;
end;
procedure TfrmOrderGoods.tbOrderSumShow(Sender: TObject);
var OrderSum:Double;
begin
if not dsBusket.Active then Exit;
{
//по неизвестной причине в ARM считает не правильно
SaveOrder;
ledtOrderSum.Text:=VarToStr(BaseConnect.DLookup(
'SELECT SUM(Price*Quantity) as S FROM Order_List Where ID_Order=%d', [ID_Order], 'S'));
//'SELECT SUM((Price + 0.0)*(Quantity + 0.0) + 0.0) as S FROM Order_List Where ID_Order=%d', [ID_Order], 'S'));
}
GlobalLogger.Log('Подсчет суммы заказа');
CopyingRecords:=true;
try
dsBusket.DisableControls;
dsBusket.First;
OrderSum:=0;
while not dsBusket.EOF do
begin
if dsBusket.FieldByName('Selected').AsInteger <> 0 then
begin
OrderSum:=OrderSum + dsBusket.FieldByName('Price').AsFloat * dsBusket.FieldByName('Quantity').AsFloat;
end;
dsBusket.Next;
end;
dsBusket.First;
ledtOrderSum.Text:=FormatFloat('#,###.##', OrderSum);
GlobalLogger.Log('Подсчет суммы заказа успешно завершено');
finally
CopyingRecords:=false;
dsBusket.EnableControls;
end;
end;
procedure TfrmOrderGoods.BitBtn1Click(Sender: TObject);
begin
SaveOrder;
Close;
end;
{
procedure TfrmOrderGoods.SaveOrder;
var PostDS:TSqlite3Dataset;
begin
GlobalLogger.Log('Сохранение заказа с id=%d. Старт', [ID_Order]);
GlobalLogger.Log('Очистка существующего содержимого заказа');
//сначала удалим все из существующего заказа
BaseConnect.SQLExec('DELETE FROM Order_List WHERE ID_Order=' + IntToStr(ID_Order));
GlobalLogger.Log('Добавление товаров в заказ');
PostDS:=nil;
CopyingRecords:=true;
try
PostDS:=BaseConnect.DatasetCreate('Order_List', 'ID');
//dsrcOrderGoods.Enabled:=False;
dsBusket.DisableControls;
dsBusket.First;
while not dsBusket.EOF do
begin
if dsBusket.FieldByName('Selected').AsInteger <> 0 then
begin
PostDS.Append;
PostDS.FieldByName('ID_Order').AsInteger:=Id_Order;
PostDS.FieldByName('Good').AsInteger :=dsBusket.FieldByName('ID_Good').AsInteger;
PostDS.FieldByName('Price').AsFloat :=dsBusket.FieldByName('Price').AsFloat;
PostDS.FieldByName('Quantity').AsFloat:=dsBusket.FieldByName('Quantity').AsFloat;
PostDS.FieldByName('Dealer').AsInteger:=dsBusket.FieldByName('Dealer').AsInteger;
PostDS.Post;
end;
dsBusket.Next;
end;
GlobalLogger.Log('Применение заказа');
PostDS.ApplyUpdates;
finally
//dsrcOrderGoods.Enabled:=true;
CopyingRecords:=false;
dsBusket.EnableControls;
PostDS.Free;
GlobalLogger.Log('Сохранение заказа с id=%d. Финиш', [ID_Order]);
end;
end;
}
procedure TfrmOrderGoods.SaveOrder;
var Fmt: TFormatSettings;
S:String;
begin
GlobalLogger.Log('Сохранение заказа с id=%d. Старт', [ID_Order]);
GlobalLogger.Log('Очистка существующего содержимого заказа');
//сначала удалим все из существующего заказа
BaseConnect.SQLExec('DELETE FROM Order_List WHERE ID_Order=' + IntToStr(ID_Order));
GlobalLogger.Log('Добавление товаров в заказ');
CopyingRecords:=true;
Fmt:=DefaultFormatSettings;
Fmt.DecimalSeparator:='.';
try
dsBusket.DisableControls;
dsBusket.First;
while not dsBusket.EOF do
begin
if dsBusket.FieldByName('Selected').AsInteger <> 0 then
begin
S:=Format('INSERT INTO Order_List(ID, ID_Order, Good, Price, Quantity, Dealer) ' +
'VALUES(NULL, %d, %d, %s, %s, %d)',
[Id_Order, dsBusket.FieldByName('ID_Good').AsInteger,
FloatToStr(dsBusket.FieldByName('Price').AsFloat, Fmt),
FloatToStr(dsBusket.FieldByName('Quantity').AsFloat, Fmt),
dsBusket.FieldByName('Dealer').AsInteger
]);
BaseConnect.SQLExec(S);
end;
dsBusket.Next;
end;
GlobalLogger.Log('Применение заказа');
finally
//dsrcOrderGoods.Enabled:=true;
CopyingRecords:=false;
dsBusket.EnableControls;
GlobalLogger.Log('Сохранение заказа с id=%d. Финиш', [ID_Order]);
end;
end;
procedure TfrmOrderGoods.Reload;
var dsOrder_Busket:TSqlite3Dataset;
S:string;
SubGroupId, GroupId:String;
Filter, ShowTypeFilter:string;
Q, P:Variant;
begin
GlobalLogger.Log('Заполнение корзины товаров');
DealerPickListFill;
SubGroupId:=BaseConnect.OptionUser[goOptSubGroupCurrent];
if SubGroupId = '' then
begin
ShowMessage('Не выбрана текущая подгруппа товаров');
dsBusket.Close;
end;
GroupId:=BaseConnect.OptionUser[goOptGroupCurrent];
if GroupId = '' then
begin
ShowMessage('Не выбрана текущая группа товаров');
dsBusket.Close;
end;
{
if SubGroupId = '0' then
Filter:='left join Good_Groups h on (o.ID_Good = h.Good and h.ID_Group=' + GroupId + ') '
else
Filter:='left join HierGoods h on (o.ID_Good = h.Good and h.ParentId=' + SubGroupId + ') ';
}
if SubGroupId = '0' then
Filter:='left join Good_Groups h on (g.ID = h.Good and h.ID_Group=' + GroupId + ') '
else
Filter:='left join HierGoods h on (g.ID = h.Good and h.ParentId=' + SubGroupId + ') ';
DealerDefault:=VarToStr(BaseConnect.DLookup('SELECT DealerDefault FROM Orgs WHERE Id = %d', [Id_Org], 'DealerDefault'));
ShowTypeFilter:='';
{
case GoodShowType of
gstBusket:
ShowTypeFilter:=Iif(Id_Order <> -1, Format(' WHERE (ID_Order=-1 or ID_Order=%d) and ((o.Selected=1) or not (h.Good is null)) ', [Id_Order]), '');
gstOrder:
ShowTypeFilter:=Format(' WHERE (ID_Order=%d) and (o.Selected=1) ', [Id_Order]);
else
begin
ShowMessage('Неизвестный тип показа заказа');
end;
end;
}
case GoodShowType of
gstBusket:
//ShowTypeFilter:=Iif(Id_Order <> -1, Format(' WHERE (ol.ID_Order is null or ol.ID_Order=%d) and ((ol.ID is not null) or (h.Good is not null)) ', [Id_Order]), '');
//ShowTypeFilter:=Iif(Id_Order <> -1, Format(' WHERE (ol.ID_Order is null and (h.Good is not null)) or (ol.ID_Order=%d and (ol.ID is not null)) ', [Id_Order]), '');
ShowTypeFilter:=Iif(Id_Order <> -1, Format(' WHERE (ol.ID_Order is null and (h.Good is not null)) or (ol.ID is not null) ', [Id_Order]), '');
gstOrder:
ShowTypeFilter:=Format(' WHERE (ol.ID_Order=%d) and (ol.ID is not null) ', [Id_Order]);
else
begin
ShowMessage('Неизвестный тип показа заказа');
end;
end;
dsOrder_Busket:=nil;
try
{S:=
'SELECT ID_Order, Selected, ID_Order_List, o.ID_Good as ID_Good, ' +
'Good_Name, Price, Quantity, Remains, ' +
'Dealer '+
'FROM Order_Busket o ' +
Filter +
ShowTypeFilter +
' ORDER BY Good_Name';
}
S:=Format(
'SELECT coalesce(ol.ID_Order, -1) as ID_Order, ' +
'coalesce(ol.ID+1, 0)/coalesce(ol.ID+1, 1) as Selected, ' +
'coalesce(ol.ID, -1) as ID_Order_List, '+
'g.ID as ID_Good, ' +
'g.Name as Good_Name, ' +
'ol.Price as Price, ' +
'ol.Quantity as Quantity, ' +
'coalesce(g.Remains, 0) as Remains, ' +
'ol.Dealer as Dealer '+
'FROM Goods g left join Order_List ol on (g.ID=ol.Good and ol.ID_Order=%d) ' +
Filter +
ShowTypeFilter +
' ORDER BY Good_Name', [Id_Order]);
GlobalLogger.Log('Открытие датасета dsOrder_Busket (%s)', [S]);
dsOrder_Busket:=BaseConnect.DatasetCreate(S);
dsBusket.DisableControls;
try
GlobalLogger.Log('Заполнение временного датасета. Старт');
CopyingRecords:=true;
//dsBusket.CopyFromDataset(dsOrder_Busket, true);
dsBusket.Clear(False);
dsBusket.Open;
GlobalLogger.LogDatasetFieldNames('dsOrder_Busket', dsOrder_Busket);
while not dsOrder_Busket.EOF do
begin
dsBusket.Append;
DbFieldAssignAsDbKey(dsBusket, 'ID_Order', dsOrder_Busket.FieldByName('ID_Order'));
dsBusket.FieldByName('Selected').AsVariant:=dsOrder_Busket.FieldByName('Selected').AsVariant;
dsBusket.FieldByName('ID_Order_List').AsVariant:=dsOrder_Busket.FieldByName('ID_Order_List').AsVariant;
dsBusket.FieldByName('ID_Good').AsVariant:=dsOrder_Busket.FieldByName('ID_Good').AsVariant;
dsBusket.FieldByName('Good_Name').AsVariant:=dsOrder_Busket.FieldByName('Good_Name').AsVariant;
dsBusket.FieldByName('Dealer').AsVariant:=dsOrder_Busket.FieldByName('Dealer').AsVariant;
P:=dsOrder_Busket.FieldByName('Price').AsVariant;
dsBusket.FieldByName('Price').AsVariant:=P;
if VarIsNull(P) then P:=0;
Q:=dsOrder_Busket.FieldByName('Quantity').AsVariant;
dsBusket.FieldByName('Quantity').AsVariant:=Q;
if VarIsNull(Q) then Q:=0;
dsBusket.FieldByName('PriceSum').AsFloat:=Q*P;
dsBusket.FieldByName('Remains').AsFloat:=dsOrder_Busket.FieldByName('Remains').AsFloat + Q;
dsBusket.FieldByName('RemainsCurrent').AsVariant:=dsOrder_Busket.FieldByName('Remains').AsVariant;
dsBusket.Post;
dsOrder_Busket.Next;
end;
dsBusket.First;
GlobalLogger.Log('Заполнение временного датасета. Финиш');
finally
dsBusket.EnableControls;
CopyingRecords:=False;
end;
finally
dsOrder_Busket.Free;
end;
end;
procedure TfrmOrderGoods.BusketFieldsDefine;
begin
dsBusket.FieldDefs.Add('ID_Order', ftDbKey);
dsBusket.FieldDefs.Add('Selected', ftInteger);
dsBusket.FieldDefs.Add('ID_Order_List', ftDbKey);
dsBusket.FieldDefs.Add('ID_Good', ftDbKey);
dsBusket.FieldDefs.Add('Good_Name', ftString, 250);
dsBusket.FieldDefs.Add('Price', ftFloat);
dsBusket.FieldDefs.Add('PriceSum', ftFloat);
dsBusket.FieldDefs.Add('Quantity', ftFloat);
dsBusket.FieldDefs.Add('Dealer', ftInteger);
dsBusket.FieldDefs.Add('Remains', ftFloat);
dsBusket.FieldDefs.Add('RemainsCurrent', ftFloat);
dsBusket.CreateTable;
end;
const
BackSpaceTag = 100;
procedure TfrmOrderGoods.OnKeyboardClick(Sender: TObject);
var S,Q:String;
begin
if ActiveControl = nil then Exit;
Q:=dsBusket.FieldByName('Quantity').AsString;
if TComponent(Sender).Tag = BackSpaceTag then
begin
S:='';
if Length(Q) > 0 then S:=Copy(Q, 1, Length(Q)-1);
end
else
begin
S:=Q + IntToStr(TComponent(Sender).Tag);
end;
dsBusket.FieldByName('Quantity').AsString:=S;
dsBusketBeforePost(dsBusket);
end;
procedure TfrmOrderGoods.KeyboardCreate;
var n:integer;
ButWidth:Integer;
ButWidthF:double;
function ButtonCreate(Caption:string; LeftPos, TagN:Integer):TButton;
var B:TButton;
begin
B:=TButton.Create(self);
B.Parent:=pnlKeyboard;
B.BorderWidth:=0;
B.Font.Name:='Sans';
B.Font.Size:=7;
B.Left:=LeftPos;
B.Top:=0;
B.Width:=ButWidth;
B.Height:=pnlKeyboard.Height;
B.Caption:=Caption;
B.OnClick:=@OnKeyboardClick;
B.Tag:=TagN;
KeyboardControls.Add(B);
Result:=B;
end;
begin
KeyboardControls.Clear;
ButWidthF:=pnlKeyboard.Width/11;
ButWidth:=trunc(ButWidthF);
for n:=0 to 9 do
begin
ButtonCreate(IntToStr(n), trunc(n*ButWidthF), n);
end;
ButtonCreate('<', trunc((n+1)*ButWidthF), BackSpaceTag);
end;
procedure TfrmOrderGoods.DealerPickListFill;
var SQL:TSqlite3Dataset;
C:TRxColumn;
begin
GlobalLogger.Log('Заполнение picklist для столбца дилер');
C:=grdBusket.ColumnByFieldName('Dealer');
C.KeyList.Clear;
C.PickList.Clear;
SQL:=nil;
try
SQL:=BaseConnect.DatasetCreate('select d.id, d.Name from Dealers d order by d.Name');
while not SQL.EOF do
begin
C.KeyList.Add( SQL.FieldByName('id').AsString );
C.PickList.Add( SQL.FieldByName('Name').AsString );
SQL.Next;
end;
finally
SQL.Free;
end;
end;
constructor TfrmOrderGoods.Create(AOwner: TComponent);
begin
GlobalLogger.Log('constructor TfrmOrderGoods.Create. Старт');
FId_Order:=-1;
FGoodShowType:=gstBusket;
CopyingRecords:=false;
KeyboardControls:=TComponentList.create(true);
KeyboardControls.OwnsObjects:=True;
Inherited;
BusketFieldsDefine;
KeyboardCreate;
GlobalLogger.Log('constructor TfrmOrderGoods.Create. Финиш');
end;
destructor TfrmOrderGoods.Destroy;
begin
KeyboardControls.Free;
inherited Destroy;
end;
initialization
{$I uordergoods.lrs}
end.