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

📄 mrp.cpp

📁 速达开源ERP系统
💻 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 + -