/// /////////////////////////////////////////////////////////////
        /// <summary>
        /// Crée un attribut relation décrivant la relation qui lie la donnée cumulée au type demandé
        /// </summary>
        /// <param name="tp"></param>
        /// <returns></returns>
        public RelationAttribute GetRelationAttributeToType(Type tp)
        {
            int nCle = 0;

            foreach (CCleDonneeCumulee cle in Parametre.ChampsCle)
            {
                if (cle.TypeLie != null && cle.TypeLie == tp)
                {
                    CObjetDonneeAIdNumerique obj  = (CObjetDonneeAIdNumerique)Activator.CreateInstance(tp, new object[] { ContexteDonnee });
                    RelationAttribute        attr = new RelationAttribute(
                        obj.GetNomTable(),
                        obj.GetChampId(),
                        CDonneeCumulee.GetNomChampCle(nCle),
                        false,
                        true,
                        false);
                    return(attr);
                }
                nCle++;
            }
            return(null);
        }
        /// ////////////////////////////////////////////////////////
        protected override CResultAErreur MyExecute(CContexteExecutionAction contexte)
        {
            CResultAErreur result = CResultAErreur.True;

            //Calcule l'élément à supprimer
            CContexteEvaluationExpression contexteEval = new CContexteEvaluationExpression(Process);

            contexteEval.AttacheObjet(typeof(CContexteDonnee), contexte.ContexteDonnee);
            result = ExpressionEntiteASupprimer.Eval(contexteEval);
            if (!result)
            {
                result.EmpileErreur(I.T("Error during @1 formula evaluation|216", ExpressionEntiteASupprimer.ToString()));
                return(result);
            }
            if (result.Data is IEnumerable &&
                (!(result.Data is CListeObjetsDonnees) || m_bPurgeAdmin))
            {
                StringBuilder bl         = new StringBuilder();
                Type          tp         = null;
                string        strChampId = "";
                List <int>    lstIds     = new List <int>();
                foreach (object obj in ((IEnumerable)result.Data))
                {
                    CObjetDonneeAIdNumerique objId = obj as CObjetDonneeAIdNumerique;
                    if (objId == null)
                    {
                        result.EmpileErreur(I.T("Can not delete element of this type|20030"));
                        return(result);
                    }
                    if (tp == null)
                    {
                        tp         = objId.GetType();
                        strChampId = objId.GetChampId();
                    }
                    if (objId.GetType() != tp)
                    {
                        result.EmpileErreur(I.T("Can not delete a list of different object types|20031"));
                        return(result);
                    }
                    bl.Append(objId.Id);
                    lstIds.Add(objId.Id);
                    bl.Append(",");
                }
                if (m_bPurgeAdmin)
                {
                    result = PurgeEntites(contexte.IdSession, tp, lstIds.ToArray());
                }
                else
                {
                    if (bl.Length == 0)
                    {
                        return(result);
                    }
                    bl.Remove(bl.Length - 1, 1);
                    CListeObjetsDonnees lst = new CListeObjetsDonnees(contexte.ContexteDonnee, tp);
                    lst.Filtre = new CFiltreData(strChampId + " in (" + bl.ToString() + ")");
                    if (DeleteFillesEnCascade)
                    {
                        result = CObjetDonneeAIdNumerique.DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(lst, true);
                    }
                    else
                    {
                        result = CObjetDonneeAIdNumerique.Delete(lst, true);
                    }
                }
                return(result);
            }


            if (result.Data is CListeObjetsDonnees)
            {
                result = CObjetDonneeAIdNumerique.Delete(result.Data as CListeObjetsDonnees, true);
                return(result);
            }

            CObjetDonneeAIdNumerique objetASupprimer = (CObjetDonneeAIdNumerique)result.Data;

            ArrayList lstVariablesAVider = new ArrayList();

            //CHerche les variables qui contiennent l'objet à supprimer
            foreach (CVariableDynamique variable in contexte.Branche.Process.ListeVariables)
            {
                object val = contexte.Branche.Process.GetValeurChamp(variable);
                if (val != null && val.Equals(objetASupprimer))
                {
                    lstVariablesAVider.Add(variable);
                }
            }

            if (m_bPurgeAdmin)
            {
                result = PurgeEntites(contexte.IdSession, objetASupprimer.GetType(), new int[] { objetASupprimer.Id });
            }
            else
            {
                // Traite la suppression de tous les éléments filles en cascade.
                if (DeleteFillesEnCascade)
                {
                    result = objetASupprimer.DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(true);
                }
                else
                {
                    result = objetASupprimer.Delete(true);
                }
            }

            if (result)
            {
                foreach (CVariableDynamique variable in lstVariablesAVider)
                {
                    Process.SetValeurChamp(variable, null);
                }
            }
            return(result);
        }
Exemple #3
0
        /*
         * //-------------------------------------------------------
         * private object GetObjetPourFormuleData(object valeur)
         * {
         *  CChampFinalDeTableauCroiseCle champFinalCle = ChampFinal as CChampFinalDeTableauCroiseCle;
         *  if (champFinalCle != null)
         *  {
         *      CCleDonneeCumulee cle = parametreDonnee.GetChampCle(champFinalCle.NomChamp);
         *      if (cle != null && cle.TypeLie != null)
         *      {
         *          CObjetDonnee objet = Activator.CreateInstance(cle.TypeLie, new object[] { contexte }) as CObjetDonnee;
         *          if (objet.ReadIfExists(new object[] { valeur }))
         *              valeur = objet;
         *          else
         *              valeur = null;
         *      }
         *  }
         *  return new CDummyForDataFormula(valeur);
         * }*/

        public CResultAErreur PrepareAffichageDonnees(
            System.Data.DataTable table,
            CContexteDonnee contexte,
            CParametreDonneeCumulee parametreDonnee,
            CParametreVisuDonneePrecalculee parametreVisu)
        {
            CResultAErreur result = CResultAErreur.True;

            m_dummyForData   = null;
            m_dummyForHeader = null;

            m_dummyForHeader = GetObjetPourFormuleHeader(parametreDonnee) as CDummyForHeaderFormula;
            CCleDonneeCumulee cle = null;

            #region Précharge les données nécéssaires pour les entetes de colonnes
            if (FormuleHeader != null)
            {
                //regarde si c'est un champ clé
                CChampFinalDeTableauCroiseDonnee champDonnee = m_champFinal as CChampFinalDeTableauCroiseDonnee;
                if (champDonnee != null && champDonnee.Pivot != null && parametreDonnee != null)
                {
                    cle = parametreDonnee.GetChampCle(champDonnee.Pivot.NomChamp);
                    if (cle != null && cle.TypeLie != null)
                    {
                        if (cle.TypeLie != null)
                        {
                            m_typeObjetDonneeHeader = cle.TypeLie;
                            List <int> lstCles = new List <int>();
                            //Précharge les éléments correspondants. On trouve les valeurs
                            //des éléments dans les données étendues de chaque colonne
                            StringBuilder bl = new StringBuilder();
                            foreach (DataColumn col in table.Columns)
                            {
                                CChampFinalDetableauCroiseDonneeAvecValeur champFinalDeCol = col.ExtendedProperties[CTableauCroise.c_ExtendedPropertyToColumnKey] as CChampFinalDetableauCroiseDonneeAvecValeur;
                                if (champFinalDeCol != null && champFinalDeCol.NomChamp == ChampFinal.NomChamp)
                                {
                                    bl.Append(champFinalDeCol.ValeurPivot);
                                    bl.Append(',');
                                }
                            }
                            if (bl.Length > 0)
                            {
                                bl.Remove(bl.Length - 1, 1);
                                CListeObjetsDonnees lst = new CListeObjetsDonnees(contexte, cle.TypeLie);
                                //trouve la clé
                                CObjetDonneeAIdNumerique obj = Activator.CreateInstance(cle.TypeLie, new object[] { contexte }) as CObjetDonneeAIdNumerique;
                                lst.Filtre = new CFiltreData(obj.GetChampId() + " in (" +
                                                             bl.ToString() + ")");
                                foreach (CObjetDonneeAIdNumerique objTmp in lst)
                                {
                                    parametreVisu.PutElementInCache(objTmp);
                                }
                            }
                        }
                    }
                }
            }
            #endregion

            m_dummyForData = GetObjetPourFormuleData(parametreDonnee);
            //Si le champ final correspond à une clé, précharge toutes les valeurs
            //de clé si la clé correspond à un type
            cle = parametreDonnee.GetChampCle(ChampFinal.NomChamp);
            if (cle != null && FormuleData != null && cle.TypeLie != null)
            {
                m_typeObjetDonneeData = cle.TypeLie;
                StringBuilder bl = new StringBuilder();
                if (table.Columns.Contains(ChampFinal.NomChamp))
                {
                    foreach (DataRow row in table.Rows)
                    {
                        try
                        {
                            int nId = Int32.Parse(row[ChampFinal.NomChamp].ToString());
                            bl.Append(nId);
                            bl.Append(',');
                        }
                        catch { }
                    }
                    if (bl.Length > 0)
                    {
                        bl.Remove(bl.Length - 1, 1);
                        CObjetDonneeAIdNumerique obj = Activator.CreateInstance(cle.TypeLie, new object[] { contexte }) as CObjetDonneeAIdNumerique;
                        CListeObjetsDonnees      lst = new CListeObjetsDonnees(contexte, cle.TypeLie);
                        lst.Filtre = new CFiltreData(obj.GetChampId() + " in (" + bl.ToString() + ")");
                        foreach (CObjetDonneeAIdNumerique objTmp in lst)
                        {
                            parametreVisu.PutElementInCache(objTmp);
                        }
                    }
                }
            }
            return(result);
        }
        //**********************************************************************************
        public void ReadArbre(CListeObjetsDonnees listeSource, CListeObjetsDonnees.CArbreProps arbre, List <string> lstPaquetsALire)
        {
            if (listeSource.Count == 0)
            {
                return;
            }
            CObjetDonneeAIdNumerique objExemple = listeSource[0] as CObjetDonneeAIdNumerique;

            if (objExemple == null)
            {
                return;
            }
            string strCle         = "";
            string strPropSansCle = "";

            if (!CDefinitionProprieteDynamique.DecomposeNomProprieteUnique(arbre.ProprietePrincipale, ref strCle, ref strPropSansCle))
            {
                return;
            }
            //trouve la relation correspondante à l'identifiant de la propriété
            RelationTypeIdAttribute relation = null;

            foreach (RelationTypeIdAttribute relTest in CContexteDonnee.RelationsTypeIds)
            {
                if (relTest.IdRelation == strPropSansCle)
                {
                    relation = relTest;
                    break;
                }
            }
            if (relation == null)
            {
                return;
            }

            string     strNomColDep = relation.GetNomColDepLue();
            DataColumn col          = objExemple.Table.Columns[strNomColDep];

            if (col == null)
            {
                col = new DataColumn(strNomColDep, typeof(bool));
                col.DefaultValue = false;
                col.AllowDBNull  = false;
                objExemple.Table.Columns.Add(col);
            }

            if (lstPaquetsALire == null)
            {
                lstPaquetsALire = listeSource.GetPaquetsPourLectureFils(objExemple.GetChampId(), col);
            }

            foreach (string strPaquet in lstPaquetsALire)
            {
                if (strPaquet != null && strPaquet.Trim().Length > 0)
                {
                    CListeObjetsDonnees lst = new CListeObjetsDonnees(listeSource.ContexteDonnee,
                                                                      CContexteDonnee.GetTypeForTable(relation.TableFille));
                    lst.Filtre = new CFiltreData(
                        relation.ChampType + "=@1 and " +
                        relation.ChampId + " in " + strPaquet,
                        listeSource.TypeObjets.ToString());
                    lst.AssureLectureFaite();
                    lst.ReadDependances(arbre);
                }
            }

            foreach (CObjetDonneeAIdNumerique obj in listeSource)
            {
                CContexteDonnee.ChangeRowSansDetectionModification(obj.Row, strNomColDep, true);
            }
        }