www.pudn.com > Tustena_CRM_OS_3.0.2_Stable.zip > QueryBuilderManager.cs


/// TUSTENA PUBLIC LICENSE v1.0 
///  
/// Portions Copyright (c) 2003-2005 Digita S.r.l. All Rights Reserved. 
/// 
/// Tustena CRM is a trademark of: 
/// Digita S.r.l. 
/// Viale Enrico Fermi 14/z 
/// 31011 Asolo (Italy) 
/// Tel. +39-0423-951251 
/// Mail. info@digita.it 
/// 
/// This file contains Original Code and/or Modifications of Original Code 
/// as defined in and that are subject to the Tustena Public Source License 
/// Version 1.0 (the 'License'). You may not use this file except in 
/// compliance with the License. Please obtain a copy of the License at 
/// http://www.tustena.com/TPL/ and read it before using this 
// file. 
/// 
/// The Original Code and all software distributed under the License are 
/// distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
/// EXPRESS OR IMPLIED, AND DIGITA S.R.L. HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
/// INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
/// FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
/// Please see the License for the specific language governing rights and 
/// limitations under the License. 
/// 
/// YOU MAY NOT REMOVE OR ALTER THIS COPYRIGHT NOTICE! 
///  
 
using System; 
using System.Collections; 
using System.Data; 
using System.Diagnostics; 
using System.Text; 
using System.Web; 
using Digita.Tustena.Base; 
using Digita.Tustena.Database; 
 
namespace Digita.Tustena 
{ 
	public class QueryBuilderManager 
	{ 
		public DataTable QBManager(int id, Hashtable htParams, bool fromId) 
		{ 
			return QBManager(id, htParams, -1, ((UserConfig) HttpContext.Current.Session["UserConfig"]).UserGroupId, fromId); 
		} 
 
		public DataTable QBManager(int id, Hashtable htParams) 
		{ 
			return QBManager(id, htParams, -1, ((UserConfig) HttpContext.Current.Session["UserConfig"]).UserGroupId, true); 
		} 
 
		public DataTable QBManager(int id, Hashtable htParams, int companyId, int groupId, bool fromId) 
		{ 
			string idQuery = String.Empty; 
			if (fromId) 
				idQuery = id.ToString(); 
			else 
				idQuery = DatabaseConnection.SqlScalar("select id from QB_CustomerQuery where fromwap=" + id.ToString()); 
			string grouping = String.Empty; 
			string orderby = String.Empty; 
 
			string tblstring = String.Empty; 
			int tblindex = 0; 
 
			UserConfig ucCurrent = (UserConfig) HttpContext.Current.Session["UserConfig"]; 
			bool orderAndGroup = false; 
			{ 
				StringBuilder TablesString = new StringBuilder(); 
				StringBuilder fieldsString = new StringBuilder(); 
				StringBuilder ParamsString = new StringBuilder(); 
				StringBuilder finalQuery = new StringBuilder(); 
				string firstTable = String.Empty; 
 
				string qbTablesQuery = "Select QB_All_Tables.ID, QB_All_Tables.TableName, QB_All_Tables.FixedQuery " + 
					"from QB_CustomerQueryTables " + 
					"inner join QB_All_Tables on QB_CustomerQueryTables.IDTable=QB_All_Tables.ID " + 
					"where QB_CustomerQueryTables.IDQuery=" + idQuery + " order by QB_CustomerQueryTables.MainTable desc"; 
 
				DataSet QBTables = DatabaseConnection.CreateDataset(qbTablesQuery); 
				if (QBTables.Tables[0].Rows.Count > 0) 
				{ 
					TablesString.Append(QBTables.Tables[0].Rows[0][1].ToString()); 
					firstTable = QBTables.Tables[0].Rows[0][1].ToString(); 
 
					if (QBTables.Tables[0].Rows.Count > 1) 
					foreach (DataRow d in QBTables.Tables[0].Rows) 
					{ 
						string sqlJoin = "SELECT QB_All_Tables.TableName as FirstTableName,QB_All_Tables.fixedquery, QB_All_Tables_1.TableName AS SecondTableName, QB_Join.FirstField, QB_Join.SecondField, QB_Join.type " + 
							"FROM   QB_Join INNER JOIN " + 
							"QB_All_Tables ON QB_Join.FirstTableID = QB_All_Tables.id INNER JOIN " + 
							"QB_All_Tables QB_All_Tables_1 ON QB_Join.SecondTableID = QB_All_Tables_1.id " + 
							"where QB_Join.SecondTableID=" + QBTables.Tables[0].Rows[0][0].ToString() + " and QB_Join.FirstTableID=" + d[0].ToString(); 
 
						DataSet QBJoin = DatabaseConnection.CreateDataset(sqlJoin); 
						if (QBJoin.Tables[0].Rows.Count > 0) 
						{ 
							DataRow jd = QBJoin.Tables[0].Rows[0]; 
							switch ((byte) jd["type"]) 
							{ 
								case 0: 
									string fixedq = jd["fixedquery"].ToString(); 
									if(fixedq.Length>0)fixedq=" and "+fixedq; 
									TablesString.AppendFormat(" LEFT OUTER JOIN {0} as {4} ON {1}.{2} = {4}.{3}{5}", jd["FirstTableName"], jd["SecondTableName"], jd["SecondField"], jd["FirstField"], (tblstring.IndexOf(jd["FirstTableName"].ToString()) != -1) ? jd["FirstTableName"].ToString() + tblindex++.ToString() : jd["FirstTableName"].ToString(),fixedq); 
									break; 
								case 1: 
									TablesString.AppendFormat(" LEFT OUTER JOIN {0} as {4} ON {1}.{2} like '%|'+convert(varchar(10),{4}.{3})+'|%'", jd["FirstTableName"], jd["SecondTableName"], jd["SecondField"], jd["FirstField"], (tblstring.IndexOf(jd["FirstTableName"].ToString()) != -1) ? jd["FirstTableName"].ToString() + tblindex++.ToString() : jd["FirstTableName"].ToString()); 
									break; 
							} 
							tblstring += jd["FirstTableName"] + "|"; 
						} 
					} 
				} 
				else 
				{ 
				} 
 
				string qf = "select qb_all_fields.rmValue,qb_all_fields.field,qb_all_fields.JoinID,qb_all_fields.ParentField,qb_all_fields.FieldType,qb_all_tables.TableName,qb_customerqueryfields.ColumnName,qb_all_fields.ID,qb_all_fields.tableId from qb_customerqueryfields " + 
					"left outer join qb_all_fields on qb_customerqueryfields.IDField=qb_all_fields.id " + 
					"left outer join qb_all_tables on qb_all_fields.tableId=qb_all_tables.id " + 
					"where qb_customerqueryfields.IDQuery=" + idQuery + " and qb_customerqueryfields.FieldVisible=1 and QB_CustomerQueryFields.IDTable>0"; // and IDTable="+d[0].ToString(); 
 
				DataSet qpFieldsQuery = DatabaseConnection.CreateDataset(qf); 
 
				string tableIdForId = String.Empty; 
 
				foreach (DataRow fi in qpFieldsQuery.Tables[0].Rows) 
				{ 
					string tableId = DatabaseConnection.SqlScalar("select TableName from QB_All_Tables where id=" + fi["TableID"].ToString()); 
 
					if (tableIdForId.IndexOf(fi["TableID"].ToString() + "|") < 0) 
					{ 
						switch (fi["TableID"].ToString()) 
						{ 
							case "1": 
								fieldsString.AppendFormat("'AID' as rmAID,{0}.ID as AID,", tableId); 
								grouping += String.Format("{0}.ID,", tableId); 
								break; 
							case "2": 
								fieldsString.AppendFormat("'CID' as rmCID,{0}.ID as CID,", tableId); 
								grouping += String.Format("{0}.ID,", tableId); 
								break; 
							case "78": 
								fieldsString.AppendFormat("'LID' as rmLID,{0}.ID as LID,", tableId); 
								grouping += String.Format("{0}.ID,", tableId); 
								break; 
						} 
						tableIdForId += fi["TableID"].ToString() + "|"; 
					} 
 
					if (fi[2] == DBNull.Value) 
						switch (Convert.ToInt32(fi[4])) 
						{ 
							case 7: 
								fieldsString.AppendFormat("'{2}' as rm{1},sum({0}.{1}) as {1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString()); 
								orderAndGroup = true; 
								break; 
							case 13: 
								fieldsString.AppendFormat("'{2}' as rmNR${1},(convert(varchar(50),{0}.{1})+'|{3}') as NR${1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString(), fi["ID"].ToString()); 
								grouping += String.Format("{0}.{1},", tableId, fi[1].ToString()); 
								break; 
							case 6: 
								fieldsString.AppendFormat("'{2}' as rm{1},CAST({0}.{1} as varchar(8000)) as {1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString()); 
								grouping += String.Format("CAST({0}.{1} as varchar(8000)),", tableId, fi[1].ToString()); 
								break; 
							case 3: 
							case 8: 
								fieldsString.AppendFormat("'{2}' as rmDA${1},{0}.{1} as DA${1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString()); 
								grouping += String.Format("{0}.{1},", tableId, fi[1].ToString()); 
								break; 
							case 2: // Company categories 
								fieldsString.AppendFormat("'{2}' as rmCA${1},{0}.{1} as CA${1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString()); 
								grouping += String.Format("{0}.{1},", tableId, fi[1].ToString()); 
								break; 
							case 14: // Attivit todo 
								fieldsString.AppendFormat("'{2}' as rmAT${1},{0}.{1} as AT${1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString()); 
								grouping += String.Format("{0}.{1},", tableId, fi[1].ToString()); 
								break; 
							default: 
								fieldsString.AppendFormat("'{2}' as rm{1},{0}.{1},", tableId, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString()); 
								grouping += String.Format("{0}.{1},", tableId, fi[1].ToString()); 
								break; 
						} 
					else 
					{ 
						string SqlJoinField = "SELECT QB_All_Tables.TableName as FirstTableName, QB_All_Tables_1.TableName AS SecondTableName, QB_Join.FirstField, QB_Join.SecondField, QB_Join.type, QB_Join.astable " + 
							"FROM   QB_Join INNER JOIN " + 
							"QB_All_Tables ON QB_Join.FirstTableID = QB_All_Tables.id INNER JOIN " + 
							"QB_All_Tables QB_All_Tables_1 ON QB_Join.SecondTableID = QB_All_Tables_1.id " + 
							"where QB_Join.ID=" + fi["JoinID"].ToString(); 
 
						DataSet drjoin = DatabaseConnection.CreateDataset(SqlJoinField); 
						DataRow jd = drjoin.Tables[0].Rows[0]; 
 
						string tempTableName = (tblstring.IndexOf(jd["FirstTableName"].ToString()) != -1) ? jd["FirstTableName"].ToString() + tblindex++.ToString() : jd["FirstTableName"].ToString(); 
						tblstring += jd["FirstTableName"] + "|"; 
 
						switch ((byte) jd["type"]) 
						{ 
							case 0: 
								TablesString.AppendFormat(" LEFT OUTER JOIN {0} as {4} ON {1}.{2} = {4}.{3}", jd["FirstTableName"], jd["SecondTableName"], jd["SecondField"], jd["FirstField"], tempTableName); 
								break; 
							case 1: 
								TablesString.AppendFormat(" LEFT OUTER JOIN {0} as {4} ON {1}.{2} like '%|'+convert(varchar(10),{4}.{3})+'|%'", jd["FirstTableName"], jd["SecondTableName"], jd["SecondField"], jd["FirstField"], tempTableName); 
 
								break; 
							case 2: 
								UserConfig UC = (UserConfig) HttpContext.Current.Session["UserConfig"]; 
								TablesString.AppendFormat(" LEFT OUTER JOIN {0} as {4} ON {1}.{2} = {4}.{3} and {4}.lang='{5}'", jd["FirstTableName"], jd["SecondTableName"], jd["SecondField"], jd["FirstField"], tempTableName,UC.Culture.Substring(0,2)); 
								break; 
						} 
 
 
						if (fi[3].ToString().IndexOf(",") > 0) 
						{ 
							string[] pf = fi[3].ToString().Split(','); 
							if(tempTableName.ToLower().IndexOf("lead")>=0) 
								fieldsString.AppendFormat("'{2}' as rm{1},(isnull({0}.{3},'')+' '+isnull({0}.{4},'')) as {1},", tempTableName, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString(), pf[0], pf[1]); 
							else 
								fieldsString.AppendFormat("'{2}' as rm{1},(isnull({0}.{3},'')) as {1},", tempTableName, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString(), pf[0], pf[1]); 
							grouping += String.Format("{0}.{1},{0}.{2},", tempTableName, pf[0], pf[1]); 
						} 
						else 
						{ 
							fieldsString.AppendFormat("'{2}' as rm{1},{0}.{3} as {1},", tempTableName, fi[1].ToString(), (fi["ColumnName"].ToString().Length > 0) ? fi["ColumnName"].ToString() : fi[0].ToString(), fi[3].ToString()); 
							grouping += String.Format("{0}.{1},", tempTableName, fi[3].ToString()); 
						} 
					} 
				} 
 
				if (fieldsString.Length > 0) fieldsString.Remove(fieldsString.Length - 1, 1); 
 
 
 
 
 
				foreach (DataRow d in QBTables.Tables[0].Rows) 
				{ 
					int idfield = -1; 
					object vvv = DatabaseConnection.SqlScalartoObj("select IDField from QB_CustomerQueryParamFields where IDQuery=" + idQuery + " and IDTable=" + d[0].ToString()); 
					if (vvv != null) 
						idfield = (int) vvv; 
 
					if (idfield > 0) 
					{ 
						string qfp = "select qb_all_fields.rmValue,qb_all_fields.field,qb_all_fields.FieldType,qb_all_fields.JoinID,qb_all_fields.ParentField from QB_CustomerQueryParamFields " + 
							"inner join qb_all_fields on QB_CustomerQueryParamFields.IDField=qb_all_fields.id " + 
							"where QB_CustomerQueryParamFields.IDQuery=" + idQuery + " and QB_CustomerQueryParamFields.IDTable=" + d[0].ToString(); 
 
						DataSet qpFieldsQueryP = DatabaseConnection.CreateDataset(qfp); 
 
						foreach (DataRow f in qpFieldsQueryP.Tables[0].Rows) 
						{ 
							foreach (DictionaryEntry myDE in htParams) 
							{ 
								if (myDE.Key.ToString().ToLower() == f[1].ToString().ToLower()) 
								{ 
									string table0 = d[1].ToString(); 
									string field1 = f[1].ToString(); 
									string field2 = String.Empty; 
									if (f["JoinID"].ToString().Length > 0) 
									{ 
										string SqlJoinFieldG = "SELECT QB_All_Tables.TableName as FirstTableName, QB_All_Tables_1.TableName AS SecondTableName, QB_Join.FirstField, QB_Join.SecondField " + 
											"FROM   QB_Join INNER JOIN " + 
											"QB_All_Tables ON QB_Join.FirstTableID = QB_All_Tables.id INNER JOIN " + 
											"QB_All_Tables QB_All_Tables_1 ON QB_Join.SecondTableID = QB_All_Tables_1.id " + 
											"where QB_Join.ID=" + f["JoinID"].ToString(); 
 
										DataTable drjoin = DatabaseConnection.CreateDataset(SqlJoinFieldG).Tables[0]; 
										table0 = drjoin.Rows[0][0].ToString(); 
										field1 = f["ParentField"].ToString(); 
										field2 = drjoin.Rows[0]["SecondField"].ToString(); 
									} 
 
									if (myDE.Value.ToString().Length > 0) 
									{ 
										string andOr = (fromId) ? "and" : "or"; 
 
										switch (f[2].ToString()) 
										{ 
											case "0": //textbox (like) 
												if (myDE.Value.ToString().IndexOf("|") > 0) 
												{ 
													string[] tempQuery = myDE.Value.ToString().Split('|'); 
 
													string query = String.Empty; 
													foreach (string t in tempQuery) 
													{ 
														if (field1.IndexOf(",") > 0) 
														{ 
															string[] morefields = field1.Split(','); 
															foreach (string mf in morefields) 
															{ 
																query += String.Format("{0}.{1} like '{2}%' or ", table0, mf, t); 
															} 
														} 
														else 
															query += String.Format("{0}.{1} like '{2}%' or ", table0, field1, t); 
													} 
													ParamsString.AppendFormat(" {1} ({0})", query.Substring(0, query.Length - 3), andOr); 
 
												} 
												else 
												{ 
													string query = String.Empty; 
 
														if (field1.IndexOf(",") > 0) 
														{ 
															string[] morefields = field1.Split(','); 
															foreach (string mf in morefields) 
															{ 
																query += String.Format("{0}.{1} like '{2}%' or ", table0, mf, myDE.Value); 
															} 
														} 
														else 
															query += String.Format("{0}.{1} like '{2}%' or ", table0, field1, myDE.Value); 
 
													ParamsString.AppendFormat(" {1} ({0})", query.Substring(0, query.Length - 3), andOr); 
												} 
 
												break; 
											case "1": //dropdown con = 
											case "13": 
 
												if (myDE.Value.ToString().IndexOf("|") > 0) 
												{ 
													string[] tempQuery = myDE.Value.ToString().Split('|'); 
													string query = String.Empty; 
													foreach (string t in tempQuery) 
													{ 
														query += String.Format("{0}.{1} = '{2}' or ",  d[1].ToString(), (field2.Length>0)?field2:f[1].ToString(), t); 
													} 
													ParamsString.AppendFormat(" {1} ({0})", query.Substring(0, query.Length - 3), andOr); 
												} 
												else 
												{ 
													if (f["ParentField"] == DBNull.Value) 
													{ 
														ParamsString.AppendFormat(" {3} {0}.{1} = '{2}'", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
													} 
													else 
													{ 
														ParamsString.AppendFormat(" {3} {0}.{1} = '{2}'", d[1].ToString(), field2, myDE.Value, andOr); 
													} 
												} 
												break; 
											case "2": //dropdown con like e pipe 
												if (myDE.Value.ToString().IndexOf("|") > 0) 
												{ 
													string[] tempQuery = myDE.Value.ToString().Split('|'); 
 
													string query = String.Empty; 
													foreach (string t in tempQuery) 
													{ 
														query += String.Format("{0}.{1} like '%|{2}|%' or ", table0, field1, t); 
													} 
													ParamsString.AppendFormat(" {1} ({0})", query.Substring(0, query.Length - 3), andOr); 
												} 
												else 
													ParamsString.AppendFormat(" {3} {0}.{1} like '%|{2}|%'", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
												break; 
											case "3": //data secca 
												ParamsString.AppendFormat(" {3} Convert(varchar(10),{0}.{1},112)='{2}'", d[1].ToString(), f[1].ToString(), ucCurrent.LTZ.ToUniversalTime(Convert.ToDateTime(myDE.Value, ucCurrent.myDTFI)).ToString(@"yyyyMMdd"), andOr); 
												break; 
											case "4": //checkbox 
												if (myDE.Value != null) 
												{ 
													ParamsString.AppendFormat(" {2} {0}.{1} = 1", d[1].ToString(), f[1].ToString(), andOr); 
												} 
												else 
												{ 
													ParamsString.AppendFormat(" {2} {0}.{1} = 0", d[1].ToString(), f[1].ToString(), andOr); 
												} 
												break; 
											case "5": // risearch per propietario 
												ParamsString.AppendFormat(" {3} {0}.{1} = '{2}'", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
												break; 
											case "8": //data between 
												string[] valori = myDE.Value.ToString().Split('|'); 
												ParamsString.AppendFormat(" {4} {0}.{1} between '{2}' and '{3}'", d[1].ToString(), f[1].ToString(), ucCurrent.LTZ.ToUniversalTime(Convert.ToDateTime(valori[0], ucCurrent.myDTFI)).ToString(@"yyyyMMdd"), Convert.ToDateTime(valori[1], ucCurrent.myDTFI).ToString(@"yyyyMMdd"), andOr); 
												break; 
											case "9": // risearch per aziende 
												ParamsString.AppendFormat(" {3} {0}.{1} = '{2}'", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
												break; 
											case "10": // risearch per contatto 
												ParamsString.AppendFormat(" {3} {0}.{1} = '{2}'", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
												break; 
											case "11": // risearch per opportunit 
												ParamsString.AppendFormat(" {3} {0}.{1} like '%|{2}|%'", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
												break; 
											case "12": // risearch per opportunit 
												valori = myDE.Value.ToString().Split('|'); 
												if (valori[1] == "0") 
												{ 
													ParamsString.AppendFormat(" {3} {0}.{1} = {2}", d[1].ToString(), f[1].ToString(), valori[0], andOr); 
												} 
												else 
												{ 
													ParamsString.AppendFormat(" {3} {0}.{1} > {2}", d[1].ToString(), f[1].ToString(), valori[0], andOr); 
												} 
												break; 
											case "14": // Radio Button 
												ParamsString.AppendFormat(" {3} {0}.{1} = {2}", d[1].ToString(), f[1].ToString(), myDE.Value, andOr); 
												break; 
 
										} 
									} 
								} 
							} 
						} 
					} 
					else 
					{ 
						if (idfield == 0) 
						{ 
							foreach (DictionaryEntry myDE in htParams) 
							{ 
								ParamsString.AppendFormat(" and {0}.ID = {1}", d[1].ToString(), myDE.Value); 
							} 
						} 
					} 
				} 
 
				foreach (DataRow d in QBTables.Tables[0].Rows) 
				{ 
					if (d["FixedQuery"].ToString().Length > 0 && TablesString.ToString().IndexOf(d["FixedQuery"].ToString())<0) 
					{ 
						ParamsString.AppendFormat(" and ({0})", d["FixedQuery"].ToString()); 
					} 
				} 
 
 
 
				finalQuery.AppendFormat("select {0} ", fieldsString.ToString()); 
				finalQuery.AppendFormat("from {0} ", TablesString.ToString()); 
				finalQuery.Append("where "); 
				if (fromId) 
					if((finalQuery.ToString().EndsWith("where ") || 
						finalQuery.ToString().EndsWith("where")) 
						) 
						if((ParamsString.ToString().StartsWith(" and") || 
							ParamsString.ToString().StartsWith("and"))) 
							finalQuery.AppendFormat("{0}", ParamsString.ToString().Substring(4, ParamsString.Length - 4)); 
						else 
							finalQuery.AppendFormat("{0}", ParamsString.ToString()); 
					else 
						if((ParamsString.ToString().StartsWith(" and") || 
						ParamsString.ToString().StartsWith("and")) || StaticFunctions.IsBlank(ParamsString.ToString())) 
							finalQuery.AppendFormat("{0}", ParamsString.ToString()); 
						else 
							finalQuery.AppendFormat(" and {0}", ParamsString.ToString()); 
				else 
					if((finalQuery.ToString().EndsWith("where ") || 
					finalQuery.ToString().EndsWith("where")) 
					) 
						finalQuery.AppendFormat("{0}", ParamsString.ToString().Substring(3, ParamsString.Length - 3)); 
					else 
						finalQuery.AppendFormat("and ({0})", ParamsString.ToString().Substring(3, ParamsString.Length - 3)); 
 
 
 
				string groupby = DatabaseConnection.SqlScalar("select GroupBy from QB_CustomerQuery where ID=" + idQuery); 
				if (groupby.Length > 0 || orderAndGroup) 
				{ 
					string[] t; 
					if(groupby.Length > 0) 
						t = groupby.Split('|'); 
					else 
					{ 
						groupby = DatabaseConnection.SqlScalar("select top 1 cast(idtable as varchar)+'|'+cast(idfield as varchar) as groupby from QB_CustomerQueryFields where idQuery="+idQuery+" order by options"); 
						t = groupby.Split('|'); 
					} 
 
 
 
					string qbGroup = "select qb_all_tables.tablename,qb_all_fields.field as groupby,qb_all_fields.JoinID,qb_all_fields.ParentField from qb_all_tables " + 
						"join qb_all_fields on qb_all_tables.id=qb_all_fields.tableid " + 
						"where qb_all_tables.id=" + t[0] + " and qb_all_fields.id=" + t[1] + ";"; 
					DataTable dtGroup = DatabaseConnection.CreateDataset(qbGroup).Tables[0]; 
					string groupFor = String.Empty; 
					if (dtGroup.Rows[0]["JoinID"].ToString().Length > 0) 
					{ 
						string SqlJoinFieldG = "SELECT QB_All_Tables.TableName as FirstTableName, QB_All_Tables_1.TableName AS SecondTableName, QB_Join.FirstField, QB_Join.SecondField " + 
							"FROM   QB_Join INNER JOIN " + 
							"QB_All_Tables ON QB_Join.FirstTableID = QB_All_Tables.id INNER JOIN " + 
							"QB_All_Tables QB_All_Tables_1 ON QB_Join.SecondTableID = QB_All_Tables_1.id " + 
							"where QB_Join.ID=" + dtGroup.Rows[0]["JoinID"].ToString(); 
 
						DataTable drjoin = DatabaseConnection.CreateDataset(SqlJoinFieldG).Tables[0]; 
						if (dtGroup.Rows[0]["ParentField"].ToString().IndexOf(",") > 0) 
						{ 
							string[] compositegroup = dtGroup.Rows[0]["ParentField"].ToString().Split(','); 
 
							foreach (string cg in compositegroup) 
							{ 
								groupFor += drjoin.Rows[0][0].ToString() + "." + cg + ","; 
							} 
							groupFor = groupFor.Substring(0, groupFor.Length - 1); 
						} 
						else 
							groupFor = drjoin.Rows[0][0].ToString() + "." + dtGroup.Rows[0]["ParentField"].ToString(); 
					} 
					else 
					{ 
						if (dtGroup.Rows[0][1].ToString().IndexOf(",") > 0) 
						{ 
							string[] compositegroup = dtGroup.Rows[0][1].ToString().Split(','); 
 
							foreach (string cg in compositegroup) 
							{ 
								groupFor += dtGroup.Rows[0][0].ToString() + "." + cg + ","; 
							} 
							groupFor = groupFor.Substring(0, groupFor.Length - 1); 
 
						} 
						else 
							groupFor = dtGroup.Rows[0][0].ToString() + "." + dtGroup.Rows[0][1].ToString(); 
					} 
 
					if (grouping.IndexOf(groupFor) > 0) 
					{ 
						grouping.Remove(grouping.IndexOf(groupFor), groupFor.Length + 1); 
					} 
 
					if (orderAndGroup) 
					{ 
						if (grouping.Length > 0) 
							finalQuery.AppendFormat(" group by {0},{1}", groupFor, grouping.Substring(0, grouping.Length - 1)); 
						else 
							finalQuery.AppendFormat(" group by {0}", groupFor); 
					} 
					else 
					{ 
						finalQuery.AppendFormat(" order by {0}", groupFor); 
					} 
				} 
 
 
				if (orderby.Length > 0 && finalQuery.ToString().IndexOf("group by") < 1) 
					finalQuery.AppendFormat(" order by {0}", orderby); 
 
 
 
				DataSet finalDs = DatabaseConnection.CreateDataset(finalQuery.ToString()); 
				G.FixDateTimeZone(finalDs,ucCurrent.LTZ); 
 
				DataTable labels = new DataTable(); 
				DataTable freeLabels = new DataTable(); 
 
				if (finalDs.Tables[0].Rows.Count > 0) 
				{ 
					string fieldString = String.Empty; 
					int fieldIndex = 0; 
					DataRow drlabels = finalDs.Tables[0].Rows[0]; 
					foreach (DataColumn cc in finalDs.Tables[0].Columns) 
					{ 
						if (cc.ColumnName.Substring(0, 2) == "rm") 
						{ 
							DataColumn dcDynColumn = new DataColumn(); 
							string columnName = G.rm.GetString("QBTxt" + drlabels[cc.ColumnName].ToString()); 
							if (columnName != null) 
							{ 
								if (fieldString.IndexOf(columnName + "|") != -1) 
									dcDynColumn.ColumnName = columnName + "_" + fieldIndex++; 
								else 
									dcDynColumn.ColumnName = columnName; 
 
								fieldString += columnName + "|"; 
							} 
							else 
							{ 
								dcDynColumn.ColumnName = drlabels[cc.ColumnName].ToString(); 
								fieldString += drlabels[cc.ColumnName].ToString() + "|"; 
							} 
							dcDynColumn.DataType = Type.GetType("System.String"); 
							labels.Columns.Add(dcDynColumn); 
						} 
					} 
 
					foreach (DataRow dd in finalDs.Tables[0].Rows) 
					{ 
						DataRow d = labels.NewRow(); 
						foreach (DataColumn cc in finalDs.Tables[0].Columns) 
						{ 
							if (cc.ColumnName.Substring(0, 2) != "rm") 
							{ 
								switch (cc.ColumnName.Substring(0, 3)) 
								{ 
									case "AID": 
									case "CID": 
									case "LID": 
										d[dd["rm" + cc.ColumnName].ToString()] = dd[cc.ColumnName].ToString(); 
										break; 
									case "DA$": 
										try 
										{ 
											d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = Convert.ToDateTime(dd[cc.ColumnName].ToString()).ToString(); 
										} 
										catch 
										{ 
											try 
											{ 
												d[dd["rm" + cc.ColumnName].ToString()] = Convert.ToDateTime(dd[cc.ColumnName].ToString()).ToString(); 
											} 
											catch 
											{ 
												d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = DBNull.Value; 
											} 
										} 
										break; 
									case "NR$": 
										try 
										{ 
											if (dd[cc.ColumnName].ToString().Length > 0) 
											{ 
												string[] Nrm = dd[cc.ColumnName].ToString().Split('|'); 
												string Nrmvalue = DatabaseConnection.SqlScalar("select rmvalue from QB_FixedDropDownParams where idrif=" + Nrm[1] + " and dropvalue=" + Nrm[0]); 
												d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = G.rm.GetString("QBTxt" + Nrmvalue); 
											} 
											else 
												d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = String.Empty; 
										} 
										catch 
										{ 
											d[dd["rm" + cc.ColumnName].ToString()] = dd[cc.ColumnName].ToString(); 
										} 
										break; 
									case "CA$": 
										try 
										{ 
											string[] Cat = dd[cc.ColumnName].ToString().Split('|'); 
											string queryCat = String.Empty; 
											foreach (string c in Cat) 
											{ 
												if (c.Length > 0) 
													queryCat += " id=" + c + " or "; 
											} 
											DataTable catdt = DatabaseConnection.CreateDataset("select description from CRM_ContactCategories where " + queryCat.Substring(0, queryCat.Length - 3)).Tables[0]; 
											string catList = String.Empty; 
											foreach (DataRow dr in catdt.Rows) 
											{ 
												catList += dr[0].ToString() + ","; 
											} 
 
											d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = catList; 
										} 
 
										catch 
										{ 
										} 
 
 
										break; 
									case "AT$": 
										string todo=string.Empty; 
 
										switch(dd[cc.ColumnName].ToString()) 
										{ 
											case "1": 
												todo=G.rm.GetString("Acttxt71"); 
												break; 
											case "0": 
												todo=G.rm.GetString("Acttxt72"); 
												break; 
											case "2": 
												todo=G.rm.GetString("Acttxt103"); 
												break; 
										} 
 
										d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = todo; 
										break; 
									default: 
										try 
										{ 
											d[G.rm.GetString("QBTxt" + dd["rm" + cc.ColumnName].ToString())] = dd[cc.ColumnName].ToString(); 
										} 
										catch 
										{ 
 
											d[dd["rm" + cc.ColumnName].ToString()] = dd[cc.ColumnName].ToString(); 
 
										} 
 
										break; 
								} 
							} 
						} 
						labels.Rows.Add(d); 
					} 
 
					string fieldsFlag = String.Empty; 
					bool toDelete = true; 
					foreach (DataRow d in QBTables.Tables[0].Rows) 
					{ 
						StringBuilder FreeFields = new StringBuilder(); 
						string wichid = String.Empty; 
						string qff = "select AddedFields.Name,AddedFields.ID " + 
							"from qb_customerqueryfields " + 
							"INNER JOIN AddedFields ON qb_customerqueryfields.IDField = AddedFields.ID " + 
							"where qb_customerqueryfields.IDQuery=" + idQuery + " and IDTable=-" + d[0].ToString(); 
						DataSet qpFieldsQueryF = DatabaseConnection.CreateDataset(qff); 
						if (qpFieldsQueryF.Tables[0].Rows.Count > 0) 
						{ 
							DataColumn[] newcolumns = new DataColumn[qpFieldsQueryF.Tables[0].Rows.Count + 1]; 
							int i = 0; 
							foreach (DataRow fi in qpFieldsQueryF.Tables[0].Rows) 
							{ 
								newcolumns[i++] = new DataColumn(fi[0].ToString(), Type.GetType("System.String")); 
							} 
 
							switch (d[0].ToString()) 
							{ 
								case "1": 
									wichid = "AID"; 
									break; 
								case "2": 
									wichid = "CID"; 
									break; 
								case "78": 
									wichid = "LID"; 
									break; 
							} 
							fieldsFlag += wichid + "|"; 
							newcolumns[i++] = new DataColumn(wichid, Type.GetType("System.String")); 
							freeLabels.Columns.AddRange(newcolumns); 
 
							DataTable freeparams = DatabaseConnection.CreateDataset("select IDField from QB_CustomerQueryParamFields where IDQuery=" + idQuery + " and IDTable=-" + d[0].ToString()).Tables[0]; 
 
							if (freeparams.Rows.Count > 0) 
							{ 
								toDelete = false; 
								FreeFields.Append("select seconda.* from ("); 
								FreeFields.AppendFormat("SELECT AddedFields.Name, AddedFields_Cross.FIELDVAL, AddedFields_Cross.ID as {0} ", wichid); 
								FreeFields.Append("FROM AddedFields "); 
								FreeFields.Append("INNER JOIN AddedFields_Cross ON AddedFields.ID = AddedFields_Cross.IDRif "); 
								FreeFields.Append("inner join qb_customerqueryfields ON AddedFields.ID=qb_customerqueryfields.IDField "); 
								FreeFields.AppendFormat("WHERE (ADDEDFIELDS.TableName = {0}) and qb_customerqueryfields.IDQuery={1} and ", d[0].ToString(), idQuery); 
								FreeFields.Append("AddedFields.ID=qb_customerqueryfields.IDField "); 
 
								foreach (DictionaryEntry myDE in htParams) 
								{ 
 
									if (myDE.Key.ToString().Substring(0, 1) == "-") 
									{ 
										FreeFields.AppendFormat("and AddedFields.NAME='{0}' and AddedFields_Cross.FIELDVAL like '%{1}%' ", myDE.Key.ToString().Substring(1, myDE.Key.ToString().Length - 1), myDE.Value.ToString()); 
									} 
								} 
 
								FreeFields.Append(") as prima "); 
								FreeFields.Append("left outer join ("); 
 
								FreeFields.AppendFormat("SELECT AddedFields.Name, AddedFields_Cross.FIELDVAL, AddedFields_Cross.ID as {0} ", wichid); 
								FreeFields.Append("FROM AddedFields "); 
								FreeFields.Append("INNER JOIN AddedFields_Cross ON AddedFields.ID = AddedFields_Cross.IDRif "); 
								FreeFields.Append("inner join qb_customerqueryfields ON AddedFields.ID=qb_customerqueryfields.IDField "); 
								FreeFields.AppendFormat("WHERE (ADDEDFIELDS.TableName = {0}) and qb_customerqueryfields.IDQuery={1} and ", d[0].ToString(), idQuery); 
								FreeFields.Append("AddedFields.ID=qb_customerqueryfields.IDField "); 
 
								FreeFields.AppendFormat(") as seconda on prima.{0} = seconda.{0} order by seconda.AID,seconda.name", wichid); 
 
							} 
							else 
							{ 
								FreeFields.AppendFormat("SELECT AddedFields.Name, AddedFields_Cross.FIELDVAL, AddedFields_Cross.ID as {0} ", wichid); 
								FreeFields.Append("FROM AddedFields "); 
								FreeFields.Append("INNER JOIN AddedFields_Cross ON AddedFields.ID = AddedFields_Cross.IDRif "); 
								FreeFields.Append("inner join qb_customerqueryfields ON AddedFields.ID=qb_customerqueryfields.IDField "); 
								FreeFields.AppendFormat("WHERE (ADDEDFIELDS.TableName = {0}) and qb_customerqueryfields.IDQuery={1} and ", d[0].ToString(), idQuery); 
								FreeFields.Append("AddedFields.ID=qb_customerqueryfields.IDField "); 
								FreeFields.Append("order by AddedFields_Cross.id "); 
							} 
 
 
							DataTable dtFree = DatabaseConnection.CreateDataset(FreeFields.ToString()).Tables[0]; 
							foreach (DataRow crossid in dtFree.Rows) 
							{ 
								try 
								{ 
									DataRow[] tempdr = freeLabels.Select("AID=" + crossid[wichid]); 
									DataRow drfiledval; 
									if (tempdr.Length > 0) 
										drfiledval = tempdr[0]; 
									else 
										drfiledval = freeLabels.NewRow(); 
									drfiledval[crossid["Name"].ToString()] = crossid["fieldval"].ToString(); 
									drfiledval[wichid] = crossid[wichid].ToString(); 
									if (!(tempdr.Length > 0)) 
										freeLabels.Rows.Add(drfiledval); 
								} 
								catch 
								{ 
									try 
									{ 
										DataRow drfiledval; 
										drfiledval = freeLabels.NewRow(); 
										drfiledval[crossid["Name"].ToString()] = crossid["fieldval"].ToString(); 
										drfiledval[wichid] = crossid[wichid].ToString(); 
										freeLabels.Rows.Add(drfiledval); 
									}catch{} 
								} 
 
							} 
						} 
					} 
					if (freeLabels.Rows.Count > 0 && labels.Rows.Count > 0) 
					{ 
						string[] wich = fieldsFlag.Split('|'); 
						foreach (string field in wich) 
							if (field.Length > 0) DataManipulation.JoinTableByID(labels, freeLabels, field, field, toDelete); 
					} 
				} 
 
				DataColumn[] keyColumns = new DataColumn[labels.Columns.Count]; 
				for(int dc=0;dc