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

📄 unit_rubb_autocard.pas

📁 此代码为企业原料管理代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:

{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
unit Unit_Rubb_AutoCard;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, StdCtrls, ExtCtrls, Buttons, Db, DBTables, ComCtrls;

type
  TForm_Rubb_AutoCard = class(TForm)
    DBGrid1: TDBGrid;
    Edit_MixCardNum: TEdit;
    Edit_Rubb: TEdit;
    Edit_Per: TEdit;
    BitBtn1: TBitBtn;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel_Hint: TPanel;
    Qry_TakeCard: TQuery;
    DS_TakeCard: TDataSource;
    Qry_exe: TQuery;
    Panel5: TPanel;
    Panel6: TPanel;
    Panel3: TPanel;
    edit_p: TEdit;
    Panel4: TPanel;
    Panel7: TPanel;
    DateTimePicker1: TDateTimePicker;
    TabIO: TTable;
    Q1: TQuery;
    Edit_dep: TEdit;
    Panel8: TPanel;
    TabMater: TTable;
    Query1: TQuery;
    eChe: TEdit;
    Panel9: TPanel;
    Panel10: TPanel;
    eTotal: TEdit;
    BitBtn2: TBitBtn;
    Button1: TButton;
    Query2: TQuery;
    procedure Edit_MixCardNumChange(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    function ifEnoughStock(sname:string; stock:real):boolean;
    procedure FormShow(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Edit_PerEnter(Sender: TObject);
    procedure Edit_PerExit(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Edit_depEnter(Sender: TObject);

  private
    { Private declarations }
    b_state:integer;
  public
    { Public declarations }
  end;

var
  Form_Rubb_AutoCard: TForm_Rubb_AutoCard;

implementation

uses Unit_Rubb_PrtTakeCard, Unit_Rubb_TakeCard, Unit_Mater_OutCard,
  Unit_Mater_OutFromInCard, Unit_Rubb_QryProcCard, Unit_Rubb_Main,
  Unit_Rubb_piliang, UnitDM, Unit_prjihua, UnitQueryID;

{$R *.DFM}

function TForm_Rubb_AutoCard.ifEnoughStock(sname:string; stock:real):boolean;
begin
  with Q1 do
  begin
    close;
    sql.clear;
    sql.Add('select sum(库存) from 原材料台帐  ');
    sql.Add('where 最后领料标识 = :v_lastOutCardFlag and 材料名称 = :v_mater ');
    sql.Add('group by 材料名称 ');
    parambyname('v_lastOutCardFlag').asboolean:=true;
    parambyname('v_mater').asstring:=sname;
    open;

   // showmessage(sname +'预领料 '+floattostr(stock) +#13+#13+'仓库现有 '+floattostr(fields[0].asfloat));

    if stock > fields[0].asfloat then
      result := false
    else
      result := true;
    end; //with

end;



procedure TForm_Rubb_AutoCard.Edit_MixCardNumChange(Sender: TObject);
begin
  if Edit_MixCardNum.text='' then
    begin
      showmessage('库内没有保存配方单,请输入配方单!');
      exit;
    end;  
  with Qry_exe  do
  begin
    close;
    sql.clear;
    sql.add('select  * from 炼胶配方表 where 配方编号 = :v_MixCardNum ');
    parambyname('v_MixCardNum').asinteger:=strtoint(Edit_MixCardNum.text);
    open;
    Edit_rubb.text:= fieldbyname('制成品名称').asstring;
    if fieldbyname('百分比').asfloat = 0 then
    begin
      Panel_Hint.Font.Color:=clred;
      Panel_Hint.Caption:='请输入每车重量:';
      b_state:=0;
    end
    else
    begin
      Panel_Hint.Font.Color:=clred;
      Panel_Hint.Caption:='请输入每车重量:';
      b_state:=1;
    end;
  end;//with


end;


procedure TForm_Rubb_AutoCard.BitBtn1Click(Sender: TObject);
var
  t_SelfStock,fWeight,fPrice,fTotalWeight:real;  //最后的步骤弥补
  sTakename,sProcBat,sStaff:string;
  temWT, temStock,zongfen, temPer:real;
  temNAME,temDrawCard:string;
  n_id,iID, vkuhao:integer;
  bDrawFlag, bLogic:Boolean;
  bmRubbQry:TBookMark;
begin
  //判断日期是否小于等于结账日期
  if (DateTimePicker1.date) <=dm.zdyGetmaterCheckDate then //d_LimDate then
  begin
    showmessage('您所选择的日期在结账日期之前!'+#13+#13+'请重新选择!'+#13+#13+'上次结帐日期是:'+datetostr(dm.zdyGetmaterCheckDate));
    perform(WM_NEXTDLGCTL,0,0);
    exit;
  end;
  if Qry_TakeCard.Active then
  begin
    showmessage('已经自动领料完毕!如果某原材料库存不够请入库再领料!');
    exit;
  end; //if

  bLogic:=true;

// 必须填写某些栏目
  if (Edit_Per.text = '') or (Edit_Rubb.text = '')  then
  begin
    showmessage('请填写每车重量 ');
    exit;
  end;//if

  if (eChe.text = '') then
  begin
    showmessage('请输入车数');
    exit;
  end; //if

  fTotalWeight:=strtofloat(eChe.text)*strtofloat(Edit_Per.text);
  fTotalWeight:=strtofloat(formatfloat('0.000',fTotalWeight));

  case b_state of
  1:
  begin
    eTotal.text:=floattostr(fTotalWeight); //总重
    try
      strtofloat(Edit_Per.text);
    except
      showmessage('请填写数字!');
      exit;
    end;// try
    with Qry_TakeCard do
      begin
        close;
        sql.clear;
        sql.add(format('select 配方编号,制成品名称,材料名称,百分比/100*'+'"%s"'+' as 重量 from 炼胶配方表 where 配方编号 = :v_MixCardNum ',[floattostr(fTotalWeight)]));
        parambyname('v_MixCardNum').asinteger:=strtoint(Edit_MixCardNum.text);
        open;
      end; //with
    end;
  0:
  begin
   with Q1 do
    begin //求总份数
      close;
      sql.Clear;
      sql.Add('select sum(份数) as zofen from 炼胶配方表 where 配方编号 = :v_MixCardNum ');
      parambyname('v_MixCardNum').asinteger:=strtoint(Edit_MixCardNum.text);
      open;
      zongfen:=fieldbyname('zofen').asfloat;
      zongfen:=strtofloat(formatfloat('0.000',zongfen));
    end; //with
      fTotalWeight:=fTotalWeight/zongfen;
       fTotalWeight:=strtofloat(formatfloat('0.000', fTotalWeight));
      
    //try
     // strtofloat(Edit_per.text);
    //except
      //showmessage('请填写数字!');
     // exit;
    //end;// try
    with Qry_TakeCard do
    begin
      close;
      sql.clear;
      sql.add(format('select 配方编号,制成品名称,材料名称,份数*'+'"%s"'+' as 重量 from 炼胶配方表 where 配方编号 = :v_MixCardNum ',[floattostr(fTotalWeight)]) );
      parambyname('v_MixCardNum').asinteger:=strtoint(Edit_MixCardNum.text);
      open;
      fTotalWeight:=0;
      while not eof do
      begin
        fTotalWeight:=fTotalWeight+ fieldbyname('重量').asfloat;
        next;
      end; //while
      eTotal.text:=floattostr(fTotalWeight);//求总重
      first;
    end; //with
  end;

  end; //case

//检查每种材料库存是否大于出库量
////////////////////////////////////////////////////
////////////////////////////////////////////////////

  Qry_TakeCard.first;
  while not Qry_TakeCard.Eof do
  begin
    temName:=Qry_TakeCard.fieldbyname('材料名称').asstring;
    temWT:=Qry_TakeCard.fieldbyname('重量').asfloat;


    temWT:=strtofloat(formatfloat('0.000',temWt));
    if not ifEnoughStock(temName,temWT) then
      bLogic:=false;

    if not bLogic then
      break; //跳出

    Qry_TakeCard.next;
  end; //while

  //如果不够
  if not bLogic then
  begin
    messagedlg(temName +'的库存不够!'+#13+#13+'现已停止自动领料过程!',mtwarning, [mbok],0);
    exit;
  end; //if

//都够了
  Qry_TakeCard.first;
  while not Qry_TakeCard.Eof do
  begin
    temName:=Qry_TakeCard.fieldbyname('材料名称').asstring;
    temWT:=Qry_TakeCard.fieldbyname('重量').asfloat;

//  if Qry_exe.eof then
//    showmessage('已经到了最后一条,无法继续循环!');


    //选出对应的入库记录
    Qry_exe.close;
    Qry_exe.sql.Clear;
    Qry_exe.sql.Add('select * from 原材料台帐 ');
    Qry_exe.sql.Add('where 材料名称 = :sName and 剩余库存 > 0 and 出入标识 = :bIO ');
    Qry_exe.sql.Add('order by 日期 ');
    Qry_exe.parambyname('sName').asstring:=temName;
    Qry_exe.parambyname('bIO').asBoolean:=false;
    Qry_exe.open;

    if Qry_exe.RecordCount = 0 then
//实际不可能,前面已检查过都够
    begin
      if messagedlg(temName +' 库存量不够 ,缺少' + floattostr(temWT)+' 千克'
      +#13+#13+'  是否继续领料?'+#13+#13+'若继续请按 Yes 键,若中止请按 NO 键'
      +#13+#13+'按 YES 键后,请向其他单位借 '+ floattostr(temWT)+'千克的'+temName+',日后在混炼用料单中手动添加'+ floattostr(temWT)+'千克的'+temName+'!'
      +#13+#13+'按 NO 键后必须在材料仓库的台帐中删除已领取的材料记录!'
      ,mtwarning,[mbyes,mbno],0) = mryes then

        continue  //继续循环
      else
      begin
        showmessage('您已经中止填写用料单!' +#13+#13+'请按"返回"键! ');
        exit;  //跳出该按钮事件
      end; //if
    end
    else
    begin //开始计帐
      while not Qry_exe.eof do
      begin //记下要领材料的信息
      temStock:=Qry_exe.fieldbyname('剩余库存').asfloat;
//    temStock:=temStock - temWT ;
      temPer:=Qry_exe.fieldbyname('单价').asfloat;
      temDrawCard:=Qry_exe.fieldbyname('领料单号').asstring ;
      bDrawFlag:=Qry_exe.fieldbyname('领料标识').asboolean ;
      iID:=Qry_exe.fieldbyname('标识号').asinteger ;
      vkuhao:=Qry_exe.fieldbyname('kuhao').asinteger;

    //如果领料数量小于第一种原料的库存  只需要处理一次
    if ( (temStock - temWT) >= 0 )then  // if 1
    begin
    //第一步
    with Q1 do
    begin //修改入库记录
      close;
      sql.Clear;
      sql.Add('update 原材料台帐 set 剩余库存 = :s , 领料标识 = :bT where 标识号 = :id   ');
      parambyname('s').asfloat:=strtofloat(formatfloat('0.000', (temStock-temWT)));
      parambyname('id').asinteger:=iID;
      parambyname('bT').asboolean:=true;
      execsql;
    end; //with

    //第二步
    with Q1 do
    begin //查出该材料最后一条记录
      close;
      sql.Clear;
      sql.Add('select * from 原材料台帐  ');
      sql.Add('where 材料名称 = :sName and 领料单号 = :card  and 最后领料标识 = :bT ');
      parambyname('sName').asstring:=temName;
      parambyname('card').asstring:=temDrawCard;
      parambyname('bT').asboolean:=true;
      open;
      iID:=fieldbyname('标识号').asinteger;
    end; //with
    with Q1 do
    begin //置该记录最后领料标识
      close;
      sql.Clear;
      sql.Add('update 原材料台帐 set 最后领料标识 = :bF  ');
      sql.Add('where 标识号  = :id ');
      parambyname('id').asinteger:=iID;
      parambyname('bF').asboolean:=false;
      execsql;
    end; //with


    //第三步
   //自动填写 标识号
    with Q1 do
    begin
      close;
      sql.Clear;
      sql.Add('select max(标识号) from 原材料台帐 ');
      open;
    end; //with
//开始写新记录
    with TabIO  do
    begin
      open;
      append;
      fields[0].asinteger:=Q1.fields[0].asinteger + 1;
      fields[1].asdatetime:=DateTimePicker1.date; //日期
      fields[2].asboolean:=true;//出入标识
      fields[3].asstring:=temName;
      fields[4].asstring:='';//入库单号
//      fields[5].asstring:='生产厂家';
//      fields[6].asstring:='进货地点';
//      fields[7].asfloat:=100; //入库数量
      fields[8].asfloat:=strtofloat(formatfloat('0.00',temPer));//temPer; //单价
//      fields[9].asstring:='采购员';
//      fields[10].asstring:='检验员';
//      fields[11].asfloat:=20.5;  //剩余库存
      fields[12].asboolean:=false;//true; //最后领料标识
      fields[13].asstring:=temDrawCard; //领料单号
      if not bDrawFlag then
        fields[14].asstring:='HX'+temDrawCard;  //出库货源号
        fields[15].asstring:=Edit_dep.text;  //使用部门
        with Q1 do
        begin
          close;
          sql.Clear;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -