【问题标题】:Array to Return Year End Balances For The Past Five Years - (C#)返回过去五年的年终余额的数组 - (C#)
【发布时间】:2011-05-04 14:56:00
【问题描述】:

我试图只返回过去五年的年终信息(12 月 31 日),并在 DataGrid 中显示该信息。这不包括当年。

我的程序目前正在显示从上一年到当年最近一个月的最后一天的月末信息(例如:当前月份是 2011 年 5 月,我的 DataGrid 中显示的信息显示了存储的数据2010 年 1 月 31 日;2010 年 2 月 28 日;2010 年 3 月 31 日....2010 年 12 月 31 日;2011 年 1 月 31 日;2011 年 2 月 28 日;2011 年 3 月 31 日;4 月 30 日, 2011)。

它还会在 2010 年 12 月 31 日之后添加一个总计行,在 2011 年 4 月 30 日之后添加另一个总计行。新的 DataGrid 中不需要这两个总计行。

下面是返回月末信息的当前代码的 sn-p。

如果我遗漏了任何信息或不清楚我的问题,请告诉我。

对于这样一个菜鸟问题,我提前道歉,过去几天我一直在发疯,我无法弄清楚。

protected DataSet DS;
protected DataRow dr, dNew;

private void GetInfo()
{

}

private double getDbl(string columnName)
{
    if (dr[columnName] != DBNull.Value)
        return Double.Parse(dr[columnName].ToString());
    return 0;
}

private void Calculate()
{
    double cg, na, n, ka, nka, kaa, tca;
    double tmr, to, gpo;
    int year, rowcnt, rowindx, months;

    months = -1;
    rowindx = 0;
    cg = 0;
    na = 0;
    n = 0;
    ka = 0;
    nka = 0;
    kaa = 0;
    tca = 0;
    tmr = 0;
    tor = 0;
    gpo = 0;

    rowcnt = DS.Tables[0].Rows.Count;

    if (rowcnt > 0) year = Int32.Parse(DS.Tables[0].Rows[0]["cy"].ToString());
    else year = 0;

    for (int i = 0; i < rowcnt; i++)
    {
        months++;
        dr = DS.Tables[0].Rows[i]

        if (year != Int32.Parse(dr["cy"].ToString())
        {
            dNew = DS.Tables[0].NewRow();
            dNew["ind"] = rowindx;
            dNew["cg"] = cg;
            dNew["na"] = na;
            dNew["n"] = n;
            dNew["ka"] = ka / months;
            dNew["nka"] = nka / months;
            dNew["kaa"] = kaa / months;
            dNew["tca"] = tca / months;
            dNew["tmr"] = tmr / months;
            dNew["tor"] = tor;
            dNew["gpo"] = gpo / months;

            cg = 0;
            na = 0;
            n = 0;
            ka = 0;
            nka = 0;
            kaa = 0;
            tca = 0;
            tmr = 0;
            tor = 0;
            gpo = 0;
            months = 1;
            year = Int32.Parse(dr["cy"].ToString());
            rowindx++;

            DS.Tables[0].Rows.Add(dNew);

            dNew = DS.Tables[0].NewRow();
            dNew["ind"] = rowindx;
            rowindx++;
            DS.Tables[0].Rows.Add(dNew);
        }

        cg += getDbl("cg");
        na += getDbl("na");
        n += getDbl("n");
        ka += getDbl("ka");
        nka += getDbl("nka");
        kaa += getDbl("kaa");
        tca += getDbl("tca");
        tmr += getDbl("tmr");
        tor += getDbl("tor");
        gpo += getDbl("gpo");
        dr["ind"] = rowindx;
        rowindx++;
    }

    dNew = DS.Tables[0].NewRow();
    dNew["ind"] = rowindx;
    dNew["cg"] = cg;
    dNew["na"] = na;
         dNew["n"] = naum;
         dNew["ka"] = ka / months;
         dNew["nka"] = nka / months;
         dNew["kaa"] = kaa / months;
         dNew["tca"] = tca / months;
         dNew["tmr"] = tmr / months;
         dNew["tor"] = tor;
         dNew["gpo"] = gpo / months;
         DS.Tables[0].Rows.Add(dNew);

      DS.Tables[0].DefaultView.Sort = "ind";
}

【问题讨论】:

  • 您遗漏了您的问题。你有什么问题?
  • 这些数据来自哪里?如果它来自数据库,我建议您执行一个为您计算数据的查询。
  • 我建议您从问题中删除所有不必要的内容,以便人们更好地理解您的问题。例如,我不认为所有这些 "dNew["ka"] = ka / 月;dNew["nka"] = nka / 月;dNew["kaa"] = kaa / 月;"应该在那里,他们只是让那些从实际问题中得到帮助的人分散注意力。

标签: c# arrays


【解决方案1】:

您是否尝试过将数据集查询限制在您想要的年份?

【讨论】:

  • 是的,数据来自数据库,我将查询设置为返回参数以显示“DateTime.Now.Year - 5”,这确实带回了过去 5 年的数据。唯一的事情是它带回了过去5年的月末数据。我得到了 50 行,而不是只有 5 行(2006、2007、2008、2009、2010)。
  • 我认为您需要显示查询。计算正在对所有行执行其工作,您要么需要一次执行 1 年(在查询中),要么更改循环以执行所需的数学运算。
  • 您需要发布查询,因为您应该得到 60 个结果而不是 50 个。
  • 我觉得应该没那么难。基本上我会考虑更改查询以便使用年份(所以你会做 5 次选择)。或者将 for 循环更改为一次做几年的工作。
  • 不确定我可以用当前状态的代码做到这一点。试着用伪代码写下你想做的事。可能从您的查询开始,并将最后一条语句更改为 cy = :cy。只需专注于先做 1 年。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多