📄 unit_rubb_autocard.pas
字号:
{$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 + -