///////////////////////////////////////////////////////////////////////////////////// public CResultAErreur ExecuteRequeteComplexe(C2iChampDeRequete[] champs, CArbreTable arbreTables, CFiltreData filtre) { CResultAErreur result = CResultAErreur.True; result.EmpileErreur(I.T("Function not implemented|177")); return(result); }
///////////////////////////////////////////////////////////////////////////////////// public override void CreateJoinPourLiens( CFiltreData filtre, CArbreTable arbreTables, CComposantFiltre composantFiltre, ref bool bDistinct, ref string strJoin, ref string strWhere, ref string strPrefixeFrom) { strJoin = ""; arbreTables.SortTablesLiees(); foreach (CArbreTableFille arbreFils in arbreTables.TablesLiees) { strPrefixeFrom += "("; if (arbreFils.IsLeftOuter) { strJoin += " LEFT OUTER JOIN "; } else { strJoin += " INNER JOIN "; } if (arbreFils.Relation.IsRelationFille) { bDistinct = true; } string strTable; strTable = CContexteDonnee.GetNomTableInDbForNomTable(arbreFils.NomTable) + GetSqlForAliasDecl(arbreFils.Alias); string strSuiteFrom = ""; string strSuiteWhere = ""; string strPrefixe = ""; CreateJoinPourLiens(filtre, arbreFils, composantFiltre, ref bDistinct, ref strSuiteFrom, ref strSuiteWhere, ref strPrefixe); strJoin += strPrefixe; if (strSuiteFrom.Trim() != "") { strTable = "(" + strTable; } strTable += strSuiteFrom; if (strSuiteFrom.Trim() != "") { strTable += ")"; } strJoin += strTable; strJoin += " ON ("; CInfoRelationComposantFiltre relation = arbreFils.Relation; string strAliasParent, strAliasFille; string strTableDependante = ""; if (relation.IsRelationFille) { strAliasParent = arbreTables.Alias; strAliasFille = arbreFils.Alias; strTableDependante = arbreFils.NomTable; } else { strAliasParent = arbreFils.Alias; strAliasFille = arbreTables.Alias; strTableDependante = arbreTables.NomTable; } string strJointure = relation.GetJoinClause(strAliasParent, "", strAliasFille, ""); string strComplementVersion = ""; if (EstCeQueLaTableGereLesVersions(strTableDependante) && !filtre.IntegrerLesElementsSupprimes) { strComplementVersion = "(" + strAliasFille + "." + CSc2iDataConst.c_champIsDeleted + "=0 or " + strAliasFille + "." + CSc2iDataConst.c_champIsDeleted + " is null)"; } string strIdsVersionsALire = filtre.GetStringListeIdsVersionsALire(','); if (EstCeQueLaTableGereLesVersions(strTableDependante)) { if (strComplementVersion != "") { strComplementVersion += " and "; } if (strIdsVersionsALire == null) { strComplementVersion += strAliasFille + "." + CSc2iDataConst.c_champIdVersion + " is null"; } else { strComplementVersion += "(" + strAliasFille + "." + CSc2iDataConst.c_champIdVersion + " in (" + strIdsVersionsALire + ") or " + strAliasFille + "." + CSc2iDataConst.c_champIdVersion + " is null)"; } } if (strComplementVersion != "") { if (strWhere != "") { strWhere += " and (" + strComplementVersion + ") and ("; } else { strWhere += "("; } strWhere += strComplementVersion + ")"; } strJoin += strJointure + "))"; if (composantFiltre != null) { composantFiltre.DefinitAlias(arbreFils.CheminRelations, arbreFils.Alias); } if (filtre is CFiltreDataAvance) { foreach (CComposantFiltreChamp champ in ((CFiltreDataAvance)filtre).ChampsAAjouterAArbreTable) { champ.DefinitAlias(arbreFils.CheminRelations, arbreFils.Alias); } } } }
/// //////////////////////////////// public CResultAErreur ExecuteRequete(C2iRequeteAvancee requete) { CResultAErreur result = CResultAErreur.True; string strTable = requete.TableInterrogee; //S'il y a un filtre sur la requête avancée, //On prépare d'abord la sous requête de sélection des ids qui nous //Interessent Type typeReference = CContexteDonnee.GetTypeForTable(strTable); if (typeReference == null) { result.EmpileErreur(I.T("Impossible to define the associated type with @1|121", strTable)); return(result); } IDatabaseConnexion con; if (typeReference == null) { con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, ""); } else { con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeReference); } CFiltreData filtre = requete.FiltreAAppliquer; CArbreTable arbre = null; bool bHasVersionSurTablePrincipale = false; Type tpObjet = CContexteDonnee.GetTypeForTable(requete.TableInterrogee); if (tpObjet != null && !typeof(IObjetSansVersion).IsAssignableFrom(tpObjet) && typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpObjet)) { bHasVersionSurTablePrincipale = true; } if (bHasVersionSurTablePrincipale) { CFiltreDataAvance filtreVersion = new CFiltreDataAvance(strTable, ""); //Lecture dans le référentiel if (requete.IdVersionDeTravail == null && (filtre == null || !filtre.IgnorerVersionDeContexte)) { filtreVersion.Filtre = "HasNo(" + CSc2iDataConst.c_champIdVersion + ")"; } //Ignorer les suppressions if (filtre != null && !filtre.IntegrerLesElementsSupprimes) { if (filtreVersion.Filtre != "") { filtreVersion.Filtre += " and "; } filtreVersion.Filtre += CSc2iDataConst.c_champIsDeleted + "=0"; } //Lecture dans une version if (requete.IdVersionDeTravail != null && (filtre == null || !filtre.IgnorerVersionDeContexte) && requete.IdVersionDeTravail >= 0) { if (filtre == null) { filtre = new CFiltreData(); } filtre.IdsDeVersionsALire = CVersionDonnees.GetVersionsToRead(IdSession, (int)requete.IdVersionDeTravail); } if (filtreVersion.Filtre != "") { filtre = CFiltreData.GetAndFiltre(filtre, filtreVersion); } } if (filtre != null && filtre is CFiltreDataAvance) { result = ((CFiltreDataAvance)filtre).GetArbreTables(); if (!result) { return(result); } arbre = (CArbreTable)result.Data; } result = requete.CalculeArbre(arbre); if (!result) { return(result); } arbre = (CArbreTable)result.Data; int nOldTimeOut = con.CommandTimeOut; con.CommandTimeOut = 60 * 2; result = con.ExecuteRequeteComplexe(requete.Champs, arbre, filtre); con.CommandTimeOut = nOldTimeOut; return(result); }
/// ///////////////////////////////////////////////////// public override void CreateJoinPourLiens( CFiltreData filtre, CArbreTable arbreTables, CComposantFiltre composantFiltre, ref bool bDistinct, ref string strFrom, ref string strWhere) { strFrom = ""; strWhere = ""; foreach (CArbreTableFille arbreFils in arbreTables.TablesLiees) { if (arbreFils.Relation.IsRelationFille) { bDistinct = true; } string strNomTableFils = CContexteDonnee.GetNomTableInDbForNomTable(arbreFils.NomTable); strNomTableFils = GetPrefixeForTable(arbreFils.NomTable) + strNomTableFils; strFrom += "," + strNomTableFils + GetSqlForAliasDecl(arbreFils.Alias); string strSuiteFrom = ""; string strSuiteWhere = ""; CreateJoinPourLiens(filtre, arbreFils, composantFiltre, ref bDistinct, ref strSuiteFrom, ref strSuiteWhere); if (strSuiteFrom != "") { strFrom += strSuiteFrom; } if (strWhere.Trim() != "" && strSuiteWhere.Trim() != "") { strWhere += " and (" + strSuiteWhere + ")"; } if (strWhere.Trim() == "" && strSuiteWhere.Trim() != "") { strWhere = strSuiteWhere; } //Equivalence WHERE ( MACOL = MACOL (+)) CInfoRelationComposantFiltre relation = arbreFils.Relation; string strAliasParent, strAliasFille; string strSuffixeParent = ""; string strSuffixeFils = ""; string strTableDependante = ""; if (relation.IsRelationFille) { strAliasParent = arbreTables.Alias; strAliasFille = arbreFils.Alias; strTableDependante = arbreFils.NomTable; if (arbreFils.IsLeftOuter) { strSuffixeFils = "(+)"; } } else { strAliasParent = arbreFils.Alias; strAliasFille = arbreTables.Alias; strTableDependante = arbreTables.Alias; if (arbreFils.IsLeftOuter) { strSuffixeParent = "(+)"; } } string strTmp = relation.GetJoinClause(strAliasParent, strSuffixeParent, strAliasFille, strSuffixeFils); string strComplementVersion = ""; if (EstCeQueLaTableGereLesVersions(strTableDependante) && !filtre.IntegrerLesElementsSupprimes) { strComplementVersion = "(" + strAliasFille + "." + CSc2iDataConst.c_champIsDeleted + "=0 or " + strAliasFille + "." + CSc2iDataConst.c_champIsDeleted + " is null)"; } string strIdsVersionsALire = filtre.GetStringListeIdsVersionsALire(','); if (EstCeQueLaTableGereLesVersions(strTableDependante)) { if (strComplementVersion != "") { strComplementVersion += " and "; } if (strIdsVersionsALire == null) { strComplementVersion += strAliasFille + "." + CSc2iDataConst.c_champIdVersion + " is null"; } else { strComplementVersion += "(" + strAliasFille + "." + CSc2iDataConst.c_champIdVersion + " in (" + strIdsVersionsALire + ") or " + strAliasFille + "." + CSc2iDataConst.c_champIdVersion + " is null)"; } } if (strComplementVersion != "") { if (strTmp != "") { strTmp = "((" + strTmp + ") and "; } else { strAliasFille += "("; } strTmp += strComplementVersion + ")"; } if (strWhere.Trim() != "") { strWhere = "(" + strTmp + ") and (" + strWhere + ")"; } else { strWhere = strTmp; } if (composantFiltre != null) { composantFiltre.DefinitAlias(arbreFils.CheminRelations, arbreFils.Alias); } } }
public override CResultAErreur ExecuteRequeteComplexe(C2iChampDeRequete[] champs, CArbreTable arbreTables, CFiltreData filtre) { CResultAErreur result = base.ExecuteRequeteComplexe(champs, arbreTables, filtre); if (!result) { return(result); } else { DataTable dt = ((CDataTableFastSerialize)result.Data).DataTableObject; foreach (C2iChampDeRequete ch in champs) { string colch = ch.NomChamp.ToUpper(); for (int ncol = dt.Columns.Count; ncol > 0; ncol--) { DataColumn col = dt.Columns[ncol - 1]; if (col.ColumnName == colch) { dt.Columns.Add(new DataColumn(col.ColumnName + "_2", ch.TypeDonnee)); foreach (DataRow dr in dt.Rows) { dr[col.ColumnName + "_2"] = dr[col]; } dt.Columns.Remove(col); dt.Columns[col.ColumnName + "_2"].ColumnName = col.ColumnName; break; } } } } return(result); }