配料计算方法(笨方法)

 

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;
        }

转载于:https://www.cnblogs.com/hyladmin/archive/2009/03/05/1403706.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值