ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: h749600173

[求助] 缺料表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-25 10:50 来自手机 | 显示全部楼层
h749600173 发表于 2018-4-25 10:23
可否写成码看看一下,您可以结合我的另一个帖子(您也有回复的)一起看看,谢谢!

http://club.excelh ...

请确认一下上面的计算结果是否正确?如果正确,就可以在上面数据结构的基础上开始写代码了,就是一个递归,中间有库存的判断。
这个计算最终不能分解的原料的缺料,应该就是MRP的主要功能吧,否则,进销存也行了。
另外,用Excel公式,数据量大,可能会有问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-25 17:36 | 显示全部楼层
zpy2 发表于 2018-4-24 21:39
需求表
SAP_Code        需求
2087601        1

看不大明白,可否放在EXCEL中?

TA的精华主题

TA的得分主题

发表于 2018-4-25 19:37 来自手机 | 显示全部楼层
h749600173 发表于 2018-4-25 17:36
看不大明白,可否放在EXCEL中?

结果可以复制放到excel,计算我用的是c#,你也可以用vba
using System;
using System.IO;
using System.Data;
using System.Data.OleDb;      
using System.Text;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Reflection;
using System.Net;
//using System.Exception;
public partial class Index : System.Web.UI.Page
{
     public  string result;//调试输出
     Hashtable htWanted = new Hashtable();//缺料表
     Hashtable htStock = new Hashtable();//库存表
   
System.Text.StringBuilder sb = new System.Text.StringBuilder();//调试输出
   protected void Page_Load(object sender, EventArgs e)
    {
     string sql="";
/*htStock.Add("x",0);
     Response.Write((double)(int)htStock["x"]);
     return;装箱拆箱要一致0被转成int
     */
    //打开数据库
       DAO.DBEngine dbEn2=new DAO.DBEngine();
       DAO.Database db2 = dbEn2.OpenDatabase(System.Web.HttpContext.Current.Server.MapPath("./stu.mdb"))
;
     //打开库存
     sql="select SAP_Code,库存合计 from 库存2";
     DAO.Recordset rsStock = db2.OpenRecordset(sql)
;  //库存记录
   while (!rsStock.EOF){
     htStock.Add(rsStock.Fields["SAP_Code"].Value.ToString(),rsStock.Fields["库存合计"].Value);//库存表 为 料号 库存合计 键值对
          //循环下一条
     rsStock.MoveNext();
   }  //while
   rsStock.Close();
   //打开需求表
   sql="select SAP_Code,需求 from 需求2";
   DAO.Recordset rs2 = db2.OpenRecordset(sql)
;

     while (!rs2.EOF){//循环取出 每个产品料号的需求量
       //取出料号
       string strKey=rs2.Fields[0].Value.ToString();
       //取出需求量
       double dblWanted=(double)rs2.Fields["需求"].Value;
    //产品是没有库存的,所以,全部转化为对下级 半阶或原料的需求,不需要计算缺料
         //分解到下层
       findChild(strKey,dblWanted);
       //循环 取出 下一个产品
       rs2.MoveNext();
     }//while
   rs2.Close();

   db2.Close();
   //输出
//  result=sb.ToString();  
  Response.Write("<br><br> ");

        Response.Write("缺料表:<br> ");

         ICollection key = htWanted.Keys;
         // 获取缺料哈希表键的集合
         foreach (string k in key)
         {//输出缺料
            Response.Write(k + "缺料: " + htWanted[k]);
            Response.Write("<br>");//打印库存缺料
         }

   }//page_load
   
   
   //根据 上级的料号,需求量 求出 缺料
   void findChild(string strKeyParent,double dblWanted){
    string sql="";
    string strKey="";
      sb.AppendLine(strKeyParent);//输出料号,调试
       //打开bom表
       DAO.DBEngine dbEn=new DAO.DBEngine();
       DAO.Database db = dbEn.OpenDatabase(System.Web.HttpContext.Current.Server.MapPath("./stu.mdb"))
;
      sql="select 上阶料号,SAP_Code,单耗 from bom2 where 上阶料号 LIKE  '"+strKeyParent+"'";
      Response.Write("上阶"+sql+"记录数:");

      DAO.Recordset rs = db.OpenRecordset(sql)
;

    //     Response.Write("上阶"+strKeyParent+":");
           Response.Write(rs.RecordCount);
       Response.Write("<br>");
     
      sb.AppendLine("<ol>");
      if(rs.RecordCount==0){//如果是原料,没有经过上面循环分解到下级
          if(htWanted.ContainsKey(strKeyParent)){
           htWanted[strKeyParent]=dblWanted+(double)htWanted[strKeyParent];
           Response.Write(strKeyParent+ "缺料增加: " + htWanted[strKeyParent]);
            Response.Write("<br>");//打印
      
          //缺料增加
           }else{
            htWanted.Add(strKeyParent,dblWanted);
            Response.Write(strKeyParent+ "新增缺料: " + htWanted[strKeyParent]);
            Response.Write("<br>");//打印
     
          //新增缺料品种
           }//是否 新缺料
   
      }else{
     while (!rs.EOF){//如果 有下级则循环取出,否则 跳过
       //本级需求转化为下级需求 不需要算 缺料
      // Response.Write("上阶"+sql+":<br>有下级");
       strKey=rs.Fields["SAP_Code"].Value.ToString();
       sb.AppendLine("<li>");
       sb.AppendLine(strKey);//显示料号
       sb.AppendLine("</li>");

       //这里的单耗不能用哈希表,因为,一个code对应不同的上阶,所以不同的单耗
       //这里对本级子料的需求量等于 传入上级料号 需求量* 本级的 单耗
       dblWanted=dblWanted*(double)rs.Fields["单耗"].Value;
       //输出调试
       Response.Write("需求"+strKey+":");
      
        Response.Write(dblWanted);
        Response.Write("库存"+strKey+":");
      
        Response.Write(htStock[strKey]);
          //本级料号 需求 减去 (库存 哈希表 里键值 为 本级 SAP_code的库存)=缺料
   
          dblWanted=dblWanted-Convert.ToDouble(htStock[strKey]);
           Response.Write("缺料:"+strKey+":");

           Response.Write(dblWanted);
           Response.Write("<br>");
      
         // break;
          if((dblWanted)>0)     //如果缺料 大于 库存
          {
          htStock[strKey]=0; //库存量 全部消耗掉 变为0
          //缺料 等于 需求 减 库存合计 缺料进入下一级 消耗
      
          findChild(strKey,dblWanted);
          }else{//dblWanted<0缺料 小于0,库存合计 大于 需求量 只要 更新 库存,不要计算下一级 消耗量
         htStock[strKey]=Convert.ToDouble(htStock[strKey])+dblWanted;//dblWanted<0
           Response.Write("库存减少:"+strKey+":");

           Response.Write(dblWanted);
           Response.Write("<br>");

          }
         
         
          //循环取出下个 子料号
          rs.MoveNext();
        }//while
    }// elseif recordsetCout>0
        //关闭数据库连接
        rs.Close();
        db.Close();
       sb.AppendLine("</ol>");
    }//find

}//class


Screenshot_2018-04-25-19-34-58.png

TA的精华主题

TA的得分主题

发表于 2018-4-25 19:38 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
h749600173 发表于 2018-4-25 17:36
看不大明白,可否放在EXCEL中?

数据可以从excel导入的。
Screenshot_2018-04-25-19-38-18.png

TA的精华主题

TA的得分主题

发表于 2018-4-25 20:39 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zpy2 发表于 2018-4-25 19:38
数据可以从excel导入的。

现在咋不能发代码了,发的代码都不能显示啊。
Screenshot_2018-04-25-19-34-58.png
Screenshot_2018-04-25-20-38-40.png

TA的精华主题

TA的得分主题

发表于 2018-4-25 21:17 来自手机 | 显示全部楼层
有个运算上bug,现在看不出错在哪里,明天再研究下。

TA的精华主题

TA的得分主题

发表于 2018-4-25 21:31 来自手机 | 显示全部楼层
这个增加了一个 半成品 库存 的确 和以前全部展开到底层原材料 再去求库存有点不同。

TA的精华主题

TA的得分主题

发表于 2018-4-25 22:31 | 显示全部楼层
BOM1及物料需求-QQ14885553.rar (1.02 MB, 下载次数: 87)

只能帮你到这里了,太费力!

QQ截图20180425222927.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-26 15:33 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-26 15:47 | 显示全部楼层
本帖最后由 h749600173 于 2018-4-26 16:08 编辑
opiona 发表于 2018-4-25 22:31
只能帮你到这里了,太费力!


opiona,刚刚试运行了一下,运算的结果有点不对,如:2087601在4/1需求1000,库存有3000,但在缺料表中显示缺料1000.结果应够库存才对。请有空的时候再帮看看,谢谢!
若看BOM时要看BOM结构,不要看“上阶料号”栏。“上阶料号”栏只是为了方便看BOM的结构。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 18:35 , Processed in 0.042062 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表