Mit dem neuen PrimeFact Release 5.3.3, scheint sich nun auch die Evaluierung wieder geändert zu haben. Damit schlagen nun auch Fehler in der Definition einem Materials durch, die das System vorher noch verzeiht hat. Damit man nicht Gefahr läuft, diese Fehler selber zu übersehen, habe ich mal ein paar Sourcen geschrieben. Ruft man die Methode GetMaterialDefError() auf, bekommt man in der Console alle Materialien mit deutschen Fehlermeldungen zurück, die ein Problem in der Definition haben.

Problem erklärt an einem kleinen Beispiel: Es gibt 2 Materialien: Haus und Wand.

Würde man im Material Wand das Merkmal: Wandstärke von einer Pivottabelle berechnen lassen,

aber im Material Haus, diese als berechnet oder überschreibbar berechnet an die Wand runtererben,

PrimeFact Komponente berechent oder überschreibar berechnet

dann würde im Release 5.3.2 die Kalkulation die im Haus definiert wurde gewinnen.
Im neuen Release gewinnt aber die Wand. Genauer gesagt, gewinnt die PivotTabelle.

PrimeFact Ergebnisse von Methode

Lösung: Einfach im Material das betroffene Merkmal von z.B. „berechnet“ auf „fest berechnet“ stellen.

Damit man aber nicht in allen Materialien einzeln nachschauen muss, hilft hier einfach eine kleine Routine, die genau diese Stellen findet. 😉

/// 
<summary>
/// Durchsucht alle MaterialDef's nach Definitionsfehler
/// </summary>

public void GetMaterialDefErrors()
{
    //Liste alle Fehler im Projekt
    var res = new List<Exception>();

    List<SBObject> sbolst = session.FindList(typeof(PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef), "", "_Name");

    foreach (SBObject sbo in sbolst)
    {
        PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef materialDef = (PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef)session.GetPFObject(sbo, false);
        FindProblemInMaterial(res, materialDef);
    }
    foreach (Exception e in res)
        Console.WriteLine(e.Message);
}

/// 
<summary>
/// 
/// </summary>

/// <param name="res">Fehlermeldungen</param>
/// <param name="obj">MaterialDef</param>
private void FindProblemInMaterial(List<Exception> res, PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef obj)
{
    foreach (PrimeFact5.PrimeConfig.Core.Defenition.MaterialComponent mc in obj._Components)
    {
        foreach (PrimeFact5.PrimeConfig.Core.Defenition.ComponentParameter mcp in mc._Parameters)
        {
            if (mcp._ValueType.StringValue == "Fixed"
            || mcp._ValueType.StringValue == "Inherit"
            || mcp._ValueType.StringValue == "CalcDefault")
            {
                PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef mcMat = mc._Material.RefObject as PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef;
                if (mcMat != null)
                {
                    string bs;
                    List<PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef> only_baseMats = mcMat.CollectBaseMatDefs(out bs);

                    List<PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef> baseMats_and_Mat = new List<PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef>();
                    baseMats_and_Mat.AddRange(only_baseMats);
                    if (!baseMats_and_Mat.Contains(mcMat))
                        baseMats_and_Mat.Add(mcMat);

                    foreach (PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef m in baseMats_and_Mat)
                    {
                        foreach (PrimeFact5.PrimeConfig.Core.Defenition.MaterialParameter mp in m._Parameters)
                        {
                            if (mp._Parameter.DisplayCode == mcp._ParameterName.StringValue)
                            {
                                #region Merkmal wird geprüft, ob es eine Berechnung enthält
                                {
                                    string messageOK = "In der Komponente " + mc.DisplayCode + " des Materials " + obj.DisplayCode + ", wurde der Parameter " + mcp.DisplayCode + " mit " + mcp._ValueCalculation.StringValue + " " + mcp._ValueType.TranslatedText + ". Im Material " + m.DisplayCode + " wird der Paramter " + mcp.DisplayCode + " korrekt auf " + mp._ValueType.TranslatedText + " mit dem Wert " + mp._Calculation.StringValue + " gesetzt.";
                                    string messageError = "In der Komponente " + mc.DisplayCode + " des Materials " + obj.DisplayCode + ", wurde der Parameter " + mcp.DisplayCode + " mit " + mcp._ValueCalculation.StringValue + " " + mcp._ValueType.TranslatedText + ". Im Material " + m.DisplayCode + " steht aber der Paramter " + mcp.DisplayCode + " bereits auf " + mp._ValueType.TranslatedText + " mit dem Wert " + mp._Calculation.StringValue + ".";

                                    if ((mp._ValueType.StringValue == "Calculated" || mp._ValueType.StringValue == "CalcDefault")
                                        && !String.IsNullOrEmpty(mp._Calculation.StringValue))
                                    {
                                        res.Add(new Exception(messageError));
                                    }
                                }
                                #endregion

                                #region gucken ob eine Pivottabelle dran hängt
                                {
                                    string messagePivotOK = "In der Komponente " + mc.DisplayCode + " des Materials " + obj.DisplayCode + " wurde der Parameter " + mp.DisplayCode + " mit " + mcp._ValueCalculation.StringValue + " " + mcp._ValueType.TranslatedText + " und es gibt keine Pivottabelle die das Merkmal setzt.";
                                    var pivotLst = GetAllPivotTablesFromMaterial(m);
                                    PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef foundPivot = CheckIsParameterInPivotAsOutput((PrimeFact5.PrimeConfig.Core.Defenition.Parameter)mp._Parameter.RefObject, pivotLst);

                                    if (foundPivot != null)
                                    {
                                        string messagePivotError = "Kritisch! In der Komponente " + mc.DisplayCode + " des Materials " + obj.DisplayCode + " wurde der Parameter " + mp.DisplayCode + " mit " + mcp._ValueCalculation.StringValue + " " + mcp._ValueType.TranslatedText + ", die " + foundPivot._TableType.TranslatedText + " Pivottabelle " + foundPivot._Name.StringValue + " setzt das Merkmal aber.";
                                        bool throwException = true;
                                        if (!String.IsNullOrEmpty(foundPivot._IsActive.StringValue))
                                            throwException = false;
                                        if (foundPivot._Nullify.IntValue == 0)
                                            throwException = false;

                                        if (throwException)
                                            res.Add(new Exception(messagePivotError));
                                    }
                                }
                                #endregion

                                break;
                            }
                        }
                    }
                }
            }
        }
    }
}

private static Dictionary<string, PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef> GetAllPivotTablesFromMaterial(PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef obj)
{
	Dictionary<string, PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef> pivotLst = new Dictionary<string, PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef>();
		
	GetPivotTablesFromMaterial(obj, pivotLst);
		
	string bs;
	List<PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef> baseMats = obj.CollectBaseMatDefs(out bs);
		
	foreach (PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef m in baseMats)
		GetPivotTablesFromMaterial(m, pivotLst);
		
	return pivotLst;
}
		
private static void GetPivotTablesFromMaterial(PrimeFact5.PrimeConfig.Core.Defenition.MaterialDef obj, Dictionary<string, PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef> pivotLst)
{
	foreach (PrimeFact5.PrimeConfig.Core.Defenition.MaterialPivotTable mpt in obj._PivotTables)
	{
		PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef ptd = mpt._PivotTable.RefObject as PrimeFact5.PrimeConfig.Core.Defenition.PivotTableDef;
		if (ptd != null)
		{
		    if (!pivotLst.ContainsKey(ptd._Name.StringValue))
		        pivotLst.Add(ptd._Name.StringValue, ptd);
		}
	}
}

Es kann sein, das der Sourcecode nicht alle Problemfälle abdeckt. Aber schreibt einfach, bei Fragen oder Problemen.