Пример #1
0
        ////////////////////////////////////////////////////////
        public string GetStringExpression(IExpression expression, CFiltreData filtre)
        {
            string strRetour = "";

            if (expression is CComposantFiltre)
            {
                expression = ((CComposantFiltre)expression).GetComposantFiltreFinal(filtre);
            }

            if (expression is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)expression;
                if (champ.Alias != "")
                {
                    strRetour += champ.Alias + ".";
                }
                strRetour += champ.NomChamp;

                /*if ( champ.Relations.Length > 0 )
                 * {
                 *      if (champ.Relations[champ.Relations.Length-1].IsRelationFille)
                 *              strRetour = champ.Relations[champ.Relations.Length-1].TableFille+".";
                 *      else
                 *              strRetour = champ.Relations[champ.Relations.Length-1].TableParente+".";
                 * }
                 * strRetour += champ.NomChamp;*/
            }


            else if (expression is CComposantFiltreVariable)
            {
                strRetour = ((CComposantFiltreVariable)expression).GetString();
            }



            else if (expression is CComposantFiltreConstante)
            {
                CComposantFiltreConstante constante = (CComposantFiltreConstante)expression;
                strRetour = CConvertisseurObjetToSqlServeur.ConvertToSql(constante.Valeur);
            }



            else if (expression is CComposantFiltreHasNo)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], filtre);
                strRetour += " is null";
            }

            else if (expression is CComposantFiltreHas)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], filtre);
                strRetour += " is not null";
            }



            else if (expression is CComposantFiltreListe)
            {
                CComposantFiltreListe liste = (CComposantFiltreListe)expression;
                strRetour = "";
                foreach (IExpression expInListe in liste.Liste)
                {
                    strRetour += GetStringExpression(expInListe, filtre) + ",";
                }
                if (strRetour.Length > 0)
                {
                    strRetour = strRetour.Substring(0, strRetour.Length - 1);
                }
                strRetour = "(" + strRetour + ")";
            }



            else if (expression is CComposantFiltreOperateur)
            {
                COperateurAnalysable operateur = ((CComposantFiltreOperateur)expression).Operateur;
                string strTexteOperateur       = operateur.Texte;
                if (operateur.Texte.Length > 3 && operateur.Texte.Substring(0, 3).ToUpper() == "NOT")
                {
                    strTexteOperateur = operateur.Texte.Substring(0, 3) + " " + operateur.Texte.Substring(3);
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains)
                {
                    strTexteOperateur = "like";
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                {
                    strTexteOperateur = "not like";
                }
                if (operateur.Niveau > 0 && operateur.Niveau != 4)
                {
                    string str1, str2, str3;
                    str1 = GetStringExpression((IExpression)expression.Parametres[0], filtre);
                    str2 = strTexteOperateur;
                    str3 = GetStringExpression((IExpression)expression.Parametres[1], filtre);
                    string[] valeurs = new string[] { str3 };
                    if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains ||
                        operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                    {
                        str3 = "'%'+" + str3 + "+'%'";
                    }
                    if (operateur.Niveau >= 4)
                    {
                        str1 = "(" + str1 + ")";
                        str3 = "(" + str3 + ")";
                    }
                    bool bChercheVide = false;
                    if (strTexteOperateur.ToUpper() == "LIKE")
                    {
                        bChercheVide = str3 == "%%";
                        if (!bChercheVide && str3.Contains("@"))
                        {
                            try
                            {
                                int nParam = Int32.Parse(str3.Substring("@PARAM".Length));
                                if (filtre.Parametres[nParam - 1].ToString() == "%%")
                                {
                                    bChercheVide = true;
                                }
                            }
                            catch
                            {
                            }
                        }
                    }

                    if (bChercheVide)
                    {
                        strRetour += str3 + "=" + str3;
                    }
                    else
                    {
                        strRetour = str1 + " " + str2 + " " + str3;

                        /*if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurLike ||
                         *   operateur.Id == CComposantFiltreOperateur.c_IdOperateurNotLike)
                         *   strRetour += " ESCAPE '\\'";*/
                    }
                }
                else
                {
                    strRetour = strTexteOperateur + "(";
                    foreach (IExpression exp in expression.Parametres)
                    {
                        strRetour += GetStringExpression(exp, filtre) + ",";
                    }
                    if (expression.Parametres.Count > 0)
                    {
                        strRetour = strRetour.Substring(0, strRetour.Length - 1);
                    }
                    strRetour += ")";
                }
            }
            return(strRetour);
        }
Пример #2
0
        ////////////////////////////////////////////////////////
        public string GetStringExpression(IExpression expression, CFiltreData filtre)
        {
            string strRetour = "";

            if (expression is CComposantFiltre)
            {
                expression = ((CComposantFiltre)expression).GetComposantFiltreFinal(filtre);
            }

            if (expression is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)expression;
                foreach (CInfoRelationComposantFiltre info in champ.Relations)
                {
                    strRetour += "Parent(" + info.RelationKey + ").";
                }
                strRetour += champ.NomChamp;
            }


            else if (expression is CComposantFiltreConstante)
            {
                CComposantFiltreConstante constante = (CComposantFiltreConstante)expression;
                if (constante.Valeur is String)
                {
                    strRetour = "'" + constante.Valeur.ToString().Replace("'", "''") + "'";
                }
                else if (constante.Valeur is DateTime)
                {
                    strRetour += ((DateTime)constante.Valeur).ToShortDateString();
                }
                else
                {
                    strRetour += constante.Valeur.ToString();
                }
            }


            else if (expression is CComposantFiltreListe)
            {
                CComposantFiltreListe liste = (CComposantFiltreListe)expression;
                strRetour = "";
                foreach (IExpression expDeListe in liste.Liste)
                {
                    strRetour += GetStringExpression(expDeListe, filtre) + ",";
                }
                if (strRetour.Length > 0)
                {
                    strRetour = strRetour.Substring(0, strRetour.Length - 1);
                }
                strRetour = "(" + strRetour + ")";
            }


            else if (expression is CComposantFiltreOperateur)
            {
                COperateurAnalysable operateur = ((CComposantFiltreOperateur)expression).Operateur;
                string strTexteOperateur       = operateur.Texte;
                if (operateur.Niveau > 0 && operateur.Niveau != 4)
                {
                    if (operateur.Texte.Length > 3 && operateur.Texte.Substring(0, 3).ToUpper() == "NOT")
                    {
                        strTexteOperateur = operateur.Texte.Substring(0, 3) + " " + operateur.Texte.Substring(3);
                    }

                    strRetour = GetStringExpression((IExpression)expression.Parametres[0], filtre) +
                                " " + strTexteOperateur +
                                " " + GetStringExpression((IExpression)expression.Parametres[1], filtre);
                }
                else
                {
                    strRetour = strTexteOperateur + "(";
                    foreach (IExpression exp in expression.Parametres)
                    {
                        strRetour += GetStringExpression(exp, filtre) + ",";
                    }
                    if (expression.Parametres.Count > 0)
                    {
                        strRetour = strRetour.Substring(0, strRetour.Length - 1);
                    }
                    strRetour += ")";
                }
            }

            return(strRetour);
        }
Пример #3
0
        ////////////////////////////////////////////////////////
        protected string GetStringExpression(
            IExpression expression,
            CFiltreData filtre,
            Dictionary <string, object> valeursParametres)
        {
            string strRetour = "";

            if (expression is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)expression;
                if (champ.Alias != "")
                {
                    strRetour += champ.Alias + ".";
                }
                strRetour += champ.NomChamp;

                /*if ( champ.Relations.Length > 0 )
                 * {
                 *      if (champ.Relations[champ.Relations.Length-1].IsRelationFille)
                 *              strRetour = champ.Relations[champ.Relations.Length-1].TableFille+".";
                 *      else
                 *              strRetour = champ.Relations[champ.Relations.Length-1].TableParente+".";
                 * }
                 * strRetour += champ.NomChamp;*/
            }


            else if (expression is CComposantFiltreVariable)
            {
                strRetour = ((CComposantFiltreVariable)expression).GetString();
            }



            else if (expression is CComposantFiltreConstante)
            {
                CComposantFiltreConstante constante = (CComposantFiltreConstante)expression;
                strRetour = CConvertisseurObjetToSqlServeur.ConvertToSql(constante.Valeur);
            }



            else if (expression is CComposantFiltreHasNo)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], filtre, valeursParametres);
                strRetour += " is null";
            }

            else if (expression is CComposantFiltreHas)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], filtre, valeursParametres);
                strRetour += " is not null";
            }



            else if (expression is CComposantFiltreListe)
            {
                CComposantFiltreListe liste = (CComposantFiltreListe)expression;
                strRetour = "";
                foreach (IExpression expInListe in liste.Liste)
                {
                    strRetour += GetStringExpression(expInListe, filtre, valeursParametres) + ",";
                }
                if (strRetour.Length > 0)
                {
                    strRetour = strRetour.Substring(0, strRetour.Length - 1);
                }
                strRetour = "(" + strRetour + ")";
            }

            else if (expression is CComposantFiltreSousFiltre && m_connexion != null)
            {
                CComposantFiltreSousFiltre compo  = (CComposantFiltreSousFiltre)expression;
                CResultAErreur             result = compo.InterpreteParametres();
                if (result)
                {
                    string strWhere      = "";
                    string strJoin       = "";
                    string strPrefixFrom = "";
                    bool   bDistinct     = false;
                    compo.Filtre.Parametres.Clear();
                    compo.Filtre.AddChampAAjouterAArbreTable(compo.ChampSousFiltre);
                    foreach (object parametre in filtre.Parametres)
                    {
                        compo.Filtre.Parametres.Add(parametre);
                    }
                    CComposantFiltreOperateur compoEt = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEt);
                    compoEt.Parametres.Add(compo.Filtre.ComposantPrincipal);
                    CComposantFiltreHas compoNotNull = new CComposantFiltreHas();
                    compoNotNull.Parametres.Add(compo.ChampSousFiltre);
                    compoEt.Parametres.Add(compoNotNull);
                    compo.Filtre.ComposantPrincipal = compoEt;
                    IEnumerable <C2iDbDatabaseConnexion.CParametreRequeteDatabase> parametres = null;
                    result = m_connexion.PrepareRequeteFromFiltre(
                        compo.Filtre,
                        ref strWhere,
                        ref strJoin,
                        ref bDistinct,
                        ref strPrefixFrom,
                        ref parametres);
                    if (result)
                    {
                        strRetour += " ";
                        if (compo.ChampTeste.Alias != "")
                        {
                            strRetour += compo.ChampTeste.Alias + ".";
                        }
                        strRetour += compo.ChampTeste.NomChamp;

                        if (compo is CComposantFiltreInSousFiltre)
                        {
                            strRetour += " in (";
                        }
                        else
                        {
                            strRetour += " not in (";
                        }
                        string strSelect = "select ";
                        if (compo.ChampSousFiltre.Alias != "")
                        {
                            strSelect += compo.ChampSousFiltre.Alias + ".";
                        }
                        strSelect += compo.ChampSousFiltre.NomChamp;
                        strSelect += " from " + CContexteDonnee.GetNomTableInDbForNomTable(compo.TableSousFiltre);
                        strRetour += m_connexion.GetSql(strSelect, strPrefixFrom, strJoin, strWhere);
                        strRetour += ")";
                    }
                }
            }



            else if (expression is CComposantFiltreOperateur)
            {
                COperateurAnalysable operateur = ((CComposantFiltreOperateur)expression).Operateur;
                string strTexteOperateur       = operateur.Texte;
                //Remplacement du not par not espace operateur
                bool bToUpper = false;
                if (operateur.Texte.Length > 3 && operateur.Texte.Substring(0, 3).ToUpper() == "NOT")
                {
                    strTexteOperateur = operateur.Texte.Substring(0, 3) + " " + operateur.Texte.Substring(3);
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains)
                {
                    strTexteOperateur = "like";
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                {
                    strTexteOperateur = "not like";
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurLike ||
                    operateur.Id == CComposantFiltreOperateur.c_IdOperateurNotLike ||
                    operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains ||
                    operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                {
                    bToUpper = true;
                }


                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurEtBinaire)
                {
                    string str1, str2;
                    str1      = GetStringExpression((IExpression)expression.Parametres[0], filtre, valeursParametres);
                    str2      = GetStringExpression((IExpression)expression.Parametres[1], filtre, valeursParametres);
                    strRetour = "BitAnd(" + str1 + "," + str2 + ")";
                }
                else if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurOuBinaire)
                {
                    string str1, str2;
                    str1      = GetStringExpression((IExpression)expression.Parametres[0], filtre, valeursParametres);
                    str2      = GetStringExpression((IExpression)expression.Parametres[1], filtre, valeursParametres);
                    strRetour = "BitOr(" + str1 + "," + str2 + ")";
                }

                else if (operateur.Niveau > 0 && operateur.Niveau != 4)
                {
                    string str1, str2, str3;
                    str1 = GetStringExpression((IExpression)expression.Parametres[0], filtre, valeursParametres);
                    if (bToUpper)
                    {
                        str1 = "Upper(" + str1 + ")";
                    }
                    str2 = strTexteOperateur;
                    str3 = GetStringExpression((IExpression)expression.Parametres[1], filtre, valeursParametres);

                    object val = null;

                    if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurEgal &&
                        valeursParametres != null &&
                        valeursParametres.TryGetValue(str3, out val) &&
                        val == c_null)
                    {
                        //Obligé d'ajouter une référence au nom de la variable, sinon, oracle fait la gueule
                        //d'où or str3 is null qui ne sert à rien
                        strRetour = "(" + str1 + " is null or " + str3 + " is null)";
                    }
                    else if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurDifferent &&
                             valeursParametres != null &&
                             valeursParametres.TryGetValue(str3, out val) &&
                             val == c_null)
                    {
                        //Obligé d'ajouter une référence au nom de la variable, sinon, oracle fait la gueule
                        //d'où or str3 is null qui ne sert à rien
                        strRetour = "(" + str1 + " is not null or " + str3 + " is null)";
                    }
                    else
                    {
                        if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains ||
                            operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                        {
                            str3 = "Concat('%',concat(" + str3 + ",'%'))";
                        }
                        if (bToUpper)
                        {
                            str3 = "Upper(" + str3 + ")";
                        }

                        if (operateur.Niveau >= 4)
                        {
                            str1 = "(" + str1 + ")";
                            str3 = "(" + str3 + ")";
                        }
                        strRetour = str1 + " " + str2 + " " + str3;
                    }
                }
                else
                {
                    strRetour = strTexteOperateur + "(";
                    foreach (IExpression exp in expression.Parametres)
                    {
                        strRetour += GetStringExpression(exp, filtre, valeursParametres) + ",";
                    }
                    if (expression.Parametres.Count > 0)
                    {
                        strRetour = strRetour.Substring(0, strRetour.Length - 1);
                    }
                    strRetour += ")";
                }
            }
            return(strRetour);
        }
        ////////////////////////////////////////////////////////
        protected string GetStringExpression(IExpression expression, Dictionary <string, object> valeursParametres)
        {
            string strRetour = "";

            if (expression is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)expression;
                if (champ.Alias != "")
                {
                    strRetour += champ.Alias + ".";
                }
                strRetour += champ.NomChamp;

                /*if ( champ.Relations.Length > 0 )
                 * {
                 *      if (champ.Relations[champ.Relations.Length-1].IsRelationFille)
                 *              strRetour = champ.Relations[champ.Relations.Length-1].TableFille+".";
                 *      else
                 *              strRetour = champ.Relations[champ.Relations.Length-1].TableParente+".";
                 * }
                 * strRetour += champ.NomChamp;*/
            }


            else if (expression is CComposantFiltreVariable)
            {
                strRetour = ((CComposantFiltreVariable)expression).GetString();
            }



            else if (expression is CComposantFiltreConstante)
            {
                CComposantFiltreConstante constante = (CComposantFiltreConstante)expression;
                strRetour = CConvertisseurObjetToSqlServeur.ConvertToSql(constante.Valeur);
            }



            else if (expression is CComposantFiltreHasNo)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], valeursParametres);
                strRetour += " is null";
            }

            else if (expression is CComposantFiltreHas)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], valeursParametres);
                strRetour += " is not null";
            }



            else if (expression is CComposantFiltreListe)
            {
                CComposantFiltreListe liste = (CComposantFiltreListe)expression;
                strRetour = "";
                foreach (IExpression expInListe in liste.Liste)
                {
                    strRetour += GetStringExpression(expInListe, valeursParametres) + ",";
                }
                if (strRetour.Length > 0)
                {
                    strRetour = strRetour.Substring(0, strRetour.Length - 1);
                }
                strRetour = "(" + strRetour + ")";
            }



            else if (expression is CComposantFiltreOperateur)
            {
                COperateurAnalysable operateur = ((CComposantFiltreOperateur)expression).Operateur;
                string strTexteOperateur       = operateur.Texte;
                //Remplacement du not par not espace operateur
                bool bToUpper = false;
                if (operateur.Texte.Length > 3 && operateur.Texte.Substring(0, 3).ToUpper() == "NOT")
                {
                    strTexteOperateur = operateur.Texte.Substring(0, 3) + " " + operateur.Texte.Substring(3);
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains)
                {
                    strTexteOperateur = "like";
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                {
                    strTexteOperateur = "not like";
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurLike ||
                    operateur.Id == CComposantFiltreOperateur.c_IdOperateurNotLike ||
                    operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains ||
                    operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                {
                    bToUpper = true;
                }


                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurEtBinaire)
                {
                    string str1, str2;
                    str1      = GetStringExpression((IExpression)expression.Parametres[0], valeursParametres);
                    str2      = GetStringExpression((IExpression)expression.Parametres[1], valeursParametres);
                    strRetour = "BitAnd(" + str1 + "," + str2 + ")";
                }
                else if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurOuBinaire)
                {
                    string str1, str2;
                    str1      = GetStringExpression((IExpression)expression.Parametres[0], valeursParametres);
                    str2      = GetStringExpression((IExpression)expression.Parametres[1], valeursParametres);
                    strRetour = "BitOr(" + str1 + "," + str2 + ")";
                }

                else if (operateur.Niveau > 0 && operateur.Niveau != 4)
                {
                    string str1, str2, str3;
                    str1 = GetStringExpression((IExpression)expression.Parametres[0], valeursParametres);
                    if (bToUpper)
                    {
                        str1 = "Upper(" + str1 + ")";
                    }
                    str2 = strTexteOperateur;
                    str3 = GetStringExpression((IExpression)expression.Parametres[1], valeursParametres);

                    object val = null;

                    if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurEgal &&
                        valeursParametres != null &&
                        valeursParametres.TryGetValue(str3, out val) &&
                        val == c_null)
                    {
                        //Obligé d'ajouter une référence au nom de la variable, sinon, MySql fait la gueule
                        //d'où or str3 is null qui ne sert à rien
                        strRetour = "(" + str1 + " is null or " + str3 + " is null)";
                    }
                    else if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurDifferent &&
                             valeursParametres != null &&
                             valeursParametres.TryGetValue(str3, out val) &&
                             val == c_null)
                    {
                        //Obligé d'ajouter une référence au nom de la variable, sinon, MySql fait la gueule
                        //d'où or str3 is null qui ne sert à rien
                        strRetour = "(" + str1 + " is not null or " + str3 + " is null)";
                    }
                    else
                    {
                        if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains ||
                            operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                        {
                            str3 = "Concat('%',concat(" + str3 + ",'%'))";
                        }
                        if (bToUpper)
                        {
                            str3 = "Upper(" + str3 + ")";
                        }

                        if (operateur.Niveau >= 4)
                        {
                            str1 = "(" + str1 + ")";
                            str3 = "(" + str3 + ")";
                        }
                        strRetour = str1 + " " + str2 + " " + str3;
                    }
                }
                else
                {
                    strRetour = strTexteOperateur + "(";
                    foreach (IExpression exp in expression.Parametres)
                    {
                        strRetour += GetStringExpression(exp, valeursParametres) + ",";
                    }
                    if (expression.Parametres.Count > 0)
                    {
                        strRetour = strRetour.Substring(0, strRetour.Length - 1);
                    }
                    strRetour += ")";
                }
            }
            return(strRetour);
        }
Пример #5
0
        ////////////////////////////////////////////////////////
        public string GetStringExpression(IExpression expression, CFiltreData filtre)
        {
            string strRetour = "";

            if (expression is CComposantFiltre)
            {
                expression = ((CComposantFiltre)expression).GetComposantFiltreFinal(filtre);
            }

            if (expression is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)expression;
                if (champ.Alias != "")
                {
                    strRetour += champ.Alias + ".";
                }
                strRetour += champ.NomChamp;
            }


            else if (expression is CComposantFiltreVariable)
            {
                strRetour = ((CComposantFiltreVariable)expression).GetString();
            }



            else if (expression is CComposantFiltreConstante)
            {
                CComposantFiltreConstante constante = (CComposantFiltreConstante)expression;
                strRetour = CConvertisseurObjetToSqlServeur.ConvertToSql(constante.Valeur);
            }



            else if (expression is CComposantFiltreHasNo)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], filtre);
                strRetour += " is null";
            }

            else if (expression is CComposantFiltreHas)
            {
                strRetour += GetStringExpression((IExpression)expression.Parametres[0], filtre);
                strRetour += " is not null";
            }



            else if (expression is CComposantFiltreListe)
            {
                CComposantFiltreListe liste = (CComposantFiltreListe)expression;
                strRetour = "";
                foreach (IExpression expInListe in liste.Liste)
                {
                    strRetour += GetStringExpression(expInListe, filtre) + ",";
                }
                if (strRetour.Length > 0)
                {
                    strRetour = strRetour.Substring(0, strRetour.Length - 1);
                }
                strRetour = "(" + strRetour + ")";
            }

            else if (expression is CComposantFiltreSousFiltre && m_connexion != null)
            {
                CComposantFiltreSousFiltre compo  = (CComposantFiltreSousFiltre)expression;
                CResultAErreur             result = compo.InterpreteParametres();
                if (result)
                {
                    string strWhere      = "";
                    string strJoin       = "";
                    string strPrefixFrom = "";
                    bool   bDistinct     = false;
                    compo.Filtre.Parametres.Clear();
                    compo.Filtre.AddChampAAjouterAArbreTable(compo.ChampSousFiltre);
                    foreach (object parametre in filtre.Parametres)
                    {
                        compo.Filtre.Parametres.Add(parametre);
                    }
                    CComposantFiltreOperateur compoEt = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEt);
                    compoEt.Parametres.Add(compo.Filtre.ComposantPrincipal);
                    CComposantFiltreHas compoNotNull = new CComposantFiltreHas();
                    compoNotNull.Parametres.Add(compo.ChampSousFiltre);
                    compoEt.Parametres.Add(compoNotNull);
                    compo.Filtre.ComposantPrincipal = compoEt;
                    IEnumerable <C2iDbDatabaseConnexion.CParametreRequeteDatabase> parametres = null;
                    result = m_connexion.PrepareRequeteFromFiltre(
                        compo.Filtre,
                        ref strWhere,
                        ref strJoin,
                        ref bDistinct,
                        ref strPrefixFrom,
                        ref parametres);
                    if (result)
                    {
                        strRetour += " ";
                        if (compo.ChampTeste.Alias != "")
                        {
                            strRetour += compo.ChampTeste.Alias + ".";
                        }
                        strRetour += compo.ChampTeste.NomChamp;

                        if (compo is CComposantFiltreInSousFiltre)
                        {
                            strRetour += " in (";
                        }
                        else
                        {
                            strRetour += " not in (";
                        }
                        string strSelect = "select ";
                        if (compo.ChampSousFiltre.Alias != "")
                        {
                            strSelect += compo.ChampSousFiltre.Alias + ".";
                        }
                        strSelect += compo.ChampSousFiltre.NomChamp;
                        strSelect += " from " + CContexteDonnee.GetNomTableInDbForNomTable(compo.TableSousFiltre);
                        strRetour += m_connexion.GetSql(strSelect, strPrefixFrom, strJoin, strWhere);
                        strRetour += ")";
                    }
                }
            }



            else if (expression is CComposantFiltreOperateur)
            {
                COperateurAnalysable operateur = ((CComposantFiltreOperateur)expression).Operateur;
                string strTexteOperateur       = operateur.Texte;
                if (operateur.Texte.Length > 3 && operateur.Texte.Substring(0, 3).ToUpper() == "NOT")
                {
                    strTexteOperateur = operateur.Texte.Substring(0, 3) + " " + operateur.Texte.Substring(3);
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains)
                {
                    strTexteOperateur = "like";
                }
                if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                {
                    strTexteOperateur = "not like";
                }
                if (operateur.Niveau > 0 && operateur.Niveau != 4)
                {
                    string str1, str2, str3;
                    str1 = GetStringExpression((IExpression)expression.Parametres[0], filtre);
                    str2 = strTexteOperateur;
                    str3 = GetStringExpression((IExpression)expression.Parametres[1], filtre);
                    string[] valeurs = new string[] { str3 };
                    if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurContains ||
                        operateur.Id == CComposantFiltreOperateur.c_IdOperateurWithout)
                    {
                        str3 = "'%'+" + str3 + "+'%'";
                    }
                    if (operateur.Niveau >= 4)
                    {
                        str1 = "(" + str1 + ")";
                        str3 = "(" + str3 + ")";
                    }
                    bool bChercheVide = false;
                    if (strTexteOperateur.ToUpper() == "LIKE")
                    {
                        bChercheVide = str3 == "%%";
                        if (!bChercheVide && str3.Contains("@"))
                        {
                            try
                            {
                                int nParam = Int32.Parse(str3.Substring("@PARAM".Length));
                                if (filtre.Parametres[nParam - 1].ToString() == "%%")
                                {
                                    bChercheVide = true;
                                }
                            }
                            catch
                            {
                            }
                        }
                    }

                    if (bChercheVide)
                    {
                        strRetour += str3 + "=" + str3;
                    }
                    else
                    {
                        strRetour = str1 + " " + str2 + " " + str3;

                        if (operateur.Id == CComposantFiltreOperateur.c_IdOperateurLike ||
                            operateur.Id == CComposantFiltreOperateur.c_IdOperateurNotLike)
                        {
                            strRetour += " ESCAPE '\\'";
                        }
                    }
                }
                else
                {
                    strRetour = strTexteOperateur + "(";
                    foreach (IExpression exp in expression.Parametres)
                    {
                        strRetour += GetStringExpression(exp, filtre) + ",";
                    }
                    if (expression.Parametres.Count > 0)
                    {
                        strRetour = strRetour.Substring(0, strRetour.Length - 1);
                    }
                    strRetour += ")";
                }
            }
            return(strRetour);
        }