• C#中编写sqlserver中自定义函数,实现复杂报表


    有这样一张报表,如图:

    要求用GridView显示,所以查询的结果要么是一个临时表或者是一个查询视图,想到sql2005中加入CLR的支持,有关CLR的操作请看体验:用C#写存储过程(VS.NET 2005) 或者在sqlserver2005中部署C#编写的自定义函数 ,实现的类如下

       1using System;
       2using
     System.Collections.Generic;
       3using
     System.Data;
       4using
     System.Data.SqlClient;
       5using
     System.Data.SqlTypes;
       6using
     Microsoft.SqlServer.Server;
       7using
     System.Collections;
       8

       9public partial class
     WYTableFunction
      10
    {
      11      
    #region Fun_FactIncome_CLR
      12    //这个特性定义了一个sql表值函数,此函数返回的表的定义为:String nvarchar(200)
      13    //
    并且指定了填充这个表的行的方法是FillRow 方法
      14    //注意这个方法返回的一定是一个IEnumerable类型的,并且为公开,静态,这个方法的入参就是sql函数的入参

      15    [SqlFunction(DataAccess = DataAccessKind.Read, TableDefinition = @"tid    int ,unitname nvarchar(100),itemname nvarchar(100),
      16
                    jan    decimal(18,2),feb    decimal(18,2),    mar    decimal(18,2),    apr    decimal(18,2),
      17
                    may    decimal(18,2),jun    decimal(18,2),    jul    decimal(18,2),    aug    decimal(18,2),
      18
                    sep    decimal(18,2),oct    decimal(18,2),    nov    decimal(18,2),    dec    decimal(18,2),
      19                total decimal(18,2),    flag int ", FillRowMethodName = "FillRow3"
    )]
      20    public static IEnumerable Fun_FactIncome_CLR(int iYear, string CompanyID, int
     type)
      21    
    {
      22        List<DataRow> rowList = new List<DataRow>
    ();
      23        DataTable dt = new
     DataTable();
      24        
    #region 表结构
      25        DataColumn col = new DataColumn("tid"typeof(int));
      26
            dt.Columns.Add(col);
      27        dt.Columns.Add("unitname"typeof(string
    ));
      28        dt.Columns.Add("itemname"typeof(string
    ));
      29

      30        AddColumns(ref dt, new string[] "jan""feb""mar""apr""may""jun""jul""aug""sep""oct""nov""dec""total" }
    );
      31

      32        col = new DataColumn("flag"typeof(int
    ));
      33        col.DefaultValue = 0
    ;
      34
            dt.Columns.Add(col);
      35

      36        col = new DataColumn("myTemp"typeof(decimal
    ));
      37        col.Expression = "jan+feb+mar+apr+may+jun+jul+aug+sep+oct+nov+dec"
    ;
      38
            dt.Columns.Add(col);
      39        #endregion

      40        if (type == 0)//总部查询
      41        {
      42            string CompanyList =
     GetCompanyList(CompanyID);
      43            string UnitName = ""
    ;
      44            SearchCompany(iYear, CompanyID, rowList, ref
     dt, CompanyList, UnitName);
      45        }

      46        else if (type == 1)//区域查询
      47        {
      48            string CompanyList =
     GetCompanyList(CompanyID);
      49            string UnitName = ""
    ;
      50            SearchRegion(iYear, CompanyID, rowList, ref
     dt, CompanyList, UnitName);
      51        }

      52        else if (type == 2)//所有楼盘
      53        {
      54            string CompanyList =
     GetCompanyList(CompanyID);
      55            string UnitName = ""
    ;
      56            SearchBuilding(iYear, CompanyID, rowList, ref
     dt, CompanyList, UnitName);
      57        }

      58        else if (type == 3)//自定义楼盘查询
      59        {
      60            string CompanyList =
     GetUnitList(CompanyID);
      61            string UnitName = ""
    ;
      62            dt =
     SearchBuildingDef(iYear, rowList, dt, CompanyList);
      63        }

      64        else if (type == 4)//自定义区域查询
      65        {
      66            string CompanyList =
     GetUnitList(CompanyID);
      67            string UnitName = ""
    ;
      68            SearchRegionDef(iYear, CompanyID, rowList, ref
     dt, CompanyList, UnitName);
      69        }

      70        return rowList as IEnumerable;
      71        //返回一个string 数组,这个数组符合IEnumerable接口,当然你也可以返回hashtable等类型。

      72
      73    }

      74
      75    //自定义楼盘查询

      76    private static DataTable SearchBuildingDef(int iYear, List<DataRow> rowList, DataTable dt, string CompanyList)
      77    
    {
      78        
    #region 数据查询
      79
      80        string Err = null
    ;
      81

      82        //1、服务费收入(本年度)[包括应收部分和优惠]

      83        string sql = @"select sf.UnitName,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney
      84
                                        from finance_preceipt fp 
      85
                                        join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
      86
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
      87
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
      88
                                        join system_framework as sf on sf.unitid=fp.companyid
      89
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) = {0} and  fa.itemtype = 7 
      90
                                        and fp.companyid in ({1})
      91
                                        group by sf.unitcode,sf.UnitName,se.[Name],month(fp.gatherdate)
      92
                            union all
      93
                                        select  sf.UnitName,se.[Name] as itemname,Month(fp.gatherdate) as [Month],sum(far.GainPbMoney) as TotalMoney                        
      94
                                        from Pb_Genledger fp 
      95
                                        join Pb_Datail far on fp.GenledgerID = far.GenledgerID
      96
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
      97
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
      98
                                        join system_framework as sf on sf.unitid=fp.companyid
      99
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) = {0} and  fa.itemtype = 7 
     100
                                        and fp.companyid in ({1})
     101                                    group by sf.unitcode,sf.UnitName,se.[Name],Month(fp.gatherdate);"
    ;
     102        //2、服务费收入(往年)[包括应收部分和优惠]

     103        sql += @"select sf.UnitName,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney
     104
                                        from finance_preceipt fp 
     105
                                        join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     106
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
     107
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     108
                                        join system_framework as sf on sf.unitid=fp.companyid
     109
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) < {0} and  fa.itemtype = 7 
     110
                                        and fp.companyid in ({1})
     111
                                        group by sf.unitcode,sf.UnitName,se.[Name],month(fp.gatherdate)
     112
                            union all
     113
                                        select  sf.UnitName,se.[Name] as itemname,Month(fp.gatherdate) as [Month],sum(far.GainPbMoney) as TotalMoney                        
     114
                                        from Pb_Genledger fp 
     115
                                        join Pb_Datail far on fp.GenledgerID = far.GenledgerID
     116
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
     117
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     118
                                        join system_framework as sf on sf.unitid=fp.companyid
     119
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) < {0} and  fa.itemtype = 7 
     120
                                        and fp.companyid in ({1})
     121                                    group by sf.unitcode,sf.UnitName,se.[Name],Month(fp.gatherdate);"
    ;
     122        //3、服务费收入(预收)

     123        sql += @"    select sf.UnitName,se.[Name] as itemname,month(fi.gatherdate) as [Month],sum(fi.incomeMoney) as TotalMoney    
     124
                                    from finance_rmoney fr 
     125
                                    join finance_income fi on fr.rmoneyid = fi.rmoneyid
     126
                                    join finance_chargeitemset as fc on fc.itemid=fr.itemid
     127
                                    join Sys_Exestype  as se on se.ExecTypeID=fc.ExesTypeID 
     128
                                    join system_framework as sf on sf.unitid=fr.companyid
     129
                                    where fi.incomemoney > 0 and year(fi.gatherdate) = {0} and fc.ExesTypeID=7
     130
                                    and fr.companyid in ({1})    
     131                                group by sf.unitcode,sf.UnitName,se.[Name],month(fi.gatherdate);"
    ;
     132

     133        //4、计划收入

     134        /*sql += @"select  '所有区域' as UnitName,    sum(isnull(janmoney,0))as jan,sum(isnull(febmoney,0))as feb,sum(isnull(marmoney,0))as mar,
     135
                            sum(isnull(aprmoney,0))as apr,sum(isnull(maymoney,0))as may,sum(isnull(junmoney,0))as jun,
     136
                            sum(isnull(julmoney,0))as jul,sum(isnull(augmoney,0))as aug,sum(isnull(septmoney,0))as sep,
     137
                            sum(isnull(octMoney,0))as oct,sum(isnull(NovMoney,0))as nov,sum(isnull(DecMoney,0))as dec
     138                    from plan_income where planyear = {0} and companyID in ({1});";*/

     139        sql += @"select '所有楼盘',sum(p.jan) as jan ,sum(p.feb) as feb,sum(p.mar) as mar,sum(p.apr) as apr,sum(p.may) as may,
     140
                            sum(p.jun) as jun, sum(p.jul) as jul,sum(p.aug) as aug,sum(p.sep) as sep, sum(p.oct) as oct,sum(p.nov) as nov, sum(p.[dec]) as [dec]
     141
                            from (
     142
                            select sf.unitcode,sf.UnitName, sum(isnull(janmoney,0))as jan,sum(isnull(febmoney,0))as feb,sum(isnull(marmoney,0))as mar,
     143
                            sum(isnull(aprmoney,0))as apr,sum(isnull(maymoney,0))as may,sum(isnull(junmoney,0))as jun,
     144
                            sum(isnull(julmoney,0))as jul,sum(isnull(augmoney,0))as aug,sum(isnull(septmoney,0))as sep,
     145
                            sum(isnull(octMoney,0))as oct,sum(isnull(NovMoney,0))as nov,sum(isnull(DecMoney,0))as [dec]
     146
                            from plan_income 
     147
                            join system_framework as sf on sf.unitid=plan_income.companyid
     148
                            where planyear = {0} and companyID in ({1})
     149
                            group by sf.unitcode,sf.UnitName
     150                        ) as p;"
    ;
     151        //5、其他服务收入(除服务费以外)                                                

     152        sql += @"select sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     153
                                    from finance_preceipt fp join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     154
                                    join finance_areceivable fa on far.areceivableid = fa.areceivableid
     155
                                    left join finance_chargeitemset ft on ft.itemid=fa.itemid
     156
                                    left join Sys_ExesGenre on Sys_ExesGenre.ExesGenreID=ft.ExesGenreID
     157
                                    join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     158
                                    left join system_framework as sf on sf.unitid=fa.companyid 
     159
                                    where year(fp.gatherdate)= {0} and  fa.itemtype <> 7 and Sys_ExesGenre.ExesGenreID=1
     160
                                        and fp.companyid in ({1})
     161                                group by sf.unitcode,sf.unitname, se.[Name] ,month(fp.gatherdate) ;"
    ;
     162        //6、空置房(本年)        

     163        sql += @"select sf.unitcode,sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     164
                                    from finance_preceipt fp 
     165
                                    join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     166
                                    join finance_areceivable fa on far.areceivableid = fa.areceivableid
     167
                                    join Sys_Exestype as se on se.ExecTypeID=fa.itemtype
     168
                                    left join system_framework as sf on sf.unitid=fa.companyid 
     169
                                    where year(fp.gatherdate)= {0} and year(fa.enddate) = {0} and fa.UnitOrindividualID is not null and isnull(fa.FavourableSign,0) !=1
     170
                                    and fa.itemtype=7 and fp.companyid in ({1}) 
     171                                group by sf.unitcode,sf.unitname,se.[Name],month(fp.gatherdate) ;"
    ;
     172        //7、空置房(往年)        

     173        sql += @"select sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     174
                                    from finance_preceipt fp 
     175
                                    join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     176
                                    join finance_areceivable fa on far.areceivableid = fa.areceivableid
     177
                                    join Sys_Exestype as se on se.ExecTypeID=fa.itemtype
     178
                                    left join system_framework as sf on sf.unitid=fa.companyid 
     179
                                    where year(fp.gatherdate)= {0} and year(fa.enddate) < {0} and fa.UnitOrindividualID is not null and isnull(fa.FavourableSign,0) !=1
     180
                                    and fa.itemtype=7 and fp.companyid in ({1}) 
     181                                group by sf.unitcode,sf.unitname,se.[Name],month(fp.gatherdate) ;"
    ;
     182        //8、空置房(预收)    

     183        sql += @"select sf.unitcode,sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     184
                                from finance_preceipt fp 
     185
                                join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     186
                                join finance_areceivable fa on far.areceivableid = fa.areceivableid
     187
                                join Sys_Exestype as se on se.ExecTypeID=fa.itemtype
     188
                                left join system_framework as sf on sf.unitid=fa.companyid 
     189
                                where fa.GainMoney>0 and year(fp.gatherdate)= {0} and year(fa.enddate) > {0} and fa.UnitOrindividualID is not null and isnull(fa.FavourableSign,0) !=1
     190
                                and fa.itemtype=7 and fp.companyid in ({1}) 
     191                            group by sf.unitcode,sf.unitname,se.[Name],month(fp.gatherdate) ;"
    ;
     192        //UnitName = sqlHead;

     193        sql = string.Format(sql, iYear, CompanyList);
     194

     195        // throw new Exception();

     196        DataSet ds = AmbitsWY_CLR.Globe.ExecSqlForDataSet(sql, out Err);
     197

     198

     199        if (Err != null
    )
     200        
    {
     201            throw new Exception("错误01:" + Err + "\r\n语句:\r\n" +
     sql);
     202

     203        }

     204
     205        //
    col = new DataColumn("myTemp", typeof(decimal));
     206        //
    col.Expression = "jan+feb+mar+apr+may+jun+jul+aug+sep+oct+nov+dec";
     207        //dt.Columns.Add(col);

     208        #endregion

     209
     210        
    #region 服务费收入
     211        //本年度
     212        DataRow row = dt.NewRow();
     213        row["UnitName"= "服务费收入(本年度)"
    ;
     214
            dt.Rows.Add(row);
     215        InsertData(ref dt, ds.Tables[0], 1
    );
     216        AddSum(ref dt, """小计"11"flag = 1 "
    );
     217

     218        //往年度

     219        row = dt.NewRow();
     220        row["UnitName"= "服务费收入(往年度)"
    ;
     221
            dt.Rows.Add(row);
     222        InsertData(ref dt, ds.Tables[1], 2
    );
     223        AddSum(ref dt, """小计"12"flag = 2 "
    );
     224

     225        //预收款

     226        row = dt.NewRow();
     227        row["UnitName"= "服务费收入(预收款)"
    ;
     228
            dt.Rows.Add(row);
     229        InsertData(ref dt, ds.Tables[2], 3
    );
     230        AddSum(ref dt, """小计"13"flag = 3 "
    );
     231

     232        //合计

     233        AddSum(ref dt, "所有楼盘服务费(④=①+②+③)""合计"7"Flag in (11,12,13)");
     234

     235

     236        //本年收入差异率

     237        CalculatePercent(ref dt, ds.Tables[3]);
     238

     239        #endregion

     240
     241        
    #region 其他服务收入
     242        row = dt.NewRow();
     243        row["UnitName"= "其他服务收入"
    ;
     244
            dt.Rows.Add(row);
     245        InsertData(ref dt, ds.Tables[4], 8
    );
     246        AddSum(ref dt, """小计"18"flag = 8 "
    );
     247        AddSum(ref dt, "所有楼盘总收入(⑥=④+⑤)""共计"18"flag in (7,8) "
    );
     248        #endregion

     249
     250        
    #region 空置房
     251        //本年度
     252        row = dt.NewRow();
     253        row["UnitName"= "空置房(本年度)"
    ;
     254
            dt.Rows.Add(row);
     255        InsertData(ref dt, ds.Tables[5], 4
    );
     256        AddSum(ref dt, """小计"4"flag = 4 "
    );
     257

     258        //往年度

     259        row = dt.NewRow();
     260        row["UnitName"= "空置房(往年度)"
    ;
     261
            dt.Rows.Add(row);
     262        InsertData(ref dt, ds.Tables[6], 5
    );
     263        AddSum(ref dt, """小计"15"flag = 5 "
    );
     264

     265        //预收款

     266        row = dt.NewRow();
     267        row["UnitName"= "空置房(预收款)"
    ;
     268
            dt.Rows.Add(row);
     269        InsertData(ref dt, ds.Tables[7], 6
    );
     270        AddSum(ref dt, """小计"16"flag = 6 "
    );
     271
            dt.AcceptChanges();
     272        for (int i = 0; i < dt.Rows.Count; i++
    )
     273        
    {
     274            dt.Rows[i]["tid"= i + 1
    ;
     275            DataRow row2 =
     dt.Rows[i];
     276            if (AmbitsWY_CLR.Globe.ConvertToInt(row2["Flag"]) > 0
    )
     277                row2["Total"= row2["myTemp"
    ];
     278            else

     279                row2["Total"= DBNull.Value;//空值
     280            rowList.Add(dt.Rows[i]);
     281        }

     282
     283        dt.Columns.Remove("myTemp"
    );
     284

     285        #endregion

     286        return dt;
     287    }

     288    //自定义区域查询
     289    private static void SearchRegionDef(int iYear, string CompanyID, List<DataRow> rowList, ref DataTable dt, string CompanyList, string UnitName)
     290    
    {
     291        
    #region 数据查询
     292        string Err = null;
     293        //1、服务费收入(本年度)[包括应收部分和优惠]

     294        string sql = @"select  (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     295
                                        a.itemname,a.[month],a.[totalmoney]
     296
                                        from (select sf.unitcode,sf.UnitName,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney
     297
                                        from finance_preceipt fp 
     298
                                        join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     299
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
     300
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     301
                                        join system_framework as sf on sf.unitid=fp.companyid
     302
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) = {0} and  fa.itemtype = 7 
     303
                                        and fp.companyid in ({1})
     304
                                        group by sf.unitcode,sf.UnitName,se.[Name],month(fp.gatherdate)
     305
                                        ) as a join system_framework as b on a.unitcode=b.unitcode
     306

     307
                            union all
     308
                                        select (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     309
                                        a.itemname,a.[month],a.[totalmoney]
     310
                                        from (select  sf.unitcode,sf.UnitName,se.[Name] as itemname,Month(fp.gatherdate) as [Month],sum(far.GainPbMoney) as TotalMoney                        
     311
                                        from Pb_Genledger fp 
     312
                                        join Pb_Datail far on fp.GenledgerID = far.GenledgerID
     313
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
     314
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     315
                                        join system_framework as sf on sf.unitid=fp.companyid
     316
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) = {0} and  fa.itemtype = 7 
     317
                                        and fp.companyid in ({1})
     318
                                        group by sf.unitcode,sf.UnitName,se.[Name],Month(fp.gatherdate)
     319                                    ) as a join system_framework as b on a.unitcode=b.unitcode;"
    ;
     320        //2、服务费收入(往年)[包括应收部分和优惠]

     321        sql += @"select (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     322
                                        a.itemname,a.[month],a.[totalmoney]
     323
                                        from (select sf.unitcode,sf.UnitName,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney
     324
                                        from finance_preceipt fp 
     325
                                        join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     326
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
     327
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     328
                                        join system_framework as sf on sf.unitid=fp.companyid
     329
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) < {0} and  fa.itemtype = 7 
     330
                                        and fp.companyid in ({1})
     331
                                        group by sf.unitcode,sf.UnitName,se.[Name],month(fp.gatherdate)
     332
                                        ) as a join system_framework as b on a.unitcode=b.unitcode
     333

     334
                            union all
     335
                                        select  (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     336
                                        a.itemname,a.[month],a.[totalmoney]
     337
                                        from (select  sf.unitcode,sf.UnitName,se.[Name] as itemname,Month(fp.gatherdate) as [Month],sum(far.GainPbMoney) as TotalMoney                        
     338
                                        from Pb_Genledger fp 
     339
                                        join Pb_Datail far on fp.GenledgerID = far.GenledgerID
     340
                                        join finance_areceivable fa on far.areceivableid = fa.areceivableid
     341
                                        join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     342
                                        join system_framework as sf on sf.unitid=fp.companyid
     343
                                        where year(fp.gatherdate)= {0} and year(fa.enddate) < {0} and  fa.itemtype = 7 
     344
                                        and fp.companyid in ({1})
     345
                                        group by sf.unitcode,sf.UnitName,se.[Name],Month(fp.gatherdate)
     346                                    ) as a join system_framework as b on a.unitcode=b.unitcode;"
    ;
     347        //3、服务费收入(预收)

     348        sql += @"    select  (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     349
                                    a.itemname,a.[month],a.[totalmoney]
     350
                                    from (
     351
                                    select sf.unitcode,sf.UnitName,se.[Name] as itemname,month(fi.gatherdate) as [Month],sum(fi.incomeMoney) as TotalMoney    
     352
                                    from finance_rmoney fr 
     353
                                    join finance_income fi on fr.rmoneyid = fi.rmoneyid
     354
                                    join finance_chargeitemset as fc on fc.itemid=fr.itemid
     355
                                    join Sys_Exestype  as se on se.ExecTypeID=fc.ExesTypeID 
     356
                                    join system_framework as sf on sf.unitid=fr.companyid
     357
                                    where fi.incomemoney > 0 and year(fi.gatherdate) = {0} and fc.ExesTypeID=7
     358
                                    and fr.companyid in ({1})    
     359
                                    group by sf.unitcode,sf.UnitName,se.[Name],month(fi.gatherdate)
     360                                ) as a join system_framework as b on a.unitcode=b.unitcode;"
    ;
     361

     362        //4、计划收入

     363        /*sql += @"select  '所有区域' as UnitName,    sum(isnull(janmoney,0))as jan,sum(isnull(febmoney,0))as feb,sum(isnull(marmoney,0))as mar,
     364
                            sum(isnull(aprmoney,0))as apr,sum(isnull(maymoney,0))as may,sum(isnull(junmoney,0))as jun,
     365
                            sum(isnull(julmoney,0))as jul,sum(isnull(augmoney,0))as aug,sum(isnull(septmoney,0))as sep,
     366
                            sum(isnull(octMoney,0))as oct,sum(isnull(NovMoney,0))as nov,sum(isnull(DecMoney,0))as dec
     367                    from plan_income where planyear = {0} and companyID in ({1});";*/

     368        sql += @"select '所有区域',sum(p.jan) as jan ,sum(p.feb) as feb,sum(p.mar) as mar,sum(p.apr) as apr,sum(p.may) as may,
     369
                                    sum(p.jun) as jun, sum(p.jul) as jul,sum(p.aug) as aug,sum(p.sep) as sep, sum(p.oct) as oct,sum(p.nov) as nov, sum(p.[dec]) as [dec]
     370
                                    from (
     371
                                    select b.punitcode as unitcode,(select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     372
                                    a.jan,a.feb,a.mar,a.apr,a.may,a.jun,a.jul,a.aug,a.sep,a.oct,a.nov,a.[dec]
     373
                                    from (
     374
                                    select sf.unitcode,sf.UnitName, sum(isnull(janmoney,0))as jan,sum(isnull(febmoney,0))as feb,sum(isnull(marmoney,0))as mar,
     375
                                    sum(isnull(aprmoney,0))as apr,sum(isnull(maymoney,0))as may,sum(isnull(junmoney,0))as jun,
     376
                                    sum(isnull(julmoney,0))as jul,sum(isnull(augmoney,0))as aug,sum(isnull(septmoney,0))as sep,
     377
                                    sum(isnull(octMoney,0))as oct,sum(isnull(NovMoney,0))as nov,sum(isnull(DecMoney,0))as [dec]
     378
                                    from plan_income 
     379
                                    join system_framework as sf on sf.unitid=plan_income.companyid
     380
                                    where planyear = {0} and companyID in ({1})
     381
                                    group by sf.unitcode,sf.UnitName
     382
                                    ) as a join system_framework as b on a.unitcode=b.unitcode
     383                                ) as p;"
    ;
     384        //5、其他服务收入(除服务费以外)                                                

     385        sql += @"select (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     386
                                    a.itemname,a.[month],a.[totalmoney]
     387
                                    from (
     388
                                    select sf.unitcode,sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     389
                                    from finance_preceipt fp join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     390
                                    join finance_areceivable fa on far.areceivableid = fa.areceivableid
     391
                                    left join finance_chargeitemset ft on ft.itemid=fa.itemid
     392
                                    left join Sys_ExesGenre on Sys_ExesGenre.ExesGenreID=ft.ExesGenreID
     393
                                    join Sys_Exestype  as se on se.ExecTypeID=fa.itemtype
     394
                                    left join system_framework as sf on sf.unitid=fa.companyid 
     395
                                    where year(fp.gatherdate)= {0} and  fa.itemtype <> 7 and Sys_ExesGenre.ExesGenreID=1
     396
                                        and fp.companyid in ({1})
     397
                                    group by sf.unitcode,sf.unitname, se.[Name] ,month(fp.gatherdate)
     398                                )as a join system_framework as b on a.unitcode=b.unitcode ;"
    ;
     399        //6、空置房(本年)        

     400        sql += @"select (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     401
                                    a.itemname,a.[month],a.[totalmoney]
     402
                                    from (
     403
                                    select sf.unitcode,sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     404
                                    from finance_preceipt fp 
     405
                                    join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     406
                                    join finance_areceivable fa on far.areceivableid = fa.areceivableid
     407
                                    join Sys_Exestype as se on se.ExecTypeID=fa.itemtype
     408
                                    left join system_framework as sf on sf.unitid=fa.companyid 
     409
                                    where year(fp.gatherdate)= {0} and year(fa.enddate) = {0} and fa.UnitOrindividualID is not null and isnull(fa.FavourableSign,0) !=1
     410
                                    and fa.itemtype=7 and fp.companyid in ({1}) 
     411
                                    group by sf.unitcode,sf.unitname,se.[Name],month(fp.gatherdate)
     412                                )as a join system_framework as b on a.unitcode=b.unitcode ;"
    ;
     413        //7、空置房(往年)        

     414        sql += @"select (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     415
                                    a.itemname,a.[month],a.[totalmoney]
     416
                                    from (
     417
                                    select sf.unitcode,sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     418
                                    from finance_preceipt fp 
     419
                                    join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     420
                                    join finance_areceivable fa on far.areceivableid = fa.areceivableid
     421
                                    join Sys_Exestype as se on se.ExecTypeID=fa.itemtype
     422
                                    left join system_framework as sf on sf.unitid=fa.companyid 
     423
                                    where year(fp.gatherdate)= {0} and year(fa.enddate) < {0} and fa.UnitOrindividualID is not null and isnull(fa.FavourableSign,0) !=1
     424
                                    and fa.itemtype=7 and fp.companyid in ({1}) 
     425
                                    group by sf.unitcode,sf.unitname,se.[Name],month(fp.gatherdate)
     426                                )as a join system_framework as b on a.unitcode=b.unitcode ;"
    ;
     427        //8、空置房(预收)    

     428        sql += @"select (select unitname from system_framework where unitcode=b.punitcode) as unitname ,
     429
                                a.itemname,a.[month],a.[totalmoney]
     430
                                from (
     431
                                select sf.unitcode,sf.unitname,se.[Name] as itemname,month(fp.gatherdate) as [Month],sum(far.gainmoney) as TotalMoney                        
     432
                                from finance_preceipt fp 
     433
                                join finance_arecei_receiptlist far on fp.receiptid = far.receiptid
     434
                                join finance_areceivable fa on far.areceivableid = fa.areceivableid
     435
                                join Sys_Exestype as se on se.ExecTypeID=fa.itemtype
     436
                                left join system_framework as sf on sf.unitid=fa.companyid 
     437
                                where fa.GainMoney>0 and year(fp.gatherdate)= {0} and year(fa.enddate) > {0} and fa.UnitOrindividualID is not null and isnull(fa.FavourableSign,0) !=1
     438
                                and fa.itemtype=7 and fp.companyid in ({1}) 
     439
                                group by sf.unitcode,sf.unitname,se.[Name],month(fp.gatherdate)
     440                            )as a join system_framework as b on a.unitcode=b.unitcode ;"
    ;
     441        //UnitName = sqlHead;

     442        sql = string.Format(sql, iYear, CompanyList);
     443

     444

     445        DataSet ds = AmbitsWY_CLR.Globe.ExecSqlForDataSet(sql, out
     Err);
     446

     447

     448        if (Err != null
    )
     449        
    {
     450            throw new Exception("错误01:" + Err + "\r\n语句:\r\n" +
     sql);
     451

     452        }

     453
     454        //
    col = new DataColumn("myTemp", typeof(decimal));
     455        //
    col.Expression = "jan+feb+mar+apr+may+jun+jul+aug+sep+oct+nov+dec";
     456        //dt.Columns.Add(col);

     457        #endregion

     458
     459        
    服务费收入
     489
     490        
    其他服务收入
     498
     499        
    空置房
     535    }

     536    //总部查询
     537    private static void SearchCompany(int iYear, string CompanyID, List<DataRow> rowList, ref DataTable dt, string CompanyList, string UnitName)
     538    
    {
     539        
    数据查询
     649
     650        
    服务费收入
     680
     681        
    其他服务收入
     689
     690        
    空置房
     726    }

     727    //楼盘查询
     728    private static void SearchBuilding(int iYear, string CompanyID, List<DataRow> rowList, ref DataTable dt, string CompanyList, string UnitName)
     729    
    {
     730        string Err = null
    ;
     731        
    数据查询
     859
     860        
    服务费收入
     890
     891        
    其他服务收入
     899
     900        
    空置房
     936    }

     937    //区域查询
     938    private static void SearchRegion(int iYear, string CompanyID, List<DataRow> rowList, ref DataTable dt, string CompanyList, string UnitName)
     939    
    {
     940        
    数据查询
    1107
    1108        
    服务费收入
    1138
    1139        
    其他服务收入
    1147
    1148        
    空置房
    1184    }

    1185    private static void AddColumns(ref DataTable dt, string[] colArray)
    1186    
    {
    1187        for (int i = 0; i < colArray.Length; i++
    )
    1188        
    {
    1189            DataColumn col = new DataColumn(colArray[i], typeof(decimal
    ));
    1190            col.DefaultValue = 0
    ;
    1191
                dt.Columns.Add(col);
    1192        }

    1193    }

    1194    /// <summary>
    1195    /// 计算百分比
    1196    /// </summary>

    1197    /// <param name="dt"></param>
    1198    /// <param name="dtData"></param>

    1199    private static void CalculatePercent(ref DataTable dt, DataTable dtData)
    1200    
    {
    1201        string[] sa = new string[] "jan""feb""mar""apr""may""jun""jul""aug""sep""oct""nov""dec" }
    ;
    1202        decimal dTotal = 0, dTotal2 = 0
    ;
    1203        dt.DefaultView.RowFilter = "Flag=7"
    ;
    1204        DataRow row = dt.DefaultView[0
    ].Row;
    1205        dt.DefaultView.RowFilter = ""
    ;
    1206

    1207        DataRow NewRow =
     dt.NewRow();
    1208        NewRow["UnitName"= "--"
    ;
    1209        NewRow["ItemName"= "本年收入差异率"
    ;
    1210        NewRow["flag"= 20
    ;
    1211
            dt.Rows.Add(NewRow);
    1212

    1213        foreach (string s in
     sa)
    1214        
    {
    1215            decimal d = AmbitsWY_CLR.Globe.ConvertToDecimal(dtData.Rows[0
    ][s]);
    1216            if (d != 0)//注意:如果除数为0会出错,所以这里有判断。

    1217                NewRow[s] = AmbitsWY_CLR.Globe.ConvertToDecimal(row[s]) / d * 100;
    1218            else

    1219                NewRow[s] = -1;
    1220            dTotal +=
     d;
    1221            dTotal2 +=
     AmbitsWY_CLR.Globe.ConvertToDecimal(row[s]);
    1222

    1223        }

    1224        if (dTotal != 0)//注意:如果除数为0会出错,所以这里有判断。
    1225            NewRow["Total"= dTotal2 / dTotal * 100;
    1226        else

    1227            NewRow["Total"= -1;
    1228

    1229    }

    1230    /// <summary>
    1231    /// 将数据插入目标表。
    1232    /// </summary>

    1233    /// <param name="dt"></param>
    1234    /// <param name="dtData"></param>
    1235    /// <param name="Flag"></param>

    1236    private static void InsertData(ref DataTable dt, DataTable dtData, int Flag)
    1237    
    {
    1238        string[] sa = new string[] "jan""feb""mar""apr""may""jun""jul""aug""sep""oct""nov""dec" }
    ;
    1239        while (dtData.Rows.Count > 0
    )
    1240        
    {
    1241            
    ////每次都以第一条记录作为月汇总的ItemName,因为使用完后会删除掉。
    1242            //
    string sName = Convert.ToString(dtData.Rows[0]["ItemName"]);
    1243            //
    dtData.DefaultView.RowFilter = "itemName='" + sName + "'";
    1244            //
    DataRow dRow = dt.NewRow();
    1245            //
    dRow["ItemName"] = sName;
    1246            //
    dRow["Flag"] = Flag;
    1247            //
    dt.Rows.Add(dRow);
    1248            //
    foreach (DataRowView row2 in dtData.DefaultView)
    1249            //
    {
    1250

    1251            //
        int iMonth = Convert.ToInt32(row2["Month"]);
    1252            //
        dRow[sa[iMonth - 1]] = row2["TotalMoney"];
    1253            //    dtData.Rows.Remove(row2.Row);//
    删除,已经用完。
    1254            //    //
    dtData.DefaultView.Delete(0);
    1255            //}

    1256            ////dtData.DefaultView.RowFilter = "";
    1257

    1258
    1259            //每次都以第一条记录作为月汇总的ItemName,因为使用完后会删除掉。

    1260            string sName = Convert.ToString(dtData.Rows[0]["ItemName"]);
    1261            string unitName = Convert.ToString(dtData.Rows[0]["UnitName"
    ]);
    1262            dtData.DefaultView.RowFilter = "UnitName='" + unitName + "' and itemName='" + sName + "'"
    ;
    1263            DataRow dRow =
     dt.NewRow();
    1264            dRow["UnitName"=
     unitName;
    1265            dRow["ItemName"=
     sName;
    1266            dRow["Flag"=
     Flag;
    1267
                dt.Rows.Add(dRow);
    1268            foreach (DataRowView row2 in
     dtData.DefaultView)
    1269            
    {
    1270

    1271                int iMonth = Convert.ToInt32(row2["Month"
    ]);
    1272                dRow[sa[iMonth - 1]] = row2["TotalMoney"
    ];
    1273                dtData.Rows.Remove(row2.Row);//
    删除,已经用完。
    1274                //dtData.DefaultView.Delete(0);

    1275            }

    1276            //dtData.DefaultView.RowFilter = "";
    1277        }

    1278    }

    1279    /// <summary>
    1280    /// 添加合计信息
    1281    /// </summary>

    1282    /// <param name="dt"></param>
    1283    /// <param name="ItemName"></param>
    1284    /// <param name="Flag"></param>
    1285    /// <param name="Filter"></param>

    1286    private static void AddSum(ref DataTable dt, string UnitName, string ItemName, int Flag, string Filter)
    1287    
    {
    1288        DataRow row =
     dt.NewRow();
    1289        row["UnitName"=
     UnitName;
    1290        row["ItemName"=
     ItemName;
    1291        row["Flag"=
     Flag;
    1292        string[] sa = new string[] "jan""feb""mar""apr""may""jun""jul""aug""sep""oct""nov""dec" }
    ;
    1293        foreach (string s in
     sa)
    1294        
    {
    1295            row[s] = AmbitsWY_CLR.Globe.ConvertToDecimal(dt.Compute(string.Format("sum({0})"
    , s), Filter));
    1296        }

    1297        dt.Rows.Add(row);
    1298    }

    1299    /// <summary>
    1300    /// 获取公司的所有下级公司ID列表,避免重复查询。
    1301    /// </summary>

    1302    /// <param name="CompanyID"></param>
    1303    /// <returns></returns>

    1304    private static string GetCompanyList(string CompanyID)
    1305    
    {
    1306

    1307        string Err = null
    ;
    1308        string sCode = AmbitsWY_CLR.Globe.GetSqlStringValue("select UnitCode from System_Framework where UnitCode=" + CompanyID, "--"
    );
    1309        if (sCode == "--"
    )
    1310            throw new Exception("获取公司编码出错"
    );
    1311        DataSet ds = AmbitsWY_CLR.Globe.ExecSqlForDataSet("select UnitID from System_Framework where UnitCode like '" + sCode + "%'"out
     Err);
    1312        if (Err != null
    )
    1313        
    {
    1314            throw new Exception("获取公司信息出错:" +
     Err);
    1315

    1316        }

    1317        string IDList = "";
    1318        foreach (DataRow row in ds.Tables[0
    ].Rows)
    1319        
    {
    1320            IDList += (string.IsNullOrEmpty(IDList) ? "" : ","+ Convert.ToString(row["UnitID"
    ]);
    1321        }

    1322        return IDList;
    1323    }

    1324    private static string GetUnitList(string CompanyID)
    1325    
    {
    1326

    1327        string Err = null
    ;
    1328        string sqlstr = string.Format("select unitcode From System_FrameWork Where UnitCode in(select Context from CW_F_GetStringsTable_CLR('{0}',','))"
    , CompanyID);
    1329        DataSet ds = AmbitsWY_CLR.Globe.ExecSqlForDataSet(sqlstr, out
     Err);
    1330        if (Err != null
    )
    1331        
    {
    1332            throw new Exception("获取公司信息出错:" +
     Err);
    1333

    1334        }

    1335        string IDList = "";
    1336        foreach (DataRow row in ds.Tables[0].Rows)
    1337        {
    1338            string sCode = row["unitcode"].ToString();
    1339            DataSet ds1 = AmbitsWY_CLR.Globe.ExecSqlForDataSet("select UnitID from System_Framework where UnitCode like '" + sCode + "%'"out Err);
    1340            foreach (DataRow thisRow in ds1.Tables[0].Rows)
    1341            {
    1342                IDList += (string.IsNullOrEmpty(IDList) ? "" : ","+ Convert.ToString(thisRow["UnitID"]);
    1343            }

    1344
    1345        }

    1346        return IDList;
    1347    }

    1348    //填充返回表的行的方法,这个方法有一定的规定:
    1349    //一定是空返回的void类型,并且入参的第一个必须为object,其后面的参数都必须为out类型
    1350    //参数的类型,个数和顺序由返回表的列结构决定!(在TableDefinition = " String nvarchar(200)"中定义的表结构)
    1351    public static void FillRow3(object row, out int ID, out string UnitName, out string ItemName, out decimal jan, out decimal feb, out decimal mar, out decimal apr, out decimal may, out decimal jun, out decimal jul, out decimal aug, out decimal sep, out decimal oct, out decimal nov, out decimal dec, out decimal Total, out int Flag)
    1352    {
    1353        //这个object 其实就是GetStrings(string x,char y)函数返回的迭代,这样你直接赋值给那个列就可以了。
    1354        DataRow objRow = row as DataRow;
    1355        if (objRow == null)
    1356        {
    1357            ID = 0;
    1358            UnitName = "";
    1359            ItemName = "";
    1360            jan = 0;
    1361            feb = 0;
    1362            mar = 0;
    1363            apr = 0;
    1364            may = 0;
    1365            jun = 0;
    1366            jul = 0;
    1367            aug = 0;
    1368            sep = 0;
    1369            oct = 0;
    1370            nov = 0;
    1371            dec = 0;
    1372            Total = 0;
    1373            Flag = 0;
    1374        }

    1375        else
    1376        {
    1377            ID = AmbitsWY_CLR.Globe.ConvertToInt(objRow["tID"], -1);
    1378            UnitName = Convert.ToString(objRow["UnitName"]);
    1379            ItemName = Convert.ToString(objRow["ItemName"]);
    1380            jan = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["jan"]);
    1381            feb = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["feb"]);
    1382            mar = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["mar"]);
    1383            apr = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["apr"]);
    1384            may = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["may"]);
    1385            jun = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["jun"]);
    1386            jul = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["jul"]);
    1387            aug = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["aug"]);
    1388            sep = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["sep"]);
    1389            oct = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["oct"]);
    1390            nov = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["nov"]);
    1391            dec = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["dec"]);
    1392
    1393            Total = AmbitsWY_CLR.Globe.ConvertToDecimal(objRow["total"]);
    1394            Flag = AmbitsWY_CLR.Globe.ConvertToInt(objRow["Flag"]);
    1395        }

    1396    }

    1397    #endregion

    1398
    1399}

    1400
    1401
    1402
    1403
  • 相关阅读:
    CentOS 6.5下安装MySQL 5.6.21
    Java文件实时监控Commons-io
    quartz 实例记录
    Quartz任务调度快速入门(转)
    MySQL日期时间函数大全(转)
    struts2 jsp 传参 NullPointerException问题解决
    hibernate cascade=CascadeType.All
    struts2 学习记录 过滤器 国际化
    struts2 struts1.x 区别
    学习 自己的过滤器和监听器
  • 原文地址:https://www.cnblogs.com/bingyun84/p/1604663.html
Copyright © 2020-2023  润新知