惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - hyladmin

动态生成收藏夹菜单 內表定义模式 常用的对话框函数使用 SAP各模块简介 BOM展开函数 有关FIELD-SYMBOLS的用法 - hyladmin SAP control编程快速入门 SAP函数大荟萃 ABAP 的 Message Box 的用法 SAP MM 移动类型 SAP库存类型与库存状态 替代物料操作详解 SAP中几种特殊物料 SAP系统中如何处理代管料 SAP BOM分析 SAP FI/CO 基本概念 SAP中库存周转率算法 SAP期初数据导入 SAP FI T-CODE
配料计算方法(笨方法)
hyladmin · 2009-03-05 · via 博客园 - hyladmin

private void btnJS_Click(object sender, EventArgs e)
        {
            //元素的DATASET
            DataTable Phdt = (DataTable)this.gridControl1.DataSource;
            DataTable dt1 = Phdt.Copy();
            DataRow[] dr = dt1.Select("check=1");
            //定义元素中数组
            ArrayList al = new ArrayList();
            string[,] strArray = new string[dr.GetLength(0), 3];
            for (int a = 0; a < dr.GetLength(0); a++)
            {
                //对数组进行赋值,得出每个元素所需要的最大值。 a为元素循环的变量
                al.Add(dr[a]["YS"].ToString());
                strArray[a, 0] = dr[a]["YS"].ToString();
                strArray[a, 1] = dr[a]["ysup"].ToString();
                strArray[a, 2] = dr[a]["ysdown"].ToString();
            }
            //原料的DATASET
            DataTable Yhdt = (DataTable)this.gridControl2.DataSource;
            //DATASET复制
            DataTable dt2 = Yhdt.Copy();
            DataTable dthl = Yhdt.Copy();
            // weight为要生产的重量
            double weight = double.Parse(this.spinEdit1.Text.ToString());
            // parambc为步长
            double parambc = double.Parse(this.spinEdit2.Text.ToString());
            // c为原料在DATASET里的index,可以取到各个原料含量的值
            int c = 0;
            // dsfh 为计算后生成动态的列
            DataTable dtfh = new DataTable();
            dtfh = SetColumn(dtfh, "System.Int32", "ID", true, "序号", false);
            dtfh = SetColumn(dtfh, "System.Boolean", "check", false, "选择", false);
            for (int i = 0; i < dt2.Rows.Count; i++)
            {
                if (dt2.Rows[i].RowState != DataRowState.Deleted)
                {
                    if (dt2.Rows[i][25].ToString().ToLower() == "false")
                    {
                        dtfh = SetColumn(dtfh, "System.Double", dt2.Rows[i]["原料编号"].ToString() + "|" + dt2.Rows[i]["批号"].ToString(), false, dt2.Rows[i]["原料名称"].ToString(), false);
                        dthl.Rows[i].Delete();
                    }
                    else
                    {
                        dt2.Rows[i].Delete();
                    }
                }
            }
            dthl.AcceptChanges();
            dt2.AcceptChanges();
            for (int j = 6; j < 23; j++)
            {
                dtfh = SetColumn(dtfh, "System.Decimal", dt2.Columns[j].ColumnName.ToString(), false, "含" + dt2.Columns[j].ColumnName.ToString() + "量", false);
            }
            dtfh = SetColumn(dtfh, "System.Double", "Feiyong", false, "费用", false);

            this.gridControl3.DataSource = this.gcdHL.DataSource;
            gridControl4.MainView.PopulateColumns();
            this.gridControl3.DataSource = dthl;
            gridControl3.MainView.PopulateColumns();
            FormatGridView(gridView7, 6);
            gridView7.Columns[5].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
            gridView7.Columns[5].DisplayFormat.FormatString = "C";

            string[,] strc = new string[dt2.Rows.Count, 2];

            // 进入递归计算部分
            dtfh = GetFor(dt2, dtfh, weight, c, weight, parambc, strc, strArray);
            // 绑定dtfh列表
            this.gridControl4.DataSource = dtfh;
            gridControl4.MainView.PopulateColumns();

            FormatGridView(gridView8, dt2.Rows.Count + 2);
            gridView8.Columns[dt2.Rows.Count + 19].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
            gridView8.Columns[dt2.Rows.Count + 19].DisplayFormat.FormatString = "C";

            // 按钮状态的改变
            btnNext_Click(sender, e);
        }

        private void FormatGridView(DevExpress.XtraGrid.Views.Grid.GridView dgv, int parmInt)
        {
            dgv.Columns[0].Width = 50;
            dgv.Columns[1].Width = 50;
            for (int i = parmInt; i < parmInt + 17; i++)
            {
                dgv.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
                dgv.Columns[i].DisplayFormat.FormatString = "p";
            }
        }

        /// <summary>
        /// 配料计算函数
        /// </summary>
        /// <param name="dt2">原料的dataset</param>
        /// <param name="dtfh">计算后保存的dataset</param>
        /// <param name="paramB">原料初始投量</param>
        /// <param name="paramC">原料的index</param>
        /// <param name="paramweight">重量</param>
        /// <param name="parambc">步长</param>
        /// <param name="strc">存入现在循环中的重量值</param>
        /// <returns>Dataset</returns>
        private DataTable GetFor(DataTable dt2, DataTable dtfh, double paramB, int paramC, double paramweight, double parambc, string[,] strc, string[,] strArray)
        {
            // 每次子循环paramC+1
            paramC++;
            // 第一个先进行循环
            for (double i = paramB; i > 0; i = i - parambc)
            {
                // 把循环中的重量记录到strc数组中
                strc[paramC - 1, 0] = (paramC - 1).ToString();
                strc[paramC - 1, 1] = i.ToString();
                // tt为总数
                double tt = 0;
                // 之前循环的总量
                double hyl = 0;
                for (int x = 0; x < strc.GetLength(0); x++)
                {
                    if (strc[x, 1] == null)
                    {
                        strc[x, 1] = "0";
                    }
                    tt += double.Parse(strc[x, 1]);
                    if (x < paramC)
                    {
                        hyl += double.Parse(strc[x, 1]);
                    }
                }

                // 看循环的重量是否等于要生产的重量,相等的话直接进行计算。
                if (tt != paramweight)
                {
                    // 看循环是否是最后一个,是就退出'总重量不相等',否进行继续循环
                    if (paramC < dt2.Rows.Count)
                    {
                        // 递归循环
                        GetFor(dt2, dtfh, paramweight - hyl, paramC, paramweight, parambc, strc, strArray);
                    }
                    else
                    {
                        strc = null;
                        break;
                    }
                }
                else
                {
                    // 是否新增一行的标志
                    bool flag = false;
                    // 元素的含量进行判断
                    bool ysflag = true;
                    // 新增一行
                    DataRow row = dtfh.NewRow();
                    row["ID"] = dtfh.Rows.Count + 1;
                    // 进行判断
                    // 定义多少种元素
                    string[,] ysnums = new string[17, 2];
                    // m为原料中元素名称的起始值
                    for (int m = 6; m < 23; m++)
                    {
                        // 元素名称
                        ysnums[m - 6, 1] = dt2.Columns[m].ColumnName.ToString();
                        for (int y = 0; y < dt2.Rows.Count; y++)
                        {
                            if (ysnums[m - 6, 0] != null)
                            {
                                // 元素的总重量
                                ysnums[m - 6, 0] = (double.Parse(dt2.Rows[y][m].ToString()) * double.Parse(strc[y, 1]) + double.Parse(ysnums[m - 6, 0].ToString())).ToString();
                            }
                            else
                            {
                                ysnums[m - 6, 0] = (double.Parse(dt2.Rows[y][m].ToString()) * double.Parse(strc[y, 1])).ToString();
                            }
                        }
                        row[ysnums[m - 6, 1]] = Math.Round(double.Parse(ysnums[m - 6, 0].ToString()) / paramweight, 2).ToString();
                        // 判断含量是否合格
                        for (int w = 0; w < strArray.GetLength(0);w++ )
                        {
                            if (strArray[w,0].ToString() == (ysnums[m - 6, 1].ToString()))
                            {
                                if (double.Parse(row[ysnums[m - 6, 1]].ToString()) > double.Parse(strArray[w, 2].ToString()) || double.Parse(row[ysnums[m - 6, 1]].ToString()) < double.Parse(strArray[w, 1].ToString()))
                                {
                                    ysflag = false;
                                    // 不符合退出 不再进行循环
                                    break;
                                }
                                else
                                {
                                    ysflag = true;
                                }
                            }
                            if (!ysflag)
                            {
                                // 不符合退出 不再进行循环
                                break;
                            }
                        }
                        if (!ysflag)
                        {
                            // 不符合退出 不再进行循环
                            break;
                        }
                    }
                    if (ysflag)
                    {
                        // 费用
                        double money = 0;
                        // 进行库存比较,费用计算,原料名称的循环含量显示
                        for (int k = 0; k < strc.GetLength(0); k++)
                        {
                            // 原料名称的循环含量
                            row[k + 2] = Math.Round(double.Parse(strc[k, 1].ToString()), 2);
                            // 库存是否参与计算
                            if (this.chkKC.Checked)
                            {
                                if (double.Parse(dt2.Rows[k]["原料重量"].ToString()) >= double.Parse(strc[k, 1].ToString()))
                                {
                                    flag = true;
                                }
                                else
                                {
                                    flag = false;
                                    break;
                                }
                            }
                            else
                            {
                                flag = true;
                            }
                            money += double.Parse(dt2.Rows[k]["单价"].ToString()) * double.Parse(strc[k, 1].ToString());
                        }
                        // 费用的添加
                        row["Feiyong"] = Math.Round(money, 2).ToString();
                        // 如果参与计算的库存量比较少的话就不添加行
                        if (flag)
                        {
                            dtfh.Rows.Add(row);
                        }
                    }
                }
            }
            return dtfh;
        }

        /// <summary>
        /// 设置动态的列
        /// </summary>
        /// <param name="myTable">DataTable</param>
        /// <param name="paramType">数据类型</param>
        /// <param name="paramColumn">列名</param>
        /// <param name="paramReadOnly">是否只读</param>
        /// <param name="paramName">列名描述</param>
        /// <param name="paramDefaultValue">false</param>
        /// <returns></returns>
        private DataTable SetColumn(DataTable myTable, string paramType, string paramColumn, bool paramReadOnly, string paramName, bool paramDefaultValue)
        {
            DataColumn mydatacolumn = new DataColumn();
            mydatacolumn.DataType = System.Type.GetType(paramType);
            mydatacolumn.ColumnName = paramColumn;
            mydatacolumn.ReadOnly = paramReadOnly;
            mydatacolumn.Expression = "";
            mydatacolumn.Caption = paramName;
            mydatacolumn.DefaultValue = paramDefaultValue;
            myTable.Columns.Add(mydatacolumn);
            return myTable;
        }