public void AddProprietesAccedees( CArbreDefinitionsDynamiques arbre, Type typeSource, string strPropriete) { //TESTDBKEYOK CDbKey key = CDbKey.CreateFromStringValue(strPropriete); /*int nIdChamp = -1; * try * { * nIdChamp = Int32.Parse ( strPropriete ); * } * catch * { * }*/ CChampCalcule champCalcule = new CChampCalcule(CContexteDonneeSysteme.GetInstance()); C2iExpression formule = null; if (champCalcule.ReadIfExists(key)) { formule = champCalcule.Formule; formule.GetArbreProprietesAccedees(arbre); CDefinitionProprieteDynamiqueChampCalcule.DetailleSousArbres(arbre, CContexteDonneeSysteme.GetInstance()); } }
/// ////////////////////////////////////////////////////// public CDefinitionProprieteDynamiqueChampCalcule(CChampCalcule champ) : base(champ.Nom.Replace(" ", "_"), champ.DbKey.StringValue, champ.Formule.TypeDonnee, false, true) { //TESTDBKEYOK m_dbKeyChamp = champ.DbKey; Rubrique = champ.Categorie; }
/// //////////////////////////////////////// ///Si l'arbre est basé sur un champ calculé, détaille les ///champs utilisés dans la formule public static void DetailleSousArbres( CArbreDefinitionsDynamiques arbre, CContexteDonnee contexteDonnee, Dictionary <CDefinitionProprieteDynamique, int> dicCountProfondeurParChamp) { //TESTDBKEYOK if (dicCountProfondeurParChamp == null) { dicCountProfondeurParChamp = new Dictionary <CDefinitionProprieteDynamique, int>(); } ArrayList lstSousArbres = new ArrayList(arbre.SousArbres); foreach (CArbreDefinitionsDynamiques sousArbre in lstSousArbres) { if (sousArbre.DefinitionPropriete is CDefinitionProprieteDynamiqueChampCalcule) { int nProfondeur = 0; dicCountProfondeurParChamp.TryGetValue(sousArbre.DefinitionPropriete, out nProfondeur); if (nProfondeur < 10)//En cas d'appel récursif, limite à 10 appels { CChampCalcule champCalc = new CChampCalcule(contexteDonnee); if (champCalc.ReadIfExists(((CDefinitionProprieteDynamiqueChampCalcule)sousArbre.DefinitionPropriete).DbKeyChamp)) { C2iExpression formule = champCalc.Formule; if (formule != null) { CArbreDefinitionsDynamiques arbreDeFormule = new CArbreDefinitionsDynamiques(null); formule.GetArbreProprietesAccedees(arbreDeFormule); nProfondeur++; dicCountProfondeurParChamp[sousArbre.DefinitionPropriete] = nProfondeur; DetailleSousArbres(arbreDeFormule, contexteDonnee, dicCountProfondeurParChamp); nProfondeur--; dicCountProfondeurParChamp[sousArbre.DefinitionPropriete]--; arbre.RemoveSousArbre(sousArbre); foreach (CArbreDefinitionsDynamiques arbreTmp in arbreDeFormule.SousArbres) { arbre.AddSousArbre(arbreTmp); } } } } } else { DetailleSousArbres(sousArbre, contexteDonnee, dicCountProfondeurParChamp); } } }
public IOptimiseurGetValueDynamic GetOptimiseur(Type tp, string strPropriete) { //TESTDBKEYOK CDbKey key = CDbKey.CreateFromStringValue(strPropriete); /*int nIdChamp = -1; * try * { * nIdChamp = Int32.Parse ( strPropriete ); * } * catch * { * }*/ CChampCalcule champCalcule = new CChampCalcule(CContexteDonneeSysteme.GetInstance()); C2iExpression formule = null; if (champCalcule.ReadIfExists(key)) { formule = champCalcule.Formule; } return(new CInterpreteurProprieteDynamiqueFormule.COptimiseurProprieteDynamiqueFormule(formule)); }
//------------------------------------------------------------ public CResultAErreur GetValue(object objet, string strPropriete) { CResultAErreur result = CResultAErreur.True; CObjetDonnee objetDonnee = objet as CObjetDonnee; if (objetDonnee == null) { result.Data = null; return(result); } //TESTDBKEYOK CDbKey key = CDbKey.CreateFromStringValue(strPropriete); CContexteDonnee contexte = objetDonnee.ContexteDonnee; CChampCalcule champCalcule = new CChampCalcule(contexte); if (!champCalcule.ReadIfExists(key)) { result.EmpileErreur(I.T("Calculated field @1 doesn't exists|200023", strPropriete)); return(result); } CContexteEvaluationExpression ctx = new CContexteEvaluationExpression(objet); return(champCalcule.Formule.Eval(ctx)); }
/// /////////////////////////////////////////////////////////// public object GetValue(object objetInterroge, CDefinitionProprieteDynamique propriete) { //Récupère l'objet à interroger string strProp = propriete.NomPropriete; object valeur = m_cache.GetValeurCache(objetInterroge, strProp); if (valeur != null) { return(valeur); } CContexteDonnee contexteForObjets = ContexteDonneeCache; if (objetInterroge is IObjetAContexteDonnee) { contexteForObjets = ((IObjetAContexteDonnee)objetInterroge).ContexteDonnee; } if (contexteForObjets == null) { contexteForObjets = ContexteDonneeCache; } object objetFinal = objetInterroge; int nPos = strProp.LastIndexOf('.'); if (nPos > 0 && !(propriete is CDefinitionProprieteDynamiqueDonneeCumulee) && !(propriete is CDefinitionProprieteDynamiqueChampCustom) && !(propriete is CDefinitionProprieteDynamiqueChampCustomFils) && !(propriete is CDefinitionProprieteDynamiqueFormule)) { string strPropDebut; strPropDebut = strProp.Substring(0, nPos); strProp = strProp.Substring(nPos + 1); objetFinal = m_cache.GetValeurCache(objetInterroge, strPropDebut); if (objetFinal == null) { objetFinal = GetValue(objetInterroge, strPropDebut); /*object objetAInterroger = null; * MemberInfo membre = null; * CInterpreteurTexteProptVariete.GetObjetFinalEtMemberInfo ( objetInterroge, strPropDebut, ref objetAInterroger, ref membre ); * if ( membre != null ) * { * objetFinal = CInterpreteurTextePropriete.GetValue ( objetAInterroger, membre ); * } * else * { * //On n'a pas trouvé le membre, il s'agit donc d'autre chose, il faut donc décomposer * //Le champ * }*/ //objetFinal = CInterpreteurTextePropriete.GetValue(objetInterroge, strPropDebut); m_cache.StockeValeurEnCache(objetInterroge, strPropDebut, objetFinal); } if (objetFinal == null) { return(null); } valeur = m_cache.GetValeurCache(objetFinal, strProp); if (valeur != null) { return(valeur); } } if (propriete is CDefinitionProprieteDynamiqueChampCustom) { if (!(objetFinal is IElementAChamps)) { valeur = null; } else { //TESTDBKEYTODO qui ne peut pas marche valeur = ((IElementAChamps)objetFinal).GetValeurChamp(((CDefinitionProprieteDynamiqueChampCustom)propriete).DbKeyChamp.InternalIdNumeriqueANeJamaisUtiliserSaufDansCDbKeyAddOn.Value, System.Data.DataRowVersion.Default); /*if (m_bValeurAfficheeDeChampsCustom) * { * CChampCustom champ = new CChampCustom(ContexteDonneeCache); * if (champ.ReadIfExists(((CDefinitionProprieteDynamiqueChampCustom)propriete).IdChamp)) * { * object valTmp = champ.DisplayFromValue(valeur); * if (valTmp != null) * valeur = valTmp; * } * }*/ } } else if (propriete is CDefinitionProprieteDynamiqueChampCustomFils && objetInterroge is CObjetDonneeAIdNumerique) { CChampCustom champ = new CChampCustom(ContexteDonneeCache); if (champ.ReadIfExists(((CDefinitionProprieteDynamiqueChampCustomFils)propriete).KeyChamp)) { Type tp = champ.Role.TypeAssocie; try { IObjetDonneeAChamps elt = (IObjetDonneeAChamps)Activator.CreateInstance(tp, new object[] { contexteForObjets }); CRelationElementAChamp_ChampCustom rel = elt.GetNewRelationToChamp(); CListeObjetsDonnees liste = new CListeObjetsDonnees(contexteForObjets, tp); liste.Filtre = new CFiltreDataAvance( elt.GetNomTable(), rel.GetNomTable() + "." + CRelationElementAChamp_ChampCustom.c_champValeurString + "=@1 and " + rel.GetNomTable() + "." + CRelationElementAChamp_ChampCustom.c_champValeurInt + "=@2 and " + rel.GetNomTable() + "." + CChampCustom.c_champId + "=@3", objetInterroge.GetType().ToString(), ((CObjetDonneeAIdNumerique)objetInterroge).Id, champ.Id); valeur = liste.ToArray(tp); } catch { valeur = null; } } } else if (propriete is CDefinitionProprieteDynamiqueListeEntites) { CListeEntites liste = new CListeEntites(contexteForObjets); try { if (liste.ReadIfExists(((CDefinitionProprieteDynamiqueListeEntites)propriete).DbKeyListeEntite)) { CListeObjetsDonnees resultListe = liste.GetElementsLiesFor(objetInterroge); if (resultListe != null) { valeur = resultListe.ToArray(liste.TypeElements); } } } catch { valeur = null; } } else if (propriete is CDefinitionProprieteDynamiqueRelationTypeId) { if (!(objetFinal is CObjetDonneeAIdNumerique)) { valeur = null; } else { CDefinitionProprieteDynamiqueRelationTypeId defRel = (CDefinitionProprieteDynamiqueRelationTypeId)propriete; return(((CObjetDonneeAIdNumerique)objetFinal).GetDependancesRelationTypeId( defRel.Relation.TableFille, defRel.Relation.ChampType, defRel.Relation.ChampId, false)); } } else if (propriete is CDefinitionProprieteDynamiqueDonneeCumulee) { if (!(objetFinal is CObjetDonneeAIdNumerique)) { valeur = null; } else { CDefinitionProprieteDynamiqueDonneeCumulee defType = (CDefinitionProprieteDynamiqueDonneeCumulee)propriete; CObjetDonneeAIdNumerique objet = (CObjetDonneeAIdNumerique)objetFinal; CTypeDonneeCumulee type = new CTypeDonneeCumulee(contexteForObjets); if (type.ReadIfExists(defType.DbKeyTypeDonnee)) { valeur = type.GetDonneesCumuleesForObjet(objet); } else { valeur = null; } } } else if (propriete is CDefinitionProprieteDynamiqueChampCalcule) { CChampCalcule champ = new CChampCalcule(contexteForObjets); if (champ.ReadIfExists(((CDefinitionProprieteDynamiqueChampCalcule)propriete).DbKeyChamp)) { valeur = champ.Calcule(objetFinal, new CFournisseurPropDynStd(true)); } else { valeur = null; } } else if (propriete is CDefinitionProprieteDynamiqueFormule) { CContexteEvaluationExpression contexte = new CContexteEvaluationExpression(objetInterroge); contexte.AttacheObjet(typeof(CContexteDonnee), contexteForObjets); CResultAErreur result = ((CDefinitionProprieteDynamiqueFormule)propriete).Formule.Eval(contexte); if (result) { return(result.Data); } } else if (propriete is CDefinitionProprieteDynamiqueVariableDynamique && objetFinal is IElementAVariables) { valeur = ((IElementAVariables)objetFinal).GetValeurChamp(((CDefinitionProprieteDynamiqueVariableDynamique)propriete).IdChamp); } else { valeur = CInterpreteurTextePropriete.GetValue(objetFinal, strProp); } m_cache.StockeValeurEnCache(objetInterroge, propriete.Nom, valeur); if (objetFinal != objetInterroge) { m_cache.StockeValeurEnCache(objetFinal, strProp, valeur); } return(valeur); }