/// <summary> /// Добавляет новую группировку /// </summary> public void AddGroup() { once = new GroupClassOnce(this); grouplist.Add(once); }
/// <summary> /// Пищет группировку для одной группировки /// При этом данные группировки помещаются в переменную group_id /// </summary> /// <param name="sql">SQl - схема</param> /// <param name="idSQL">Номер SQL-запроса</param> /// <param name="idGroup">Номер группировки</param> /// <param name="prevCountGroup">номер предыдущей группировки (от туда будут браться данные)</param> /// <param name="TrName">Путь до данных</param> public void GroupOne(GroupClassOnce sql, int idSQL, int idGroup, int prevCountGroup, string TrName) { int id = 0; bool old = true; string from = "$group_var_" + id.ToString(); if (idGroup != 0) { from = "$group_" + idSQL.ToString() + "_" + ((int)(idGroup-1)).ToString(); old = false; } else if (idSQL != 0 && prevCountGroup !=0) { from = "$group_" + (idSQL-1).ToString() + "_" + prevCountGroup.ToString(); old = false; } string VarGroupName = "group_"+ idSQL.ToString() + "_" + idGroup.ToString(); //if tw.WriteLine("<xsl:variable name=\"" + VarGroupName + "\">"); //далее мы должны написать цикл группировки если надо if (!sql.isAll) { string from_val = from; if (old) { string tmp_TrName = sql.baseGroup.baseSql.GetTr(-1); from += "/" + tmp_TrName; } for (int i=0;i<sql.Count;i++) { if (i == 0) tw.WriteLine("<xsl:for-each-group select=\""+from+"\" group-by=\"" + sql[i] + "\">"); else tw.WriteLine("<xsl:for-each-group select=\"current-group()\" group-by=\"" + sql[i] + "\">"); tw.WriteLine("<xsl:variable name=\"" + VarGroupName+"_key_" + sql[i] + "\" select=\"current-grouping-key()\"/>"); } } if (sql.type == TypeGroup.CONTAIN) GroupContain(sql, sql.isAll, from, VarGroupName, TrName); else if (sql.type == TypeGroup.HEADER) GroupHeader(sql, sql.isAll, from, VarGroupName, TrName); GroupData(from,sql.isAll); /*tw.WriteLine("<xsl:for-each select=\"" + from + "" + id.ToString() + "/*\" >"); tw.WriteLine("<xsl:copy-of select=\"current()\"/>"); tw.WriteLine("</xsl:for-each");*/ if (sql.type == TypeGroup.CONTAIN) GroupContainEnd(sql); else if (sql.type == TypeGroup.FOOTER) GroupFooter(sql, sql.isAll, from, VarGroupName, TrName); if (!sql.isAll) { for (int i=0;i<sql.Count;i++) { tw.WriteLine("</xsl:for-each-group>"); } } //tw.WriteLine(""); tw.WriteLine("</xsl:variable>"); }
/// <summary> /// Конструктор /// </summary> /// <param name="baseSql">Базовый SQL-класс</param> public GroupClass(SQLStruct baseSql) { this.baseSql = baseSql; once = new GroupClassOnce(this); }
/// <summary> /// Пишет FOOTER. Просто вызывает GroupFooter <see cref="GroupFooter"/> /// </summary> /// <param name="sql"></param> /// <param name="all"></param> /// <param name="from"></param> /// <param name="VarGroupName"></param> /// <param name="TrName"></param> public void GroupFooter(GroupClassOnce sql, bool all, string from, string VarGroupName, string TrName) { GroupHeader(sql, all, from, VarGroupName, TrName); }
/// <summary> /// Пищет HEADER /// </summary> /// <param name="sql">SQL</param> /// <param name="all">Флфг ALL</param> /// <param name="from">Откуда будут браться данные</param> /// <param name="VarGroupName">Имя переменной группировок</param> /// <param name="TrName">Имя узла</param> public void GroupHeader(GroupClassOnce sql, bool all, string from, string VarGroupName, string TrName) { tw.WriteLine("<" + sql.UseTag(TypeFH.HEADER) + ">"); //Пишем все агрегаты. GroupValueRec(sql,all,from, VarGroupName, TrName, TypeFH.HEADER); tw.WriteLine("</" + sql.UseTag(TypeFH.HEADER) + ">"); }
/// <summary> /// Пишет закрывающийся тег /// </summary> /// <param name="sql"></param> public void GroupContainEnd(GroupClassOnce sql) { tw.WriteLine("</" + sql.UseTag(TypeFH.CONTAIN) + ">"); }
/// <summary> /// Пишет Conatin /// </summary> /// <param name="sql">SQL -схема 1 группировки</param> /// <param name="all">Флаг ALL</param> /// <param name="from">Откуда будут браться данные</param> /// <param name="VarGroupName">Имя переменной (group_) из которой группируются данные</param> /// <param name="TrName">Имя узла xsl:value-of select="$" + VarGroupName + "/" + TrName </param> public void GroupContain(GroupClassOnce sql, bool all, string from, string VarGroupName, string TrName) { tw.WriteLine("<" + sql.UseTag(TypeFH.CONTAIN) + ">"); //Пишем все агрегаты. GroupValueRec(sql,all,from, VarGroupName, TrName, TypeFH.CONTAIN); }
/// <summary> /// Пишет записи (данные) в Group /// Если при этом указана агрегатная функция, то она тоже пищется /// </summary> /// <param name="sql">SQL -схема 1 группировки</param> /// <param name="all">Флаг ALL</param> /// <param name="from">Параметр откуда будут браться данные</param> /// <param name="VarGroupName">Имя переменной (group_) из которой группируются данные</param> /// <param name="TrName">Имя узла xsl:value-of select="$" + VarGroupName + "/" + TrName </param> /// <param name="t">Тип группировки</param> public void GroupValueRec(GroupClassOnce sql, bool all, string from, string VarGroupName, string TrName, TypeFH t) { int CountValueRec = 0; if (t == TypeFH.FOOTER) CountValueRec = sql.CountValueRecFooter; else CountValueRec = sql.CountValueRecHeader; //Пишем все агрегаты... for (int j=0;j< CountValueRec;j++) { string defTemplate = "#.##"; //string node = (string) sql.group[idGroup].array[j]; string node = sql.ValueRec(j,t); string node_value = node; string func = sql.Func(j,t); string fullName = sql.FullName(j,t); /*if (sql.FullName!= null && sql.FullName != "") node_value = fullName;*/ //tw.WriteLine("<" + node + "><xsl:value-of select=\"" + func + "(current()/" + node + ")\"/></" + node + ">"); if (all) if (fullName!= null && fullName != "") { if (func != null && func != "") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "($"+ fullName + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + fullName + "\"/></" + node + ">"); } else { if (func != null && func != "") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "("+ from + "/" + TrName + "" + node_value + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"" + from + "/" + TrName + "" + node_value + "\"/></" + node + ">"); } else { if (fullName!= null && fullName != "") { if (func!=null && func != "") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "($" + fullName + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + fullName + "\"/></" + node + ">"); } else { if (func!=null && func != "") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "(current-group()/" + node_value + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + VarGroupName + "_key_" + node + "\"/></" + node + ">"); } } } }
/// <summary> /// Пишет записи (данные) в Group /// Если при этом указана агрегатная функция, то она тоже пищется /// </summary> /// <param name="sql">SQL -схема 1 группировки</param> /// <param name="all">Флаг ALL</param> /// <param name="VarGroupName">Имя переменной (group_) из которой группируются данные</param> /// <param name="TrName">Имя узла xsl:value-of select="$" + VarGroupName + "/" + TrName </param> /// <param name="t">Тип группировки</param> public void GroupValueRec2(GroupClassOnce sql, bool all, string VarGroupName, string TrName, TypeFH t) { //Пишем все агрегаты... int CountValueRec = 0; if (t == TypeFH.FOOTER) CountValueRec = sql.CountValueRecFooter; else CountValueRec = sql.CountValueRecHeader; for (int j=0;j< CountValueRec;j++) { string defTemplate = "#.##"; //string node = (string) sql.group[idGroup].array[j]; string node = sql.ValueRec(j, t); string node_value = node; string func = sql.Func(j, t); string fullName = sql.FullName(j, t); if ((fullName == null || fullName == "") && !all) { //Провереям надохится ли в текущем гроупе все колонки int idGroup = sql.IdGroup(j,t); if (idGroup!=-1) { fullName = "group_" + idGroup.ToString() + "_key_" + node; } } if (all) if (fullName!= null && fullName != "") { if (func != null && func != "") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "($"+ fullName + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + fullName + "\"/></" + node + ">"); } else { if (func != null && func != "") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "($"+ VarGroupName + "/" + TrName + "" + node_value + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + VarGroupName + "/" + TrName + "" + node_value + "\"/></" + node + ">"); //int uu=0; } else { if (fullName!= null && fullName != "") { if (func!=null && func != "") if (func.ToLower() !="val") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "($" + fullName + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + fullName + "\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + fullName + "\"/></" + node + ">"); } else { if (func!=null && func != "") if (func.ToLower() != "val") tw.WriteLine("<" + node + "><xsl:value-of select=\"format-number(" + func + "(current-group()/" + node_value + "),'" + defTemplate + "')\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"current-group()/" + node_value + "\"/></" + node + ">"); else tw.WriteLine("<" + node + "><xsl:value-of select=\"$" + VarGroupName + "_key_" + node + "\"/></" + node + ">"); } } } }
/// <summary> /// Пишет FOOTER /// </summary> /// <param name="sql">SQL -схема</param> /// <param name="isAll">Флаг ALL</param> /// <param name="VarGroupName">Имя переменной (group_) из которой группируются данные</param> /// <param name="TrName">Имя узла xsl:value-of select="$" + VarGroupName + "/" + TrName </param> public void GroupFooter2(GroupClassOnce sql, bool isAll, string VarGroupName, string TrName) { tw.WriteLine("<" + sql.UseTag(TypeFH.FOOTER) + ">"); GroupValueRec2(sql,isAll, VarGroupName, TrName, TypeFH.FOOTER); tw.WriteLine("</" + sql.UseTag(TypeFH.FOOTER) + ">"); }