| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | unit DealBillsDm;interfaceuses  SysUtils, Classes, sdDB, sdProvider, ADODB;type  TDealBillsData = class(TDataModule)    sdpDealBills: TsdADOProvider;    sddDealBills: TsdDataSet;    sdvDealBills: TsdDataView;    procedure sddDealBillsBeforeAddRecord(ARecord: TsdDataRecord;      var Allow: Boolean);    procedure sdvDealBillsSetText(var Text: String; ARecord: TsdDataRecord;      AValue: TsdValue; AColumn: TsdViewColumn; var Allow: Boolean);  private    FProjectData: TObject;    function GetNewID: Integer;  public    constructor Create(AProjectData: TObject);    destructor Destroy; override;    procedure Open(AConnection: TADOConnection);    procedure Close;    procedure Save;    procedure Clear;    procedure DisableEvent;    procedure EnableEvent;    function DealRecord(const AB_Code: string): TsdDataRecord;    function GetAllDealBillsJson: string;    property ProjectData: TObject read FProjectData;  end;implementationuses  UtilMethods, superobject;{$R *.dfm}{ TDealBillsData }procedure TDealBillsData.Clear;begin  sddDealBills.DeleteAll;end;procedure TDealBillsData.Close;begin  sddDealBills.Close;end;constructor TDealBillsData.Create(AProjectData: TObject);begin  inherited Create(nil);  FProjectData := AProjectData;end;function TDealBillsData.DealRecord(const AB_Code: string): TsdDataRecord;begin  Result := sddDealBills.Locate('B_Code', AB_Code);end;destructor TDealBillsData.Destroy;begin  inherited;end;procedure TDealBillsData.DisableEvent;begin  sddDealBills.BeforeAddRecord := nil;end;procedure TDealBillsData.EnableEvent;begin  sddDealBills.BeforeAddRecord := sddDealBillsBeforeAddRecord;end;function TDealBillsData.GetAllDealBillsJson: string;var  vJa, vJbills: ISuperObject;  i: Integer;  Rec: TsdDataRecord;begin  vJa := SA([]);  try    for i := 0 to sddDealBills.RecordCount - 1 do    begin      Rec := sddDealBills.Records[i];      vJbills := SO;      vJbills.S['lnum'] := Rec.ValueByName('B_Code').AsString;      vJbills.S['lname'] := Rec.ValueByName('Name').AsString;      vJbills.S['unit'] := Rec.ValueByName('Units').AsString;      vJbills.D['unitprice'] := Rec.ValueByName('Price').AsFloat;      vJbills.D['amount'] := Rec.ValueByName('Quantity').AsFloat;      vJa.AsArray.Add(vJbills);    end;  finally    Result := vJa.AsJSon;  end;end;function TDealBillsData.GetNewID: Integer;var  idx: TsdIndex;begin  Result := 1;  if sddDealBills.RecordCount = 0 then Exit;  idx := sddDealBills.FindIndex('idxID');  Result := idx.Records[sddDealBills.RecordCount - 1].ValueByName('ID').AsInteger + 1;end;procedure TDealBillsData.Open(AConnection: TADOConnection);begin  sdpDealBills.Connection := AConnection;  sddDealBills.Open;  if not Assigned(sddDealBills.IndexList.FindByName('idxID')) then    sddDealBills.AddIndex('idxID', 'ID');  sdvDealBills.Open;  sdvDealBills.IndexName := 'idxID';end;procedure TDealBillsData.Save;  procedure CheckIndexCode;  var    i: Integer;    Rec: TsdDataRecord;    sIndexCode: string;  begin    for i := 0 to sddDealBills.RecordCount - 1 do    begin      Rec := sddDealBills.Records[i];      sIndexCode := B_CodeToIndexCode(Rec.ValueByName('B_Code').AsString);      if sIndexCode <> Rec.ValueByName('IndexCode').AsString then        Rec.ValueByName('IndexCode').AsString := sIndexCode;    end;  end;begin  CheckIndexCode;  sddDealBills.Save;end;procedure TDealBillsData.sddDealBillsBeforeAddRecord(  ARecord: TsdDataRecord; var Allow: Boolean);begin  ARecord.ValueByName('ID').AsInteger := GetNewID;end;procedure TDealBillsData.sdvDealBillsSetText(var Text: String;  ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;  var Allow: Boolean);begin  if SameText(AColumn.FieldName, 'Price') then    Text := FloatToStr(PriceRoundTo(StrToFloatDef(Text, 0)))  else if SameText(AColumn.FieldName, 'Quantity') then    Text := FloatToStr(QuantityRoundTo(StrToFloatDef(Text, 0)))  else if SameText(AColumn.FieldName, 'TotalPrice') then    Text := FloatToStr(TotalPriceRoundTo(StrToFloatDef(Text, 0)));end;end.
 |