📄 mmps.cpp
字号:
delete McrQuery;
throw Exception("系统计划展望期值出错!");
}
PeriodLen=RstStr.ToInt();
switch(PeriodType)
{
case 1:
PlanLen=PeriodLen;
break;
case 2:
PlanLen=PeriodLen * 7;
break;
case 3:
PlanLen=PeriodLen * 10;
break;
case 4:
PlanLen=PeriodLen * 15;
break;
case 5:
PlanLen=PeriodLen * 30;
break;
case 6:
PlanLen=PeriodLen * 90;
break;
case 7:
PlanLen=PeriodLen * 183;
break;
case 8:
PlanLen=PeriodLen * 366;
break;
}
TADOQuery *MrpQuery=new TADOQuery(Application);
MrpQuery->Connection=Connection;
MrpQuery->SQL->Clear();
MrpQuery->SQL->Add("select Curdate,CurFmonth from sdvw_curvalue");
MrpQuery->Open();
if(MrpQuery->RecordCount<=0)
{
delete MrpQuery;
delete McrQuery;
throw Exception("读取当前日期及当前月份失败!");
}
CurDate=MrpQuery->FieldValues["CurDate"];
CurFmonth=MrpQuery->FieldValues["CurFmonth"];
MrpQuery->Close();
EndDate=TDateTime(StrToDate(CurDate)+PlanLen).FormatString("yyyy-mm-dd");
SqlStr="select * from sdcale where CaleSocDate='"+EndDate+"'";
MrpQuery->SQL->Clear();
MrpQuery->SQL->Add(SqlStr);
MrpQuery->Open();
if(MrpQuery->RecordCount<=0)
{
delete MrpQuery;
delete McrQuery;
throw Exception("工厂日历没有覆盖整个计划运算期!");
}
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::BufferInit(struct LinkRec **BufferHead)
{
//初试化物料需求缓冲区
struct GoodsRec tmpRec;
TADOQuery *MrpQuery=new TADOQuery(Application);
MrpQuery->Connection=Connection;
MrpQuery->Close();
MrpQuery->SQL->Clear();
MrpQuery->SQL->Add("select McrdGoods,McrdRDate,McrdRQty,McrdFrom from sdmcrd,sdGoods ");
MrpQuery->SQL->Add("where McrdGoods=GoodsCode and McrdFrom =4 order by McrdGoods");
MrpQuery->Open();
MrpQuery->First();
while(!MrpQuery->Eof)
{
//相关需求物料入缓冲区
tmpRec.Code=MrpQuery->FieldValues["McrdGoods"];
tmpRec.ReqQty=MrpQuery->FieldValues["McrdRQty"];
tmpRec.ReqDate=MrpQuery->FieldValues["McrdRDate"];
tmpRec.From=MrpQuery->FieldValues["McrdFrom"];
//tmpRec.LowLevel=MrpQuery->FieldValues["GoodsLlc"];
/*if(tmpRec.LowLevel<0)
{
delete MrpQuery;
throw Exception("物料<"+tmpRec.Code+">低层码不能小于0");
}*/
LinkAddRec(tmpRec,BufferHead);
MrpQuery->Next();
}
delete MrpQuery;
}
//---------------------------------------------------------------------------
//实现在LinkHead指向的链中增加一个物料记录
//LinkHead是指向链头指针的指针
void __fastcall TsdMrp::LinkAddRec(struct GoodsRec Rec,struct LinkRec **LinkHead)
{
struct LinkRec * p,* q;
struct GoodsRec *rec;
rec=new struct GoodsRec;
rec->Code=Rec.Code;
rec->ReqDate=Rec.ReqDate;
rec->ReqQty=Rec.ReqQty;
rec->LowLevel=Rec.LowLevel;
rec->From=Rec.From;
q=new struct LinkRec;
q->Rec=rec;
p=*LinkHead;
if(p == NULL)
{
q->Next=NULL;
p=q;
}
else
{
q->Next=p;
p=q;
}
*LinkHead=p;
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::DestroyLink(struct LinkRec * Head)
{
struct LinkRec * tmp,*next;
if(Head == NULL)
return;
tmp=Head;
while(tmp != NULL)
{
next=tmp->Next;
delete tmp->Rec;
delete tmp;
tmp=next;
}
}
//---------------------------------------------------------------------------
//函数实现将缓冲BuuferHead内低层码等于LevelCode的物料记录放入队列QueueHead
void __fastcall TsdMrp::BufferToQueue(int LevelCode,struct LinkRec **BufferHead,struct LinkRec **QueueHead)
{
struct LinkRec * tmp,*pre,*p;
p=*QueueHead;
tmp=*BufferHead;//tmp是遍历整个缓冲区指针
pre=tmp; //pre是tmp的前驱指针
while(tmp != NULL)
{
if(tmp->Rec->LowLevel == LevelCode)
{
if(tmp == *BufferHead)
{
*BufferHead=tmp->Next; //缓冲头指针后移
tmp->Next=p; //将tmp链接到队列QueueHead
p=tmp;
tmp=*BufferHead;
pre=tmp;
}
else
{
pre->Next=tmp->Next; //将tmp从缓冲区删除
tmp->Next=p; //将tmp链接到队列QueueHead
p=tmp;
tmp=pre->Next;
}
}
else
{
pre=tmp;
tmp=pre->Next;
}
}
*QueueHead=p;
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::PlanIn()
{
AnsiString SqlStr;
TADOQuery *m_Query=new TADOQuery(Application);
m_Query->Connection=Connection;
SqlStr="Exec SdMrp_CaleSupply '"+EndDate+"'";
m_Query->Close();
m_Query->SQL->Clear();
m_Query->SQL->Add(SqlStr);
try
{
m_Query->ExecSQL();
delete m_Query;
}
catch(Exception &e)
{
delete m_Query;
throw Exception("计算物料供应失败!"+e.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::ClearMrp()
{
AnsiString SqlStr;
TADOQuery *m_Query=new TADOQuery(Application);
m_Query->Connection=Connection;
SqlStr="Exec KsMps_Clear ";
m_Query->Close();
m_Query->SQL->Clear();
m_Query->SQL->Add(SqlStr);
try
{
m_Query->ExecSQL();
delete m_Query;
}
catch(Exception &e)
{
delete m_Query;
throw Exception("清空MRP计划数据失败"+e.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::PlanGross(AnsiString sCode,AnsiString sDate,double dQty)
{
//计算队列所有低层码等于TierCounter的物料毛需求
AnsiString sql;
TADOQuery *m_Query=new TADOQuery(Application);
m_Query->Connection=Connection;
m_Query->Close();
m_Query->SQL->Clear();
sql="exec sdmrp_CaleGross '"+sCode+"','"+sDate+"',"+AnsiString(dQty)+",'"+Planner+"',"+AnsiString(PlanLen);
m_Query->SQL->Add(sql);
try
{
m_Query->ExecSQL();
delete m_Query;
}
catch(Exception &e)
{
delete m_Query;
throw Exception("计算物料<"+sCode+">毛需求失败!"+e.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::PlanNet(AnsiString sCode)
{
//计算净需求
AnsiString sql;
TADOQuery *m_Query=new TADOQuery(Application);
m_Query->Connection=Connection;
m_Query->Close();
m_Query->SQL->Clear();
sql="exec sdmrp_CaleNet '"+sCode+"'";
m_Query->SQL->Add(sql);
try
{
m_Query->ExecSQL();
delete m_Query;
}
catch(Exception &e)
{
delete m_Query;
throw Exception("计算物料<"+sCode+">净需求失败!"+e.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TsdMrp::BalanceMrp(AnsiString Code)
{
//平衡物料需求
TADOQuery *m_Query=new TADOQuery(Application);
m_Query->Connection=Connection;
m_Query->Close();
m_Query->SQL->Clear();
m_Query->SQL->Add("exec sdmrp_CaleBalance '"+Code+"'");
try
{
m_Query->ExecSQL();
delete m_Query;
}
catch(Exception &e)
{
delete m_Query;
throw Exception("平衡MRP计算失败!"+e.Message);
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -