📄 mrpcalc.cpp
字号:
pNode1->PchQty=0;
pNode1->Source=pPrd->brothersource;
pSeq1=new RqSeq;
pSeq1->itself=pNode1;
pSeq1->parent=parentNode;
pSeq1->next=NULL;
for (pMtrl1=pRqMtrl;pMtrl1!=NULL;pMtrl1=pMtrl1->next)
if (pMtrl1->MtrlID==pNode1->MtrlID)
{
/*
pSeq1=new RqSeq;
pSeq1->itself=pNode1;
pSeq1->parent=parentNode;
pSeq1->next=NULL;
*/
if (pMtrl1->firstRq==NULL)
{
pMtrl1->firstRq=pSeq1;
}
else
{
if (pMtrl1->firstRq->itself->RqDate>=pNode1->RqDate)
{
pSeq1->next=pMtrl1->firstRq;
pMtrl1->firstRq=pSeq1;
}
else
{
pSeq2=pMtrl1->firstRq;
/*
for (pSeq3=pSeq2->next;pSeq3!=NULL;pSeq3=pSeq3->next)
if (pSeq3->itself->RqDate>=pNode1->RqDate)
{
pSeq1->next=pSeq3;
pSeq2->next=pSeq1;
break;
}
else
{
pSeq2=pSeq2->next;
}
*/
pSeq3=pSeq2->next;
if (pSeq3==NULL)
{
pSeq2->next=pSeq1;
}
else
for (;pSeq3!=NULL;pSeq3=pSeq3->next)
if (pSeq3->itself->RqDate>=pNode1->RqDate)
{
pSeq1->next=pSeq3;
pSeq2->next=pSeq1;
break;
}
else
{
pSeq2=pSeq2->next;
}
if (pSeq3==NULL)
{
pSeq2->next=pSeq1;
}
}
}
pMtrl1->counter++;
break;
}
if (pMtrl1==NULL)
{
pMtrl1=new RqMtrl;
pMtrl1->MtrlID=pNode1->MtrlID;
pMtrl1->Storage=pPrd->brotherStorage;
pMtrl1->counter=1;
pMtrl1->firstRq=pSeq1;
pMtrl1->next=NULL;
if (pRqMtrl==NULL)
{
pRqMtrl=pMtrl1;
}
else
{
for (pMtrl2=pRqMtrl;pMtrl2->next!=NULL;pMtrl2=pMtrl2->next);
pMtrl2->next=pMtrl1;
}
}
if (pNode1->Source!=src)
{
pNode1->son=GenLeftTree(pNode1);
}
else
{
pNode1->son=NULL;
}
pNode1->brother=GenRightTree(parentNode,pNode1->NodeID);
return pNode1;
}
void CMRPCalc::GenTree()
{
CalcNode *pNode1;
for (pNode1=pRoot;pNode1!=NULL;pNode1=pNode1->brother)
pNode1->son=GenLeftTree(pNode1);
return;
}
long CMRPCalc::RqCalc()
{
bool finish;
double dblQty,dblAllcQty,dblRestAllcQty;
RqSeq *pSeq;
RqMtrl *pMtrl;
_bstr_t FilterStr,FilterStr2;
char strbuf[50];
// _RecordsetPtr pRstMtrlWare,pRstAllocMx;
do
{
finish=true;
for (pMtrl=pRqMtrl;pMtrl!=NULL;pMtrl=pMtrl->next)
if (pMtrl->counter > 0)
{
finish=false;
dblQty=0;
pSeq=pMtrl->firstRq;
if (pSeq->parent==NULL)
{
dblQty=pSeq->itself->PrvdQty;
}
else
if (pSeq->parent->RqQty!=-1)
{
dblQty=pSeq->parent->RqQty*pSeq->itself->Scale*(1+pSeq->itself->Loss);
pSeq->itself->PrvdQty=dblQty;
}
if (dblQty>0)
{
//_itoa(pMtrl->MtrlID,FilterStr,10);
//FilterStr="MtrlID="+FilterStr;
sprintf(strbuf,"MtrlID= %d",pMtrl->MtrlID);
FilterStr=strbuf;
if ((pMtrl->Storage>=dblQty) && (pMtrl->Storage>0))
{
// allocate material
try
{
pRstMtrlWare->Filter=FilterStr;
dblRestAllcQty=dblQty;
// 待分配数量
while (true)
if ((double)pRstMtrlWare->Fields->Item["noallocqty"]->Value >= dblRestAllcQty)
{
pRstMtrlWare->Fields->Item["noallocqty"]->Value = (double)pRstMtrlWare->Fields->Item["noallocqty"]->Value - dblRestAllcQty;
pRstMtrlWare->Fields->Item["allocqty"]->Value =(double)pRstMtrlWare->Fields->Item["allocqty"]->Value + dblRestAllcQty;
pRstMtrlWare->Update();
sprintf(strbuf,"(billtype=2) AND (relid=%d) AND (mtrlwareid=%d)",pSeq->itself->OrderID,(long)pRstMtrlWare->Fields->Item["mtrlwareid"]->Value);
FilterStr2=strbuf;
pRstAllocMx->Filter=FilterStr2;
if (pRstAllocMx->EndOfFile)
{
pRstAllocMx->AddNew();
pRstAllocMx->Fields->Item["billtype"]->Value=(long)2;
// 分配给生产令
pRstAllocMx->Fields->Item["mtrlwareid"]->Value=(long)pRstMtrlWare->Fields->Item["mtrlwareid"]->Value;
pRstAllocMx->Fields->Item["relid"]->Value=pSeq->itself->OrderID;
pRstAllocMx->Fields->Item["allocqty"]->Value=dblRestAllcQty;
}
else
{
pRstAllocMx->Fields->Item["allocqty"]->Value=dblRestAllcQty+(long)pRstAllocMx->Fields->Item["allocqty"]->Value;
}
pRstAllocMx->Update();
break;
}
else
{
dblAllcQty = (double)pRstMtrlWare->Fields->Item["noallocqty"]->Value;
//本次分配数量
pRstMtrlWare->Fields->Item["allocqty"]->Value =(double)pRstMtrlWare->Fields->Item["allocqty"]->Value + dblAllcQty;
pRstMtrlWare->Fields->Item["noallocqty"]->Value=(long)0;
pRstMtrlWare->Update();
sprintf(strbuf,"(billtype=2) AND (relid=%d) AND (mtrlwareid=%d)",pSeq->itself->OrderID,(long)pRstMtrlWare->Fields->Item["mtrlwareid"]->Value);
FilterStr2=strbuf;
pRstAllocMx->Filter=FilterStr2;
if (pRstAllocMx->EndOfFile)
{
pRstAllocMx->AddNew();
pRstAllocMx->Fields->Item["billtype"]->Value=(long)2;
// 分配给生产令
pRstAllocMx->Fields->Item["mtrlwareid"]->Value=(long)pRstMtrlWare->Fields->Item["mtrlwareid"]->Value;
pRstAllocMx->Fields->Item["relid"]->Value=pSeq->itself->OrderID;
pRstAllocMx->Fields->Item["allocqty"]->Value=dblAllcQty;
}
else
pRstAllocMx->Fields->Item["allocqty"]->Value=dblAllcQty+(long)pRstAllocMx->Fields->Item["allocqty"]->Value;
pRstAllocMx->Update();
dblRestAllcQty -= dblAllcQty;
pRstMtrlWare->MoveNext();
}
}
catch(...)
{
m_OprtOK=false;
return(0);
}
pMtrl->Storage-=dblQty;
pMtrl->counter--;
pSeq->itself->RqQty=0;
// DestroyTree(pSeq->itself->son);
// pSeq->itself->son=NULL;
pMtrl->firstRq=pSeq->next;
delete(pSeq);
}
else
{
//allocate mtrl
if (pMtrl->Storage>0)
{
try
{
pRstMtrlWare->Filter=FilterStr;
while (!pRstMtrlWare->EndOfFile)
{
dblAllcQty=pRstMtrlWare->Fields->Item["noallocqty"]->Value;
pRstMtrlWare->Fields->Item["allocqty"]->Value =(double)pRstMtrlWare->Fields->Item["allocqty"]->Value + dblAllcQty;
pRstMtrlWare->Fields->Item["noallocqty"]->Value=(long)0;
pRstMtrlWare->Update();
sprintf(strbuf,"(billtype=2) AND (relid=%d) AND (mtrlwareid=%d)",pSeq->itself->OrderID,(long)pRstMtrlWare->Fields->Item["mtrlwareid"]->Value);
FilterStr2=strbuf;
pRstAllocMx->Filter=FilterStr2;
if (pRstAllocMx->EndOfFile)
{
pRstAllocMx->AddNew();
pRstAllocMx->Fields->Item["billtype"]->Value=(long)2;
// 分配给生产令
pRstAllocMx->Fields->Item["mtrlwareid"]->Value=(long)pRstMtrlWare->Fields->Item["mtrlwareid"]->Value;
pRstAllocMx->Fields->Item["relid"]->Value=pSeq->itself->OrderID;
pRstAllocMx->Fields->Item["allocqty"]->Value=dblAllcQty;
}
else
{
pRstAllocMx->Fields->Item["allocqty"]->Value=dblAllcQty+(long)pRstAllocMx->Fields->Item["allocqty"]->Value;
}
pRstAllocMx->Update();
pRstMtrlWare->MoveNext();
}
}
catch(...)
{
m_OprtOK=false;
return(0);
}
}
pSeq->itself->RqQty=dblQty - pMtrl->Storage;
pMtrl->Storage=0;
pMtrl->counter--;
pMtrl->firstRq=pSeq->next;
delete(pSeq);
}
}
if (dblQty==0)
{
pSeq->itself->RqQty=0;
pMtrl->counter--;
pMtrl->firstRq=pSeq->next;
delete(pSeq);
}
}
}while(finish==false);
return(0);
}
void CMRPCalc::DestroyTree(CalcNode *pCurNode)
{
if (pCurNode==NULL) return;
DestroyTree(pCurNode->son);
DestroyTree(pCurNode->brother);
delete(pCurNode);
return;
}
STDMETHODIMP CMRPCalc::MRP()
{
// TODO: Add your implementation code here
CalcNode *pNode;
GenTree();
RqCalc();
for (pNode=pRoot;pNode!=NULL;pNode=pNode->brother)
AccessTree(pNode->son);
return S_OK;
}
void CMRPCalc::AccessTree(CalcNode *pNode)
{
// _RecordsetPtr pRstRslt;
if (pNode==NULL) return;
if ((pNode->RqQty!=0) || (pNode->PrvdQty!=0))
{
try
{
pRstRslt->AddNew();
pRstRslt->Fields->Item["OrderID"]->Value=pNode->OrderID;
pRstRslt->Fields->Item["MtrlID"]->Value=pNode->MtrlID;
pRstRslt->Fields->Item["RqQty"]->Value=pNode->RqQty;
pRstRslt->Fields->Item["RqDate"]->Value=pNode->RqDate;
pRstRslt->Fields->Item["PrvdQty"]->Value=pNode->PrvdQty;
pRstRslt->Update();
}
catch(...)
{
m_OprtOK=false;
return;
}
AccessTree(pNode->son);
}
AccessTree(pNode->brother);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -