⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clsprocstat.cs

📁 以构建的方式来实现对通用的查询统计
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.Text;
using dist.hb.EnvQueryStat.Pub;
using  ESRI.ArcGIS.Carto;
using System.Data;
using System.Data.OleDb;
using ESRI.ArcGIS.Geodatabase;

namespace dist.hb.EnvQueryStat.Stat
{

  /// <summary>
  /// 主分组是地图时,进行地图统计
  /// </summary>
  class clsProcStat
  {
    public clsStatEnv StatEnv;
    public clsCreateStatTable StatTable;
    public clsProcStat()
    {
      StatEnv = null;
      StatTable =  new clsCreateStatTable();
    }
    public void Stat()
    {
      if (StatEnv == null) return;
      StatTable.StatEnv = StatEnv;
      StatTable.Initialize();
      Stat1();
      Stat2();
      Stat3();
    }

    #region "处理情况1:主分组为地图,目标图层与分组图层不相同,还有次分组"
    private bool Stat1()
    {
      if (StatEnv == null || StatTable == null || StatEnv.MapControl == null) return false;
      if (StatEnv.MainGroupType != 0) return false;//0表示,主分组为地图
      if (StatTable.MainGroupList == null  || StatTable.StatItemList == null) return false;
      if (StatTable.MainGroupList.Count == 0 || StatTable.StatItemList.Count == 0) return false;
      string StatLayerName = StatEnv.ProcAttFilter.StatTemplateInfo.strLayerName;
      if (StatEnv.MainGroupItem.ToLower() == StatLayerName) return false;//分组的图层与统计的图层相同

      //获取要统计的地图要素,通过该要素统计该要素内的统计对象的编码
      LayerInfoArray LayerInfoList = new LayerInfoArray();
      LayerBaseInfo LayerInfo = LayerInfoList.GetLayerInfo(StatEnv.MainGroupItem);
      if (LayerInfo == null) return false;
      IFeatureLayer FLayer = clsGISPub.FindFeatureLayer(StatEnv.MapControl.Map, LayerInfo.LayerName);//分组图层
      if(FLayer == null) return false;
      string code = "";
      foreach (myItemInfo var in StatTable.MainGroupList)
	    {
    		 if(code == "") code = var.ItemCode;
         else code = code +"," + var.ItemCode;
	    }
      string SQL = LayerInfo.codeField + " in (" + code + ")";
      IFeatureCursor FCursor = clsGISPub.SearchFeature(FLayer.FeatureClass, SQL);
      if (FCursor == null) return false;
      if(StatEnv.ProcAttFilter.StatTemplateInfo == null) return false;
      string statLayerName = StatEnv.ProcAttFilter.StatTemplateInfo.strLayerName;
      IFeatureLayer StatLayer = clsGISPub.FindFeatureLayer(StatEnv.MapControl.Map, statLayerName);
      if (StatLayer == null) return false;

      LayerInfo = LayerInfoList.GetLayerInfo(statLayerName);////这里是统计图层,注意与“分组图层”区分
      int GroupCodeField =  StatLayer.FeatureClass.Fields.FindField(LayerInfo.codeField);
      int GroupNameField = StatLayer.FeatureClass.Fields.FindField(LayerInfo.nameField);
      while (true)//对分组的图层进行循环,统计每一个行政区划内的具体的查询图层的编码,在具体地进行属性统计
      {
        IFeature Feat = FCursor.NextFeature();
        if (Feat == null) break;
        string GroupCode = Feat.get_Value(GroupCodeField).ToString();
        string GroupName = Feat.get_Value(GroupNameField).ToString();

        IFeatureCursor StatCursor = clsGISPub.InSearch(StatLayer.FeatureClass, Feat.ShapeCopy, "", esriSpatialRelEnum.esriSpatialRelIntersects);
        if (StatCursor == null) break;
        int iCodeField = StatCursor.Fields.FindField(StatEnv.ProcAttFilter.StatTemplateInfo.strSpaceField);//空间统计图层的编码字段
        code = "";
        while(true)
        {
          IFeature TempFeat = StatCursor.NextFeature();
          if (TempFeat == null) break;
          if (code == "") code = "'" + TempFeat.get_Value(iCodeField).ToString() + "'";
          else code = code + ",'" + TempFeat.get_Value(iCodeField).ToString() + "'";
        }
        ///////////////统计一个行政区划////////////////////////////////////////////
        StatOnCode(GroupCode, GroupName, code);
      }
      return true;
    }

    //按一个行政区划,将其下的所有代码进行分类统计
    private bool StatOnCode(string GroupCode, string GroupName, string code)
    {
      if (StatEnv == null || StatEnv.ProcAttFilter == null || StatTable == null) return false;
      if (code.Trim() == "") return false;

      string view = StatEnv.ProcAttFilter.StatTemplateInfo.strVName;
      string ViewCode = StatEnv.ProcAttFilter.StatTemplateInfo.strAttField;
      clsProcAttWhere ProcWhere = new clsProcAttWhere();
      ProcWhere.StatEnv = StatEnv;
      string sAttWhere = ProcWhere.GetAttWhere(true);////????
      //如果没有次分组
      if (StatEnv.SecondGroupField.Trim() == "" || StatTable.SecondGroupList == null || StatTable.SecondGroupList.Count == 0)
      {
        string SQL;
          SQL = "SELECT " + MakeStatField() + " FROM " + view + " WHERE "
                    + ViewCode + " in (" + code + ")";
        if(sAttWhere.Trim() != "") SQL += " and " + sAttWhere;
        saveStat1(GroupCode, GroupName, SQL);
      }
      else//有次分组
      {
        string Second = "";
        foreach (myItemInfo var in StatTable.SecondGroupList)
	      {
          if (Second == "") Second = "'" + var.ItemCode + "'";
          else Second += ",'" + var.ItemCode + "'";
	      }
        string SecondGroupField = StatEnv.ProcAttFilter.GetFieldName(StatEnv.SecondGroupField);
        Second = SecondGroupField + " in(" + Second + ")";


        string SQL;
        SQL = "SELECT " + SecondGroupField + "," + MakeStatField() + " FROM " + view + " WHERE "
                  + ViewCode + " in (" + code + ") and " + Second;
        if (sAttWhere.Trim() != "") SQL += " and " + sAttWhere;
        SQL = SQL + " GROUP BY " + SecondGroupField;
        saveStat2(GroupCode, GroupName, SQL);
      }
      return true;
    }

    //处理一条统计好的记录(没有group by的分组)
    private bool saveStat1(string GroupCode, string GroupName, string SQL)//只有一条记录
    {
      clsDbPub.SaveTextToFile(SQL);
      if (StatEnv == null || StatTable == null) return false;
      DataTable dt = clsDbPub.GetDataTable(StatEnv.DbConn, SQL);
      if (dt == null || dt.Rows.Count == 0) return false;
      DataRow dr = StatTable.workTable.NewRow();
      clsProcMainGroupField procField = new clsProcMainGroupField();
      procField.StatEnv = StatEnv;
      dr[procField.GetMainFieldCode()] = GroupCode;
      dr[procField.GetMainFieldName()] = GroupName;

      for (int i = 0; i < dt.Columns.Count; i++)
			{
			 string name = dt.Columns[i].ColumnName;
        dr[name] = dt.Rows[0][name];
			}
      StatTable.workTable.Rows.Add(dr);

      return true;
    }

    //处理一条统计好的记录(带有group by分组)
    private bool saveStat2(string GroupCode, string GroupName, string SQL)//只有一条记录
    {
      clsDbPub.SaveTextToFile(SQL);

      if (StatEnv == null || StatTable == null) return false;
      DataTable dt = clsDbPub.GetDataTable(StatEnv.DbConn, SQL);
      if (dt == null || dt.Rows.Count == 0) return false;
      DataRow dr = StatTable.workTable.NewRow();
      clsProcMainGroupField procField = new clsProcMainGroupField();
      procField.StatEnv = StatEnv;
      dr[procField.GetMainFieldCode()] = GroupCode;
      dr[procField.GetMainFieldName()] = GroupName;

      string AttCodeField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttField;
      string AttNameField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttNameField;
      string SecondGroupField = StatEnv.ProcAttFilter.GetFieldName(StatEnv.SecondGroupField);
      for (int i = 0; i < dt.Rows.Count; i++)//myItemInfo var1 in SecondGroupList
      {
        string code = dt.Rows[i][SecondGroupField].ToString();

        foreach (StatItem var in StatTable.StatItemList)
        {
          string ValueField = var.fieldName + "_" + code;
          dr[ValueField] = dt.Rows[i][var.fieldName];
        }
      }
      StatTable.workTable.Rows.Add(dr);
      return true;
    }

    private string MakeStatField()
    {
      if(StatTable == null || StatTable.StatItemList == null) return "";
      string item = "";
      foreach (StatItem var in StatTable.StatItemList)
	    {
        if (item == "") item = var.statMethod + "(" + var.fieldName + ") as " + var.fieldName;
        else item += "," + var.statMethod + "(" + var.fieldName + ") as " + var.fieldName;
	    }
      return item;
    }
    #endregion
    #region "处理情况2:主分组为地图,目标图层与分组图层相同,还有次分组"
    private bool Stat2()
    {

      if (StatEnv == null || StatTable == null || StatEnv.MapControl == null) return false;
      if (StatEnv.MainGroupType != 0) return false;//0表示,主分组为地图
      if (StatTable.MainGroupList == null || StatTable.StatItemList == null) return false;
      if (StatTable.MainGroupList.Count == 0 || StatTable.StatItemList.Count == 0) return false;
      string StatLayer = StatEnv.ProcAttFilter.StatTemplateInfo.strLayerName;
      if (StatEnv.MainGroupItem.ToLower() != StatLayer) return false;//分组的图层与统计的图层相同

      //获取要统计的地图要素,通过该要素统计该要素内的统计对象的编码
      LayerInfoArray LayerInfoList = new LayerInfoArray();
      LayerBaseInfo LayerInfo = LayerInfoList.GetLayerInfo(StatEnv.MainGroupItem);
      if (LayerInfo == null) return false;
      string code = "";
      foreach (myItemInfo var in StatTable.MainGroupList)
      {
        if (code == "") code = "'" + var.ItemCode + "'";
        else code = code + ",'" + var.ItemCode + "'";
      }
      string AttCodeField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttField;
      string AttNameField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttNameField;

      string MainGroup = AttCodeField + " in (" + code + ")";
      string view = StatEnv.ProcAttFilter.StatTemplateInfo.strVName;
      clsProcAttWhere ProcWhere = new clsProcAttWhere();
      ProcWhere.StatEnv = StatEnv;
      string sAttWhere = ProcWhere.GetAttWhere(true);////????
      //如果没有次分组
      if (StatEnv.SecondGroupField.Trim() == "" || StatTable.SecondGroupList == null || StatTable.SecondGroupList.Count == 0)
      {
        string SQL;
        SQL = "SELECT " + AttCodeField + "," + AttNameField + "," + MakeStatField() + " FROM " + view + " WHERE "
                  + MainGroup;
        if (sAttWhere.Trim() != "") SQL += " and " + sAttWhere;
        SQL +=  " group by " + AttCodeField + "," + AttNameField;
        saveStat3(SQL);//没有次分组,所有的统计记录
      }
      else//有次分组
      {
        string Second = "";
        foreach (myItemInfo var in StatTable.SecondGroupList)
        {
          if (Second == "") Second = "'" + var.ItemCode + "'";
          else Second += ",'" + var.ItemCode + "'";
        }
        string SecondGroupField = StatEnv.ProcAttFilter.GetFieldName(StatEnv.SecondGroupField);
        Second = SecondGroupField + " in(" + Second + ")";

        string SQL;
        SQL = "SELECT " + AttCodeField + "," + AttNameField + ", " + SecondGroupField + "," + MakeStatField() + " FROM " + view + " WHERE "
                  + MainGroup  + " and " + Second;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -