📄 mrp.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Mrp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "QueryBaseForm"
#pragma link "SDGrid"
#pragma resource "*.dfm"
#define ParaCode "109" //计划管理参数代码
TfrmMrp *frmMrp;
//---------------------------------------------------------------------------
__fastcall TfrmMrp::TfrmMrp(TComponent* Owner)
: TQueryBaseForm(Owner)
{
Initiate();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::Initiate()
{
int BeginColNum;
FilterStr="";
sSQL="";
GetParaValue();
sgMrp->ColCount=11+zx_ColNum+jh_ColNum+xq_ColNum;
sgMrp->RowCount=1;
sgMrp->Cells[0][0]="物料编码";
sgMrp->Cells[1][0]="物料名称";
sgMrp->Cells[2][0]="批量";
sgMrp->Cells[3][0]="提前期";
sgMrp->Cells[4][0]="当前库存";
sgMrp->Cells[5][0]="安全库存";
sgMrp->Cells[6][0]="已分配量";
sgMrp->Cells[7][0]="低层码";
sgMrp->Cells[8][0]="需求来源";
sgMrp->Cells[9][0]="需求类型";
sgMrp->Cells[10][0]="当期";
/*
if(zx_ColNum+jh_ColNum+xq_ColNum > 20)
{
tbMainBar->Enabled=false;
throw Exception("系统参数定义的总列数超限");
}
*/
BeginColNum=11; //起始周期列数
for(int i=0;i<zx_ColNum;i++)
{
sgMrp->Cells[BeginColNum+i][0]="执行"+IntToStr(i+1)+"区";
}
BeginColNum+=zx_ColNum;
for(int i=0;i<jh_ColNum;i++)
{
// sgMrp->Columns[BeginColNum+i].ColumnFont->Color=clRed;
sgMrp->Cells[BeginColNum+i][0]="计划"+IntToStr(i+1)+"区";
}
BeginColNum+=jh_ColNum;
for(int i=0;i<xq_ColNum;i++)
{
sgMrp->Cells[BeginColNum+i][0]="需求"+IntToStr(i+1)+"区";
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::tbQueryClick(TObject *Sender)
{
if(!ShowQueryWindow())
return;
try{
StartWaitForm("正在查询,请稍候...");
FillGridWithData();
}
__finally
{
EndWaitForm();
}
}
//---------------------------------------------------------------------------
bool __fastcall TfrmMrp::ShowQueryWindow()
{
TfrmQuForm *FQuery=new TfrmQuForm(this,this->Name);
FQuery->ShowModal();
if(FQuery->CancelQuery)
return false;
FilterStr=FQuery->CreateSqlString;
delete FQuery;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::ClearControl(bool BringToNext)
{
return;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::GetDataFromComObject()
{
return;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::WaitUserInput()
{
return;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::RefreshGridData(int mAction)
{
return;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::DisplayBill()
{
return;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::GetBill(AnsiString BillID)
{
return;
}
//---------------------------------------------------------------------------
//获取查询语句
AnsiString __fastcall TfrmMrp::GetQueryStr()
{
AnsiString Selectstr,Fromstr,Wherestr,Orderstr;
Selectstr =" select * ";
Fromstr=" from SDVW_Mrp ";
Wherestr=" where MrpdRDate >= '"+g_sdCurDate+"'";
if(FilterStr!="")
Wherestr+=" and "+FilterStr;
Orderstr=" order by MrpGoods,MrpdType,MrpdRDate";
sSQL=Selectstr+Fromstr+Wherestr+Orderstr;
return(sSQL);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::FillGridWithData()
{
TComResultSet *RsQuery;
AnsiString ItemStr,sSql;
AnsiString Tempstr,Tempstr1,Tempstr2;
AnsiString sRDate;
int iQty;
//获取查询语句
sSql=GetQueryStr();
if(sSql=="")
return;
sgMrp->RowCount=1;
RsQuery=NewResultSet();
try
{
RsQuery->Open(sSql,"");
RsQuery->MoveFirst();
Tempstr1="";
Tempstr2="";
sgMrp->ScrollBars=ssNone; //取消滚动条,防止屏幕滚动
while( RsQuery->Eof == 0)
{
Tempstr= RsQuery->FieldByName("MrpGoods");
if(Tempstr!=Tempstr1) //不同物料
{
Tempstr1=Tempstr;
Tempstr2= RsQuery->FieldByName("MrpdType");
ItemStr= RsQuery->FieldByName("MrpGoods")+
"\t"+RsQuery->FieldByName("GoodsName")+
"\t"+RsQuery->FieldByName("MrpEoq")+
"\t"+RsQuery->FieldByName("MrpLt")+
"\t"+RsQuery->FieldByName("MrpCiq")+
"\t"+RsQuery->FieldByName("MrpSiq")+
"\t"+RsQuery->FieldByName("MrpDiq")+
"\t"+RsQuery->FieldByName("MrpLlc")+
"\t"+DataConvert("MrpFrom",RsQuery->FieldByName("MrpFrom"))+
"\t"+DataConvert("MrpdType",RsQuery->FieldByName("MrpdType"))+
"\t"+AnsiString("0");
sgMrp->AddItem(ItemStr);
sgMrp->Row=sgMrp->RowCount-1;
sRDate=RsQuery->FieldByName("MrpdRDate");
iQty=StrToIntDef(RsQuery->FieldByName("MrpdQty"),0);
WriteMrpQty(sgMrp->Row,sRDate,iQty);
}
else //相同物料
{
Tempstr= RsQuery->FieldByName("MrpdType");
if(Tempstr!=Tempstr2) //相同物料,不同需求类型
{
Tempstr2=Tempstr;
ItemStr= AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+AnsiString(" ")+
"\t"+DataConvert("MrpdType",RsQuery->FieldByName("MrpdType"))+
"\t"+AnsiString("0");
sgMrp->AddItem(ItemStr);
sgMrp->Row=sgMrp->RowCount-1;
sRDate=RsQuery->FieldByName("MrpdRDate");
iQty=StrToIntDef(RsQuery->FieldByName("MrpdQty"),0);
WriteMrpQty(sgMrp->Row,sRDate,iQty);
}
else //相同物料,相同需求类型,不同的需求日期
{
sRDate=RsQuery->FieldByName("MrpdRDate");
iQty=StrToIntDef(RsQuery->FieldByName("MrpdQty"),0);
WriteMrpQty(sgMrp->Row,sRDate,iQty);
}
}
RsQuery->MoveNext();
}
RsQuery->Close();
}
__finally
{
delete RsQuery;
}
sgMrp->ScrollBars=ssBoth;//设置滚动条
if(sgMrp->RowCount>1)
{
sgMrp->Row=1;
sgMrp->Col=1;
}
}
//---------------------------------------------------------------------------
//在GRID的第iRow行中添加日期为sDate的需求数量iQty
void __fastcall TfrmMrp::WriteMrpQty(int iRow,AnsiString sDate,int iQty)
{
AnsiString sCurDate=g_sdCurDate; //当前日期
AnsiString zxDate,jhDate,xqDate;
int BeginColNum,tmpQty;
div_t PerNum; //整除后的返回类型,包括商(quot)和余数(rem)
if(sDate < sCurDate)
return; //小于当前日期不执行
BeginColNum=11; //区间起始列序号
zxDate=FormatDateTime("yyyy-mm-dd",StrToDate(sCurDate)+zx_ColNum*zx_ColPer*DayNum); //执行区间的结束日期
jhDate=FormatDateTime("yyyy-mm-dd",StrToDate(zxDate)+jh_ColNum*jh_ColPer*DayNum); //计划区间的结束日期
xqDate=FormatDateTime("yyyy-mm-dd",StrToDate(jhDate)+xq_ColNum*xq_ColPer*DayNum); //需求区间的结束日期
if(sDate < zxDate) //在执行区间内
{
PerNum=div((StrToDate(sDate)-StrToDate(sCurDate)),zx_ColPer*DayNum);
tmpQty=StrToIntDef(sgMrp->Cells[BeginColNum+PerNum.quot][iRow],0);
if(sgMrp->Cells[9][iRow]=="计划库存")
tmpQty=iQty; //计划库存不累加
else
tmpQty+=iQty;
sgMrp->Cells[BeginColNum+PerNum.quot][iRow]=IntToStr(tmpQty);
return;
}
if(sDate < jhDate) //在计划区间内
{
PerNum=div((StrToDate(sDate)-StrToDate(zxDate)),jh_ColPer*DayNum);
tmpQty=StrToIntDef(sgMrp->Cells[BeginColNum+zx_ColNum+PerNum.quot][iRow],0);
if(sgMrp->Cells[9][iRow]=="计划库存")
tmpQty=iQty; //计划库存不累加
else
tmpQty+=iQty;
sgMrp->Cells[BeginColNum+zx_ColNum+PerNum.quot][iRow]=IntToStr(tmpQty);
return;
}
if(sDate < xqDate) //在需求区间内
{
PerNum=div((StrToDate(sDate)-StrToDate(jhDate)),xq_ColPer*DayNum);
tmpQty=StrToIntDef(sgMrp->Cells[BeginColNum+zx_ColNum+jh_ColNum+PerNum.quot][iRow],0);
if(sgMrp->Cells[9][iRow]=="计划库存")
tmpQty=iQty; //计划库存不累加
else
tmpQty+=iQty;
sgMrp->Cells[BeginColNum+zx_ColNum+jh_ColNum+PerNum.quot][iRow]=IntToStr(tmpQty);
return;
}
}
//---------------------------------------------------------------------------
AnsiString __fastcall TfrmMrp::DataConvert(AnsiString sFieldName,AnsiString sFieldValue)
{
sFieldName=UpperCase(sFieldName);
if(sFieldName=="MRPDTYPE") //需求类型
{
if(sFieldValue=="1")
return("毛需求");
if(sFieldValue=="2")
return("计划入库");
if(sFieldValue=="3")
return("计划库存");
if(sFieldValue=="4")
return("净需求");
if(sFieldValue=="5")
return("计划订单");
if(sFieldValue=="6")
return("计划下达");
}
if(sFieldName=="MRPFROM") //需求来源
{
if(sFieldValue=="1")
return("采购");
if(sFieldValue=="2")
return("制造");
}
return("");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::muFirstClick(TObject *Sender)
{
if(sgMrp->RowCount > 1)
sgMrp->Row=1;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::muPreviousClick(TObject *Sender)
{
if(sgMrp->RowCount > 1 && sgMrp->Row > 1)
sgMrp->Row=sgMrp->Row-1;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::muNextClick(TObject *Sender)
{
if(sgMrp->RowCount > 1 && sgMrp->Row < sgMrp->RowCount-1)
sgMrp->Row=sgMrp->Row+1;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::muLastClick(TObject *Sender)
{
if(sgMrp->RowCount > 1)
sgMrp->Row=sgMrp->RowCount-1;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::tbRefreshClick(TObject *Sender)
{
if(sSQL=="")
return;
FillGridWithData();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMrp::GenData()
{
AnsiString sSQL;
if ( Application->MessageBox("确定要重新生成物料需求计划(MRP)吗?","系统提示",MB_YESNO) == IDNO)
return;
TComResultSet *RsQuery=NewResultSet();
sSQL=" select PlannerCode from sdPlanner where PlannerCode='"+g_sdUserCode+"'";
try
{
try
{
StartWaitForm("正在生成计划...");
RsQuery->Open(sSQL,"");
RsQuery->MoveFirst();
if( RsQuery->RecordCount < 1 )
{
RsQuery->Close();
delete RsQuery;
throw Exception("当前用户不是计划员,操作被禁止");
}
comServer=NewDcomAppSvr(euSdMrp);
comServer->Execute(WideString(g_sdUserCode));
FillGridWithData();
}
catch(Exception &e)
{
throw Exception(e.Message);
}
}
__finally
{
EndWaitForm();
comServer->FreeClass();
delete RsQuery;
}
}
void __fastcall TfrmMrp::GetParaValue()
{
//从参数表sdparameter中获取所需参数
TComResultSet *pResultSet=NewResultSet();
AnsiString strSQL,strItem,strValue;
strSQL=" select parameteritem,parametervalue from sdparameter ";
strSQL=strSQL+" where parametertype = 2 and parametercode like '"+ParaCode+"%'";
try
{
pResultSet->Close();
pResultSet->Open(strSQL,"");
//清空私有变量
zx_Num=0;
zx_ColNum=0;
zx_ColPer=0;
jh_Num=0;
jh_ColNum=0;
jh_ColPer=0;
xq_Num=0;
xq_ColNum=0;
xq_ColPer=0;
PeriodType=0;
DayNum=0;
pResultSet->MoveFirst();
while(!pResultSet->Eof)
{
strItem=pResultSet->FieldByName("parameteritem");
strValue=pResultSet->FieldByName("parametervalue");
switch(StrToInt(strItem))
{
case 2:
zx_Num=StrToInt(strValue);
break;
case 5:
zx_ColNum=StrToInt(strValue);
break;
case 6:
zx_ColPer=StrToInt(strValue);
break;
case 3:
jh_Num=StrToInt(strValue);
break;
case 7:
jh_ColNum=StrToInt(strValue);
break;
case 8:
jh_ColPer=StrToInt(strValue);
break;
case 4:
xq_Num=StrToInt(strValue);
break;
case 9:
xq_ColNum=StrToInt(strValue);
break;
case 10:
xq_ColPer=StrToInt(strValue);
break;
case 11:
PeriodType=StrToInt(strValue);
break;
default:
break;
}
pResultSet->MoveNext();
}
pResultSet->Close();
}
__finally
{
delete pResultSet;
}
switch(PeriodType)
{
//周期类型 1-天,2-周,3-旬,4-半月,5-月,6-季,7-半年,8-年
//周期类型间隔天数 天-1,周-7,旬-10,半月-15,月-30,季-90,半年-183,年-366
case 1:
DayNum=1;
break;
case 2:
DayNum=7;
break;
case 3:
DayNum=10;
break;
case 4:
DayNum=15;
break;
case 5:
DayNum=30;
break;
case 6:
DayNum=90;
break;
case 7:
DayNum=183;
break;
case 8:
DayNum=366;
break;
default:
tbMainBar->Enabled=false;
throw Exception("计划周期参数错误");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -