Ejemplo n.º 1
0
        //-------------------------------------------------------------------
        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);
        }
Ejemplo n.º 2
0
        //---------------------------------------------------------------------------------
        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);
        }
Ejemplo n.º 3
0
        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);
        }