BIM Report/de

BIM Bericht

Menüeintrag
Verwalten → Bericht-Werkzeuge → BIM Bericht
Arbeitsbereich
BIM
Standardtastenkürzel
Keiner
Eingeführt in Version
1.2
Siehe auch
Arch Liste

Beschreibung

Der BIM-Bericht ist ein Werkzeug zur Erstellung von Zeitplänen und Datenberichten aus einem FreeCAD-Modell. Er verwendet eine SQL-ähnliche Abfragesprache zum Auswählen, Filtern und Aggregieren von Daten und bietet damit eine deklarative Alternative zu anderen Planungswerkzeugen. Letztendlich ermöglicht es Benutzern, eine Kalkulationstabelle zu erstellen und automatisch mit Daten aus dem Modell zu füllen.

Das Werkzeug BIM Bericht auswählen, wenn Folgendes ausgeführt werden muss:

Anwendung

  1. Ein FreeCAD-Dokument öffnen oder erstellen, das einige Objekte enthält.
  2. Es gibt mehrere Möglichkeiten, das Werkzeug aufzurufen:
    • Die Schaltfläche BIM Bericht drücken.
    • Im Menü Verwalten → Berichtswerkzeuge → BIM Bericht wählen.
  3. Der neue Bericht öffnet automatisch sein Aufgaben-Fenster. Eine oder mehrere Anweisungen für den Bericht erstellen. Optional kann der bereitgestellte Anweisungseditor verwenden, um eine Vorschau der Ausführung dieser Anweisungen anzuzeigen.
  4. OK drücken, um den Bericht zu speichern und die zugehörige Tabelle mit den Abfrageergebnissen zu aktualisieren.

Benutzeroberfläche

Das BIM Bericht-System besteht aus drei Hauptkomponenten: Das Report-Objekt in der Baumansicht, dem Ziel Spreadsheet für die Ergebnisse, und dem Aufgaben-Fenster wo der Bericht eingestellt werden kann.

Wenn ein neuer Bericht erstellt wird, werden in der Baumansicht zwei neue Objekte angezeigt: das Berichtsobjekt, in dem alle Einstellungen gespeichert sind, und die zugehörige ReportResult-Tabelle.

Durch Doppelklicken auf das Objekt Daten-EigenschaftReport wird das Aufgaben-Fenster geöffnet, das der primäre Arbeitsbereich für die Bearbeitung des Berichts ist. Das Fenster ist in zwei Hauptbereiche unterteilt: die Report Statements (Berichts-Ausdrücke) und der Statement Editor (Ausdrucks-Editor).

Das BIM Bericht-Aufgaben-Fenster, mit dem Abschnitt Anweisungs-Übersicht oben.

Bericht-Anweisungen

Dieser Abschnitt ist immer oben im Aufgaben-Fenster sichtbar und enthält eine Zusammenfassung aller Abfragen (oder „Anweisungen“), aus denen der Bericht besteht.

Das Hauptmerkmal ist eine Tabelle, in der jede Anweisung aufgeführt ist. Von hier aus kann die Beschreibung angezeigt und direkt bearbeitet werden sowie wichtige Optionen für jede Abfrage umgeschaltet werden:

Durch Doppelklicken auf eine Zeile des Ausdrucks wird dieser zur Bearbeitung geöffnet. Durch Drücken der Taste F2 in einer Zeile des Ausdrucks kann die Beschreibung des Ausdrucks direkt bearbeitet werden, ohne dass der vollständige Editor geladen werden muss.

Unter der Tabelle sind Schaltflächen zum Hinzufügen, Entfernen, Duplizieren, oder Bearbeiten der ausgewählten Anweisung.

Schließlich können über das Dropdown-Menü Berichtsvorlagen vollständige, vorkonfigurierte Berichte geladen werden, wie beispielsweise ein „Raum- und Flächenplan“.

Anweisungs-Editor

Dieser Abschnitt wird unten im Aufgaben-Fenster angezeigt, wenn eine Anweisung ausgewählt und auf Ausgewählte bearbeiten geklickt wird. Hier wird eine individuelle SQL-Abfrage geschrieben und konfiguriert.

Der Ausdrucks-Editor mit SQL-Editor, Vorschaufenster und Anzeigeoptionen.

Die Schaltfläche Speichern speichert die Änderungen an der geladenen Anweisung. Wenn das Kontrollkästchen Speichern und Weiter aktiviert und die Schaltfläche Speichern gedrückt wird, wird zusätzlich zum Speichern eine neue Anweisung erstellt, um die Bearbeitung zu optimieren. Die Schaltfläche ❌ Verwerfen schließt den Anweisungseditor, ohne die vorgenommenen Änderungen zu speichern.

Arbeitsablauf

Dieses kurze Tutorial führt durch die Erstellung eines vollständigen Raumplans, von einer einfachen Liste bis hin zu einem mehrteiligen Bericht mit berechneten Summen.

Schritt 1: Neuer Bericht

  1. Die Schaltfläche BIM Bericht in der Werkzeugleiste des Arbeitsbereichs BIM anklicken.
  2. FreeCAD erzeugt ein Report-Objekt und eine ReportResult-Kalkulationstabelle in der Baumansicht und öffnet automatisch das Aufgaben-Fenster.

Schritt 2: Einfache Anweisung

Zunächst erstellen wir eine einfache Liste aller Räume und ihrer Flächen.

  1. In Report Statements auf die Schaltfläche Anweisung hinzufügen klicken. In der Liste erscheint eine neue, leere Anweisung.
  2. Wenn die neue Anweisung ausgewählt ist, auf die Schaltfläche Ausgewählte bearbeiten klicken. Der Statement Editor wird am unteren Rand des Aufgaben-Fensters angezeigt.
  3. Im Feld Description, Room List eingeben.
  4. Im SQL Query-Editor, die folgende Abfrage eingeben. Dadurch werden Name und Fläche aller Objekte ausgewählt, die Space sind, und alphabetisch sortiert.
    SELECT Label, Area FROM document WHERE IfcType = 'Space' ORDER BY Label ASC
    
  5. Die Schaltfläche Speichern im Editor drücken, um die Änderungen in der Anweisung zu speichern.

Schritt 3: Mehrteiliger Bericht

Fügen wir nun eine zweite Anweisung hinzu, um die Gesamtfläche zu berechnen.

  1. In der Übersicht erneut auf Anweisung hinzufügen klicken, um eine zweite Anweisung zu erstellen.
  2. Diese neue Anweisung auswählen und auf Auswahl bearbeiten klicken.
  3. Die Beschreibung auf Total Area setzen.
  4. Im SQL-Abfrage-Editor, diese Aggregationsabfrage eingeben:
    SELECT 'Total Usable Area', SUM(Area) FROM document WHERE IfcType = 'Space'
    
  5. Unter Anzeigeoptionen, Spaltennamen einbeziehen deaktivieren (da unsere erste Spalte ein benutzerdefiniertes Feld ist) und Ergebnisse fett gedruckt zur Hervorhebung überprüfen.
  6. Speichern klicken. Nun hat man einen Bericht mit zwei Anweisungen. Auf die Schaltfläche OK unten im Aufgabenbereich klicken, um ihn auszuführen. Die zugehörige Tabelle wird automatisch mit den formatierten Ergebnissen geöffnet.

Schritt 4: Befehlsverknüpfung für erweiterte Abfragen

Mit Befehlsverknüpfung können Abfragen miteinander verknüpft werden, wobei die Ausgabe einer Abfrage als Eingabe für die nächste dient. Dies ist für komplexe hierarchische Auswahlen unerlässlich, beispielsweise bei Verwendung der Funktion CHILDREN(). Da es sich nicht um eine rekursive Funktion handelt, werden nur direkte Nachkommen gefunden.

Um beispielsweise alle Türen im „Erdgeschoss“ zu finden, muss eine mehrstufige Abfrage durchgeführt werden, da Türen Unterelemente von Wänden sind, die wiederum Unterelemente des Stockwerks sind.

  1. Erzeuge einen neuen Bericht.
  2. Anweisung 1: Finde das 'Ground Floor'-Objekt
    • Füge eine Anweisung mit der Beschreibung Find Ground Floor hinzu.
    • Diese Abfrage legt den Startpunkt unserer Suche fest.
      SELECT * FROM document WHERE Label = 'Ground Floor'
      
  3. Anweisung 2: Finde die Wände auf dieser Etage
    • Füge eine zweite Anweisung mit der Beschreibung Wände auf dieser Etage finden hinzu.
    • Aktiviere im Editor das Kontrollkästchen Als Pipeline-Schritt verwenden. Dadurch wird die Anweisung angewiesen, auf den Ergebnissen der vorherigen Anweisung (dem Bodenobjekt) ausgeführt zu werden.
    • Verwende diese Abfrage, um alle direkten untergeordneten Elemente der Etage zu finden und nur die Wände beizubehalten:
      SELECT * FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Wall'
      
  4. Anweisung 3: Finde die Türen in diesen Wänden
    • Füge eine dritte Anweisung mit der Beschreibung Find Doors in Walls hinzu.
    • Aktiviere erneut das Kontrollkästchen Use as Pipeline Step. Dadurch wird die Anweisung nun mit der Ausgabe von Anweisung 2 (der Liste der Wände) verknüpft.
    • Verwende diese Abfrage, um die untergeordneten Elemente der Wände zu ermitteln und nur die Türen beizubehalten:
      SELECT Label, Width, Height FROM CHILDREN(SELECT * FROM document) WHERE IfcType = 'Door'
      
  5. OK drücken. Der Bericht führt die gesamte dreistufige Pipeline aus.

Das Ergebnis verstehen: Die endgültige Tabelle zeigt nur die Ergebnisse der letzten Anweisung in der Pipeline (die Liste der Türen). Die ersten beiden Anweisungen fungieren als Zwischenfilter, deren Ergebnisse im Speicher weitergegeben, aber nicht in die Tabelle gedruckt werden, sodass Sie einen übersichtlichen und präzisen Abschlussbericht erhalten.

Schritt 5: Voreinstellungen und Vorlagen

BIM SQL-Dialektreferenz

Dieser Abschnitt enthält detaillierte Informationen zum SQL-Dialekt, der vom BIM Berichtswerkzeug verwendet wird.

Hinweis: Die aktuellsten Informationen zu allen Klauseln und Funktionen findet man jederzeit in der Benutzeroberfläche, indem man im Aufgaben-Fenster-Editor des Berichts auf die Schaltfläche Hilfe klickt.

Klauseln

Anwendungshinweise für GROUP BY und ORDER BY

Der Dialekt hat spezifische Regeln für die Verwendung von Ausdrücken (wie Funktionen oder Arithmetik) in den Klauseln GROUP BY und ORDER BY.

Funktionen

Die Programmiersprache verfügt über eine Bibliothek mit integrierten Funktionen zur Datenbearbeitung und -analyse.

Kategorie Funktion Beschreibung
Gesamt COUNT(property|*) Zählt die Anzahl der Objekte. COUNT(*) zählt alle Reihen; COUNT(property) zählt Zeilen, in denen die angegebene property (Eigenschaft) nicht NULL ist.
SUM(property) Berechnet die Summe einer numerischen property (Eigenschaft).
MIN(property) Ermittelt den Minimalwert einer numerischen property (Eigenschaft).
MAX(property) Ermittelt den Maximalwert einer numerischen property (Eigenschaft).
Hierarchisch PARENT(*) Gibt das architektonisch relevante übergeordnete Objekt eines Objekts zurück (z. B. die Wand, in der sich ein Fenster befindet), wobei generische Gruppen transparent übersprungen werden.
CHILDREN(subquery) Eine Funktion, die in der FROM-Klausel verwendet wird. Gibt alle Unterelemente der von der Unterabfrage gefundenen Objekte zurück, wobei sowohl Inklusionsbeziehungen (.Group) als auch Host-Beziehungen (.Hosts) aufgelöst werden. Diese Funktion ist nicht rekursiv. Um Unterelemente oder tiefer liegende Nachkommen zu finden, mehrere CHILDREN()-Schritte mithilfe einer Pipeline verketten.
CHILDREN_RECURSIVE(subquery, max_depth=15) Eine Funktion, die in der FROM-Klausel verwendet wird. Gibt alle untergeordneten Objekte der subquery-Ergebnisse zurück, indem sie die Hierarchie rekursiv durchläuft. Generische Gruppen werden dabei transparent übersprungen. Optional kann ein Wert für max_depth angegeben werden (Standard: 15, 0 für unbegrenzt). Dadurch entfällt die Notwendigkeit komplexer Pipelines zum Auffinden verschachtelter Objekte.
Dienstprogramm TYPE(*) Gibt den benutzerseitigen Typ des Objekts zurück, wie er durch seinen Proxy bestimmt wird (z. B. Wall, Space, Part::Box).
CONVERT(quantity, 'unit') Konvertiert ein FreeCAD-Mengenobjekt in eine neue Einheit und gibt es als reinen Zahlenwert zurück. Beispiel: CONVERT(Area, 'm^2').
Zeichenkette LOWER(property) Wandelt eine Texteigenschaft in Kleinbuchstaben um.
UPPER(property) Wandelt eine Texteigenschaft in Großbuchstaben um.
CONCAT(val1, val2, …) Fügt mehrere Textwerte und Eigenschaften zu einer einzigen Zeichenfolge zusammen.

Eigenschaftenzugriff

Es kann auf alle Eigenschaften eines Objekts zugegriffen werden, einschließlich verschachtelter Datenstrukturen.

Operatoren

Typ Operatoren Beschreibung
Vergleich =, !=, >, <, >=, <= Standard-Vergleichsoperatoren.
LIKE Musterabgleich ohne Berücksichtigung der Groß-/Kleinschreibung. % für mehrere Zeichen und _ für ein einzelnes Zeichen verwenden.
IS NULL, IS NOT NULL Prüft, ob eine Eigenschaft einen Wert hat.
IN (value1, value2, …) Prüft, ob der Wert einer Eigenschaft in einer vorgegebenen Liste von Literalen enthalten ist.
Logisch AND, OR Wird in der WHERE-Klausel verwendet, um mehrere Bedingungen zu kombinieren.
Arithmetisch +, -, *, / Führt Berechnungen mit numerischen Werten durch. Beachtet die übliche Reihenfolge der Rechenoperatoren; () verwenden, um diese zu überschreiben.

Allgemeine Syntax

Beispiel-Abfragen

Dieser Abschnitt enthält eine Sammlung praktischer Abfragen, die direkt verwendet werden oder für die Berichte angepasst werden können.

Grundlegende Auswahlen

Alle Strukturelemente auswählen (Säulen und Träger):

SELECT Label, IfcType 
FROM document 
WHERE IfcType IN ('Column', 'Beam') 
ORDER BY IfcType, Label

Alle Wände auswählen, deren Name „Außen“ enthält:

SELECT Label, Length, Height 
FROM document 
WHERE IfcType = 'Wall' AND Label LIKE '%Exterior%'

Datenaggregation und Zusammenfassungen

Alle BIM-Objekte zählen, gruppiert nach ihrem Typ:

SELECT IfcType, COUNT(*) 
FROM document 
WHERE IfcType IS NOT NULL 
GROUP BY IfcType 
ORDER BY IfcType ASC

Eine vollständige Mengenermittlung für alle Wände erhalten:

Diese Abfrage berechnet die Gesamtzahl der Wände, ihre Gesamtlänge sowie die minimale und maximale Wandhöhe.

SELECT 
    COUNT(*) AS "Total Count", 
    SUM(Length) AS "Total Length (mm)", 
    MIN(Height) AS "Min Height (mm)", 
    MAX(Height) AS "Max Height (mm)" 
FROM document 
WHERE IfcType = 'Wall'

Hierarchische Abfragen

Liste aller Objekte, die sich direkt im „Erdgeschoss“ befinden:

Hierbei wird die Funktion CHILDREN() verwendet, um den Inhalt eines bestimmten Containerobjekts abzufragen.

SELECT Label, IfcType 
FROM CHILDREN(SELECT * FROM document WHERE Label = 'Ground Floor') 
ORDER BY IfcType

Alle Türen und die jeweilige Wand auflisten, in der sie sich befinden:

Hierbei wird die Funktion PARENT() verwendet, um den Host jeder Tür zu ermitteln.

SELECT 
    Label AS "Door_Name", 
    PARENT(*).Label AS "Host_Wall_Name" 
FROM document 
WHERE IfcType = 'Door' 
ORDER BY "Host_Wall_Name"

Alle Fenster im „Erdgeschoss“ finden (indem die Vorgänger überprüft werden):

Diese Abfrage findet Fenster, überprüft deren übergeordnetes Element (die Wand) und anschließend das übergeordnete Element dieser Wand (den Boden).

SELECT Label 
FROM document 
WHERE IfcType = 'Window' AND PARENT(*).PARENT(*).Label = 'Ground Floor'

Erweiterte Abfragen

Einen vollständigen Raum- und Flächenplan erstellen:

Diese Abfrage erzeugt eine formatierte Liste aller Räume, gruppiert nach der Etage, zu der sie gehören, mit ihrer Fläche umgerechnet in Quadratmeter.

SELECT 
    PARENT(*).Label AS "Floor", 
    Label AS "Room Name", 
    CONVERT(Area, 'm^2') AS "Area (m²)" 
FROM document 
WHERE IfcType = 'Space' 
ORDER BY "Floor", "Room Name"

Anwendungshinweise

Einheiten

Wenn eine Eigenschaft ausgewählt wird, die Einheiten (eine „Quantität“) hat, wie z. B. „Länge“ oder „Fläche“, gibt die BIM-Report-Engine den rohen numerischen Wert dieser Eigenschaft zurück, wie er intern im FreeCAD-Dokument gespeichert ist. Die internen Einheiten von FreeCAD basieren immer auf Millimetern (mm).

Das bedeutet, dass die Standardausgabe unabhängig vom aktuellen Einheitenschema oder den Benutzereinstellungen in mm für Länge, mm² für Fläche und mm³ für Volumen erfolgt. Die automatisch generierte Spaltenüberschrift gibt diese interne Einheit korrekt wieder.

Beispiel: Standardverhalten

Wenn diese einfache Abfrage auf einer Fläche von 1 Meter mal 1 Meter ausgeführt wird:

SELECT Label, Area FROM document WHERE IfcType = 'Space'

Die resultierende Kalkulationstabelle zeigt:

<span id="Using_CONVERT()">

Verwendung von CONVERT()

Um die Ergebnisse in den gewünschten Einheiten zu erhalten, kann die Funktion CONVERT() verwendet werden, die eine explizite Kontrolle über die Ausgabe ermöglicht. Um die Fläche in Quadratmetern zu erhalten, ändert man die Abfrage wie folgt:

SELECT Label, CONVERT(Area, 'm^2') AS "Area (m²)" FROM document WHERE IfcType = 'Space'

Diese Abfrage liefert nun das Ergebnis in der gewünschten Einheit.:

Die Verwendung von CONVERT() garantiert, dass die Ausgabe des Berichts eindeutig ist und dass alle Berechnungen, die innerhalb der Abfrage durchgeführt werden (z. B. SUM(CONVERT(Area, 'm^2'))), mathematisch korrekt sind.

Eigenschaften

Ein Arch Report-Objekt stellt dem Benutzer die folgenden Eigenschaften zur Verfügung.

Daten

Report

Skripten

Die BIM Bericht-Engine ist vollständig über Python zugänglich, sodass die erweiterten Abfragefunktionen in die eigenen Skripte und Automatisierungen integrieren kann.

Arch.selectObjects(query_string)

Dies ist die Hauptfunktion zum Ausführen einer einzelnen, einfachen SQL-Abfrage. Sie nimmt eine Abfragezeichenfolge als Eingabe entgegen und gibt eine Liste der FreeCAD-Dokumentobjekte zurück, die der Abfrage entsprechen. Wenn die Abfrage ungültig ist oder keine Objekte findet, gibt sie eine leere Liste zurück und gibt eine Fehlermeldung an die Konsole aus.

Beispiel: Alle Wandobjekte mit „Exterior“ (Außenbereich) im Namen abrufen

import FreeCAD
import Arch

# This query selects all Wall objects whose Label contains the substring "Exterior"
query = "SELECT * FROM document WHERE IfcType = 'Wall' AND Label LIKE '%Exterior%'"

exterior_walls = Arch.selectObjects(query)

# The result is a list of FreeCAD objects
FreeCAD.Console.PrintMessage(f"Found {len(exterior_walls)} exterior walls.\n")
for wall in exterior_walls:
    FreeCAD.Console.PrintMessage(f"- {wall.Label} (Length: {wall.Length})\n")

Arch.selectObjectsFromPipeline(statements)

Für komplexere, mehrstufige Auswahlen kann diese Funktion verwendet werden, um eine Pipeline auszuführen. Sie nimmt eine Liste von ArchSql.ReportStatement-Objekten entgegen und gibt die endgültige Liste der FreeCAD-Dokumentobjekte zurück, die aus der vollständigen Pipeline resultieren.

Dies entspricht programmatisch der Verwendung des Kontrollkästchens „Als Pipeline-Schritt verwenden“ in der Benutzeroberfläche.

Beispiel: Finde alle Türen im „Erdgeschoss“"

Dies ist ein klassisches hierarchisches Problem, das mehrere Schritte erfordert. Das Ziel besteht darin, die „Enkelkinder” (Türen) eines „Großelternteils” (des Stockwerks) zu finden. Da die Funktion CHILDREN() nicht rekursiv ist, müssen wir mehrere Schritte in einer Pipeline verketten.

  1. Zuerst suchen wir das Objekt 'Ground Floor'.
  2. Zweitens finden wir seine direkten Kinder (die Wände, Räume usw.).
  3. Drittens finden wir die Kinder dieser Objekte (zu denen auch die Türen und Fenster gehören, die von den Wänden gehostet werden).
  4. Schließlich filtern wir diese letzte Gruppe, um nur die Türen zu behalten.
import FreeCAD
import Arch
import ArchSql

# Step 1: Define the pipeline statements.
# The ReportStatement class must be imported from the ArchSql module.

# Statement 1: Find the parent 'Ground Floor' object.
# Output of this step: [Ground_Floor_Object]
stmt1 = ArchSql.ReportStatement(
    query_string="SELECT * FROM document WHERE Label = 'Ground Floor'"
)

# Statement 2: Find the direct children of the floor (walls, spaces, etc.).
# is_pipelined=True tells this to run on the output of stmt1.
# Output of this step: [Wall_Object_1, Wall_Object_2, Space_Object_1, …]
stmt2 = ArchSql.ReportStatement(
    query_string="SELECT * FROM CHILDREN(SELECT * FROM document)",
    is_pipelined=True
)

# Statement 3: Find the children of the objects from the previous step.
# This finds the doors and windows hosted by the walls.
# Output of this step: [Door_Object, Window_Object_1, …]
stmt3 = ArchSql.ReportStatement(
    query_string="SELECT * FROM CHILDREN(SELECT * FROM document)",
    is_pipelined=True
)

# Statement 4: Filter the final list to keep only the doors.
# This runs on the output of stmt3.
# Final Output: [Door_Object]
stmt4 = ArchSql.ReportStatement(
    query_string="SELECT * FROM document WHERE IfcType = 'Door'",
    is_pipelined=True
)

# Step 2: Execute the full pipeline.
pipeline_statements = [stmt1, stmt2, stmt3, stmt4]
doors_on_floor = Arch.selectObjectsFromPipeline(pipeline_statements)

# The result is the final list of door objects.
FreeCAD.Console.PrintMessage(f"Found {len(doors_on_floor)} doors on the ground floor.\n")
for door in doors_on_floor:
    FreeCAD.Console.PrintMessage(f"- {door.Label}\n")

Überprüfen und Teilen eines Berichts über die Python-Konsole

Zum Debuggen, Skripten oder Teilen der Arbeit mit anderen kann eine vollständige, für Menschen lesbare Zusammenfassung der Konfiguration eines Berichts direkt aus der Python-Konsole abgerufen werden.

Die benutzerdefinierte Logik und der detaillierte Inhalt eines BIM-Berichts werden in seinem „Proxy-Objekt” gespeichert. Durch Zugriff auf das Attribut .Proxy erhält man einen vollständigen Ausdruck aller Anweisungen und der SQL-Abfragen. Auf diese Weise kann man die gesamte Berichtsdefinition bequem in die Zwischenablage kopieren, um sie in einem Forum oder einem Fehlerbericht zu teilen.

Wie man es benutzt:

  1. Das Berichtsobjekt in der Baumansicht auswählen.
  2. Strg+Umschalt+P drücken. Dadurch wird das ausgewählte Objekt als Variable obj an die Python-Konsole gesendet.
  3. In der Konsole Folgendes eingeben und die Eingabetaste drücken:
print(obj.Proxy)

Beispiel-Ausgabe:

>>> print(obj.Proxy)
BIM Report: 'My Door Schedule' (2 statements)

--- Statement [1]: Find All Walls on Ground Floor ---
    SELECT * 
    FROM CHILDREN(SELECT * FROM document WHERE Label = 'Ground Floor')
    WHERE IfcType = 'Wall'

--- Statement [2]: Final Door Schedule (Pipelined, Header) ---
    SELECT
        Tag,
        COUNT(*) AS "Count"
    FROM
        document
    GROUP BY
        Tag