ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 缺料表

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-26 16:02 | 显示全部楼层
zpy2 发表于 2018-4-25 19:37
结果可以复制放到excel,计算我用的是c#,你也可以用vba
using System;
using System.IO;

复制在VBA中显示语法错误呀!

TA的精华主题

TA的得分主题

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

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

对求缺料表的BOM作一下说明,可能这样表达比较直观。

BOM1及物料需求-说明.rar

977.07 KB, 下载次数: 33

TA的精华主题

TA的得分主题

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

对求缺料表的BOM作一下说明,可能这样表达比较直观。
见上一楼附件,谢谢!

TA的精华主题

TA的得分主题

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

谢谢,辛苦了,刚试模拟了一下,计算的结果还是不对。可能算的思路有些不同。你看下24楼对BOM结构计算的说明。看看你的思路是否和说明中的计算步骤是一样的。

TA的精华主题

TA的得分主题

发表于 2018-4-26 18:01 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
h749600173 发表于 2018-4-26 16:49
谢谢,辛苦了,刚试模拟了一下,计算的结果还是不对。可能算的思路有些不同。你看下24楼对BOM结构计算的 ...

这位老师,这个对和不对,应该是有个比对的标准,我下载了最新的附件,没有看到问题手工模拟计算的结果,是否可以把无用的字段去除,就最少的数据模拟。比如,用我以前贴的模拟数据结构,您花点时间计算确认一下是否是结果是我算这样的,一个就3个料号,两个产品,5个sap_code,三次运算就行了。另外,我是c#,不是vba,论坛上关于bom计算的代码非常多,现在的问题不是代码,是业务逻辑。我的bug也是逻辑,不是语法错误。

TA的精华主题

TA的得分主题

发表于 2018-4-26 21:50 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
opiona 发表于 2018-4-26 16:31

数量2018-04-04
2088124有点不同

2018-04-03计算结果一致
Screenshot_2018-04-26-21-47-54.png
Screenshot_2018-04-26-21-47-20.png

TA的精华主题

TA的得分主题

发表于 2018-4-27 06:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zpy2 发表于 2018-4-26 21:50
数量2018-04-04
2088124有点不同

这是我的计算结果和计算过程,请老师指点。
Screenshot_2018-04-27-06-12-37.png

stu.xls.zip

21.88 KB, 下载次数: 26

TA的精华主题

TA的得分主题

发表于 2018-4-27 06:19 | 显示全部楼层
  1. using System;
  2. using System.IO;
  3. using System.Data;
  4. using System.Data.OleDb;      
  5. using System.Text;
  6. using System.Configuration;
  7. using System.Collections;
  8. using System.Web;
  9. using System.Web.Security;
  10. using System.Web.UI;
  11. using System.Web.UI.WebControls;
  12. using System.Web.UI.WebControls.WebParts;
  13. using System.Web.UI.HtmlControls;
  14. using System.Collections.Generic;
  15. using System.Web.Script.Serialization;
  16. using System.Reflection;
  17. using System.Net;
  18. //using System.Exception;
  19. public partial class Index : System.Web.UI.Page
  20. {
  21.      public  string result;//调试输出
  22.      Hashtable htWanted = new Hashtable();//缺料表
  23.      Hashtable htStock = new Hashtable();//库存表
  24.    
  25. System.Text.StringBuilder sb = new System.Text.StringBuilder();//调试输出
  26.    protected void Page_Load(object sender, EventArgs e)
  27.     {
  28.      string sql="";
  29.     //打开数据库
  30.        DAO.DBEngine dbEn2=new DAO.DBEngine();
  31.        DAO.Database db2 = dbEn2.OpenDatabase(System.Web.HttpContext.Current.Server.MapPath("./stu.mdb"))
  32. ;
  33.      //打开库存
  34.      sql="select SAP_Code,库存合计 from 库存2";
  35.      DAO.Recordset rsStock = db2.OpenRecordset(sql)
  36. ;  //库存记录
  37.    while (!rsStock.EOF){
  38.      htStock.Add(rsStock.Fields["SAP_Code"].Value.ToString(),rsStock.Fields["库存合计"].Value);//库存表 为 料号 库存合计 键值对
  39.           //循环下一条
  40.      rsStock.MoveNext();
  41.    }  //while
  42.    rsStock.Close();
  43.    //打开需求表
  44.    sql="select SAP_Code,需求 from 需求2";
  45.          Response.Write("<br>上阶"+sql+"记录数:");

  46.    DAO.Recordset rs2 = db2.OpenRecordset(sql)
  47. ;
  48.         Response.Write(rs2.RecordCount);
  49.    
  50.      while (!rs2.EOF){//循环取出 每个产品料号的需求量
  51.        //取出料号
  52.        string strKey=rs2.Fields[0].Value.ToString();
  53.        //取出需求量
  54.        double dblWanted=(double)rs2.Fields["需求"].Value;
  55.       
  56.       
  57.     //产品也是有库存的,所以,在全部转化为对下级 半阶或原料的需求前,需要计算缺料
  58.    
  59.            //本级的需求2018-4-26 晚
  60.         Response.Write("需求"+strKey+":");
  61.       
  62.         Response.Write(dblWanted);
  63.         Response.Write("库存"+strKey+":");
  64.       
  65.         Response.Write(htStock[strKey]);
  66.           //本级料号 需求 减去 (库存 哈希表 里键值 为 本级 SAP_code的库存)=缺料
  67.    
  68.           dblWanted=dblWanted-Convert.ToDouble(htStock[strKey]);
  69.           if((dblWanted)>0)     //如果需求 大于 库存
  70.           {
  71.           htStock[strKey]=0; //库存量 全部消耗掉 变为0
  72.           //缺料 等于 需求 减 库存合计 缺料进入下一级 消耗
  73.              //分解到下层
  74.            Response.Write("缺料:"+strKey+":");
  75.           Response.Write(dblWanted);
  76.            Response.Write("<br>");
  77.   
  78.           findChild(strKey,dblWanted);
  79.           }else{//dblWanted<0需求 小于0,库存合计 大于 需求量 只要 更新 库存,不要计算下一级 消耗量
  80.          htStock[strKey]=dblWanted;//dblWanted=库存-需求
  81.            Response.Write("库存减少到:"+strKey+":");

  82.            Response.Write(-1*dblWanted);
  83.            Response.Write("<br>");

  84.           }

  85.          
  86.    //  //本级的需求2018-4-26 晚
  87.          
  88.            
  89.            
  90.            Response.Write("<br>");
  91.      Response.Write("   循环 取出 下一个产品");
  92.             Response.Write("<br>");

  93.        //循环 取出 下一个产品
  94.        rs2.MoveNext();
  95.      }//while
  96.    rs2.Close();

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

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

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

  109.    }//page_load
  110.    
  111.    
  112.    //根据 上级的料号,需求量 求出 缺料
  113.    void findChild(string strKeyParent,double dblWantedParent){
  114.     string sql="";
  115.     string strKey="";
  116.       sb.AppendLine(strKeyParent);//输出料号,调试
  117.        //打开bom表
  118.        DAO.DBEngine dbEn=new DAO.DBEngine();
  119.        DAO.Database db = dbEn.OpenDatabase(System.Web.HttpContext.Current.Server.MapPath("./stu.mdb"))
  120. ;
  121.       sql="select 上阶料号,SAP_Code,单耗 from bom2 where 上阶料号 LIKE  '"+strKeyParent+"'";
  122.       Response.Write("<br>上阶"+sql+"记录数:");

  123.       DAO.Recordset rs = db.OpenRecordset(sql)
  124. ;
  125.             

  126.     //     Response.Write("上阶"+strKeyParent+":");
  127.            Response.Write(rs.RecordCount);
  128.        Response.Write("父缺料:"+dblWantedParent+"<br>");
  129.      
  130.       sb.AppendLine("<ol>");
  131.       if(rs.RecordCount==0){//如果是原料,没有经过上面循环分解到下级
  132.           if(htWanted.ContainsKey(strKeyParent)){
  133.            htWanted[strKeyParent]=dblWantedParent+(double)htWanted[strKeyParent];
  134.            Response.Write(strKeyParent+ "缺料增加: " +dblWantedParent );
  135.             Response.Write("<br>");//打印
  136.             Response.Write(strKeyParent+ "缺料增加后: " + htWanted[strKeyParent]);
  137.             Response.Write("<br>");//打印
  138.          
  139.           //缺料增加
  140.            }else{
  141.             htWanted.Add(strKeyParent,dblWantedParent);
  142.             Response.Write(strKeyParent+ "新增缺料: " + htWanted[strKeyParent]);
  143.             Response.Write("<br>");//打印
  144.      
  145.           //新增缺料品种
  146.            }//是否 新缺料
  147.    
  148.       }else{
  149.      while (!rs.EOF){//如果 有下级则循环取出,否则 跳过
  150.        //本级需求转化为下级需求 不需要算 缺料
  151.       // 本级需求=上级数量*本级单耗
  152.       double dblWanted=dblWantedParent*(double)rs.Fields["单耗"].Value;

  153.        strKey=rs.Fields["SAP_Code"].Value.ToString();
  154.        sb.AppendLine("<li>");
  155.        sb.AppendLine(strKey);//显示料号
  156.        sb.AppendLine("</li>");

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

  170.            Response.Write(dblWanted);
  171.            Response.Write("<br>");
  172.       
  173.          // break;
  174.           if((dblWanted)>0)     //如果缺料 大于 库存
  175.           {
  176.           htStock[strKey]=0; //库存量 全部消耗掉 变为0
  177.           //缺料 等于 需求 减 库存合计 缺料进入下一级 消耗
  178.       
  179.           findChild(strKey,dblWanted);
  180.           }else{//dblWanted<0缺料 小于0,库存合计 大于 需求量 只要 更新 库存,不要计算下一级 消耗量
  181.          htStock[strKey]=-1*dblWanted;//dblWanted<0
  182.            Response.Write("库存减少到:"+strKey+":");

  183.            Response.Write(-1*dblWanted);
  184.            Response.Write("<br>");

  185.           }
  186.          
  187.          
  188.           //循环取出下个 子料号
  189.           rs.MoveNext();
  190.         }//while
  191.     }// elseif recordsetCout>0
  192.         //关闭数据库连接
  193.         rs.Close();
  194.         db.Close();
  195.        sb.AppendLine("</ol>");
  196.     }//find

  197. }//class
复制代码

TA的精华主题

TA的得分主题

发表于 2018-4-27 06:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
有点明白了,我算的是截止4日总共缺料多少,楼上老师应该是新增的缺料吧:)算法应该是一样的。1333+666=2000
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 12:42 , Processed in 0.045726 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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