private void SoitConcernePar(CListeObjetsDonnees lstEquips)
 {
     if (m_relationToEquipSpv == null)
     {
         foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(CEquipementLogique.c_nomTable))
         {
             if (info.TableParente == CEquipementLogique.c_nomTable && info.TableFille == CSpvEquip.c_nomTable)
             {
                 m_relationToEquipSpv = info;
                 break;
             }
         }
     }
     lstEquips.GetDependances(m_relationToEquipSpv).AssureLectureFaite();
     foreach (CEquipementLogique eqpt in lstEquips)
     {
         CSpvEquip spvEquip = new CSpvEquip(eqpt.ContexteDonnee);
         if (spvEquip.ReadIfExists(new CFiltreData(CSpvEquip.c_champSmtEquipementLogique_Id + "=@1",
                                                   eqpt.Id), false))
         {
             m_dicEquipementsSpvConcernant[spvEquip.Id] = true;
         }
     }
     lstEquips = lstEquips.GetDependances("EquipementsLogiquesContenus");
     if (lstEquips.Count > 0)
     {
         SoitConcernePar(lstEquips);
     }
 }
Пример #2
0
        /// ///////////////////////////////////////////////////////////////
        private CResultAErreur ReadObjetEtDependances(CObjetDonneeAIdNumeriqueAuto source)
        {
            CResultAErreur result = CResultAErreur.True;

            //Charge tous les parents et tous les fils
            foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(source.GetNomTable()))
            {
                //Relation parente
                if (relation.TableFille == source.GetNomTable())
                {
                    CObjetDonneeAIdNumeriqueAuto parent = (CObjetDonneeAIdNumeriqueAuto)source.GetParent(relation.ChampsFille[0],
                                                                                                         CContexteDonnee.GetTypeForTable(relation.TableParente));
                    if (parent != null)
                    {
                        parent.AssureData();
                    }
                }
                else
                {
                    if (relation.Composition)
                    {
                        CListeObjetsDonnees liste = source.GetDependancesListe(relation.TableFille, relation.ChampsFille[0]);
                        foreach (CObjetDonneeAIdNumeriqueAuto objetFils in liste)
                        {
                            objetFils.AssureData();
                            ReadObjetEtDependances(objetFils);
                        }
                    }
                }
            }
            return(result);
        }
Пример #3
0
 /////////////////////////////////////////////////////////////////
 //S'assure que les CInfoRelation vers les objets SPV sont bien connues
 private void AssureRelationsToSpv()
 {
     if (m_relationFromEquipementSpvToEquipement == null)
     {
         foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CEquipementLogique.c_nomTable))
         {
             if (relation.TableParente == CEquipementLogique.c_nomTable && relation.TableFille == CSpvEquip.c_nomTable)
             {
                 m_relationFromEquipementSpvToEquipement = relation;
                 break;
             }
         }
     }
     if (m_relationFromLiaisonSpvToLiaison == null)
     {
         foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CLienReseau.c_nomTable))
         {
             if (relation.TableParente == CLienReseau.c_nomTable && relation.TableFille == CSpvLiai.c_nomTable)
             {
                 m_relationFromLiaisonSpvToLiaison = relation;
                 break;
             }
         }
     }
     if (m_relationFromSiteSpvToSite == null)
     {
         foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CSite.c_nomTable))
         {
             if (relation.TableParente == CSite.c_nomTable && relation.TableFille == CSpvSite.c_nomTable)
             {
                 m_relationFromSiteSpvToSite = relation;
                 break;
             }
         }
     }
     if (m_relationFromEquipementSpvToEquipement == null)
     {
         throw new Exception("Error in finding relation from site to Supervised site");
     }
     if (m_relationFromLiaisonSpvToLiaison == null)
     {
         throw new Exception("Error in finding relation form link to Supervised link");
     }
     if (m_relationFromSiteSpvToSite == null)
     {
         throw new Exception("Error in finding relation from site to supervised site");
     }
 }
Пример #4
0
        //Initialise la base des alarmes en cours avec les alarmes de la base et les acces concernant chaque élément
        private void LoadAlarmesEtLiensTransForElement(string strChampDansAcces, CDictionnaireConcerne dicConcernes)
        {
            //Récupère la relation entre CSpvLienAccesAlarme et CSpvLienAccesAlarmeRep
            if (m_relationFromLienAlarmeToLienAlarmeRep == null)
            {
                foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CSpvLienAccesAlarme.c_nomTable))
                {
                    if (relation.TableFille == CSpvLienAccesAlarme_Rep.c_nomTable && relation.TableParente == CSpvLienAccesAlarme.c_nomTable)
                    {
                        m_relationFromLienAlarmeToLienAlarmeRep = relation;
                        break;
                    }
                }
            }
            List <int> lstIdsElements = new List <int>();

            lstIdsElements.AddRange(dicConcernes.Keys);
            int nSizePaquet = 100;

            for (int nPaquet = 0; nPaquet < lstIdsElements.Count; nPaquet += nSizePaquet)
            {
                int           nMax = Math.Min(nPaquet + nSizePaquet, lstIdsElements.Count);
                StringBuilder bl   = new StringBuilder();
                for (int nId = 0; nId < nMax; nId++)
                {
                    bl.Append(lstIdsElements[nId]);
                    bl.Append(';');
                }
                if (bl.Length > 0)
                {
                    bl.Remove(bl.Length - 1, 1);
                    //Charge tous les Liens d'alarme pour les éléments
                    CListeObjetsDonnees lstLiensAccesAlarme = new CListeObjetsDonnees(m_contexteDonnee, typeof(CSpvLienAccesAlarme));
                    lstLiensAccesAlarme.Filtre = new CFiltreDataAvance(CSpvLienAccesAlarme.c_nomTable,
                                                                       CSpvAccesAlarme.c_nomTable + "." + strChampDansAcces + " in (" +
                                                                       bl.ToString() + ")");
                    lstLiensAccesAlarme.AssureLectureFaite();

                    // Chargement des acces correspondant
                    CListeObjetsDonnees lstAcces = lstLiensAccesAlarme.GetDependances("AccesAlarmeOne");
                    lstAcces.InterditLectureInDB = true;

                    CListeObjetsDonnees lstEtatAlarme = lstLiensAccesAlarme.GetDependances(m_relationFromLienAlarmeToLienAlarmeRep);
                    lstEtatAlarme.Filtre = new CFiltreData(CSpvLienAccesAlarme_Rep.c_champALARM_ID + " is not null");
                    lstEtatAlarme.AssureLectureFaite();
                    lstEtatAlarme.InterditLectureInDB = true;

                    // Chargement des données alarmes
                    CListeObjetsDonnees listAlarmesDonnees = lstEtatAlarme.GetDependances("AlarmeDonnee");
                    listAlarmesDonnees.AssureLectureFaite();
                    listAlarmesDonnees.InterditLectureInDB = true;

                    lstLiensAccesAlarme.InterditLectureInDB = true;
                    lstEtatAlarme.InterditLectureInDB       = true;

                    foreach (CSpvAlarmeDonnee donneeAlarme in listAlarmesDonnees)
                    {
                        if (donneeAlarme != null)
                        {
                            CInfoAlarmeAffichee info = new CInfoAlarmeAffichee(donneeAlarme);
                            //m_dicAlarmes[info.IdSpvEvtAlarme] = info;
                            m_dicAlarmes[info.IdSpvAlarmeData] = info;
                            StartAlarme(info);
                        }
                    }

                    foreach (CSpvLienAccesAlarme lienAlarme in lstLiensAccesAlarme)
                    {
                        CSpvAcces acces = lienAlarme.AccesAlarmeOne;
                        if (acces != null)
                        {
                            int?nId = acces.Row[strChampDansAcces] as int?;
                            if (nId != null)
                            {
                                List <CInfoElementDeSchemaSupervise> lst = null;
                                if (dicConcernes.TryGetValue(nId.Value, out lst))
                                {
                                    foreach (CInfoElementDeSchemaSupervise info in lst)
                                    {
                                        info.SetConcerneParAlarmes();
                                        if (lienAlarme.MaskAdminDateMin != null && lienAlarme.MaskBriDateMin > DateTime.Now)
                                        {
                                            if (lienAlarme.MaskAdminDateMax == null || lienAlarme.MaskAdminDateMax < DateTime.Now)
                                            {
                                                info.SetMasquageAdministrateur(lienAlarme.Id, true);
                                            }
                                        }
                                        if (lienAlarme.MaskBriDateMin != null && lienAlarme.MaskBriDateMin > DateTime.Now)
                                        {
                                            if (lienAlarme.MaskBriDateMax == null || lienAlarme.MaskBriDateMax < DateTime.Now)
                                            {
                                                info.SetMasquageBrigadier(lienAlarme.Id, true);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (m_infoSchemaRacine != null)
                    {
                        List <CInfoElementDeSchemaSupervise> lstTmp = new List <CInfoElementDeSchemaSupervise>();
                        m_infoSchemaRacine.RecalculeToutLeMasquage(lstTmp);
                    }
                }
            }
        }
Пример #5
0
        //-----------------------------------------------------------------------
        private CResultAErreur AjouteNouveauxFromSecondaire(CContexteDonnee ctxDonnee)
        {
            CUtilSynchronisation utilSync        = new CUtilSynchronisation(IdSession);
            int            nIdSyncSessionEnCours = utilSync.IdSyncSession;
            CResultAErreur result = CResultAErreur.True;
            DataTable      tableLogsSynchroFromSecondaire = ctxDonnee.Tables[CEntreeLogSynchronisation.c_nomTable];

            if (tableLogsSynchroFromSecondaire == null)
            {
                result.EmpileErreur(I.T("Synchro table missing|20003"));
                return(result);
            }

            Dictionary <CIdentifiantElement, int> dicNewIds = new Dictionary <CIdentifiantElement, int>();

            ArrayList lstTables = ctxDonnee.GetTablesOrderInsert();

            foreach (DataTable tableSource in lstTables)
            {
                if (tableSource.PrimaryKey.Length == 1 && m_mappeurTablesToClass.IsSynchronisable(tableSource.TableName))
                {
                    DataTable tableDest  = GetTableSafe(tableSource.TableName);
                    string    strPrimKey = tableDest.PrimaryKey[0].ColumnName;
                    //Identifie tous les ajouts
                    DataRow[] rowsLogAjout = tableLogsSynchroFromSecondaire.Select(
                        CEntreeLogSynchronisation.c_champTable + "='" + tableSource.TableName + "' and " +
                        CEntreeLogSynchronisation.c_champType + "=" + (int)CEntreeLogSynchronisation.TypeModifLogSynchro.tAdd);
                    foreach (DataRow rowLogAjout in rowsLogAjout)
                    {
                        //Cherche la DataRow dans la table source
                        DataRow rowSource = tableSource.Rows.Find(rowLogAjout[CEntreeLogSynchronisation.c_champIdElement]);
                        if (rowSource != null)
                        {
                            //Création d'une nouvelle ligne
                            DataRow rowDest = tableDest.NewRow();
                            //copie de la ligne
                            foreach (DataColumn col in tableSource.Columns)
                            {
                                if (rowDest.Table.Columns.Contains(col.ColumnName) &&
                                    col.ColumnName != strPrimKey)
                                {
                                    rowDest[col.ColumnName] = rowSource[col.ColumnName];
                                }
                            }
                            rowDest[CSc2iDataConst.c_champIdSynchro] = nIdSyncSessionEnCours;
                            tableDest.Rows.Add(rowDest);
                            m_mapRowsFromSecondaireToMain[rowSource] = rowDest;
                            m_mapOldRowToOldId[rowSource]            = (int)rowSource[strPrimKey];


                            dicNewIds[new CIdentifiantElement(tableDest.TableName, (int)rowSource[strPrimKey])] = (int)rowDest[strPrimKey];
                            //Change l'id dans la rowSource pour qu'il soit
                            //répercuté sur les dépendances
                            rowSource[strPrimKey] = rowDest[strPrimKey];
                        }
                    }
                }
            }

            //change tous les anciens identifiants par les nouveaux
            foreach (KeyValuePair <CIdentifiantElement, int> kv in dicNewIds)
            {
                CIdentifiantElement ident = kv.Key;
                int nNewId = kv.Value;
                foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(ident.TableName))
                {
                    if (relation.TableParente == ident.TableName)
                    {
                        DataTable tableThis = Tables[relation.TableFille];
                        if (tableThis != null)
                        {
                            DataRow[] rows = tableThis.Select(relation.ChampsFille[0] + "=" + ident.IdElement);
                            foreach (DataRow row in rows)
                            {
                                row[relation.ChampsFille[0]] = nNewId;
                            }
                        }
                        DataTable tableSource = ctxDonnee.Tables[relation.TableFille];
                        if (tableSource != null)
                        {
                            DataRow[] rows = tableSource.Select(relation.ChampsFille[0] + "=" + ident.IdElement);
                            foreach (DataRow row in rows)
                            {
                                row[relation.ChampsFille[0]] = nNewId;
                            }
                        }
                    }
                }
                Type tp = CContexteDonnee.GetTypeForTable(ident.TableName);
                //Change les ids des relation typeid
                foreach (RelationTypeIdAttribute rel in RelationsTypeIds)
                {
                    DataTable tableThis = Tables[rel.TableFille];
                    if (tableThis != null)
                    {
                        DataRow[] rows = tableThis.Select(rel.ChampId + "=" + ident.IdElement + " and " +
                                                          rel.ChampType + "='" + tp.ToString() + "'");
                        foreach (DataRow row in rows)
                        {
                            row[rel.ChampId] = nNewId;
                        }
                    }
                    DataTable tableSource = ctxDonnee.Tables[rel.TableFille];
                    if (tableSource != null)
                    {
                        DataRow[] rows = tableSource.Select(rel.ChampId + "=" + ident.IdElement + " and " +
                                                            rel.ChampType + "='" + tp.ToString() + "'");
                        foreach (DataRow row in rows)
                        {
                            row[rel.ChampId] = nNewId;
                        }
                    }
                }
            }
            return(result);
        }
        public bool IsUsed(int[] nIdsParametrages)
        {
            if (nIdsParametrages == null ||
                nIdsParametrages.Length == 0)
            {
                return(false);
            }
            using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false))
            {
                C2iRequeteAvancee requete = new C2iRequeteAvancee(contexte.IdVersionDeTravail);
                string            strIds  = "";
                foreach (int nId in nIdsParametrages)
                {
                    strIds += nId.ToString() + ",";
                }
                strIds = strIds.Substring(0, strIds.Length - 1);

                lock (typeof(CLockerIsUsed))
                {
                    if (m_strRequeteParametrageInUse == "")
                    {
                        #region Construction de la requête
                        foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CParametrageSystemeCoordonnees.c_nomTable))
                        {
                            if (relation.TableFille == CParametrageSystemeCoordonnees.c_nomTable)
                            {
                                string strTableObjetAFils = relation.TableParente;
                                Type   tp = CContexteDonnee.GetTypeForTable(strTableObjetAFils);
                                if (typeof(IObjetASystemeDeCoordonnee).IsAssignableFrom(tp))
                                {
                                    IObjetASystemeDeCoordonnee objTmp = (IObjetASystemeDeCoordonnee)Activator.CreateInstance(tp, contexte);
                                    string strProprieteToObjetsAFils  = objTmp.ProprieteVersObjetsAFilsACoordonneesUtilisantLeParametrage;

                                    if (strProprieteToObjetsAFils != "")
                                    {
                                        PropertyInfo info = objTmp.GetType().GetProperty(strProprieteToObjetsAFils);
                                        if (info == null)
                                        {
                                            throw new Exception(I.T("@1 does not have the property @2|242", tp.ToString(), strProprieteToObjetsAFils));
                                        }
                                        object[] attributs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                                        if (attributs == null || attributs.Length != 1)
                                        {
                                            throw new Exception(I.T("The property @1 of the @2 type have no 'ChildAttributeRelation'|243", strProprieteToObjetsAFils, objTmp.GetType().ToString()));
                                        }
                                        tp = ((RelationFilleAttribute)attributs[0]).TypeFille;
                                    }

                                    if (typeof(IObjetAFilsACoordonnees).IsAssignableFrom(tp))
                                    {
                                        CStructureTable structure = CStructureTable.GetStructure(tp);
                                        //C'est un fils à coordonnées
                                        //Cherche toutes les relations de ce fils avec des objets à coordonnées
                                        foreach (CInfoRelation relationToObjetACoordonnee in structure.RelationsFilles)
                                        {
                                            if (relationToObjetACoordonnee.TableParente == strTableObjetAFils)
                                            {
                                                Type tpFils = CContexteDonnee.GetTypeForTable(relationToObjetACoordonnee.TableFille);
                                                if (typeof(IObjetACoordonnees).IsAssignableFrom(tpFils))
                                                {
                                                    string strPrefixe = strProprieteToObjetsAFils;
                                                    if (strPrefixe != "")
                                                    {
                                                        strPrefixe += ".";
                                                    }
                                                    //On a une relation vers un fils
                                                    m_strRequeteParametrageInUse += "has(" + strPrefixe + strTableObjetAFils + "." + relationToObjetACoordonnee.Propriete + "." + relationToObjetACoordonnee.ChampsFille[0] + ") or ";
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (m_strRequeteParametrageInUse != "")
                        {
                            m_strRequeteParametrageInUse = m_strRequeteParametrageInUse.Substring(0, m_strRequeteParametrageInUse.Length - 4);
                        }
                        #endregion
                    }
                }
                if (m_strRequeteParametrageInUse == "")
                {
                    return(false);
                }

                CListeObjetsDonnees liste = new CListeObjetsDonnees(contexte, typeof(CParametrageSystemeCoordonnees));
                liste.Filtre = new CFiltreDataAvance(
                    CParametrageSystemeCoordonnees.c_nomTable,
                    CParametrageSystemeCoordonnees.c_champId + " in (" +
                    strIds + ") and (" +
                    m_strRequeteParametrageInUse + ")");
                if (liste.CountNoLoad == 0)
                {
                    return(false);
                }
            }
            return(true);
        }
        //------------------------------------------------------------
        public CResultAErreur PurgeEntites(
            Type typeObjets,
            int[] nIdsElementsTotal,
            CDonneeNotificationModificationContexteDonnee dataModifs)
        {
            CResultAErreur result = TestTypePurgeable(typeObjets);

            if (!result)
            {
                return(result);
            }


            //travaille par paquets de 100;
            for (int nPaquet = 0; nPaquet < nIdsElementsTotal.Length; nPaquet += 100)
            {
                List <int> lstTmp = new List <int>();
                int        nMin   = Math.Min(nPaquet + 100, nIdsElementsTotal.Length);
                for (int n = nPaquet; n < nMin; n++)
                {
                    lstTmp.Add(nIdsElementsTotal[n]);
                }
                int[] nIdsElements = lstTmp.ToArray();
                if (nIdsElements.Count() == 0)
                {
                    return(result);
                }

                string strNomTable = CContexteDonnee.GetNomTableForType(typeObjets);
                if (strNomTable == null)
                {
                    result.EmpileErreur(I.T("Can not find table for type '@1'|20011"),
                                        DynamicClassAttribute.GetNomConvivial(typeObjets));
                    return(result);
                }


                CStructureTable structure = CStructureTable.GetStructure(typeObjets);
                StringBuilder   blIds     = new StringBuilder();
                foreach (int nId in nIdsElements)
                {
                    blIds.Append(nId);
                    blIds.Append(',');
                }
                if (blIds.Length == 0)
                {
                    return(result);
                }
                blIds.Remove(blIds.Length - 1, 1);

                //Si autoref, va tout chercher d'un coup
                if (typeof(IObjetDonneeAutoReference).IsAssignableFrom(typeObjets))
                {
                    HashSet <int> setIds = new HashSet <int>();
                    foreach (int nId in nIdsElements)
                    {
                        setIds.Add(nId);
                    }
                    //Va cherche toutes les dépendances
                    int nNbLast = setIds.Count();
                    while (true)
                    {
                        foreach (CInfoRelation rel in CContexteDonnee.GetListeRelationsTable(strNomTable))
                        {
                            if (rel.TableFille == rel.TableParente)
                            {
                                int[]       idsFilles = null;
                                CFiltreData filtre    = new CFiltreData(rel.ChampsFille[0] + " in (" + blIds.ToString() + ")");
                                result = GetIdsFilles(
                                    typeObjets,
                                    filtre,
                                    out idsFilles);
                                if (!result)
                                {
                                    return(result);
                                }
                                foreach (int nId in idsFilles)
                                {
                                    setIds.Add(nId);
                                }
                            }
                        }
                        nIdsElements = setIds.ToArray();
                        if (nNbLast == setIds.Count)
                        {
                            break;
                        }
                        blIds = new StringBuilder();
                        foreach (int nId in setIds)
                        {
                            blIds.Append(nId);
                            blIds.Append(',');
                        }
                        blIds.Remove(blIds.Length - 1, 1);
                        nNbLast = setIds.Count;
                    }
                }


                //Suppression des relations filles
                foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(strNomTable))
                {
                    if (info.TableParente == strNomTable && info.TableFille != strNomTable)
                    {
                        Type        typeFils   = CContexteDonnee.GetTypeForTable(info.TableFille);
                        int[]       lstIdsFils = null;
                        CFiltreData filtre     = new CFiltreData(
                            info.ChampsFille[0] + " in (" + blIds.ToString() + ")");
                        result = GetIdsFilles(typeFils,
                                              filtre,
                                              out lstIdsFils);
                        if (!result)
                        {
                            return(result);
                        }
                        if (lstIdsFils.Count() > 0)
                        {
                            result = PurgeEntites(typeFils, lstIdsFils, dataModifs);
                        }
                        if (!result)
                        {
                            return(result);
                        }
                    }
                }
                //Suppression des relations TypeId
                if (typeObjets.GetCustomAttributes(typeof(NoRelationTypeIdAttribute), true).Length == 0)
                {
                    foreach (RelationTypeIdAttribute rel in CContexteDonnee.RelationsTypeIds)
                    {
                        if (rel.IsAppliqueToType(typeObjets))
                        {
                            Type typeFils = CContexteDonnee.GetTypeForTable(rel.TableFille);
                            result = TestTypePurgeable(typeFils);
                            if (!result)
                            {
                                return(result);
                            }
                            CFiltreData filtre = new CFiltreData(
                                rel.ChampId + " in (" + blIds + ") and " +
                                rel.ChampType + "=@1",
                                typeObjets.ToString());
                            int[] lstIdsFils = null;
                            result = GetIdsFilles(
                                typeFils,
                                filtre,
                                out lstIdsFils);
                            if (!result)
                            {
                                return(result);
                            }
                            if (lstIdsFils.Count() > 0)
                            {
                                result = PurgeEntites(typeFils, lstIdsFils, dataModifs);
                            }
                            if (!result)
                            {
                                return(result);
                            }
                        }
                    }
                }

                //Suppression des valeurs de champs
                if (m_listeTypesValeursChamps == null)
                {
                    m_listeTypesValeursChamps = new List <Type>();
                    foreach (Type tp in CContexteDonnee.GetAllTypes())
                    {
                        if (typeof(CRelationElementAChamp_ChampCustom).IsAssignableFrom(tp))
                        {
                            m_listeTypesValeursChamps.Add(tp);
                        }
                    }
                }
                foreach (Type tp in m_listeTypesValeursChamps)
                {
                    CFiltreData filtre = new CFiltreData(
                        CRelationElementAChamp_ChampCustom.c_champValeurInt + " in (" +
                        blIds.ToString() + ") and " +
                        CRelationElementAChamp_ChampCustom.c_champValeurString + "=@1",
                        typeObjets.ToString());
                    int[] idsFils = null;
                    result = GetIdsFilles(tp, filtre, out idsFils);
                    if (!result)
                    {
                        return(result);
                    }
                    if (idsFils.Length > 0)
                    {
                        result = PurgeEntites(tp, idsFils, dataModifs);
                    }
                    if (!result)
                    {
                        return(result);
                    }
                }



                //Prépare les notifications
                foreach (int nId in nIdsElements)
                {
                    dataModifs.AddModifiedRecord(strNomTable,
                                                 true,
                                                 new object[] { nId });
                }

                //supprime les éléments
                //Et c'est parti pour la requete de suppression
                IDatabaseConnexion con;
                con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeObjets);
                string strWhere = structure.ChampsId[0].NomChamp + " in (" + blIds + ")";
                strWhere = COracleDatabaseConnexion.PasseLaLimiteDesMilleIn(strWhere);
                string strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(strNomTable);
                result = con.ExecuteScalar("delete from " + strNomTableInDb + " where " + strWhere);
                if (!result)
                {
                    return(result);
                }
            }
            return(result);
        }
Пример #8
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);
        }
Пример #9
0
        /////////////////////////////////////////////////////////////////
        /// <summary>
        /// Ajoute la suppression de relationsTypeId qui sont des compositions
        /// </summary>
        /// <returns></returns>
        public static CResultAErreur DoDeleteInterneACObjetDonneeNePasUtiliserSansBonneRaison(CListeObjetsDonnees liste, bool bDansContexteCourant)
        {
            CResultAErreur result = CResultAErreur.True;

            if (liste.Count == 0)
            {
                return(result);
            }

            Type typeElements = liste.TypeObjets;
            int  nTailleBloc  = 500;           //Travaille par bloc de 500 éléments
            int  nCount       = liste.Count;

            for (int nBloc = 0; nBloc < nCount; nBloc += nTailleBloc)
            {
                StringBuilder blIds = new StringBuilder();
                int           nMin  = Math.Min(nBloc + nTailleBloc, nCount);
                for (int nElement = nBloc; nElement < nMin; nElement++)
                {
                    if (((CObjetDonneeAIdNumerique)liste[nElement]).IsValide())
                    {
                        blIds.Append(((CObjetDonneeAIdNumerique)liste[nElement]).Id);
                        blIds.Append(',');
                    }
                }
                if (blIds.Length > 0)
                {
                    blIds.Remove(blIds.Length - 1, 1);
                    {
                        string strListeIds = blIds.ToString();
                        //Supprime tous les fils de relation TypeId
                        foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds)
                        {
                            if (relation.Composition)
                            {
                                Type tpLiens = CContexteDonnee.GetTypeForTable(relation.TableFille);
                                if (relation.IsAppliqueToType(typeElements))
                                {
                                    CListeObjetsDonnees listeTypeId = new CListeObjetsDonnees(liste.ContexteDonnee, tpLiens, false);
                                    CFiltreData         filtre      = new CFiltreData(
                                        relation.ChampType + "=@1 and " +
                                        relation.ChampId + " in (" + strListeIds + ")",
                                        typeElements.ToString());
                                    listeTypeId.Filtre          = filtre;
                                    listeTypeId.PreserveChanges = true;
                                    result = DoDeleteInterneACObjetDonneeNePasUtiliserSansBonneRaison(listeTypeId, bDansContexteCourant);
                                    if (!result)
                                    {
                                        return(result);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            List <CInfoRelation> relationsAMettreANull = new List <CInfoRelation>();
            string strNomTable = CContexteDonnee.GetNomTableForType(liste.TypeObjets);

            foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(strNomTable))
            {
                if (info.PasserLesFilsANullLorsDeLaSuppression && info.TableParente == strNomTable)
                {
                    relationsAMettreANull.Add(info);
                }
            }
            //Met à null ce qui doit l'être
            for (int nBloc = 0; nBloc < nCount; nBloc += nTailleBloc)
            {
                int           nMin = Math.Min(nBloc + nTailleBloc, nCount);
                StringBuilder bl   = new StringBuilder();
                for (int nElt = nBloc; nElt < nMin; nElt++)
                {
                    if (((CObjetDonneeAIdNumerique)liste[nElt]).IsValide())
                    {
                        bl.Append(((CObjetDonneeAIdNumerique)liste[nElt]).Id);
                        bl.Append(',');
                    }
                }
                bl.Remove(bl.Length - 1, 1);
                if (bl.Length > 0)
                {
                    foreach (CInfoRelation relationToNull in relationsAMettreANull)
                    {
                        CListeObjetsDonnees lstFils = new CListeObjetsDonnees(liste.ContexteDonnee,
                                                                              CContexteDonnee.GetTypeForTable(relationToNull.TableFille));
                        lstFils.Filtre = new CFiltreData(relationToNull.ChampsFille[0] + " in(" +
                                                         bl.ToString() + ")");
                        lstFils.Filtre.IgnorerVersionDeContexte     = true;
                        lstFils.Filtre.IntegrerLesElementsSupprimes = true;
                        lstFils.PreserveChanges = true;
                        foreach (CObjetDonnee fils in lstFils.ToArrayList())
                        {
                            fils.Row.Row.BeginEdit();
                            foreach (string strChamp in relationToNull.ChampsFille)
                            {
                                fils.Row.Row[strChamp] = DBNull.Value;
                            }
                            fils.Row.Row.EndEdit();
                        }
                    }
                }
            }
            foreach (CObjetDonneeAIdNumerique objet in liste.ToArrayList())
            {
                try
                {
                    if (objet.Row.RowState != DataRowState.Deleted && objet.Row.RowState != DataRowState.Detached)
                    {
                        objet.Row.Row.Sc2iDelete();
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                    return(result);
                }
            }
            return(result);
        }
Пример #10
0
        ////////////////////////////////////////////////////////////
        public static CResultAErreur CanDelete(CListeObjetsDonnees liste)
        {
            CResultAErreur result = CResultAErreur.True;

            if (liste.Count == 0)
            {
                return(result);
            }
            bool bPasObjetAIdNumeriqueAuto = false;

            foreach (CObjetDonnee objet in liste)
            {
                if (!(objet is CObjetDonneeAIdNumerique))
                {
                    bPasObjetAIdNumeriqueAuto = true;
                    result = objet.CanDelete();
                }
                else
                {
                    result = ((CObjetDonneeAIdNumerique)objet).MyCanDelete();
                }
                if (!result)
                {
                    return(result);
                }
            }
            if (bPasObjetAIdNumeriqueAuto)
            {
                return(result);
            }
            Type   typeElements   = liste.TypeObjets;
            string strListeIds    = "";
            int    nCount         = liste.Count;
            int    nTailleParBloc = 500;
            string strNomTable    = CContexteDonnee.GetNomTableForType(liste.TypeObjets);
            //Copie de la liste, pour sécuriser le parcours
            List <CObjetDonneeAIdNumerique> lstElements = liste.ToList <CObjetDonneeAIdNumerique>();

            //Travaille par bloc de 500 enregistrements pour les contrôles
            for (int nBloc = 0; nBloc < nCount; nBloc += nTailleParBloc)
            {
                StringBuilder bl   = new StringBuilder();
                int           nMin = Math.Min(nBloc + nTailleParBloc, nCount);
                //Liste des éléments du bloc en cours
                for (int nElement = nBloc; nElement < nMin; nElement++)
                {
                    bl.Append(lstElements[nElement].Id);
                    bl.Append(',');
                }
                if (bl.Length > 0)
                {
                    bl.Remove(bl.Length - 1, 1);

                    //Liste des objets du bloc en cours
                    CListeObjetsDonnees listePartielle = new CListeObjetsDonnees(liste.ContexteDonnee, liste.TypeObjets, false);
                    listePartielle.Filtre = new CFiltreData(
                        liste.ContexteDonnee.GetTableSafe(strNomTable).PrimaryKey[0].ColumnName + " in (" +
                        bl.ToString() + ")");;
                    listePartielle.InterditLectureInDB = true;                    //Pas besoin de lire car les éléments sont déjà dans le contexte de données

                    listePartielle.Filtre.IntegrerLesElementsSupprimes = liste.Filtre != null?
                                                                         liste.Filtre.IntegrerLesElementsSupprimes:
                                                                         (liste.FiltrePrincipal != null?liste.FiltrePrincipal.IntegrerLesElementsSupprimes:false);

                    listePartielle.Filtre.IgnorerVersionDeContexte = liste.Filtre != null ?
                                                                     liste.Filtre.IgnorerVersionDeContexte:
                                                                     (liste.FiltrePrincipal != null ? liste.FiltrePrincipal.IgnorerVersionDeContexte : false);

                    strListeIds = bl.ToString();
                    foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(strNomTable))
                    {
                        if (relation.TableParente == strNomTable)                    //Relation fille
                        {
                            if (!relation.Composition)                               //Ce n'est pas une composition, il ne faut pas qu'il y ait de fils
                            {
                                if (!relation.PasserLesFilsANullLorsDeLaSuppression) //Sinon, ce n'est pas grave !
                                {
                                    IObjetServeur objServeur = liste.ContexteDonnee.GetTableLoader(relation.TableFille);
                                    //Ceux pour lesquels les dépendances sont chargés n'ont pas besoin de regarder la base
                                    StringBuilder strIdsAVoirDansLaBase = new StringBuilder();
                                    DataRelation  dataRel = null;
                                    foreach (DataRelation childRel in liste.ContexteDonnee.GetTableSafe(relation.TableParente).ChildRelations)
                                    {
                                        bool bCestElle = false;
                                        if (childRel.ChildTable.TableName == relation.TableFille)
                                        {
                                            if (childRel.ChildColumns.Length == relation.ChampsFille.Length)
                                            {
                                                bCestElle = true;
                                                for (int nCol = 0; nCol < childRel.ChildColumns.Length; nCol++)
                                                {
                                                    if (childRel.ChildColumns[nCol].ColumnName != relation.ChampsFille[nCol])
                                                    {
                                                        bCestElle = false;
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                        if (bCestElle)
                                        {
                                            dataRel = childRel;
                                            break;
                                        }
                                    }
                                    if (dataRel != null)
                                    {
                                        foreach (CObjetDonneeAIdNumerique objetTmp in listePartielle)
                                        {
                                            string strFKName = objetTmp.ContexteDonnee.GetForeignKeyName(dataRel);
                                            if (objetTmp.IsDependanceChargee(strFKName))
                                            {
                                                DataRow[] rowsFilles = objetTmp.Row.Row.GetChildRows(dataRel);
                                                if (rowsFilles.Length > 0)
                                                {
                                                    result.EmpileErreur(I.T("Cannot delete element @1, @2 elements (@3) are linked|190",
                                                                            objetTmp.DescriptionElement,
                                                                            rowsFilles.Length.ToString(),
                                                                            relation.TableFille));
                                                    return(result);
                                                }
                                            }
                                            else
                                            {
                                                strIdsAVoirDansLaBase.Append(objetTmp.Id);
                                                strIdsAVoirDansLaBase.Append(',');
                                            }
                                        }
                                        if (strIdsAVoirDansLaBase.Length > 0)
                                        {
                                            strIdsAVoirDansLaBase.Remove(strIdsAVoirDansLaBase.Length - 1, 1);
                                        }
                                    }
                                    else
                                    {
                                        strIdsAVoirDansLaBase.Append(strListeIds);
                                    }
                                    if (strIdsAVoirDansLaBase.Length > 0)
                                    {
                                        CFiltreData filtre = new CFiltreData(relation.ChampsFille[0] + " in (" +
                                                                             strIdsAVoirDansLaBase.ToString() + ")");
                                        int nNb = objServeur.CountRecords(relation.TableFille, filtre);
                                        if (nNb != 0)
                                        {
                                            Type tp = CContexteDonnee.GetTypeForTable(relation.TableFille);
                                            result.EmpileErreur(I.T("Cannot delete '@1' elements because '@2' elements are dependent|160", DynamicClassAttribute.GetNomConvivial(typeElements), DynamicClassAttribute.GetNomConvivial(tp)));
                                            return(result);
                                        }
                                    }
                                }
                            }
                            else                            //C'est une composition
                            {
                                CListeObjetsDonnees listeDep = listePartielle.GetDependancesFilles(relation, liste.Filtre != null && liste.Filtre.IntegrerLesElementsSupprimes ||
                                                                                                   liste.FiltrePrincipal != null && liste.FiltrePrincipal.IntegrerLesElementsSupprimes);
                                result = CanDelete(listeDep);
                                if (!result)
                                {
                                    return(result);
                                }
                            }
                        }
                    }
                    //Peut-on supprimer les relationsTypeId
                    foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds)
                    {
                        Type tpLiens = CContexteDonnee.GetTypeForTable(relation.TableFille);
                        if (relation.AppliquerContrainteIntegrite && !relation.CanDeleteToujours && relation.IsAppliqueToType(typeElements))
                        {
                            CListeObjetsDonnees listeTypeId = new CListeObjetsDonnees(liste.ContexteDonnee, tpLiens, false);
                            CFiltreData         filtre      = new CFiltreData(
                                relation.ChampType + "=@1 and " +
                                relation.ChampId + " in (" + strListeIds + ")",
                                typeElements.ToString());
                            listeTypeId.Filtre = filtre;
                            if (relation.Composition)
                            {
                                result = CanDelete(listeTypeId);
                                if (!result)
                                {
                                    return(result);
                                }
                            }
                            else
                            {
                                int nNb = listeTypeId.CountNoLoad;
                                if (nNb != 0)
                                {
                                    Type tp = CContexteDonnee.GetTypeForTable(relation.TableFille);
                                    result.EmpileErreur(I.T("Cannot delete the required elements because elements @1 exist in database|161", DynamicClassAttribute.GetNomConvivial(tpLiens)));
                                    return(result);
                                }
                            }
                        }
                    }

                    if (IsUtiliseDansVersionFuture(liste, strListeIds))
                    {
                        result.EmpileErreur(I.T("Cannot delete these elements because they will be used in future versions|187"));
                        return(result);
                    }
                }
            }

            return(result);
        }
Пример #11
0
        ////////////////////////////////////////////////////////////
        public static CResultAErreur DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(CListeObjetsDonnees liste, bool bDansContexteCourant)
        {
            CResultAErreur result      = CResultAErreur.True;
            bool           bOldEnforce = liste.ContexteDonnee.EnforceConstraints;
            StringBuilder  bl          = new StringBuilder();

            foreach (CObjetDonneeAIdNumerique objetTmp in liste)
            {
                if (objetTmp.IsValide())
                {
                    bl.Append(objetTmp.Id);
                    bl.Append(',');
                }
            }
            if (bl.Length == 0)
            {
                return(result);
            }
            bl.Remove(bl.Length - 1, 1);
            if (IsUtiliseDansVersionFuture(liste, bl.ToString()))
            {
                result.EmpileErreur(I.T("Cannot delete these elements because they will be used in future versions|187"));
                return(result);
            }
            try
            {
                liste.ContexteDonnee.EnforceConstraints = false;
                if (liste.Count == 0)
                {
                    return(result);
                }
                foreach (CObjetDonneeAIdNumerique objet in liste)
                {
                    if (objet.IsValide())
                    {
                        result = objet.MyCanDelete();
                        if (!result)
                        {
                            return(result);
                        }
                    }
                }
                Type   typeElements = liste.TypeObjets;
                string strListeIds  = "";
                foreach (CObjetDonneeAIdNumerique objet in liste)
                {
                    if (objet.IsValide())
                    {
                        strListeIds += objet.Id.ToString() + ",";
                    }
                }
                strListeIds = strListeIds.Substring(0, strListeIds.Length - 1);
                string strNomTable = CContexteDonnee.GetNomTableForType(liste.TypeObjets);

                foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(strNomTable))
                {
                    if (relation.TableParente == strNomTable)
                    {
                        //Car la dépendance doit être lue pour la suppression
                        CListeObjetsDonnees listeDep = liste.GetDependancesFilles(relation);
                        result = DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(listeDep, bDansContexteCourant);
                        if (!result)
                        {
                            return(result);
                        }
                    }
                }

                if (typeElements.GetCustomAttributes(typeof(NoRelationTypeIdAttribute), true).Length == 0)
                {
                    //Peut-on supprimer les relationsTypeId
                    foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds)
                    {
                        Type tpLiens = CContexteDonnee.GetTypeForTable(relation.TableFille);
                        CListeObjetsDonnees listeTypeId = new CListeObjetsDonnees(liste.ContexteDonnee, tpLiens, false);
                        CFiltreData         filtre      = new CFiltreData(
                            relation.ChampType + "=@1 and " +
                            relation.ChampId + " in (" + strListeIds + ")",
                            typeElements.ToString());
                        listeTypeId.Filtre          = filtre;
                        listeTypeId.PreserveChanges = true;
                        result = DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(listeTypeId, bDansContexteCourant);
                    }
                }
                foreach (CObjetDonneeAIdNumerique objet in liste.ToArrayList())
                {
                    if (objet.IsValide())
                    {
                        result = objet.DoDeleteInterneACObjetDonneeNePasUtiliserSansBonneRaison(bDansContexteCourant);
                        if (!result)
                        {
                            return(result);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
            }
            finally
            {
                try
                {
                    liste.ContexteDonnee.EnforceConstraints = bOldEnforce;
                }
                catch
                {
                    if (liste.ContexteDonnee.HasErrors)
                    {
                        foreach (DataTable table in liste.ContexteDonnee.Tables)
                        {
                            if (table.HasErrors)
                            {
                                foreach (DataRow row in table.Rows)
                                {
                                    if (row.HasErrors)
                                    {
                                        string strKey = "";
                                        foreach (DataColumn col in table.PrimaryKey)
                                        {
                                            strKey += row[col].ToString() + "/";
                                        }
                                        result.EmpileErreur("Error while deleting (" + table.TableName + "[" +
                                                            strKey + "] : " + row.RowError);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }