/// ////////////////////////////////////////////////////////////////
        //Retourne le texte de la clause join à mettre dans SQL
        public override string GetJoinClause(
            string strAliasTableParente,
            string strSuffixeParent,
            string strAliasTableFille,
            string strSuffixeFils)
        {
            string strAliasTableValeursChampCustom = strAliasTableFille;
            string strAliasTableValeurDuChamp      = strAliasTableParente;
            string strSuffixeValeursChampsCustom   = strSuffixeFils;
            string strSuffixeValeurDuChamp         = strSuffixeParent;

            string strJoin        = "";
            int    nIdChamp       = CChampCustom.GetIdFromDbKey(m_dbKeyChamp);
            string strChampValeur = CRelationElementAChamp_ChampCustom.c_champValeurString;

            strJoin = strAliasTableParente + "." + strChampValeur + strSuffixeValeurDuChamp + "=" +
                      strAliasTableValeursChampCustom + "." + CValeurChampCustom.c_champValue + strSuffixeValeursChampsCustom + " and " +
                      strAliasTableValeursChampCustom + "." + CChampCustom.c_champId + strSuffixeValeursChampsCustom + "=" + nIdChamp.ToString();
            return(strJoin);
        }
        /// //////////////////////////////////////////////////
        public override CResultAErreur GetComposantFiltreData(CFiltreDynamique filtre, CFiltreData filtreData)
        {
            CResultAErreur result = CResultAErreur.True;
            //Vérifie que l'expression condition est OK
            CContexteEvaluationExpression contexteEvaluation = new CContexteEvaluationExpression(filtre);

            result = ConditionApplication.Eval(contexteEvaluation);
            if (!result)
            {
                result.EmpileErreur(I.T("Error while evaluation of @1|143", ConditionApplication.GetString()));
                return(result);
            }

            if (result.Data == null || !((result.Data is bool && (bool)result.Data) || result.Data.ToString() == "1"))
            {
                result.Data = null;
                return(result);
            }


            string strNomChamp      = m_champ.NomPropriete;
            CDbKey dbKeyChampCustom = null;

            if (m_champ is CDefinitionProprieteDynamiqueChampCustom)
            {
                CComposantFiltreOperateur opPrincipal = null;
                dbKeyChampCustom = ((CDefinitionProprieteDynamiqueChampCustom)m_champ).DbKeyChamp;
                strNomChamp      = m_champ.NomPropriete;
                string strAcces = "";
                //Trouve le nom du champ et le chemin d'accès
                int nPos = strNomChamp.LastIndexOf(".");
                if (nPos != -1)
                {
                    strAcces    = strNomChamp.Substring(0, nPos + 1);
                    strNomChamp = strNomChamp.Substring(nPos + 1);
                }
                strAcces += "RelationsChampsCustom.";

                int nIdChamp = CChampCustom.GetIdFromDbKey(dbKeyChampCustom);

                CComposantFiltreOperateur operateurIdChamp = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEgal);
                CComposantFiltreChamp     compo1           = new CComposantFiltreChamp(strAcces + CChampCustom.c_champId, CContexteDonnee.GetNomTableForType(filtre.TypeElements));
                compo1.IdChampCustom = nIdChamp;
                operateurIdChamp.Parametres.Add(compo1);
                operateurIdChamp.Parametres.Add(new CComposantFiltreConstante(nIdChamp));
                opPrincipal = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEt);
                opPrincipal.Parametres.Add(operateurIdChamp);
                //Stef, 28072008 : pour tester si un champ est null, on vérifie CRelationElementAChamp_ChampCustom.c_champValeurNull
                //et non pas les valeurs suivant le type

                /*if ( typeChamp == typeof(double))
                 *      strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurDouble;
                 * else if ( typeChamp == typeof(int))
                 *      strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurInt;
                 * else if ( typeChamp == typeof(DateTime) || typeChamp == typeof(CDateTimeEx) )
                 *      strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurDate;
                 * else if ( typeChamp == typeof(bool))
                 *      strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurBool;
                 * else
                 *      strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurString;
                 */
                strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurNull;

                strNomChamp = strAcces + strNomChamp;

                CComposantFiltreChamp composantChamp = new CComposantFiltreChamp(strNomChamp, CContexteDonnee.GetNomTableForType(filtre.TypeElements));
                composantChamp.IdChampCustom = nIdChamp;
                CComposantFiltre composantOperateur = new CComposantFiltreOperateur(
                    m_bTestNull ? CComposantFiltreOperateur.c_IdOperateurDifferent : CComposantFiltreOperateur.c_IdOperateurEgal);
                composantOperateur.Parametres.Add(composantChamp);
                composantOperateur.Parametres.Add(new CComposantFiltreConstante(0));

                opPrincipal.Parametres.Add(composantOperateur);
                composantOperateur = opPrincipal;
                result.Data        = composantOperateur;
                //Stef 28072008, fin modif
            }
            else
            {
                CComposantFiltreChamp composantChamp = new CComposantFiltreChamp(strNomChamp, CContexteDonnee.GetNomTableForType(filtre.TypeElements));
                composantChamp.IdChampCustom = CChampCustom.GetIdFromDbKey(dbKeyChampCustom);
                CComposantFiltre composantOperateur;

                if (!m_bTestNull)
                {
                    composantOperateur = new CComposantFiltreHas();
                }
                else
                {
                    composantOperateur = new CComposantFiltreHasNo();
                }

                composantOperateur.Parametres.Add(composantChamp);
                result.Data = composantOperateur;
            }
            return(result);
        }
        /// //////////////////////////////////////////////////
        public override CResultAErreur GetComposantFiltreData(CFiltreDynamique filtre, CFiltreData filtreData)
        {
            CResultAErreur result = CResultAErreur.True;
            //Vérifie que l'expression condition est OK
            CContexteEvaluationExpression contexteEvaluation = new CContexteEvaluationExpression(filtre);

            result = ConditionApplication.Eval(contexteEvaluation);
            if (!result)
            {
                result.EmpileErreur(I.T("Error while evaluation of @1|143", ConditionApplication.GetString()));
                return(result);
            }

            if (result.Data == null || (result.Data is bool && !((bool)result.Data)) || result.Data.ToString() == "0")
            {
                result.Data = null;
                return(result);
            }
            if (m_champValeur is CDefinitionProprieteDynamiqueChampCustom)
            {
                if (m_champ is CDefinitionProprieteDynamiqueChampCustom)
                {
                    result.EmpileErreur(I.T("Operation not supported: Field = Field|156"));
                    return(result);
                }
                else
                {
                    CDefinitionProprieteDynamique defTmp = m_champ;
                    m_champ       = m_champValeur;
                    m_champValeur = defTmp;
                }
            }

            CComposantFiltreOperateur opPrincipal = null;
            string strNomChamp      = m_champ.NomPropriete;
            CDbKey dbKeyChampCustom = null;

            if (m_champ is CDefinitionProprieteDynamiqueChampCustom)
            {
                CDbKey keyChamp = ((CDefinitionProprieteDynamiqueChampCustom)m_champ).DbKeyChamp;
                strNomChamp = m_champ.NomPropriete;
                string strAcces = "";
                //Trouve le nom du champ et le chemin d'accès
                int nPos = strNomChamp.LastIndexOf(".");
                if (nPos != -1)
                {
                    strAcces    = strNomChamp.Substring(0, nPos + 1);
                    strNomChamp = strNomChamp.Substring(nPos + 1);
                }
                strAcces        += "RelationsChampsCustom.";
                dbKeyChampCustom = ((CDefinitionProprieteDynamiqueChampCustom)m_champ).DbKeyChamp;
                //Stef, 12/10/2009, le test de l'id du champ custom est
                //Maintenant gerée par le CInfoRelationChampCustom et non
                //Plus directement dans la clause where. Ca va beaucoup plus vite sous SqlServer

                /*CComposantFiltreOperateur operateurIdChamp = new CComposantFiltreOperateur ( CComposantFiltreOperateur.c_IdOperateurEgal );
                 * CComposantFiltreChamp compo1 = new CComposantFiltreChamp ( strAcces+CChampCustom.c_champId, CContexteDonnee.GetNomTableForType (filtre.TypeElements));
                 * compo1.IdChampCustom = nIdChampCustom;
                 * operateurIdChamp.Parametres.Add ( compo1 );
                 * operateurIdChamp.Parametres.Add ( new CComposantFiltreConstante ( nIdChamp ) );
                 * opPrincipal = new CComposantFiltreOperateur ( CComposantFiltreOperateur.c_IdOperateurEt );
                 * opPrincipal.Parametres.Add ( operateurIdChamp );*/
                Type typeChamp = m_champ.TypeDonnee.TypeDotNetNatif;
                if (typeChamp == typeof(double))
                {
                    strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurDouble;
                }
                else if (typeChamp == typeof(int))
                {
                    strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurInt;
                }
                else if (typeChamp == typeof(DateTime) || typeChamp == typeof(CDateTimeEx))
                {
                    strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurDate;
                }
                else if (typeChamp == typeof(bool))
                {
                    strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurBool;
                }
                else
                {
                    strNomChamp = CRelationElementAChamp_ChampCustom.c_champValeurString;
                }
                strNomChamp = strAcces + strNomChamp;
                opPrincipal = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEt);
                CComposantFiltreChamp composantChampNull = new CComposantFiltreChamp(strAcces + CRelationElementAChamp_ChampCustom.c_champValeurNull, CContexteDonnee.GetNomTableForType(filtre.TypeElements));
                composantChampNull.IdChampCustom = CChampCustom.GetIdFromDbKey(dbKeyChampCustom);
                CComposantFiltreOperateur opEgal = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEgal);
                opEgal.Parametres.Add(composantChampNull);
                opEgal.Parametres.Add(new CComposantFiltreConstante(0));
                opPrincipal.Parametres.Add(opEgal);
            }
            CComposantFiltreChamp composantChamp = new CComposantFiltreChamp(strNomChamp, CContexteDonnee.GetNomTableForType(filtre.TypeElements));

            composantChamp.IdChampCustom = CChampCustom.GetIdFromDbKey(dbKeyChampCustom);
            CComposantFiltreOperateur composantOperateur = new CComposantFiltreOperateur(IdOperateur);


            CComposantFiltre composantValeur = null;

            if (ExpressionValeur == null)
            {
                if (m_champValeur != null)
                {
                    composantValeur = new CComposantFiltreChamp(m_champValeur.NomPropriete, composantChamp.TableDeBase);
                }
                else
                {
                    result.EmpileErreur(I.T("Value is not defined for element @1|157", Description));
                    result.Data = null;
                    return(result);
                }
            }
            else
            {
                result = ExpressionValeur.Eval(contexteEvaluation);
                if (!result)
                {
                    result.EmpileErreur(I.T("Error while evaluation of @1|143", ExpressionValeur.GetString()));
                    result.Data = null;
                    return(result);
                }
                CComposantFiltreVariable composantVariable = new CComposantFiltreVariable("@" + (filtreData.Parametres.Count + 1).ToString());
                filtreData.Parametres.Add(result.Data);
                composantValeur = composantVariable;
            }
            composantOperateur.Parametres.Add(composantChamp);
            composantOperateur.Parametres.Add(composantValeur);

            if (IdOperateur == CComposantFiltreOperateur.c_IdOperateurDifferent)
            {
                //Ajoute ou null
                CComposantFiltreOperateur ou = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurOu);
                ou.Parametres.Add(composantOperateur);

                CComposantFiltreHasNo hasNo = new CComposantFiltreHasNo();
                hasNo.Parametres.Add(new CComposantFiltreChamp(strNomChamp, composantChamp.TableDeBase));
                ou.Parametres.Add(hasNo);
                composantOperateur = ou;
            }
            if (opPrincipal != null)
            {
                opPrincipal.Parametres.Add(composantOperateur);
                composantOperateur = opPrincipal;
            }
            result.Data = composantOperateur;
            return(result);
        }