/// <summary>
        /// Le data du result contient un CArbreTable
        /// </summary>
        /// <returns></returns>
        public CResultAErreur CalculeArbre(CArbreTable arbre)
        {
            CResultAErreur result = CResultAErreur.True;
            //Identifie les relations à mettre en jeu
            ArrayList lstChamps = new ArrayList();

            if (m_strTableInterrogee == "")
            {
                result.EmpileErreur(I.T("Request table is not defined|106"));
                return(result);
            }
            if (arbre == null)
            {
                arbre = new CArbreTableParente(m_strTableInterrogee);
            }
            foreach (C2iChampDeRequete champ in ListeChamps)
            {
                try
                {
                    foreach (CSourceDeChampDeRequete source in champ.Sources)
                    {
                        CComposantFiltreChamp composant    = new CComposantFiltreChamp(source.Source, m_strTableInterrogee);
                        CArbreTable           arbreEnCours = arbre;
                        foreach (CInfoRelationComposantFiltre relation in composant.Relations)
                        {
                            //Stef 08/08/2013 : toutes les relations sont integrées
                            //en leftouter : en effet, on doit prendre toutes les valeurs
                            //de la table source, même si elles n'ont pas de valeur liées dans la
                            //table fille
                            arbreEnCours = arbreEnCours.IntegreRelation(relation, true, composant.IdChampCustom);
                            if (arbreEnCours == null)
                            {
                                result.EmpileErreur(I.T("Itegration error of the relation @1|107", relation.RelationKey));
                                return(result);
                            }
                        }
                        source.ChampDeTable = composant.NomChamp;
                        source.Alias        = arbreEnCours.Alias;
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                    result.EmpileErreur(I.T("Error in field @1|108", champ.NomChamp));
                    return(result);
                }
            }
            result.Data = arbre;
            return(result);
        }
        /// ////////////////////////////////////////////////////////////////
        private CResultAErreur IntegreRelationsChamps(CArbreTable arbre, CComposantFiltreChamp champ, bool bIsLeftOuter)
        {
            CResultAErreur result       = CResultAErreur.True;
            CArbreTable    arbreEnCours = arbre;

            foreach (CInfoRelationComposantFiltre relation in champ.Relations)
            {
                arbreEnCours = arbreEnCours.IntegreRelation(relation, bIsLeftOuter, champ.IdChampCustom);
                if (arbreEnCours == null)
                {
                    result.EmpileErreur(I.T("Error while integrating relation @1|107", relation.RelationKey));
                    return(result);
                }
            }
            return(result);
        }
        //// ////////////////////////////////////////////////////////////////
        private CResultAErreur GetRelations(CComposantFiltre composant, CArbreTable arbre, bool bFillesLeftOuter)
        {
            CResultAErreur result = CResultAErreur.True;
            bool           bIsComposantLocalLeftOuter = false;

            //Le ou entraine des left outers
            if (composant is CComposantFiltreOperateur)
            {
                CComposantFiltreOperateur op = (CComposantFiltreOperateur)composant;
                if (op.Operateur.Id == CComposantFiltreOperateur.c_IdOperateurOu)
                {
                    bIsComposantLocalLeftOuter = true;
                }
            }
            if (composant is CComposantFiltreHasNo)
            {
                bIsComposantLocalLeftOuter = true;
            }
            if (composant is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)composant;
                result = IntegreRelationsChamps(arbre, champ, bIsComposantLocalLeftOuter || bFillesLeftOuter);
                if (!result)
                {
                    return(result);
                }
            }
            foreach (CComposantFiltre composantFils in composant.Parametres)
            {
                result = GetRelations(composantFils, arbre, bIsComposantLocalLeftOuter || bFillesLeftOuter);
                if (!result)
                {
                    return(result);
                }
            }
            return(result);
        }
Exemple #4
0
 /// ///////////////////////////////////////////////////////
 public CArbreTableFille(CArbreTable parent, CInfoRelationComposantFiltre relation, string strAlias)
 {
     m_infoRelation = relation;
     Alias          = strAlias;
     m_parent       = parent;
 }