CHILD Abfrage in BSB für meine Raumgruppe


Servus!

In meinem Beschriftungsbild für eine Raumgruppe soll abhängig vom Attributwert in TEXT4 die Grundfläche summiert werden. Das klappt aber nur zur Hälfte...

Hier die 3 Syntaxe für meine 3 Abfragen:

1. CHILD(_IF_(@504@="BÜRO")ROUND(@224@;2)_ELSE_"-")
2. CHILD(_IF_(@504@="MITTELZONE")ROUND(@224@;2)_ELSE_"-")
3. CHILD(ROUND(@224@;2))

Das spannende dabei: die ersten beiden Zeilen funktionieren nicht gemeinsam. Es wird "BÜRO" ausgewertet, "MITTELZONE" allerdings nicht.

Lösche ich alle Räume mit "BÜRO" wird "MITTELZONE" sehr wohl ausgewertet.

Die letzte Zeile funktioniert immer!

Das versteht der Martin nicht!

Adjuntos (1)

Type: image/png
Descargado 23 veces
Size: 14,44 KiB
1 - 6 (6)
  • 1

Hallo Martin,

zunächst würd mich interessieren, welches Format das Beschriftungsbild hat.
Ich vermute mal numerisch mit Einheit "m²".

Deshalb mach es keinen Sinn, als Alternativ-Wert im _ELSE_-Zweig ein "-" zurückzugeben!

2. Problem:
CHILD() sollte immer nur direkt am Attribut gebraucht werden.
Statt
CHILD(_IF_(@504@="BÜRO")ROUND(@224@;2)_ELSE_"-")
sollte man besser
_IF_(CHILD(@504@)="BÜRO")ROUND(CHILD(@224@);2)_ELSE_0
schreiben.

Die Annahme, das CHILD(Formel) diese Formel für jedes einzelne Unterobjekt ausführt, ist ein Irrglaube.

Und damit sind wir beim eigentlichen Problem:

CHILD() liefert immer eine Summe aller "Kinder" (sollte also besser CHILDS() heissen)
Bei Text-Attributen sind das die einzelnen Texte mit "/" verbunden:
CHILD(@504@) würde also bei Dir z.B. "BÜRO/BÜRO/MITTELZONE" zurückliefern.
Bei Numerischen Attributen liefert es die Summe der Werte zurück.

In Deiner Abfrage _IF_(@504@="BÜRO") wird also immer nur der Text4 des ersten Raumes in der Gruppe verglichen. Schon wenn Du die Reihenfolge der Räume in Deiner Gruppe änderst, kommt etwas anderes raus!

Deswegen funktionieren die Abfragen
_IF_(@504@="BÜRO") und _IF_(@504@="MITTELZONE") nur alternativ, da an der ersten Stelle in der "Summenliste" (BÜRO/BÜRO/MITTELZONE) nur immer eines von beiden stehen kann.

Workaround:
Ich würde die Beschriftung mit einer Legende machen.
Dort kann man Räume nach beliebigen Kriterien (Attribute) aufsummieren lassen.
Aus Ausgangspunkt würde ich die Legende "Grundfläche Räume" nehmen, und diese ggf. entspr. anpassen.

@Allplan
Ein Zugriff auf einzelne "Kindelemente" (wie bei MT_BODEN auf die Schichten) wäre sinnvoll.
CHILD(@504@;1) liefert das Attribut 504 des ersten Kind-Elements usw.
CHILD(@504@;1;2) liefert die Attribute 504 des 1. und 2.Kind-Elements usw.
CHILD(@504@;-1) liefert die Attribute 504 des letzten Kind-Elements
CHILD(@504@;0) liefert die Attribute 504 aller Kind-Elemente

Zusätzlich wäre noch CHILD_COUNT() hilfreich.

Adjuntos (1)

Type: image/png
Descargado 39 veces
Size: 31,58 KiB

Servus!

Mein erster Dank gilt dem Telefonjoker!

Mein zweiter Dank gilt Nemo!

Beide haben mich auf die korrekte Lösung gebracht.

Ich habe tatsächlich ein Zahlenformat G8.2 für die Fläche definiert und diese mag das "-" natürlich nicht.

Als Konsequenz wird in meinem Syntax nun 0.00 zurückgegeben - eine Zahl!

Vielen Dank!

Sorry, muss mich korrigieren, Martin hat's richtig gemacht.

Scheinbar führt CHILD(Formel) diese Formel für jedes einzelne Unterobjekt aus und summiert die Ergebnisse auf.

Hab es gerade getestet, und es funktioniert.

Leider wird beim Kopieren oder Löschen eines Raumes der Raumgruppe die Aktualiesierung des VTB nicht angestossen,aber das ist ein anderer Fehler.

@Allplan
Ein Hinweis/Beispiel, dass man auf diese Weise durch die Unterobjekte iterieren kann, wäre in der Hilfe sehr nützlich. Auch wie Textwerte "aufsummiert" werden (s.o. "BÜRO/BÜRO/MITTELZONE"), wäre eine wichtige Information.Daraus folgt nämlich, dass man lieber kein "/"-Zeichen in solchen Textwerten verwenden sollte.

Woher weiß den die Formel das sie immer am "/" die Kinder trennen muss?
Ist das intern in Allplan festegelegt? Das würde mir einige eigene Fehlerversuche erklären

Gruß Jürgen
Allplan V 2023

Hallo Jürgen,

die Formel muss das nicht wissen, bzw. man kann das nicht einstellen.
Das Trennzeichen "/" ist intern festgelegt, und nirgends dokumentiert.

Da ein Elternelement (in dem Fall Raumgruppe) mehrere Kind-Elemente hat, ist das Ergebnis von CHILD() immer eine
"Summe" aller Kind-Werte.
Bei numerischen Kindwerten (Ganz- oder Fießkomma-Zahl-Attributen) werden die Werte einfach aufaddiert.
Bei textuellen Werten (Text-Attributen) geht das nicht.
Da fügt Allplan alle Text-Werte zu einem großen Text(-wert) zusammen, und fügt zwischen dan einzelnen Textwerten noch ein "/" ein.

@Allplan
Spätenstens jetzt sollte man über Array-Werte und deren Auswertung und Anzeige im Beschriftungsbild und im Report nachdenken.
Die Attribute dafür gibt es schon: IntVector-Attribut, DoubleVector-Attribut, StringVector-Attribut

Dann könnte CHILD() eine solche Wert-Liste zurückgeben, und diese könnten dann z.B. im Python-Script oder im Report weiter verarbeitet werden. Auch die Anzeige einer solchen Liste im Beschriftungsbild ist eher einfach zu lösen: Die Werte einfach untereinander als mehrzeiligen Text anzeigen.

Ein erster Schritt dahin, könnte die Trennung der Text-Werte mit dem Newline-Zeichen "\n" sein.
Und/Oder man macht dieses Trennzeichen "einstellbar".

1 - 6 (6)
  • 1

https://campus.allplan.com/ utiliza cookies  -  Aqui

Acéptalo