//------------------------------------------------------------------- public static CRelationElementAChamp_ChampCustom GetRelationToChamp(IObjetDonneeAChamps objet, int nIdChamp) { string strTableValeurs = objet.GetNomTableRelationToChamps(); string strChampId = objet.GetChampId(); object dummy = null; if (!objet.IsDependanceChargee(strTableValeurs, strChampId)) { dummy = objet.RelationsChampsCustom; } DataTable table = objet.ContexteDonnee.Tables[strTableValeurs]; string strFiltre = CChampCustom.c_champId + "=" + nIdChamp + " and " + strChampId + "=" + ((IObjetDonneeAIdNumerique)objet).Id; //Stef 20/07/2010 : si on fait un set avec version à -1, on modifie la version Referentiel. //Le pb était que si on ne fait pas ça, on utilise CContexteDonnee.c_colIsHorsVersion = 0, //ce qui peut ramener plus d'1 élément, du coup, applique version fonctionne de manière aléatoire //car parfois, on modifie bien la version référentiel, d'autres fois, on modifie //autre chose (suivant ce qui est dans le contexte de données). if (table.Columns.Contains(CSc2iDataConst.c_champIdVersion)) { if (objet.ContexteDonnee.IdVersionDeTravail == null || objet.ContexteDonnee.IdVersionDeTravail == -1) { strFiltre += " and " + CSc2iDataConst.c_champIdVersion + " is null and " + CSc2iDataConst.c_champIsDeleted + "=0"; } else { strFiltre += " and " + CContexteDonnee.c_colIsHorsVersion + "=0"; } } DataRow[] rows = table.Select(strFiltre); if (rows.Length > 0) { CRelationElementAChamp_ChampCustom rel = (CRelationElementAChamp_ChampCustom)objet.ContexteDonnee.GetNewObjetForTable(table); rel.SetRow(rows[0]); return(rel); } return(null); }
//--------------------------------------------------------------------------------- public static object GetValeurChamp(IObjetDonneeAChamps objet, int nIdChamp, DataRowVersion version) { string strTableValeurs = objet.GetNomTableRelationToChamps(); string strChampId = objet.GetChampId(); if (!objet.IsDependanceChargee(strTableValeurs, strChampId) && !IsChampLu(objet, nIdChamp)) { object dummy; dummy = objet.RelationsChampsCustom; SetTousChampsLus(objet); } DataTable table = objet.ContexteDonnee.Tables[strTableValeurs]; string strFiltre = CChampCustom.c_champId + "=" + nIdChamp + " and " + strChampId + "=" + ((IObjetDonneeAIdNumerique)objet).Id; //Stef 20/07/2010 : si on fait un get avec version à -1, on récupère la version Referentiel. //Le pb était que si on ne fait pas ça, on utilise CContexteDonnee.c_colIsHorsVersion = 0, //ce qui peut ramener plus d'1 élément, du coup, GetValeur champ retourne //n'importe quelle valeur, et pas forcement celle du référentiel if (table.Columns.Contains(CSc2iDataConst.c_champIdVersion)) { if (objet.ContexteDonnee.IdVersionDeTravail == null || objet.ContexteDonnee.IdVersionDeTravail == -1) { strFiltre += " and " + CSc2iDataConst.c_champIdVersion + " is null and " + CSc2iDataConst.c_champIsDeleted + "=0"; } else { strFiltre += " and " + CContexteDonnee.c_colIsHorsVersion + "=0"; } } DataRow[] rows = table.Select(strFiltre); if (rows.Length > 0) { CRelationElementAChamp_ChampCustom rel = (CRelationElementAChamp_ChampCustom)objet.ContexteDonnee.GetNewObjetForTable(table); DataRow row = rows[0]; if (row.HasVersion(version)) { rel.SetRow(row); rel.VersionToReturn = version; return(rel.Valeur); } else { return(null); } } /*CListeObjetsDonnees liste = GetRelationsToChamps(nIdChamp); * * if (liste.Count > 0) * return ((CRelationElementAChamp_ChampCustom) liste[0]).Valeur;*/ //Changement le 12/10/03 : /*Si l'objet n'a pas la relation du champ, mais qu'elle devrait (par ses groupes), * retourne la valeur par défaut du champ * si le champ ne doit pas apparaitre dans cet élément, retourne null * */ // Lecture de la valeur par défaut du champ /* le 3/2/04 pourquoi ? ça ralentit tout !!, annule cette modif*/ CChampCustom champ = new CChampCustom(objet.ContexteDonnee); if (champ.ReadIfExists(nIdChamp)) { object valeurParDefaut = champ.ValeurParDefaut; /*if ( valeurParDefaut == null ) * return null; * //La valeur par défaut n'est pas null, regarde si cet élément doit avoir ce champ * foreach ( CChampCustom champNormal in TousLesChamps ) * { * if ( champNormal == champ ) * return valeurParDefaut; * }*/ return(valeurParDefaut); } return(null); }
public CResultAErreur Execute(int nIdSession, System.Collections.Hashtable valeursParametres) { CResultAErreur result = CResultAErreur.True; using (CContexteDonnee contexte = new CContexteDonnee(nIdSession, true, false)) { CSessionClient session = CSessionClient.GetSessionForIdSession(nIdSession); session.BeginTrans(); try { CHandlerEvenementServeur.SuspendGestionnaire(true); IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(nIdSession, typeof(CVersionDonneesObjetServeur)); //Supprime les versions string strRequete = "delete from " + CVersionDonneesObjetOperation.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } strRequete = "delete from " + CVersionDonneesObjet.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(CVersionDonnees.c_nomTable)) { if (info.TableParente == CVersionDonnees.c_nomTable) { strRequete = "update " + info.TableFille + " set " + info.ChampsFille[0] + "=null where " + info.ChampsFille[0] + " is not null"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } } strRequete = "delete from " + CVersionDonnees.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } contexte.SetVersionDeTravail(-1, false); //Charge toutes les tables List <Type> typesAChamps = new List <Type>(); foreach (Type tp in CContexteDonnee.GetAllTypes()) { contexte.GetTableSafe(CContexteDonnee.GetNomTableForType(tp)); if (typeof(IObjetDonneeAChamps).IsAssignableFrom(tp)) { typesAChamps.Add(tp); } } /*Problème sur les champs custom : parfois (c'est rare, mais ça arrive * les valeurs de champs ne sont pas supprimées alors que l'entité est bien * supprimée. On ne sait pas pourquoi, mais les lignes suivantes * règlent le problème*/ foreach (Type tp in typesAChamps) { string strNomTable = CContexteDonnee.GetNomTableForType(tp); IObjetDonneeAChamps elt = (IObjetDonneeAChamps)Activator.CreateInstance(tp, new object[] { contexte }); string strTableValeurs = elt.GetNomTableRelationToChamps(); strRequete = "Update " + strTableValeurs + " set " + CSc2iDataConst.c_champIsDeleted + "=1 where " + elt.GetChampId() + " in (select " + elt.GetChampId() + " from " + strNomTable + " where " + CSc2iDataConst.c_champIsDeleted + "=1)"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } ArrayList lstTables = CContexteDonnee.GetTableOrderDelete(contexte); DataTable tableChampsCustomEnDernier = null; foreach (DataTable table in lstTables) { /* J'ai un problème avec la table Champs Custom * La requête suivante ne passe pas même directement dans SQL Server * DELETE FROM CUSTOM_FIELD WHERE (SC2I_VERSION IS NOT NULL) OR (SC2I_DELETED = 1) * Si je ne traite pas cette table, la purge se passe bien * */ if (table.TableName == CChampCustom.c_nomTable) { tableChampsCustomEnDernier = table; continue; } if (table.Columns.Contains(CSc2iDataConst.c_champIdVersion)) { strRequete = "delete from " + table.TableName + " where " + CSc2iDataConst.c_champIdVersion + " is not null or " + CSc2iDataConst.c_champIsDeleted + "=1"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } } //if (tableChampsCustomEnDernier != null) //{ // if (tableChampsCustomEnDernier.Columns.Contains(CSc2iDataConst.c_champIdVersion)) // { // strRequete = "delete from " + tableChampsCustomEnDernier.TableName + " where " + // CSc2iDataConst.c_champIdVersion + " is not null or " + // CSc2iDataConst.c_champIsDeleted + "=1"; // result = connexion.RunStatement(strRequete); // if (!result) // return result; // } //} } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { CHandlerEvenementServeur.SuspendGestionnaire(false); if (!result) { session.RollbackTrans(); } else { result = session.CommitTrans(); } } } return(result); }