有一个TableA如下:
Row 明细行数 单据号
1 20 A01
2 19 A02
3 10 A03
4 5 A04
5 4 A05
6 3 A06
7 2 A07
8 2 A08
9 1 A09
要实现20明细行为一个新表,前提是不能拆单据号.如果凑不到20那也生成生成一个表.
用C#怎么写循环才能实现如下结果?大家看看怎么写最快最简单?
Table1
Row 明细行数 单据号
1 20 A01Table2
Row 明细行数 单据号
1 19 A02
2 1 A09Table3
Row 明细行数 单据号
1 10 A03
2 5 A04
3 4 A05Table4
Row 明细行数 单据号
1 3 A06
2 2 A07
3 2 A08










            

解决方案 »

  1.   


    还是不太明白,
    Table2
    Row 明细行数 单据号
    1 19 A02
    2 1 A09 
    这里不是将单据号拆开了吗
      

  2.   

    生成结果:
    Table1 
    Row 明细行数 单据号 
    1 20 A01              明细行为20,所以生成一个新表Table1Table2 
    Row 明细行数 单据号 
    1 19        A02 
    2 1         A09       明细行为 19+1,所以生成一个新表Table2,因为不能拆单号,所以A03中明细行不能拆为1+9,所以只能和单号是A09组合
    Table3 
    Row 明细行数 单据号 
    1 10 A03 
    2 5 A04 
    3 4 A05               明细行为10+5+4,因为没有单据号中明细行为1的单子,所以生成一个新表.规律是明细行从大到小排序.Table4 
    Row 明细行数 单据号 
    1 3 A06 
    2 2 A07 
    3 2 A08               剩下的生成一个表.
      
    我现在想用  foreach (DataRow dr in Table1.Rows)
                { 
                    
                
                }但是我不知道怎么把符合的数据行数再输出一个新表.
      

  3.   

    用SQL语句不行吗?20条填充一个表
      

  4.   


    单号=单据号我的意思很简单,循环表中的row,如果dr["明细行数"]=20,那么输出一个新表.
    如果不等20,那么就凑20,规则是不能把一个单号中的明细行数拆开算.循环结束如果凑不到20也生成一个表.
    所以我说最后的结果是.
    最后一句话,就是.生成新表中,明细行数相加不能大于20.Table1 
    Row 明细行数 单据号 
    1 20 A01              明细行为20,所以生成一个新表Table1 
    Table2 
    Row 明细行数 单据号 
    1 19        A02 
    2 1        A09      明细行为 19+1,所以生成一个新表Table2,因为不能拆单号,所以A03中明细行不能拆为1+9,所以只能和单号是A09组合 
    Table3 
    Row 明细行数 单据号 
    1 10 A03 
    2 5 A04 
    3 4 A05              明细行为10+5+4,因为没有单据号中明细行为1的单子,所以生成一个新表.规律是明细行从大到小排序. Table4 
    Row 明细行数 单据号 
    1 3 A06 
    2 2 A07 
    3 2 A08              剩下的生成一个表. 
      

  5.   


    protected void Page_Load(object sender, EventArgs e)
    {
    // 每个table的行数上限
    const int MaxRows = 20;
    // 当前table的行总数,初始化为比 MaxRows,让它在后续判断可以创建第一个table
    int sum = MaxRows+1;
    // 获取你的数据
    DataTable TableA = GetYouData();
    // 当前的table
    DataTable currentTable = null;
    // 存放各个Table的容器
    DataSet result = new DataSet();

    // 处理每一行数据
    for (int i = 0; i < TableA.Rows.Count; i++)
    {
    // 检查是否超出上限
    if ((int)TableA.Rows[i]["明细行数"] + sum > MaxRows)
    {
    // 放不下了,创建新table
    currentTable = CreateNewTable();
    // 加入到 DataSet
    result.Tables.Add(currentTable);
    // 当前行总数清0
    sum = 0;
    } // 将数据复制到新table
    currentTable.Rows.Add(TableA.Rows[i].ItemArray);
    // 行总数累加
    sum += (int)TableA.Rows[i]["明细行数"];
    }
    }public DataTable CreateNewTable()
    {
    DataTable t = new DataTable();
    t.Columns.Add("row", typeof(int));
    t.Columns.Add("明细行数", typeof(int));
    t.Columns.Add("单据号", typeof(string));
    return t;
    }
      

  6.   

    protected void Page_Load(object sender, EventArgs e)
    {
        // 每个table的行数上限
        const int MaxRows = 20;
        // 当前table的行总数,初始化为比 MaxRows,让它在后续判断可以创建第一个table
        int sum = MaxRows+1;
        // 获取你的数据
        DataTable TableA = GetYouData();
        // 当前的table
        DataTable currentTable = null;
        // 存放各个Table的容器
        DataSet result = new DataSet();
        
        // 处理每一行数据
        for (int i = 0; i < TableA.Rows.Count; i++)
        {
            // 检查是否超出上限
            if ((int)TableA.Rows[i]["明细行数"] + sum > MaxRows)
            {
                // 放不下了,创建新table
                currentTable = CreateNewTable();
                // 加入到 DataSet
                result.Tables.Add(currentTable); 当循环第二行的时候会报错:名为“Table”的 DataTable 已属于此 DataSet
                // 当前行总数清0
                sum = 0;
            }        // 将数据复制到新table
            currentTable.Rows.Add(TableA.Rows[i].ItemArray);
            // 行总数累加
            sum += (int)TableA.Rows[i]["明细行数"];
        }
    }public DataTable CreateNewTable()
    {
        DataTable t = new DataTable();
        t.Columns.Add("row", typeof(int));
        t.Columns.Add("明细行数", typeof(int));
        t.Columns.Add("单据号", typeof(string));
        return t;
    }