Пример #1
0
        /// /////////////////////////////////////////////////
        protected override List <COperateurAnalysable> GetOperateursDynamiqueNiveau(int nNiveau, string strMot)
        {
            List <COperateurAnalysable> lst = new List <COperateurAnalysable>();

            if (nNiveau == 0 && strMot.StartsWith(":"))
            {
                string strTmp = strMot.Substring(1);
                if (CUtilUnite.GetIdClasseUnite(strTmp) != null)
                {
                    COperateurAnalysable operateur = new COperateurAnalysable(0,
                                                                              ":" + strTmp, ":" + strTmp, false);
                    lst.Add(operateur);
                }
            }
            return(lst);
        }
 /// /////////////////////////////////////////////////
 public CAnalyseurSyntaxiqueFiltre(string strTableDeBase)
 {
     if (m_listeOperateursFonction == null)
     {
         m_listeOperateursFonction = new ArrayList();
         foreach (Type tp in typeof(CComposantFiltreFonction).Assembly.GetTypes())
         {
             if (typeof(CComposantFiltreFonction).IsAssignableFrom(tp) && !tp.IsAbstract)
             {
                 CComposantFiltreFonction comp      = (CComposantFiltreFonction)Activator.CreateInstance(tp);
                 COperateurAnalysable     operateur = comp.GetOperateur();
                 m_listeOperateursFonction.Add(operateur);
             }
         }
     }
     m_allocateur = new CAllocateurComposantFiltre(strTableDeBase);
 }
        /// ///////////////////////////////////////////
        public CAllocateurComposantFiltre(string strTableDeBase)
        {
            if (m_tableIdOperateurToComposantFonction == null)
            {
                m_tableIdOperateurToComposantFonction = new Hashtable();
                foreach (Type tp in typeof(CComposantFiltreFonction).Assembly.GetTypes())
                {
                    if (typeof(CComposantFiltreFonction).IsAssignableFrom(tp) && !tp.IsAbstract)
                    {
                        CComposantFiltreFonction comp      = (CComposantFiltreFonction)Activator.CreateInstance(tp);
                        COperateurAnalysable     operateur = comp.GetOperateur();
                        m_tableIdOperateurToComposantFonction[operateur.Id] = tp;
                    }
                }
            }

            m_strTableDeBase = strTableDeBase;
        }
Пример #4
0
 /// /////////////////////////////////////////////////
 private void InitTableOperateursParNiveau()
 {
     m_tableListeOperateursParNiveau.Clear();
     foreach (C2iExpression exp in CAllocateur2iExpression.ToutesExpressions)
     {
         if (exp is C2iExpressionAnalysable)
         {
             CInfo2iExpression info = ((C2iExpressionAnalysable)exp).GetInfos();
             if (info != null)
             {
                 COperateurAnalysable op  = new COperateurAnalysable(info.Niveau, info.Texte, info.IdExpression, exp.CanBeArgumentExpressionObjet);
                 ArrayList            lst = (ArrayList)m_tableListeOperateursParNiveau[info.Niveau];
                 if (lst == null)
                 {
                     lst = new ArrayList();
                     m_tableListeOperateursParNiveau[info.Niveau] = lst;
                 }
                 lst.Add(op);
             }
         }
     }
 }
Пример #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;

                /*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);
        }
Пример #6
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);
        }
        ////////////////////////////////////////////////////////
        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);
        }
Пример #8
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);
        }
Пример #9
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);
        }