コード例 #1
0
        /// ///////////////////////////////////////////////
        public CDefinitionProprieteDynamique GetProprieteInverse(Type typePortantLaPropriete, CDefinitionProprieteDynamique def)
        {
            CDefinitionProprieteDynamiqueDotNet defDotNet = def as CDefinitionProprieteDynamiqueDotNet;

            if (typePortantLaPropriete == null || defDotNet == null)
            {
                return(null);
            }
            PropertyInfo info = typePortantLaPropriete.GetProperty(defDotNet.NomProprieteSansCleTypeChamp);

            if (info != null)
            {
                object[] attrs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                if (attrs.Length > 0)
                {
                    string strProp = ((RelationFilleAttribute)attrs[0]).ProprieteFille;
                    if (strProp.Length != 0)
                    {
                        return(new CDefinitionProprieteDynamiqueDotNet(strProp, strProp,
                                                                       new CTypeResultatExpression(info.PropertyType, false), true, false, ""));
                    }
                }
            }
            return(null);
        }
コード例 #2
0
            //-----------------------------------------------------------
            private C2iRequeteAvancee GetRequete(CParametreInspirationProprieteDeType parametre)
            {
                C2iRequeteAvancee requete = null;

                if (m_dicRequetes.TryGetValue(parametre, out requete))
                {
                    return(requete);
                }
                if (parametre.Type == null)
                {
                    return(null);
                }
                CDefinitionProprieteDynamiqueChampCustom defCustom = parametre.Champ as CDefinitionProprieteDynamiqueChampCustom;

                if (defCustom != null)
                {
                    requete = GetRequeteChampCustom(parametre);
                }
                CDefinitionProprieteDynamiqueDotNet defDotNet = parametre.Champ as CDefinitionProprieteDynamiqueDotNet;

                if (defDotNet != null)
                {
                    requete = GetRequeteChampDotNet(parametre);
                }
                m_dicRequetes[parametre] = requete;
                return(requete);
            }
        //-----------------------------------------------------------------
        public static CDefinitionProprieteDynamique GetDefinitionProprieteDynamique(string strPropriete, ref string strSuite)
        {
            I2iSerializable objDef = null;

            if (strPropriete.Length > 2 &&
                strPropriete.Substring(0, 2) == "~#")
            {
                string strStart = strPropriete.Substring(2);
                strSuite = "";
                int nPos = strStart.IndexOf("~@#@");
                if (nPos >= 0)
                {
                    strSuite = strStart.Substring(nPos + 4);
                    if (strSuite.Length > 1 && strSuite.Substring(0, 1) == ".")
                    {
                        strSuite = strSuite.Substring(1);
                    }
                    strStart = strStart.Substring(0, nPos);
                }

                CStringSerializer serializer = new CStringSerializer(strPropriete.Substring(2), ModeSerialisation.Lecture);
                objDef = (I2iSerializable)m_tableSerializeToDefinition[strPropriete];
                if (objDef == null)
                {
                    if (!serializer.TraiteObject(ref objDef))
                    {
                        objDef = null;
                    }
                    else
                    {
                        m_tableSerializeToDefinition[strPropriete] = objDef;
                    }
                }
            }
            else
            {
                //Il s'agit d'un nom de champ
                string[] strDatas = strPropriete.Split('.');
                string   strProp  = "";
                foreach (string strData in strDatas)
                {
                    strProp += CDefinitionProprieteDynamique.c_strCaractereStartCleType +
                               CDefinitionProprieteDynamiqueDotNet.c_strCleTypeDefinition +
                               CDefinitionProprieteDynamique.c_strCaractereEndCleType +
                               strData + ".";
                }
                if (strProp.Length > 1)
                {
                    strProp = strProp.Substring(0, strProp.Length - 1);
                }
                CDefinitionProprieteDynamiqueDotNet prop = new CDefinitionProprieteDynamiqueDotNet(strPropriete,
                                                                                                   strProp, new CTypeResultatExpression(typeof(string), false), false, false, "");
                strSuite = "";
                return(prop);
            }
            return(objDef as CDefinitionProprieteDynamique);
        }
コード例 #4
0
        internal CResultAErreur Execute(CObjetDonneeAIdNumerique cible)
        {
            CContexteEvaluationExpression ctx = new CContexteEvaluationExpression(MacroObjet.Macro);
            CResultAErreur result             = FormuleValeur.Eval(ctx);

            if (result)
            {
                try
                {
                    if (!m_champ.IsReadOnly)
                    {
                        CInterpreteurProprieteDynamique.SetValue(cible, m_champ, result.Data);
                    }
                    else//Peut être un champ forçable pour les macros
                    {
                        CDefinitionProprieteDynamiqueDotNet defDotNet = m_champ as CDefinitionProprieteDynamiqueDotNet;
                        if (defDotNet != null)
                        {
                            PropertyInfo info = info = cible.GetType().GetProperty(defDotNet.NomProprieteSansCleTypeChamp);
                            if (info != null)
                            {
                                object[] attrs = info.GetCustomAttributes(typeof(TiagRelationAttribute), true);
                                if (attrs != null && attrs.Length > 0)
                                {
                                    TiagRelationAttribute att  = (TiagRelationAttribute)attrs[0];
                                    MethodInfo            meth = cible.GetType().GetMethod(att.NomMethodeSetClesParentes);
                                    if (meth != null)
                                    {
                                        object[]     lstCles = null;
                                        CObjetDonnee obj     = result.Data as CObjetDonnee;
                                        if (obj == null)
                                        {
                                            lstCles = new object[1];
                                        }
                                        else
                                        {
                                            lstCles = obj.GetValeursCles();
                                        }
                                        meth.Invoke(cible, new object[] { lstCles });
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                    result.EmpileErreur("#Error while affecting property " + m_champ.Nom);
                }
            }
            return(result);
        }
コード例 #5
0
            public CDefinitionProprieteDynamique[] GetProprietesInstance()
            {
                CDefinitionProprieteDynamiqueDotNet def = new CDefinitionProprieteDynamiqueDotNet(
                    "Source_Element",
                    "SourceElement",
                    new CTypeResultatExpression(m_typeSource, false),
                    true,
                    false,
                    "");

                return(new CDefinitionProprieteDynamique[] { def });
            }
コード例 #6
0
        //--------------------------------------------
        /// <summary>
        /// Si succès, retourne le filtre correspondant à cet élément
        /// en tant que clé. le texte du filtre (format filtreData) est contenu dans le data du result
        /// avec le paramètre valeur = @n
        /// </summary>
        /// <param name="typeCible"></param>
        /// <returns></returns>
        public static CResultAErreur GetFiltreCle(
            Type typeCible,
            CDefinitionProprieteDynamique definition,
            int nNumeroParametre)
        {
            CResultAErreur result = CResultAErreur.True;
            CDefinitionProprieteDynamiqueDotNet def = definition as CDefinitionProprieteDynamiqueDotNet;
            PropertyInfo info = null;

            if (def != null)
            {
                info = typeCible.GetProperty(def.NomProprieteSansCleTypeChamp);
            }
            if (info != null)
            {
                object[] attribs = info.GetCustomAttributes(typeof(TableFieldPropertyAttribute), true);
                if (attribs.Length > 0)
                {
                    TableFieldPropertyAttribute attr = attribs[0] as TableFieldPropertyAttribute;
                    result.Data = attr.NomChamp + "=@" + nNumeroParametre;
                    return(result);
                }
                attribs = info.GetCustomAttributes(typeof(RelationAttribute), true);
                if (attribs.Length > 0)
                {
                    RelationAttribute attr = attribs[0] as RelationAttribute;
                    if (attr.ChampsFils.Length == 1)
                    {
                        result.Data = attr.ChampsFils[0] + "=@" + nNumeroParametre;
                        return(result);
                    }
                }
            }
            //Sinon, si ID d'un objet a id auto
            if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(typeCible))
            {
                if (definition.NomPropriete == "#PP|Id")
                {
                    //Trouve le champ id
                    string strChampId = CObjetDonnee.GetChampsId(typeCible)[0];
                    result.Data = strChampId + "=@" + nNumeroParametre;
                    return(result);
                }
            }

            result.EmpileErreur(I.T("Can not use field @1 as key in imort|20044", definition.Nom));
            return(result);
        }
        //-----------------------------------------------------------------
        public static string GetProprieteDotNetFromProprieteStructureDynamique(string strProp)
        {
            string strRetour = "";
            string strSuite  = strProp;

            while (strSuite.Length > 0)
            {
                CDefinitionProprieteDynamique       defProp    = GetDefinitionProprieteDynamique(strSuite, ref strSuite);
                CDefinitionProprieteDynamiqueDotNet propDotNet = defProp as CDefinitionProprieteDynamiqueDotNet;
                if (propDotNet == null)
                {
                    return(strProp);
                }
                if (strRetour.Length > 0)
                {
                    strRetour += ".";
                }
                strRetour += propDotNet.NomProprieteSansCleTypeChamp;
            }
            return(strRetour);
        }
コード例 #8
0
        /// <summary>
        /// retourne l'objet donné sélectionné à partir de la valeur retournée
        /// </summary>
        /// <remarks>
        /// Ne fonctionne pas toujours, ça ne fonctionne que si la valeur retournée
        /// est un champ DOTNET de l'entité sélectionnée
        /// </remarks>
        /// <param name="valeurRetournee"></param>
        /// <param name="contexte"></param>
        /// <returns></returns>
        public CReferenceObjetDonnee GetObjetFromValeurRetournee(object valeurRetournee)
        {
            if (valeurRetournee == null)
            {
                return(null);
            }
            C2iExpressionChamp exp = ExpressionRetournee as C2iExpressionChamp;

            if (exp != null)
            {
                CDefinitionProprieteDynamique       propDyn   = exp.DefinitionPropriete;
                CDefinitionProprieteDynamiqueDotNet defDotNet = propDyn as CDefinitionProprieteDynamiqueDotNet;
                if (defDotNet != null)
                {
                    CObjetDonnee    objet     = (CObjetDonnee)Activator.CreateInstance(m_filtreSelection.TypeElements, new object[] { CContexteDonneeSysteme.GetInstance() });
                    CStructureTable structure = CStructureTable.GetStructure(m_filtreSelection.TypeElements);
                    CInfoChampTable info      = structure.GetChampFromPropriete(defDotNet.NomProprieteSansCleTypeChamp);
                    if (info != null)
                    {
                        CResultAErreur result = m_filtreSelection.GetFiltreData();
                        CFiltreData    filtre = null;
                        if (result && result.Data is CFiltreData)
                        {
                            filtre = result.Data as CFiltreData;
                        }

                        filtre = CFiltreData.GetAndFiltre(filtre,
                                                          new CFiltreData(info.NomChamp + "=@1",
                                                                          valeurRetournee));
                        if (objet.ReadIfExists(filtre))
                        {
                            return(new CReferenceObjetDonnee(objet));
                        }
                    }
                }
            }
            return(null);
        }
コード例 #9
0
        internal void CreateVariable(CObjetDonnee objet)
        {
            CVariableDynamiqueSelectionObjetDonnee variable = new CVariableDynamiqueSelectionObjetDonnee(Macro);

            if (objet != null)
            {
                variable.Nom = objet.DescriptionElement.Trim().Replace("[", "-").Replace("]", "-");
            }
            else
            {
                variable.Nom = "V" + variable.IdVariable;
            }
            CFiltreDynamique filtre = new CFiltreDynamique(Macro, Macro.ContexteDonnee);

            filtre.TypeElements          = TypeObjet;
            variable.FiltreSelection     = filtre;
            variable.ExpressionRetournee = new C2iExpressionThis(TypeObjet);
            string strField = DescriptionFieldAttribute.GetDescriptionField(TypeObjet, "DescriptionElement");

            if (strField != "")
            {
                CDefinitionProprieteDynamiqueDotNet def = new CDefinitionProprieteDynamiqueDotNet(
                    strField,
                    strField,
                    new CTypeResultatExpression(typeof(string), false),
                    false,
                    true,
                    "");
                variable.ExpressionAffichee = new C2iExpressionChamp(def);
            }
            Macro.AddVariable(variable);
            Macro.SetInitialValue(variable, objet as CObjetDonneeAIdNumerique);
            m_strIdVariableAssociee = variable.IdVariable;
            CDefinitionProprieteDynamiqueVariableDynamique defSource = new CDefinitionProprieteDynamiqueVariableDynamique(variable);

            FormuleSelectionObjet = new C2iExpressionChamp(defSource);
        }
コード例 #10
0
        ////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Retourne un filtre dynamique pour la table associée en
        /// prenant en compte les filtres des parents
        /// </summary>
        /// <returns></returns>
        public CFiltreDynamique GetFiltreToElementPrincipal()
        {
            if (TouteLaTable)
            {
                return(null);
            }
            CFiltreDynamique filtreDynamiqueParent = null;

            if (FiltreParent != null)
            {
                filtreDynamiqueParent = FiltreParent.GetFiltreToElementPrincipal();
            }

            Type            typeElements = CContexteDonnee.GetTypeForTable(NomTable);
            CStructureTable structure    = CStructureTable.GetStructure(typeElements);

            CFiltreDynamique filtreFinal = (CFiltreDynamique)FiltreDynamique.Clone();

            CDefinitionProprieteDynamique defToParent = null;

            //Trouve la propriété qui amène sur le parent
            if (RelationToParent != null)
            {
                if (RelationToParent.TableFille == NomTable)
                {
                    if (filtreDynamiqueParent != null && filtreDynamiqueParent.ComposantPrincipal != null)
                    {
                        Type   tp = CContexteDonnee.GetTypeForTable(RelationToParent.TableParente);
                        string strNomConvivial = DynamicClassAttribute.GetNomConvivial(tp);
                        //Nous somme dans une relation fille
                        foreach (CInfoRelation relationParente in structure.RelationsParentes)
                        {
                            if (relationParente.RelationKey == RelationToParent.RelationKey)
                            {
                                defToParent = new CDefinitionProprieteDynamiqueDotNet(
                                    strNomConvivial,
                                    relationParente.Propriete,
                                    new CTypeResultatExpression(CContexteDonnee.GetTypeForTable(relationParente.TableParente), false),
                                    true,
                                    true,
                                    "");
                                break;
                            }
                        }
                        if (defToParent == null)
                        {
                            defToParent = new CDefinitionProprieteDynamique(
                                strNomConvivial,
                                RelationToParent.RelationKey,
                                new CTypeResultatExpression(tp, false),
                                true,
                                true,
                                "");
                        }
                    }
                }
                else
                {
                    //Nous sommes dans une relation parente
                    foreach (CInfoRelation relationFille in structure.RelationsFilles)
                    {
                        if (relationFille.RelationKey == RelationToParent.RelationKey)
                        {
                            defToParent = new CDefinitionProprieteDynamiqueDotNet(
                                relationFille.NomConvivial,
                                relationFille.Propriete,
                                new CTypeResultatExpression(CContexteDonnee.GetTypeForTable(relationFille.TableFille), true),
                                true,
                                true,
                                "");
                            break;
                        }
                    }
                    if (defToParent == null)
                    {
                        Type tp = CContexteDonnee.GetTypeForTable(RelationToParent.TableFille);
                        defToParent = new CDefinitionProprieteDynamique(
                            DynamicClassAttribute.GetNomConvivial(tp) + "(" + RelationToParent.NomConvivial + ")",
                            RelationToParent.RelationKey,
                            new CTypeResultatExpression(tp, false),
                            true, true);
                    }

                    if (filtreDynamiqueParent == null)
                    {
                        filtreDynamiqueParent = new CFiltreDynamiqueParentTablePleine(NomTable, RelationToParent);
                    }
                }
            }
            if (filtreDynamiqueParent != null && filtreDynamiqueParent.ComposantPrincipal != null)
            {
                filtreDynamiqueParent.ComposantPrincipal.InsereDefinitionToObjetFinal(defToParent);

                if (FiltreDynamique == null || FiltreDynamique.ComposantPrincipal == null)
                {
                    return(filtreDynamiqueParent);
                }

                CComposantFiltreDynamique composantEt = null;
                if (!(filtreDynamiqueParent.ComposantPrincipal is CComposantFiltreDynamiqueEt))
                {
                    composantEt = new CComposantFiltreDynamiqueEt();
                    composantEt.AddComposantFils(filtreDynamiqueParent.ComposantPrincipal);
                }
                else
                {
                    composantEt = (CComposantFiltreDynamiqueEt)filtreDynamiqueParent.ComposantPrincipal;
                }
                composantEt.AddComposantFils(filtreFinal.ComposantPrincipal);
                filtreFinal.ComposantPrincipal = composantEt;
            }

            if (filtreFinal.ComposantPrincipal == null)
            {
                return(null);
            }
            return(filtreFinal);
        }
コード例 #11
0
        /// //////////////////////////////////////////
        private void CreateChilds(TreeNode node)
        {
            CTagNode?tag = node.Tag as CTagNode?;

            if (tag == null)
            {
                return;
            }

            Dictionary <string, TreeNode> dicFolders = new Dictionary <string, TreeNode>();

            Type tpParent = tag.Value.Definition.TypeDonnee.TypeDotNetNatif;

            IEnumerable <CDefinitionProprieteDynamique> defs =
                from def in new CFournisseurPropDynStd(false).GetDefinitionsChamps(tpParent)
                where def.GetDefinitionInverse(tpParent) != null
                select def;

            foreach (CDefinitionProprieteDynamique def in defs)
            {
                CDefinitionProprieteDynamiqueDotNet defDotNet = def as CDefinitionProprieteDynamiqueDotNet;
                if (defDotNet != null)
                {
                    PropertyInfo info = tpParent.GetProperty(defDotNet.NomProprieteSansCleTypeChamp);
                    if (info != null && info.GetCustomAttributes(typeof(NonCloneableAttribute), true).Length != 0)
                    {
                        continue;
                    }
                }

                TreeNode nodeFils = new TreeNode(def.Nom);
                CTagNode tagFils  = new CTagNode(tpParent, def);
                nodeFils.Tag = tagFils;
                TreeNodeCollection nodes = node.Nodes;
                if (def.Rubrique.Trim() != "")
                {
                    TreeNode parent = null;
                    if (!dicFolders.TryGetValue(def.Rubrique.Trim().ToUpper(), out parent))
                    {
                        parent     = new TreeNode(def.Rubrique.Trim());
                        parent.Tag = node.Tag;
                        dicFolders[def.Rubrique.Trim().ToUpper()] = parent;
                        node.Nodes.Add(parent);
                        parent.ImageIndex = 0;
                    }
                    nodes = parent.Nodes;
                }
                nodes.Add(nodeFils);
                nodeFils.ImageIndex = 1;
                List <TreeNode> lst = null;
                if (!m_dicIdDefToNode.TryGetValue(tagFils.GetKey(), out lst))
                {
                    lst = new List <TreeNode>();
                    m_dicIdDefToNode[tagFils.GetKey()] = lst;
                }
                lst.Add(nodeFils);
                m_bInCheck       = true;
                nodeFils.Checked = IsCheckByDic(nodeFils);
                m_bInCheck       = false;
                nodeFils.Nodes.Add(new TreeNode());
            }
        }
コード例 #12
0
        /// ///////////////////////////////////////////////////////////
        protected virtual void GetDefinitionsChamps(
            Type tp,
            int nProfondeur,
            ArrayList lstProps,
            string strCheminConvivial,
            string strCheminReel,
            CDefinitionProprieteDynamique definitionParente
            )
        {
            /*ITraducteurNomChamps traducteur = null;
             * if ( definitionParente is ITraducteurNomChamps )
             *      traducteur = (ITraducteurNomChamps)definitionParente;*/
            if (nProfondeur < 0)
            {
                return;
            }
            if (tp == null)
            {
                return;
            }

            //Proprietes
            foreach (PropertyInfo info in tp.GetProperties())
            {
                object[] attribs = info.GetCustomAttributes(typeof(DynamicFieldAttribute), true);
                if (attribs.Length == 1)
                {
                    DynamicFieldAttribute attrib = (DynamicFieldAttribute)attribs[0];
                    bool bReadOnly = info.GetSetMethod() == null;
                    Type tpProp    = info.PropertyType;
                    bool bIsArray  = tpProp.IsArray;
                    if (bIsArray)
                    {
                        tpProp = tpProp.GetElementType();
                    }
                    bool bHasSubProprietes = HasSubProperties(tpProp);
                    if (m_bAvecReadOnly || !bReadOnly || bHasSubProprietes)
                    {
                        CDefinitionProprieteDynamique def = new CDefinitionProprieteDynamiqueDotNet(
                            strCheminConvivial + attrib.NomConvivial,
                            strCheminReel + info.Name,
                            new CTypeResultatExpression(tpProp, bIsArray),
                            bHasSubProprietes,
                            bReadOnly,
                            attrib.Rubrique);
                        if (AddDefinition(lstProps, def /*, traducteur*/))
                        {
                            GetDefinitionsChamps(info.PropertyType, nProfondeur - 1, lstProps, strCheminConvivial + attrib.NomConvivial + ".", strCheminReel + info.Name + ".", def);
                        }
                    }
                }
                attribs = info.GetCustomAttributes(typeof(DynamicChildsAttribute), true);
                {
                    if (attribs.Length == 1)
                    {
                        DynamicChildsAttribute        attrib = (DynamicChildsAttribute)attribs[0];
                        CDefinitionProprieteDynamique def    = new CDefinitionProprieteDynamiqueDotNet(
                            strCheminConvivial + attrib.NomConvivial,
                            strCheminReel + info.Name,
                            new CTypeResultatExpression(attrib.TypeFils, true)
                            , true,
                            true,
                            attrib.Rubrique);
                        if (AddDefinition(lstProps, def /*, traducteur*/))
                        {
                            GetDefinitionsChamps(attrib.TypeFils, nProfondeur - 1, lstProps, strCheminConvivial + attrib.NomConvivial + ".", strCheminReel + info.Name + ".", def);
                        }
                    }
                }
            }

            //Champs custom
            CRoleChampCustom role = CRoleChampCustom.GetRoleForType(tp);

            if (role != null)
            {
                CListeObjetsDonnees listeChamps = CChampCustom.GetListeChampsForRole(ContexteDonneeCache, role.CodeRole);
                foreach (CChampCustom champ in listeChamps)
                {
                    CDefinitionProprieteDynamiqueChampCustom def = new CDefinitionProprieteDynamiqueChampCustom(champ);
                    if (champ.Categorie.Trim() != "")
                    {
                        def.Rubrique = champ.Categorie;
                    }
                    else
                    {
                        def.Rubrique = I.T("Complementary informations|59");
                    }
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }

            //Champs calculés
            if (AvecReadOnly)
            {
                CListeObjetsDonnees liste = new CListeObjetsDonnees(ContexteDonneeCache, typeof(CChampCalcule));
                liste.Filtre = new CFiltreData(CChampCalcule.c_champTypeObjets + "=@1", tp.ToString());
                foreach (CChampCalcule champ in liste)
                {
                    CDefinitionProprieteDynamiqueChampCalcule def = new CDefinitionProprieteDynamiqueChampCalcule(champ);
                    def.HasSubProperties = HasSubProperties(def.TypeDonnee.TypeDotNetNatif);
                    def.Rubrique         = I.T("Complementary informations|59");
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }

            //Méthodes
            if (m_bAvecMethodes && AvecReadOnly)
            {
                //Va chercher les propriétés
                foreach (MethodInfo methode in tp.GetMethods())
                {
                    object[] attribs = methode.GetCustomAttributes(typeof(DynamicMethodAttribute), true);
                    if (attribs.Length == 1)
                    {
                        DynamicMethodAttribute  attrib  = (DynamicMethodAttribute)attribs[0];
                        CTypeResultatExpression typeRes = new CTypeResultatExpression(methode.ReturnType, false);
                        if (methode.ReturnType.HasElementType)
                        {
                            typeRes = new CTypeResultatExpression(methode.ReturnType.GetElementType(), true);
                        }
                        CDefinitionProprieteDynamique def = new CDefinitionMethodeDynamique(
                            strCheminConvivial + methode.Name,
                            strCheminReel + methode.Name,
                            typeRes,
                            HasSubProperties(methode.ReturnType),
                            attrib.Descriptif,
                            attrib.InfosParametres);
                        def.Rubrique = I.T("Methods|58");
                        lstProps.Add(def);
                        GetDefinitionsChamps(methode.ReturnType, nProfondeur - 1, lstProps, strCheminConvivial + methode.Name + ".", strCheminReel + methode.Name + ".", def);
                    }
                }
                foreach (CMethodeSupplementaire methode in CGestionnaireMethodesSupplementaires.GetMethodsForType(tp))
                {
                    CDefinitionProprieteDynamique def = new CDefinitionMethodeDynamique(
                        strCheminConvivial + methode.Name,
                        strCheminReel + methode.Name,
                        new CTypeResultatExpression(methode.ReturnType, methode.ReturnArrayOfReturnType),
                        HasSubProperties(methode.ReturnType));
                    def.Rubrique = I.T("Methods|58");
                    lstProps.Add(def);
                    GetDefinitionsChamps(methode.ReturnType, nProfondeur - 1, lstProps, strCheminConvivial + methode.Name + ".", strCheminReel + methode.Name + ".", def);
                }
            }

            //Relations TypeID
            foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds)
            {
                if (relation.NomConvivialPourParent != "" && relation.IsAppliqueToType(tp))
                {
                    CDefinitionProprieteDynamiqueRelationTypeId def = new CDefinitionProprieteDynamiqueRelationTypeId(relation);
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }

            //Données ucmulées
            if (m_bAvecReadOnly)
            {
                CTypeDonneeCumulee[] donnees = GetTypesDonneesPourType(tp);
                foreach (CTypeDonneeCumulee typeDonnee in donnees)
                {
                    int nCle = 0;
                    foreach (CCleDonneeCumulee cle in typeDonnee.Parametre.ChampsCle)
                    {
                        if (cle.TypeLie == tp)
                        {
                            CDefinitionProprieteDynamiqueDonneeCumulee def =
                                new CDefinitionProprieteDynamiqueDonneeCumulee(
                                    typeDonnee,
                                    nCle);
                            AddDefinition(lstProps, def /*, traducteur*/);
                            break;
                        }
                    }
                }
            }

            //Liens sur champs custom fils
            if (m_bAvecReadOnly)
            {
                //Liens sur champs custom
                CListeObjetsDonnees listeChamps = new CListeObjetsDonnees(ContexteDonneeCache, typeof(CChampCustom));
                listeChamps.Filtre = new CFiltreData(
                    CChampCustom.c_champTypeObjetDonnee + "=@1",
                    tp.ToString());
                foreach (CChampCustom champ in listeChamps)
                {
                    CDefinitionProprieteDynamiqueChampCustomFils def = new CDefinitionProprieteDynamiqueChampCustomFils(
                        champ);
                    if (champ.Categorie.Trim() != "")
                    {
                        def.Rubrique = champ.Categorie;
                    }
                    else
                    {
                        def.Rubrique = I.T("Complementary informations|59");
                    }
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }

            //Liens par CListeEntite
            if (m_bAvecReadOnly)
            {
                CListeObjetsDonnees listeEntites = new CListeObjetsDonnees(ContexteDonneeCache, typeof(CListeEntites));
                listeEntites.Filtre = new CFiltreData(
                    CListeEntites.c_champTypeElementSourceDeRecherche + "=@1",
                    tp.ToString());
                foreach (CListeEntites liste in listeEntites)
                {
                    CDefinitionProprieteDynamiqueListeEntites def = new CDefinitionProprieteDynamiqueListeEntites(liste);
                    def.Rubrique = I.T("Lists|60");
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }
        }
コード例 #13
0
        /// ///////////////////////////////////////////////////////////
        protected virtual void GetDefinitionsChamps(Type tp, int nProfondeur, ArrayList lstProps, string strCheminConvivial, string strCheminReel, CDefinitionProprieteDynamique defParente)
        {
            /*ITraducteurNomChamps traducteur = null;
             * if ( defParente is ITraducteurNomChamps )
             *      traducteur = (ITraducteurNomChamps)defParente;*/
            if (nProfondeur < 0)
            {
                return;
            }

            CStructureTable structure = null;

            try
            {
                structure = CStructureTable.GetStructure(tp);
            }
            catch
            {
                return;
            }
            foreach (CInfoChampTable info in structure.Champs)
            {
                //Trouve la méthode correspondante

                //18/09 bug : si un classe générique surcharge une propriété de sa classe de base,
                //GetProperty retourne une erreur sur cette propriété
                PropertyInfo propInfo = GetPropertySafe(tp, info.Propriete);
                if (propInfo != null)
                {
                    CDefinitionProprieteDynamique def = new CDefinitionProprieteDynamiqueDotNet(
                        strCheminConvivial + info.NomConvivial,
                        strCheminReel + info.Propriete,
                        new CTypeResultatExpression(propInfo.PropertyType, false), false, true,
                        ""
                        );
                    AddDefinition(lstProps, def /*, traducteur*/);
                    GetDefinitionsChamps(propInfo.PropertyType, nProfondeur - 1, lstProps, strCheminConvivial + info.NomConvivial + ".", strCheminReel + info.Propriete + ".", def);
                }
            }

            //Ajoute les relations parentes
            foreach (CInfoRelation relation in structure.RelationsParentes)
            {
                PropertyInfo propInfo = GetPropertySafe(tp, relation.Propriete);
                if (propInfo != null)
                {
                    CDefinitionProprieteDynamique def = new CDefinitionProprieteDynamiqueRelation(
                        strCheminConvivial + relation.NomConvivial,
                        strCheminReel + relation.Propriete,
                        relation,
                        new CTypeResultatExpression(propInfo.PropertyType, false));
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }
            //Ajoute les relations filles
            foreach (CInfoRelation relation in structure.RelationsFilles)
            {
                PropertyInfo propInfo = GetPropertySafe(tp, relation.Propriete);
                if (propInfo != null)
                {
                    object[] attribs = propInfo.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                    if (attribs.Length != 0)
                    {
                        string   strNomConvivial = strCheminConvivial + relation.NomConvivial;
                        object[] attrsDynCh      = propInfo.GetCustomAttributes(typeof(DynamicChildsAttribute), true);
                        if (attrsDynCh.Length != 0)
                        {
                            DynamicChildsAttribute dynAtt = attrsDynCh[0] as DynamicChildsAttribute;
                            strNomConvivial = strCheminConvivial + dynAtt.NomConvivial;
                        }

                        Type tpFille = ((RelationFilleAttribute)attribs[0]).TypeFille;
                        //Pas les relations aux champs custom, elles sont gerées en dessous
                        //30/11/2011 stef : Euh, en fait, si, ça peut servir ! pour accélerer des filtres
                        /*if ( !tpFille.IsSubclassOf ( typeof(CRelationElementAChamp_ChampCustom) ))*/
                        AddDefinition(lstProps,
                                      new CDefinitionProprieteDynamiqueRelation(
                                          strNomConvivial,
                                          strCheminReel + relation.Propriete,
                                          relation,
                                          new CTypeResultatExpression(tpFille, true)) /*,
                                                                                       * traducteur*/);
                    }
                }
            }

            CRoleChampCustom role = CRoleChampCustom.GetRoleForType(tp);

            if (role != null)
            {
                CListeObjetsDonnees listeChamps = CChampCustom.GetListeChampsForRole(m_contexteDonneeCache, role.CodeRole);
                foreach (CChampCustom champ in listeChamps)
                {
                    CDefinitionProprieteDynamiqueChampCustom def = new CDefinitionProprieteDynamiqueChampCustom(champ);
                    AddDefinition(lstProps, def /*, traducteur*/);
                }
            }

            //Ajoute les relations TypeId
            foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds)
            {
                if (relation.NomConvivialPourParent != "" && relation.IsAppliqueToType(tp))
                {
                    AddDefinition(lstProps, new CDefinitionProprieteDynamiqueRelationTypeId(relation) /*, traducteur*/);
                }
            }

            //Ajoute les données cumulées
            CTypeDonneeCumulee[] donnees = CFournisseurPropDynStd.GetTypesDonneesPourType(tp);
            foreach (CTypeDonneeCumulee typeDonnee in donnees)
            {
                int nCle = 0;
                foreach (CCleDonneeCumulee cle in typeDonnee.Parametre.ChampsCle)
                {
                    if (cle.TypeLie == tp)
                    {
                        CDefinitionProprieteDynamiqueDonneeCumulee def =
                            new CDefinitionProprieteDynamiqueDonneeCumulee(
                                typeDonnee,
                                nCle);
                        AddDefinition(lstProps, def /*, traducteur*/);
                        break;
                    }
                }
            }

            //Liens sur champs custom fils
            //Liens sur champs custom
            CListeObjetsDonnees listeChampsFils = new CListeObjetsDonnees(m_contexteDonneeCache, typeof(CChampCustom));

            listeChampsFils.Filtre = new CFiltreData(
                CChampCustom.c_champTypeObjetDonnee + "=@1",
                tp.ToString());
            foreach (CChampCustom champ in listeChampsFils)
            {
                CDefinitionProprieteDynamiqueChampCustomFils def = new CDefinitionProprieteDynamiqueChampCustomFils(
                    champ);
                if (champ.Categorie.Trim() != "")
                {
                    def.Rubrique = champ.Categorie;
                }
                else
                {
                    def.Rubrique = I.T("Complementary informations|59");
                }
                AddDefinition(lstProps, def /*, traducteur*/);
            }
        }
コード例 #14
0
        //------------------------------------------------
        public CResultAErreurType <CObjetDonnee> FindObjet(
            DataRow rowSource,
            CContexteImportDonnee contexteImport,
            CValeursImportFixe valeursFixes,
            ref string strFiltre)
        {
            CResultAErreurType <CObjetDonnee> resObjet = new CResultAErreurType <CObjetDonnee>();
            CResultAErreur res = CResultAErreur.True;

            StringBuilder blFiltre = new StringBuilder();

            if (valeursFixes != null)
            {
                foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes)
                {
                    blFiltre.Append(kv.Key);
                    blFiltre.Append("=");
                    blFiltre.Append(kv.Value == null ? "null" : kv.Value.ToString());
                    blFiltre.Append(";");
                }
            }


            //Création du filtre
            CComposantFiltreDynamiqueEt compoPrincipal = new CComposantFiltreDynamiqueEt();

            //Recherche à partir des champs simples
            foreach (CMappageChampSimple mapSimple in MappagesChampsSimples)
            {
                if (mapSimple.UseAsKey)
                {
                    res = mapSimple.GetValue(rowSource, contexteImport);
                    if (!res)
                    {
                        res.EmpileErreur(I.T("Erreur while searching object|20093"));
                        resObjet.EmpileErreur(res.Erreur);
                        return(resObjet);
                    }

                    //Stockage valeur témoin
                    CSourceSmartImportField sourceField = mapSimple.Source as CSourceSmartImportField;
                    if (sourceField != null)
                    {
                        contexteImport.SetValeurTemoin(sourceField.NomChampSource, res.Data);
                    }

                    blFiltre.Append(mapSimple.Propriete.NomPropriete);
                    if (res.Data == null)
                    {
                        CComposantFiltreDynamiqueTestNull testNull = new CComposantFiltreDynamiqueTestNull();
                        testNull.Champ    = mapSimple.Propriete;
                        testNull.TestNull = true;
                        compoPrincipal.AddComposantFils(testNull);
                        blFiltre.Append("=null;");
                    }
                    else
                    {
                        CComposantFiltreDynamiqueValeurChamp testValeur = new CComposantFiltreDynamiqueValeurChamp();
                        testValeur.Champ            = mapSimple.Propriete;
                        testValeur.IdOperateur      = CComposantFiltreOperateur.c_IdOperateurEgal;
                        testValeur.ExpressionValeur = new C2iExpressionConstante(res.Data);
                        compoPrincipal.AddComposantFils(testValeur);
                        blFiltre.Append("=");
                        blFiltre.Append(res.Data.ToString());
                        blFiltre.Append(";");
                    }
                }
            }


            //Recherche à partir des objets parents
            foreach (CMappageEntiteParente mapParent in m_listeMappagesParents)
            {
                if (mapParent.UseAsKey)
                {
                    CResultAErreurType <CObjetDonnee> resParent = mapParent.GetObjetAssocie(rowSource, contexteImport, false);
                    if (!resParent)
                    {
                        resObjet.EmpileErreur(resParent.Erreur);
                        return(resObjet);
                    }
                    CObjetDonneeAIdNumerique      objetId = resParent.DataType as CObjetDonneeAIdNumerique;
                    CDefinitionProprieteDynamique defId   = null;
                    object valeurTest = null;

                    if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(mapParent.Propriete.TypeDonnee.TypeDotNetNatif))
                    {
                        defId = new CDefinitionProprieteDynamiqueDotNet(
                            "Id",
                            "Id",
                            new CTypeResultatExpression(typeof(int), false),
                            false,
                            true, "");
                        defId.InsereParent(mapParent.Propriete);
                        valeurTest = objetId != null?objetId.Id:-1;
                    }
                    else if (CObjetDonnee.TypeManageIdUniversel(mapParent.Propriete.TypeDonnee.TypeDotNetNatif))
                    {
                        defId = new CDefinitionProprieteDynamiqueDotNet("Universal id",
                                                                        "IdUniversel",
                                                                        new CTypeResultatExpression(typeof(string), false),
                                                                        false, true, "");
                        defId.InsereParent(mapParent.Propriete);
                        valeurTest = resParent.DataType != null ? resParent.DataType.IdUniversel : null;
                    }
                    else
                    {
                        resObjet.EmpileErreur(I.T("Can not search objet of type @1|20094",
                                                  DynamicClassAttribute.GetNomConvivial(mapParent.Propriete.TypeDonnee.TypeDotNetNatif)));
                        return(resObjet);
                    }
                    blFiltre.Append(defId.NomPropriete);

                    if (resParent.DataType == null)
                    {
                        CComposantFiltreDynamiqueTestNull testNull = new CComposantFiltreDynamiqueTestNull();
                        testNull.Champ    = defId;
                        testNull.TestNull = true;
                        compoPrincipal.AddComposantFils(testNull);
                        blFiltre.Append("=null;");
                    }
                    else
                    {
                        CComposantFiltreDynamiqueValeurChamp testValeur = new CComposantFiltreDynamiqueValeurChamp();
                        testValeur.Champ            = defId;
                        testValeur.IdOperateur      = CComposantFiltreOperateur.c_IdOperateurEgal;
                        testValeur.ExpressionValeur = new C2iExpressionConstante(valeurTest);
                        compoPrincipal.AddComposantFils(testValeur);
                        blFiltre.Append("=");
                        blFiltre.Append(valeurTest.ToString());
                        blFiltre.Append(";");
                    }
                }
            }
            if (blFiltre.Length == 0)//Pas de filtre
            {
                return(resObjet);
            }
            strFiltre = blFiltre.ToString();
            CObjetDonnee objet = contexteImport.GetEntiteForFiltre(TypeEntite, strFiltre);

            if (objet != null)
            {
                resObjet.DataType = objet;
                return(resObjet);
            }

            CFiltreDynamique filtre = new CFiltreDynamique(contexteImport.ContexteDonnee);

            filtre.TypeElements       = TypeEntite;
            filtre.ComposantPrincipal = compoPrincipal;
            res = filtre.GetFiltreData();
            if (res && res.Data is CFiltreDataAvance)
            {
                if (valeursFixes != null)
                {
                    CFiltreDataAvance filtreData = res.Data as CFiltreDataAvance;
                    StringBuilder     blAdd      = new StringBuilder();
                    int nParam = filtreData.Parametres.Count + 1;
                    foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes)
                    {
                        if (kv.Value == null)
                        {
                            blAdd.Append("HasNo(");
                            blAdd.Append(kv.Key);
                            blAdd.Append(") and ");
                        }
                        else
                        {
                            blAdd.Append(kv.Key);
                            blAdd.Append("=@");
                            blAdd.Append((nParam++));
                            blAdd.Append(" and ");
                            filtreData.Parametres.Add(kv.Value);
                        }
                    }
                    blAdd.Remove(blAdd.Length - 5, 5);
                    if (filtreData.Filtre.Length > 0)
                    {
                        blAdd.Insert(0, " and ");
                    }
                    filtreData.Filtre += blAdd;
                }
                objet = Activator.CreateInstance(TypeEntite, new object[] { contexteImport.ContexteDonnee }) as CObjetDonnee;
                if (objet.ReadIfExists(((CFiltreData)res.Data)))
                {
                    contexteImport.SetEntiteForFiltre(strFiltre, objet);
                    resObjet.DataType = objet;
                    return(resObjet);
                }
            }
            else
            {
                res.EmpileErreur(I.T("Erreur while searching object|20093"));
                resObjet.EmpileErreur(res.Erreur);
                return(resObjet);
            }
            return(resObjet);
        }