expertcad/SRC/SCSNormBase/U_MakeCurrency.pas
2025-05-12 10:07:51 +03:00

567 lines
18 KiB
ObjectPascal

unit U_MakeCurrency;
interface
uses
Windows, U_LNG, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxLookAndFeelPainters, StdCtrls, cxButtons, cxMaskEdit,
cxSpinEdit, cxControls, cxContainer, cxEdit, cxTextEdit, cxCurrencyEdit, U_BaseCommon, U_BaseConstants,
RzEdit, Mask, RzButton, ExtCtrls, RzPanel, RzSpnEdt, RzRadChk, siComp,
siLngLnk, RzTabs, kbmMemTable;
type
TF_MakeCurrency = class(TForm)
RzGroupBox1: TRzGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
edName: TRzEdit;
edNameBrief: TRzEdit;
RzGroupBox2: TRzGroupBox;
btOk: TRzBitBtn;
btCancel: TRzBitBtn;
Label4: TLabel;
seKolvo: TRzSpinEdit;
neRatio: TRzNumericEdit;
lng_Forms: TsiLangLinked;
gbMainKind: TRzGroupBox;
rbSimple: TRzRadioButton;
rbMain: TRzRadioButton;
rbSecond: TRzRadioButton;
cbIsCountry: TRzCheckBox;
pnInfo: TRzPanel;
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure neRatioChange(Sender: TObject);
private
{ Private declarations }
GForm: TForm;
FChangedRatio: Boolean;
public
{ Public declarations }
GMakeEdit : TMakeEdit;
GID: Integer;
Constructor Create(AOwner: TComponent; AForm: TForm);
Destructor Destroy; override;
function Execute(AMakeEdit: TMakeEdit; AMemTable, AMTNorms, AMTResources: TkbmMemTable): Boolean;
//23.08.2012 function ExecuteForObject(AMakeEdit: TMakeEdit; AObjectCurrency: PCurrency): Boolean;
end;
{
var
F_MakeCurrency: TF_MakeCurrency; }
implementation
Uses Unit_DM_SCS, U_MAIN, DB, U_Common;
{$R *.dfm}
procedure TF_MakeCurrency.FormShow(Sender: TObject);
begin
if TF_Main(GForm).GDBMode <> bkNormBase then
begin
pnInfo.Visible := false;
Self.AutoSize := true;
Self.AutoSize := false;
end;
{case GParam of
tMake: begin
Caption := 'Ñîçäàíèå âàëþòû';
Edit_Name.Text := '';
Edit_Name_Brief.Text := '';
CurrencyEdit_Ratio.Value := 0.1;
end;
tEdit: with TF_Main(GForm).DM.DataSet_CURRENCY do
begin
Caption := 'Ðåäàêòèðîâàíèå âàëþòû';
Edit_Name.Text := FN('Name').AsString;
Edit_Name_Brief.Text := FN('Name_Brief').AsString;
CurrencyEdit_Ratio.Value := RoundX(FN('Ratio').AsFloat, 2);
end;
end;
}
edName.SetFocus;
end;
procedure TF_MakeCurrency.FormHide(Sender: TObject);
begin
// ##### Ïðè Ñëåäóþùåì âsçîâå, Îòîáðàæàòü ýòó ôîðìó â ñðåäèíå Ãëàâíîé #####
//F_MakeCurrency.Position := poMainFormCenter;
end;
constructor TF_MakeCurrency.Create(AOwner: TComponent; AForm: TForm);
begin
GForm := AForm;
inherited Create(AOwner);
end;
destructor TF_MakeCurrency.Destroy;
begin
inherited;
end;
function TF_MakeCurrency.Execute(AMakeEdit: TMakeEdit; AMemTable, AMTNorms, AMTResources: TkbmMemTable): Boolean;
var
OldCurrency: TCurrency;
NewCurrency: TCurrency;
CurrCurrency: TCurrency;
OldCurrencyM: TCurrency;
CurrencyS: TCurrency;
ChangedCurrencyM: Boolean;
PriceValue: Double;
//BookmarkStr: String;
BookmarkStr: TBookMark;
PriceFields: TStringList;
//Tolik
NewRatio: Double;
begin
Result := false;
Caption := '';
GID := -1;
GMakeEdit := AMakeEdit;
ZeroMemory(@OldCurrency, SizeOf(TCurrency));
ZeroMemory(@OldCurrencyM, SizeOf(TCurrency));
ZeroMemory(@NewCurrency, SizeOf(TCurrency));
FChangedRatio := false;
cbIsCountry.Enabled := true;
rbSimple.Enabled := true;
rbSimple.Checked := false;
rbMain.Enabled := true;
rbMain.Checked := false;
rbSecond.Enabled := true;
rbSecond.Checked := false;
//gbMainKind.Visible := (AMemTable <> nil);
case AMakeEdit of
meMake:
begin
Caption := cMakeCurrency_Msg1_1;
edName.Text := '';
edNameBrief.Text := '';
seKolvo.Value := 100;
neRatio.Value := 0.1;
cbIsCountry.Checked := false;
end;
meEdit:
begin
Caption := cMakeCurrency_Msg1_2;
if AMemTable <> nil then
OldCurrency := GetCurrencyFromMemTable(AMemTable)
else
OldCurrency := GetCurrencyFromDataSet(TF_Main(GForm).DM.DataSet_CURRENCY);
edName.Text := OldCurrency.Name;
edNameBrief.Text := OldCurrency.NameBrief;
seKolvo.Value := OldCurrency.Kolvo;
neRatio.OnChange := nil;
try
neRatio.Value := Round3(OldCurrency.Ratio);
finally
neRatio.OnChange := neRatioChange;
// Tolik 12/06/2018 --
if neRatio.Value = 0 then
begin
neRatio.Font.Color := clRed;
neRatio.Refresh;
end
else
begin
neRatio.Font.Color := clBlack;
neRatio.Refresh;
end;
//
end;
if OldCurrency.Main = ctSimple then
rbSimple.Checked := true
else
begin
rbSimple.Enabled := false;
if OldCurrency.Main = ctMain then
rbMain.Checked := true
else
if OldCurrency.Main = ctSecond then
rbSecond.Checked := true;
end;
cbIsCountry.Checked := IntToBool(OldCurrency.IsCountry);
//*** Çàïðåòèòü ñíÿòèå âàëþòû ñòðàíû, åñëè îíà çäåñü óñòàíîâëåíà
cbIsCountry.Enabled := Not cbIsCountry.Checked;
end;
end;
if ShowModal = mrOk then
begin
ChangedCurrencyM := false;
NewCurrency := OldCurrency;
NewCurrency.Kolvo := Round(seKolvo.Value);
if FChangedRatio then
NewCurrency.Ratio := neRatio.Value
else
NewCurrency.Ratio := OldCurrency.Ratio;
NewCurrency.Main := -1;
if rbSimple.Checked then
NewCurrency.Main := ctSimple
else
if rbMain.Checked then
NewCurrency.Main := ctMain
else
if rbSecond.Checked then
NewCurrency.Main := ctSecond;
//*** Èçìåíèëàñü ãëàâíàÿ âàëþòà
if (OldCurrency.Main <> -1) and (NewCurrency.Main <> -1) and (NewCurrency.Main <> OldCurrency.Main) then
ChangedCurrencyM := true;
if AMemTable <> nil then
begin
AMemTable.DisableControls;
//BookmarkStr := AMemTable.Bookmark;
BookmarkStr := AMemTable.getBookmark;
try
//*** Ñáðîñèòü ôëàã IsCountry íà âñåõ çàïèñÿõ
//CurrentID := 0;
if cbIsCountry.Checked then
begin
AMemTable.First;
while Not AMemTable.Eof do
begin
if AMemTable.FieldByName(fnIsCountry).AsInteger = biTrue then
begin
AMemTable.Edit;
AMemTable.FieldByName(fnIsCountry).AsInteger := biFalse;
AMemTable.FieldByName(fnIsModified).AsBoolean := true;
AMemTable.Post;
end;
AMemTable.Next;
end;
end;
//*** Íàéòè çàïèñü ñî çíà÷åíèåì NewCurrency.Main, è óñòàíîâèòü òóäà OldCurrency.Main
if ChangedCurrencyM then
begin
if AMemTable.Locate(fnMain, NewCurrency.Main, []) then
begin
OldCurrencyM := GetCurrencyFromMemTable(AMemTable);
WriteToMemTable(AMemTable, fnMain, OldCurrency.Main);
end;
end;
finally
//AMemTable.Bookmark := BookmarkStr;
if BookmarkStr <> nil then
begin
AMemTable.GotoBookmark(BookmarkStr);
AMemTable.FreeBookmark(BookmarkStr);
end;
AMemTable.EnableControls;
end;
case AMakeEdit of
meMake:
AMemTable.Append;
meEdit:
AMemTable.Edit;
end;
AMemTable.FieldByName(fnName).AsString := edName.Text;
AMemTable.FieldByName(fnNameBrief).AsString := edNameBrief.Text;
AMemTable.FieldByName(fnKolvo).AsInteger := NewCurrency.Kolvo;
AMemTable.FieldByName(fnRatio).AsFloat := NewCurrency.Ratio;
AMemTable.FieldByName(fnMain).AsInteger := NewCurrency.Main;
AMemTable.FieldByName(fnIsCountry).AsInteger := BoolToInt(cbIsCountry.Checked);
AMemTable.Post;
//*** Èçìåíèòü êóðñû âàäþò
if ChangedCurrencyM and (OldCurrencyM.GUID <> '') then
begin
// Tolik
// âàëþòà ñòàíîâèòñÿ ãëàâíîé
if NewCurrency.Main = 1 then
NewRatio := NewCurrency.Ratio
else
begin
if OldCurrency.Main = 0 then
NewRatio := NewCurrency.Ratio
else
NewRatio := OldCurrencyM.Ratio;
end;
//
AMemTable.DisableControls;
//BookmarkStr := AMemTable.Bookmark;
BookmarkStr := AMemTable.getBookmark;
try
AMemTable.First;
while Not AMemTable.Eof do
begin
CurrCurrency := GetCurrencyFromMemTable(AMemTable);
AMemTable.Edit;
// Tolik
// Åñëè íå ïîìåíÿëàñü âòîðîñòåïåííàÿ âàëþòà íà ïðîåêòå, òî áóäóò èçìåíåíèÿ
if ((NewCurrency.Main = 2) and (OldCurrency.Main = 0)) then
begin
// âòîðîñòåïåííàÿ âàëþòà íå èçìåíèò êóðñà, òàê êàê ñîîòíîøåíèÿ âàëþò, ïî èäåå,
// óæå âûñòàâëåíû, ïîýòîìó ïåðåñ÷åò íå âåäåì, âåäü ïðàêòè÷åñêè íè÷åãî íå èçìåíèòñÿ,
// ãëàâíàÿ âàëþòà åñòü
end
else
// ïåðåñ÷åò
// Tolik -- 12/06/2018 -- äëÿ îñîáî "óìíûõ", êîòîðûå ëþáÿò ïîâûåáûâàòüñÿ è ñòàâÿò íóëè
if (CurrCurrency.Kolvo * NewRatio) <> 0 then
//
AMemTable.FieldByName(fnRatio).AsFloat := Roundx(CurrCurrency.Kolvo*((NewCurrency.Kolvo*CurrCurrency.Ratio)/(CurrCurrency.Kolvo * NewRatio)), valEpsilonCurrency);
// AMemTable.FieldByName(fnRatio).AsFloat := GetPriceAfterChangeCurrency(CurrCurrency.Ratio, NewCurrency, OldCurrencyM, valEpsilonCurrency);
// èñïîëüçùîâàíèå ôóíêöèè ïðîñòî çàêîììåíòèë, ÷òîá åå íå ëîìàòü, òàê êàê èñïîëüçóåòñÿ íåîäíîêðàòíî, íóæíî ïåðåñìîòðåòü
// ñèòóàöèè âûçîâà äî òîãî, êàê ïîëîìàòü
AMemTable.Post;
AMemTable.Next;
end;
finally
//AMemTable.Bookmark := BookmarkStr;
if BookmarkStr <> nil then
begin
AMemTable.GotoBookmark(BookmarkStr);
AMemTable.FreeBookmark(BookmarkStr);
end;
AMemTable.EnableControls;
end;
//*** Ïîìåíÿòü öåíû ñïðàâî÷íûõ ðåñóðñîâ
////24.09.2010
// if AMTResources <> nil then
// begin
// BookmarkStr := AMTResources.Bookmark;
// AMTResources.DisableControls;
// try
// AMTResources.First;
// while Not AMTResources.Eof do
// begin
// PriceValue := AMTResources.FieldByName(fnPrice).AsFloat;
// if PriceValue > 0 then
// begin
// AMTResources.Edit;
// AMTResources.FieldByName(fnPrice).AsFloat := GetPriceAfterChangeCurrency(PriceValue, OldCurrencyM, NewCurrency, valEpsilonCurrency);
// AMTResources.Post;
// end;
// AMTResources.Next;
// end;
// AMTResources.Bookmark := BookmarkStr;
// finally
// AMTResources.EnableControls;
// end;
// end;
PriceFields := TStringList.Create;
PriceFields.Add(fnPrice);
//*** Ïîìåíÿòü öåíû ñïðàâî÷íûõ íîðì
DefineMTPriceFields(AMTNorms, PriceFields, OldCurrencyM, NewCurrency);
//*** Ïîìåíÿòü öåíû ñïðàâî÷íûõ ðåñóðñîâ
DefineMTPriceFields(AMTResources, PriceFields, OldCurrencyM, NewCurrency);
PriceFields.Free;
end;
Result := true;
end
else
with TF_Main(GForm).DM do
begin
//*** Ñáðîñèòü ôëàã IsCountry íà âñåõ çàïèñÿõ
//CurrentID := 0;
if cbIsCountry.Checked then
begin
SetSQLToQuery(scsQOperat, 'UPDATE CURRENCY SET '+fnIsCountry+' = '''+IntToStr(biFalse)+'''');
DataSet_CURRENCY.FullRefresh;
end;
case AMakeEdit of
meMake:
DataSet_CURRENCY.Append;
meEdit:
DataSet_CURRENCY.Edit;
end;
DataSet_CURRENCY.FN(fnName).AsString := edName.Text;
DataSet_CURRENCY.FN(fnNameBrief).AsString := edNameBrief.Text;
DataSet_CURRENCY.FN(fnKolvo).AsInteger := NewCurrency.Kolvo;
DataSet_CURRENCY.FN(fnRatio).AsFloat := NewCurrency.Ratio;
//DataSet_CURRENCY.FN(fnMain).AsInteger := NewCurrency.Main;
DataSet_CURRENCY.FN(fnIsCountry).AsInteger := BoolToInt(cbIsCountry.Checked);
DataSet_CURRENCY.Post;
if AMakeEdit = meMake then
GID := DataSet_CURRENCY.FN(fnID).AsInteger;
// Ñìåíà ãëàâíîé/âòîðîé âàëþòû ÍÁ
if ChangedCurrencyM then
begin
BeginProgress;
try
OldCurrencyM := U_BaseCommon.GetCurrencyByType(ctMain, TF_Main(GForm).DM.Query_Select);
CurrencyS := U_BaseCommon.GetCurrencyByType(ctSecond, TF_Main(GForm).DM.Query_Select);
// Åñëè äàíàÿ âàëþòà ñòàëà ãëàâíîé
if NewCurrency.Main = ctMain then
begin
//25.10.2011 if OldCurrencyM.GUID <> '' then
begin
if OldCurrencyM.Ratio <> 0 then
ChengeCurrencyRatiosWithPrices(OldCurrencyM, NewCurrency, CurrencyS, Query_Select, Query_Operat);
UpdateTableField(tnCurrency, fnMain, fnID, NewCurrency.ID, ctMain, qmPhisical);
if (NewCurrency.ID = CurrencyS.ID) and (OldCurrencyM.ID <> 0) then
UpdateTableField(tnCurrency, fnMain, fnID, OldCurrencyM.ID, ctSecond, qmPhisical);
end;
end
// Åñëè äàíàÿ âàëþòà áûëà ãëàâíîé è ñòàëà íå ãëàâíîé
else if (OldCurrency.Main = ctMain) and (NewCurrency.Main <> ctMain) then
begin
ChengeCurrencyRatiosWithPrices(OldCurrencyM, CurrencyS, OldCurrency, Query_Select, Query_Operat);
end
// Åñëè äàíàÿ âàëþòà ñòàëà âòîðîé
else if NewCurrency.Main = ctSecond then
begin
//*** Î÷èñòèòü ïîëå ñ âòîðîé âàëþòîé
SetSQLToFIBQuery(TF_Main(GForm).DM.Query_Operat, GetSQLByParams(qtUpdate, tnCurrency,
fnMain+' = '''+IntTostr(ctSecond)+'''', nil, fnMain), false);
TF_Main(GForm).DM.Query_Operat.ParamByName(fnMain).AsInteger := ctSimple;
TF_Main(GForm).DM.Query_Operat.ExecQuery;
UpdateTableField(tnCurrency, fnMain, fnID, NewCurrency.ID, ctSecond, qmPhisical);
end;
TF_Main(GForm).GCurrencyM := U_BaseCommon.GetCurrencyByType(ctMain, TF_Main(GForm).DM.Query_Select);
TF_Main(GForm).GCurrencyS := U_BaseCommon.GetCurrencyByType(ctSecond, TF_Main(GForm).DM.Query_Select);
TF_Main(GForm).SetCurrencyBriefToControls;
TF_Main(GForm).Tree_Catalog.OnChange(TF_Main(GForm).Tree_Catalog, TF_Main(GForm).Tree_Catalog.Selected);
DataSet_CURRENCY.ReopenLocate(fnID);
finally
EndProgress;
//TF_Main(GForm).RefreshNode(true); // Âíòóðè BeginProgress/EndProgress ðàáîòàòü íå áóäåò
end;
end;
Result := true;
end;
end;
end;
{//23.08.2012 - Ïîêà íèãäå íå èñïîëüçóåòñÿ
function TF_MakeCurrency.ExecuteForObject(AMakeEdit: TMakeEdit; AObjectCurrency: PCurrency): Boolean;
begin
Result := false;
Caption := '';
GID := -1;
GMakeEdit := AMakeEdit;
rbSimple.Enabled := true;
rbSimple.Checked := false;
rbMain.Enabled := true;
rbMain.Checked := false;
rbSecond.Enabled := true;
rbSecond.Checked := false;
case AMakeEdit of
meMake:
begin
Caption := cMakeCurrency_Msg1_1;
edName.Text := '';
edNameBrief.Text := '';
seKolvo.Value := 100;
neRatio.Value := 0.1;
cbIsCountry.Checked := false;
rbSimple.Checked := true;
end;
meEdit:
begin
Caption := cMakeCurrency_Msg1_2;
edName.Text := AObjectCurrency.Name;
edNameBrief.Text := AObjectCurrency.NameBrief;
seKolvo.Value := AObjectCurrency.Kolvo;
neRatio.Value := Round3(AObjectCurrency.Ratio);
if AObjectCurrency.Main = ctSimple then
rbSimple.Checked := true
else
if AObjectCurrency.Main = ctMain then
begin
rbMain.Checked := true;
rbSimple.Enabled := false;
rbSecond.Enabled := false;
end
else
if AObjectCurrency.Main = ctSecond then
begin
rbSecond.Checked := true;
rbMain.Enabled := false;
rbSimple.Enabled := false;
end;
neRatio.OnChange := nil;
try
neRatio.Value := Round3(AObjectCurrency.Ratio);
finally
neRatio.OnChange := neRatioChange;
end;
if AObjectCurrency.Main = ctSimple then
rbSimple.Checked := true
else
if AObjectCurrency.Main = ctMain then
begin
rbMain.Checked := true;
rbSimple.Enabled := false;
//rbSecond.Enabled := false;
end
else
if AObjectCurrency.Main = ctSecond then
begin
rbSecond.Checked := true;
//rbMain.Enabled := false;
rbSimple.Enabled := false;
end;
//cbIsCountry.Checked := (TF_Main(GForm).DM.DataSet_CURRENCY.FN(fnIsCountry).AsInteger = biTrue);
end;
end;
if ShowModal = mrOk then
begin
AObjectCurrency.Name := edName.Text;
AObjectCurrency.NameBrief := edNameBrief.Text;
AObjectCurrency.Kolvo := Trunc(seKolvo.Value);
AObjectCurrency.Ratio := Round3(neRatio.Value);
if rbSimple.Checked then
AObjectCurrency.Main := ctSimple
else
if rbMain.Checked then
AObjectCurrency.Main := ctMain
else
if rbSecond.Checked then
AObjectCurrency.Main := ctSecond;
Result := true;
end;
end;}
procedure TF_MakeCurrency.FormCreate(Sender: TObject);
begin
// Tolik 01/11/2019 --
seKolvo.Max := 10000000000;
//
neRatio.DisplayFormat := GetDisplayFormatForFloat;
end;
procedure TF_MakeCurrency.neRatioChange(Sender: TObject);
begin
FChangedRatio := true;
// Tolik 12/06/2018 - -
if neRatio.Value = 0 then
begin
neRatio.Font.Color := clRed;
neRatio.Refresh;
end
else
begin
neRatio.Font.Color := clBlack;
neRatio.Refresh;
end;
end;
end.