📄 fmbizmulu.pas
字号:
unit FMBizMulU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, FMMulU, Menus, DB, ADODB, StdCtrls, Buttons, ExtCtrls, Grids,
DBGrids, dxCntner, dxTL, dxDBCtrl, dxDBGrid, DBCtrls, Mask, ComCtrls,
dxDBTLCl, dxGrClms,StrUtils;
type
TFMBizMul = class(TFMMul)
CenterPanel: TPanel;
GridMain: TDBGrid;
Splitter1: TSplitter;
TopPanel: TPanel;
Splitter2: TSplitter;
GridDetail: TdxDBGrid;
cdsState: TADODataSet;
cdsMainfBillId: TSmallintField;
cdsMainfBillNo: TWideStringField;
cdsMainfAccDate: TDateTimeField;
cdsMainfCreUser: TWideStringField;
cdsMainfMemo: TWideStringField;
cdsMainfState: TSmallintField;
cdsMainfFFU: TWideStringField;
cdsUser: TADODataSet;
cdsMainfUserName: TStringField;
cdsMainfStateName: TStringField;
Label1: TLabel;
dbfBillNo: TDBEdit;
Label2: TLabel;
Label3: TLabel;
dbfMemo: TDBEdit;
dbAccDate: TDateTimePicker;
GridPopMenu: TPopupMenu;
nAdd: TMenuItem;
nDel: TMenuItem;
cdsDetailfBillId: TSmallintField;
cdsDetailfEntryId: TSmallintField;
cdsDetailfProductId: TSmallintField;
cdsDetailfQty: TFloatField;
cdsDetailfFFU: TWideStringField;
cdsItem: TADODataSet;
cdsDetailfProductName: TStringField;
cdsDetailfSpec: TStringField;
cdsDetailfSaleUnit: TStringField;
GridDetailfEntryId: TdxDBGridMaskColumn;
GridDetailfQty: TdxDBGridMaskColumn;
GridDetailfProductNo: TdxDBGridButtonColumn;
cdsDetailfAmt: TFloatField;
GridDetailCount: TdxDBGridColumn;
GridDetailfAmt: TdxDBGridCurrencyColumn;
btnCheck: TBitBtn;
btnBlank: TBitBtn;
cdsDetailfItemBuyPrice: TFloatField;
cdsDetailfItemSellPrice: TFloatField;
cdsDetailfProductNo: TStringField;
GridDetailfItemSellPrice: TdxDBGridMaskColumn;
GridDetailfItemBuyPrice: TdxDBGridMaskColumn;
GridDetailfProductName: TdxDBGridColumn;
GridDetailfSpec: TdxDBGridColumn;
GridDetailfSaleUnit: TdxDBGridColumn;
PubPanel: TPanel;
Label4: TLabel;
dbfUserName: TDBLookupComboBox;
Label5: TLabel;
dbfStateName: TDBLookupComboBox;
Qry: TADOQuery;
dsState: TDataSource;
dsUser: TDataSource;
procedure cdsMainAfterScroll(DataSet: TDataSet);
procedure cdsDetailNewRecord(DataSet: TDataSet);
procedure cdsDetailCalcFields(DataSet: TDataSet);
procedure nAddClick(Sender: TObject);
procedure nDelClick(Sender: TObject);
procedure cdsMainNewRecord(DataSet: TDataSet);
procedure btnCheckClick(Sender: TObject);
procedure btnBlankClick(Sender: TObject);
procedure btnModifyClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnSaveClick(Sender: TObject);
procedure btnCancleClick(Sender: TObject);
procedure cdsDetailfProductNoSetText(Sender: TField;
const Text: String);
procedure GridDetailfProductNoButtonClick(Sender: TObject;
AbsoluteIndex: Integer);
procedure btnAddClick(Sender: TObject);
procedure GridDetailExit(Sender: TObject);
procedure GridDetailKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure GridDetailKeyPress(Sender: TObject; var Key: Char);
procedure cdsDetailBeforePost(DataSet: TDataSet);
private
{ Private declarations }
procedure CheckDB(strKey:string);
procedure CalStock(strID :string ); //计算库存
public
{ Public declarations }
aCompany,aUserId,Style :string ;
aPriceType :integer ; //价格类型:0 无 ; 1 进价;2 售价
aNumType :integer ; //异动库存类型: 0不 ; 1 增加 ; -1 减少
aZeroStock :integer ; //检查库存 :0 不 ; 1 检查
aKeyField,aBillNo,aMainTable,aDetailTable :string ;
function GeneratID:String;
function GetPrintList:string ; //取的当前打印记录
function CheckHead:boolean ; virtual;
function CheckDetail:boolean ; virtual;
end;
var
FMBizMul: TFMBizMul;
implementation
{$R *.dfm}
uses FmSearchU ;
function TFMBizMul.CheckHead:boolean ;
begin
result :=true ;
end ;
function TFMBizMul.CheckDetail:boolean ;
begin
result :=true ;
if cdsDetail.FieldByName('fProductName').AsString ='' then
begin
MessageBox(handle,'请输入产品资料.','提示',MB_OK+MB_ICONWARNING);
result :=false ;
exit ;
end ;
if cdsDetail.FieldByName('fqty').AsString ='' then
cdsDetail.FieldByName('fqty').AsString :='0' ;
if cdsDetail.FieldByName('fqty').AsInteger =0 then exit ;
//检查该商品是否负库存
if aZeroStock=1 then
begin
Qry.Active :=false ;
Qry.SQL.Text :='select count(*),sum(fqty) from tb_stock where fProductId='+cdsDetail.FieldByName('fProductId').AsString;
Qry.Active :=true ;
if Qry.Fields[0].AsInteger=0 then
begin
MessageBox(handle,'该产品无库存数量,不能出货.','提示',MB_OK+MB_ICONWARNING);
result :=false ;
exit ;
end
else
if Qry.fields[1].AsFloat - cdsDetail.FieldByName('fqty').AsFloat<0 then
begin
MessageBox(handle,Pchar('该产品库存数量:'+Qry.fields[1].AsString+'不够出货.'),'提示',MB_OK+MB_ICONWARNING);
result :=false ;
exit ;
end ;
end ;
end ;
{取当前打印队列}
function TFMBizMul.GetPrintList:string ;
var
strPrintList :string ;
begin
strPrintList :='(0';
cdsMain.DisableControls ;
cdsMain.First ;
while not cdsMain.Eof do
begin
strPrintList :=strPrintList +','+cdsMain.fieldbyName(aKeyField).AsString ;
cdsMain.Next ;
end ;
cdsMain.First ;
cdsMain.EnableControls ;
result :=strPrintList+')' ;
end ;
{取外码}
function TFMBizMul.GeneratID:String;
var sInitVal,sSQL :String;
begin
sInitVal := FormatDateTime('YYYYMMDD',Date());
sSQL := 'SELECT MAX('+aBillNo+') as New_NO From '+aMainTable+' ' +
'WHERE 1=1 ' +
'AND '+aBillNo+' LIKE '''+Style + sInitval + '%'' ';
QrySQL.Active := false;
QrySQL.SQL.Clear;
QrySQL.SQL.Text := sSQL;
QrySQL.Active := true;
if QrySQL.FieldByName('New_NO').AsString = '' then
begin
Result := Style + sInitVal + '' + '001';
exit;
end;
if (StrToInt(RightStr(QrySQL.fieldByName('New_NO').AsString,3)) + 1 > 999) then
Raise Exception.Create('同一天产生的单据不能超过999笔!');
Result := Style + sInitVal +
RightStr('000' + IntToStr(StrToInt(RightStr(QrySQL.fieldByName('New_NO').AsString,3)) + 1 ),3);
end;
{头档与明细档是否一致}
procedure TFMBizMul.CheckDB(strKey:string);
begin
QrySQL.Active :=false ;
QrySQL.SQL.Text :='select count(*) from '+aMainTable +' where '+aKeyField +'='+strKey;
QrySQL.Open ;
if QrySQL.Fields[0].AsInteger=0 then
begin
QrySQL.Active :=false ;
QrySQL.SQL.Text :='delete from '+aDetailTable +' where '+aKeyField +'='+strKey;
QrySQL.ExecSQL ;
cdsDetail.Active :=false ;
cdsDetail.CommandText :='select * from '+aDetailTable+ ' where 1=2';
cdsDetail.Active :=true ;
end ;
QrySQL.Active :=false ;
end ;
{计算库存}
procedure TFMBizMul.CalStock(strID :string );
begin
if aNumType=0 then exit ;
Qry.Active :=false ;
Qry.SQL.Text :='select a.fproductid,a.fQty from '+aDetailTable+' a,tb_stock b where '+aKeyField+'='+strID
+' and a.fproductid=b.fproductid and a.fQty<>0 order by a.fproductid ';
Qry.Open ;
while not Qry.Eof do
begin
QrySQL.Active :=false ;
QrySQL.SQL.Text :='update tb_stock set fQty=fQty+'+Qry.fields[1].asString+'*'+IntToStr(aNumType)
+ ' where fproductid='+Qry.fields[0].asString ;
QrySQL.ExecSQL ;
Qry.Next ;
end ;
Qry.Active :=false ;
QrySQL.Active :=false ;
QrySQL.SQL.Text :='insert into tb_stock(fproductid,fqty,famt,fFFU) '
+' select fproductid,fqty*'+IntToStr(aNumType)+',0,0 '
+' from '+aDetailTable+' where '+aKeyField+'='+strID
+' and fproductid not in (select fproductid from tb_stock) ';
QrySQL.ExecSQL ;
QrySQL.Active :=false ;
end ;
procedure TFMBizMul.cdsMainAfterScroll(DataSet: TDataSet);
begin
inherited;
if not cdsMain.Active then exit ;
if cdsMain.FieldByName(aKeyField).AsString='' then exit ;
dbAccDate.Date :=cdsMain.FieldByName('fAccDate').AsDateTime ;
cdsDetail.Active :=false ;
cdsDetail.CommandText :='select * from '+aDetailTable+ ' where '+aKeyField+'='+cdsMain.fieldByname(aKeyField).AsString;
cdsDetail.Active :=true ;
if not (cdsMain.State in [dsInsert,dsEdit]) then
begin
btnCheck.Enabled :=true ;
btnBlank.Enabled :=true ;
end
else
begin
btnCheck.Enabled :=false ;
btnBlank.Enabled :=false ;
end ;
end;
procedure TFMBizMul.cdsDetailNewRecord(DataSet: TDataSet);
begin
inherited;
cdsDetail.FieldByName(aKeyField).AsString :=cdsMain.fieldByName(aKeyField).AsString ;
cdsDetail.FieldByName('fEntryId').Asinteger:=1+StrToInt(GridDetailCount.SummaryFooterText);
case aPriceType of
1: cdsDetail.FieldByName('fBuyPrice').Asinteger:=0;
2: cdsDetail.FieldByName('fSellPrice').Asinteger:=0;
3: begin
cdsDetail.FieldByName('fBuyPrice').Asinteger:=0;
cdsDetail.FieldByName('fSellPrice').Asinteger:=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -