⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmbizmulu.pas

📁 小型库存管理,希望有帮助,小型库存管理,希望有帮助
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -