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

📄 mrpcalc.cpp

📁 公司物流电脑管理系统(非常有名).rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -