将两个数据集与不同行数

时间:2015-10-21 13:59:56

标签: c# asp.net vba reporting-services ssrs-2008-r2

我有两个数据集,

这两个数据集的行数不同。

我有两个Tablix。每个Tablix指向这两个不同的数据集

在一列中,我想逐行比较两个DataSet。

所以我想要的是这个: enter image description here

这是我的两个Tablix和我的数据集,因为你可以看到数据集2上不存在学生编号10,15和23。

当发生这种情况时,我想写一个0。

如果我使用Lookup表达式,它会在比较每个数据集的行时给出错误:

=IIF(Fields!Student.Value <> Lookup(Fields!Student.Value,Fields!Student.Value,Fields!Student.Value,"Dataset1"),"0","1")

那个表达式会给我一个错误。

这个想法(我认为)是坚持学生21并对数据集1中的每个学生进行比较,当他们相等时,写1和0,而他们不相等但每行。

我无法触及数据集,我的意思是查询。

如果您需要更多信息,请与我们联系。

编辑: 为了提供更多信息,我想要做的是复制我的Web应用程序中的代码在数据层中的作用:

            ReportsDataSet.MyDatasetRow drSchool = (ReportsDataSet.MyDatasetRow)repDset.MyDataset.Rows[0];
            string Student = drSchool.Student;
            bool firstone = true;
            bool hayApproved = false;
            bool hayNotApproved = false;
            bool hayNeedMoreStudy = false;
            bool hayFail = false;
            bool hayG5 = false;
            bool hayNC = false;

            if (repDset.MyDataset.Rows.Count > 0)
            {
                int Count = repDset.MyDataset.Rows.Count;

                for (int i = 0; i < Count; i++)
                {
                    ReportsDataSet.MyDatasetRow dr = (ReportsDataSet.MyDatasetRow)repDset.MyDataset.Rows[i];

                    if (dr.tipo.Trim() == "TOTAL" && firstone)
                    {
                        Student = dr.Student;
                        firstone = false;

                        switch (dr.categoria.Trim())
                        {
                            case "Approved":
                                hayApproved = true;
                                break;
                            case "NotApproved":
                                hayNotApproved = true;
                                break;
                            case "NeedMoreStudy":
                                hayNeedMoreStudy = true;
                                break;
                            case "Fail":
                                hayFail = true;
                                break;
                            case "G5":
                                hayG5 = true;
                                break;
                            case "N/C":
                                hayNC = true;
                                break;
                        }
                    }
                    else
                    {
                        if (dr.tipo.Trim() == "TOTAL" && dr.Student == Student)
                        {
                            switch (dr.categoria.Trim())
                            {
                                case "Approved":
                                    hayApproved = true;
                                    break;
                                case "NotApproved":
                                    hayNotApproved = true;
                                    break;
                                case "NeedMoreStudy":
                                    hayNeedMoreStudy = true;
                                    break;
                                case "Fail":
                                    hayFail = true;
                                    break;
                                case "G5":
                                    hayG5 = true;
                                    break;
                                case "N/C":
                                    hayNC = true;
                                    break;
                            }
                        }
                    }

                    if (dr.Student != Student || i == (Count-1) )
                    {
                        if (!hayApproved)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "Approved", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        if (!hayNotApproved)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "NotApproved", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        if (!hayNeedMoreStudy)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "NeedMoreStudy", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        if (!hayFail)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "Fail", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        if (!hayG5)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "G5", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        if (!hayNC)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "N/C", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        if (!hayApproved && !hayNotApproved && !hayNeedMoreStudy && !hayFail && !hayG5 && !hayNC)
                        {
                            repDset.MyDataset.AddMyDatasetRow(Student, "TOTAL", "TOTAL", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0");
                            Alreadyfilled++;
                        }

                        repDset.MyDataset.AcceptChanges();

                        hayApproved = false;
                        hayNotApproved = false;
                        hayNeedMoreStudy = false;
                        hayFail = false;
                        hayG5 = false;
                        hayNC = false;
                        firstone = true;

                        if (i != (Count - 1))
                        {
                            Student = dr.Student;
                            i--;
                        }
                    }
                }
            }

编辑2:

让我给你更多信息: enter image description here

enter image description here

enter image description here

正如您在上一张图片中所看到的那样,数据集2中不存在学生11,16等我必须放置&#34; 0&#34;。 但我正在使用Lookup比较21和11,21再次11,22和11等等。这不是重点,重点是每次数据集1中存在的学生不在数据集2中时为0。

它应该是这样的,我保存数据集2中学生的值并比较数据集1上的每个学生,当它们不相等时,当它们相等时放0,放1。

可能是一个功能?将数据集1的所有学生保存在列表中,将数据集2的学生保存在另一个列表中,并在自定义代码中的foreach上进行比较?

1 个答案:

答案 0 :(得分:2)

如果没有匹配,Lookup()函数将返回Nothing。它不应该给你一个错误,但你可以检查什么,在这种情况下返回0。我认为您只是在IIF表达式中与错误的事物进行比较。

=IIF(
    IsNothing(Lookup(Fields!Student.Value, Fields!Student.Value, Fields!Student.Value, "Dataset1")),
    0,
    Lookup(Fields!Student.Value, Fields!Student.Value, Fields!Student.Value, "Dataset1")
)

除非你真的想在查找工作时只显示1。在这种情况下:

=IIF(
    IsNothing(Lookup(Fields!Student.Value, Fields!Student.Value, Fields!Student.Value, "Dataset1")),
    0,
    1
)
  

返回

     

返回Variant,如果没有匹配则返回Nothing。

Lookup Function (Report Builder and SSRS)

走查

我要做的事情与你正在尝试完成的事情有所不同,这样你就可以看到查找功能发生了什么。

首先,我创建了两个简单的数据集,每个数据集都包含一个ID和标签列表。第二个数据集只是第一个数据集的一个子集(某些行丢失,但DataSet2中的所有行都存在于DataSet1中)。

<强>数据集1

 id  |  label
-----+-----------
  1  |  Student1-a
  2  |  Student2-a
  3  |  Student3-a
  4  |  Student4-a
...
 25  |  Student25-a

<强> DataSet2

 id  |  label
-----+-----------
  1  |  Student1-b
  5  |  Student5-b
 10  |  Student10-b
 12  |  Student12-b
...
 25  |  Student25-b

然后我在报告上创建两个Tablix。这两个tablix都将数据源设置为 DataSet1 ,因为它包含我将检查DataSet2以使用查找的行。

tablix datasource configuration

我将第一个tablix设置为只显示两列中的ID和标签。第二个tablix显示ID(来自DataSet1)并使用表达式在DataSet2中查找该ID,如果不存在则显示0,如果存在则显示来自dataset2的标签。

tablix layout configuration

我使用的表达是:

=IIF(
    IsNothing(Lookup(Fields!id.Value, Fields!id.Value, Fields!label.Value, "DataSet2")),
    0,
    Lookup(Fields!id.Value, Fields!id.Value, Fields!label.Value, "DataSet2")
)

我得到的输出是这样的,注意所有行是如何出现在第二个tablix中的(因为它是由包含所有行的数据集提供的)但是label列在行时显示0不存在于dataset2中。

output of tablixes