|
发表于 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
|
-
|