DMSQuery XML-Format
Das DMSQuery-Format ist das XML-Anfrageformat für Suchanfragen an den enaio®-Server. Es beschreibt welche Archive und Objekttypen durchsucht werden sollen, welche Felder im Ergebnis erscheinen sollen und unter welchen Bedingungen Objekte zurückgeliefert werden.
Die zugehörige Schema-Datei ist DMSQuery.xsd. Das Ergebnis einer DMSQuery-Anfrage wird im
DMSContent XML-Format zurückgeliefert.
1. Verwendung
Das DMSQuery-Format wird von folgenden Jobs als Eingabe verwendet:
| Job | Beschreibung |
|---|---|
Primärer Recherche-Job — führt die Anfrage aus und liefert Treffer im DMSContent-Format zurück |
|
Suche im Papierkorb — Anfrage im DMSQuery-Format |
|
Gespeicherte Suche anlegen — speichert eine DMSQuery auf dem Server |
|
Gespeicherte Suche aktualisieren — ersetzt eine vorhandene DMSQuery |
|
Gespeicherte Suche abrufen — liefert die gespeicherte DMSQuery zurück |
|
Konvertiert eine DMSQuery in ein anderes Anfrageformat (oder umgekehrt) |
|
Führt eine gespeicherte Suche aus — intern wird die gespeicherte DMSQuery verwendet |
2. Anfrage-Typen (requesttype)
Das Attribut requesttype am <DMSQuery>-Element bestimmt die Struktur des zurückgelieferten
DMSContent:
| Wert | Bezeichnung | Ergebnis |
|---|---|---|
|
Linear Object List |
Tabellarische Trefferliste ( |
|
Hierarchical Object List |
Hierarchische Objektliste ( |
|
Mixed |
HOL-Daten für das angefragte Objekt kombiniert mit LOL-Daten für Eltern und Kinder. |
|
Detail (veraltet) |
Nicht mehr verwenden — stattdessen |
3. Schnellstart — häufige Anfragemuster
3.1. Einfache Feldsuche (LOL)
Alle Dokumente eines Typs suchen, bei denen ein Feld einen bestimmten Wert hat:
<DMSQuery requesttype="LOL" pagesize="20" offset="0">
<Archive internal_name="patient">
<ObjectType type="DOCUMENT" internal_name="medical_letter">
<Fields>
<Field internal_name="date"/>
<Field internal_name="subject"/>
<Field internal_name="physician"/>
</Fields>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="medical_letter">
<FieldCondition internal_name="physician" operator="=">
<Value>Dr. Müller</Value>
</FieldCondition>
</ConditionObject>
</Conditions>
</ObjectType>
</Archive>
</DMSQuery>
3.2. Vollständige HOL-Anfrage mit Basisparametern
<DMSQuery requesttype="HOL" baseparams="1" pagesize="10" offset="0">
<Archive internal_name="patient">
<ObjectType type="DOCUMENT" internal_name="medical_letter">
<Fields field_schema="ALL"/>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="medical_letter">
<FieldCondition internal_name="date" operator="BETWEEN">
<Value>2024-01-01</Value>
<Value>2024-12-31</Value>
</FieldCondition>
</ConditionObject>
</Conditions>
</ObjectType>
</Archive>
</DMSQuery>
4. XML-Struktur (Übersicht)
<DMSQuery requesttype="LOL|HOL|MIX"
pagesize="20" offset="0" maxhits="-1"
baseparams="0" variants="0" rights="0"
combined="0" sql="0" icons="0"
disablesearchgroups="1" narrowsearch="0"
status="0" fileinfo="0" object_inserts="0"
registercontext="0" outputformat="0">
<!-- Optionale Parameterdefintionen für parametrisierte Anfragen -->
<Params>
<Param name="myParam"><Value>Suchbegriff</Value></Param>
</Params>
<!-- Ein oder mehrere Archive -->
<Archive internal_name="archive1">
<!-- Objekttyp-Anfrage -->
<ObjectType type="DOCUMENT" internal_name="invoice" alias="Rechnung">
<Fields field_schema="DEF">
<Field internal_name="date" sortpos="1" sortorder="DESC"/>
<Field internal_name="amount"/>
</Fields>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="invoice">
<FieldCondition internal_name="status" operator="=">
<Value>approved</Value>
</FieldCondition>
<FieldCondition internal_name="amount" operator=">=">
<Value>1000</Value>
</FieldCondition>
</ConditionObject>
</Conditions>
<!-- HOL: Kinderobjekte anfragen -->
<ChildObjects child_schema="DEF" export_depth="1">
<ChildObjectType type="REGISTER" internal_name="invoice_items">
<Fields field_schema="ALL"/>
</ChildObjectType>
</ChildObjects>
<!-- HOL: Pfad zu Elternobjekten anfragen -->
<ParentObjects parent_schema="DEF">
<SubObjectType type="FOLDER" internal_name="company"/>
</ParentObjects>
<!-- Verknüpfte Objekte aus anderem Archiv -->
<ExternalObjects>
<ExternalArchive internal_name="contacts">
<ExternalObjectType internal_name="contact_person">
<Fields field_schema="MIN"/>
</ExternalObjectType>
</ExternalArchive>
</ExternalObjects>
</ObjectType>
<!-- Suche über Basisparameter (Ordner) -->
<FolderBaseParams>
<Creator><Value>admin</Value></Creator>
<Created><From>2024-01-01</From><To>2024-12-31</To></Created>
</FolderBaseParams>
<!-- Volltextsuche -->
<FulltextQuery>
<Fulltext MODE="PATTERN">
<Value>Entlassungsbrief</Value>
</Fulltext>
</FulltextQuery>
</Archive>
</DMSQuery>
5. Elemente und Attribute
5.1. <DMSQuery> (Wurzelelement)
5.1.1. Ergebnis-Steuerung
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
|
Anfragetyp: |
|
|
xs:long |
|
Maximale Trefferanzahl pro Antwort ( |
|
xs:long |
|
0-basierter Startindex für Seitenblättern |
|
xs:long |
|
Absolutes Trefferlimit ( |
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
5.1.2. Suchverhalten
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
Statusfilter für Objekte (reserviert) |
|
xs:short |
— |
Numerischer Ausgabeformatcode (ergänzend zu |
5.2. <Params> / <Param>
Optionale Parameterdefinitionen für parametrisierte Anfragen. Parameter ermöglichen es, eine DMSQuery-Vorlage zu speichern und zur Laufzeit mit Werten zu befüllen (z. B. für gespeicherte Suchen via dms.ExecuteStoredQuery).
Das name-Attribut auf <Param> ist im XSD nicht formal definiert, aber in der Praxis erforderlich, da <FieldCondition> über <ParamValue ref="name"> darauf verweist.
|
Der <Params>-Block muss vor dem ersten <Archive>-Element stehen. Steht er dahinter,
verwirft der Server ihn stillschweigend — ohne Fehlermeldung und ohne Fehlercode. Sämtliche
<ParamValue ref="…"/>-Bedingungen entfallen damit, und die Anfrage weitet sich auf den gesamten
Objekttyp aus.
|
Jedes <Param> enthält genau einen der folgenden Wert-Typen:
| Kindelement | Bedeutung |
|---|---|
|
Fester Standardwert |
|
Parameter ist leer (NULL) |
|
Wert wird zur Laufzeit aus dem Feld mit dem angegebenen |
<DMSQuery requesttype="LOL">
<Params>
<Param name="arzt"><Value>Dr. Müller</Value></Param>
<Param name="datumVon"><Value>2024-01-01</Value></Param>
<Param name="datumBis"><Value>2024-12-31</Value></Param>
</Params>
<Archive internal_name="patient">
<ObjectType type="DOCUMENT" internal_name="medical_letter">
<Fields><Field internal_name="subject"/></Fields>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="medical_letter">
<FieldCondition internal_name="physician" operator="=">
<ParamValue ref="arzt"/>
</FieldCondition>
<FieldCondition internal_name="date" operator="BETWEEN">
<ParamValue ref="datumVon"/>
<ParamValue ref="datumBis"/>
</FieldCondition>
</ConditionObject>
</Conditions>
</ObjectType>
</Archive>
</DMSQuery>
5.3. <Archive>
Bestimmt das zu durchsuchende Archiv. Mindestens eines der Attribute id, name, internal_name
oder osguid muss angegeben werden. Mehrere <Archive>-Elemente sind erlaubt (archivübergreifende Suche).
internal_name ist nur bei archivübergreifenden Abfragen (mehrere <Archive>-Elemente)
erforderlich — vorausgesetzt, auch die enthaltenen <ObjectType>-Elemente verwenden internal_name.
Bei Einzelarchiv-Anfragen kann das Attribut entfallen.
|
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:long |
|
Numerische Archiv-ID |
|
xs:string |
— |
Anzeigename |
|
xs:string |
— |
Interner Name (empfohlen) |
|
xs:string |
— |
GUID |
Kindelemente (beliebige Kombination, mehrfach erlaubt):
-
<ObjectType>— typisierte Objektsuche -
<FolderBaseParams>— Ordnersuche über Basisparameter -
<RegisterBaseParams>— Registersuche über Basisparameter -
<DocumentBaseParams>— Dokumentsuche über Basisparameter -
<FulltextQuery>— Volltextsuche
5.3.1. Mehrere Suchen in einem Aufruf
Mehrere <Archive>-Blöcke und mehrere <ObjectType>-Blöcke je Archiv bündeln voneinander
unabhängige Suchen in einem Aufruf. Die Antwort spiegelt die Struktur der Anfrage: je Block eine
eigene Ergebnisliste mit eigener <Statistics>. Es findet keine Verknüpfung und keine
Schnittmengenbildung zwischen den Blöcken statt.
Das ist etwas anderes als mehrere
<ConditionObject>-Blöcke innerhalb eines <ObjectType> —
jene wirken als Bedingungen auf dieselbe Ergebnisliste.
Gemessen an enaio®-Server 12.0.769.25242, je ein Treffer pro Block:
<!-- Zwei Archive: die Antwort enthält zwei <Archive>-Blöcke -->
<DMSQuery requesttype="HOL">
<Archive internal_name="Unittest_DMS">
<ObjectType internal_name="Unittest_DMS"> … </ObjectType>
</Archive>
<Archive internal_name="Unittest">
<ObjectType internal_name="Unittest"> … </ObjectType>
</Archive>
</DMSQuery>
<!-- Zwei Objekttypen in einem Archiv: die Antwort enthält beide <ObjectType>-Blöcke -->
<DMSQuery requesttype="HOL">
<Archive internal_name="Unittest_DMS">
<ObjectType internal_name="Unittest_DMS"> … </ObjectType>
<ObjectType internal_name="Unittest_DMS_Document"> … </ObjectType>
</Archive>
</DMSQuery>
5.4. <ObjectType>
Definiert den gesuchten Objekttyp sowie die gewünschten Ausgabefelder und Suchbedingungen.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
— |
|
|
|
xs:long |
|
Numerische ID des Objekttyps |
|
xs:string |
— |
Anzeigename |
|
xs:string |
— |
Interner Name (empfohlen) |
|
xs:string |
— |
GUID |
|
xs:string |
— |
Datenbanktabellenname |
|
xs:string |
— |
Aliasname, der in der Trefferliste erscheint (schnellerer Zugriff bei mehreren Objekttypen) |
Kindelemente:
| Element | Zweck |
|---|---|
|
Welche Felder im Ergebnis erscheinen sollen |
|
Filterbedingungen — welche Objekte zurückgeliefert werden |
|
Kinderobjekte, die hierarchisch mitgeliefert werden sollen |
|
Elternpfad (Ordner/Register), der mitgeliefert werden soll |
|
Verknüpfte Objekte aus anderen Archiven |
5.5. <Fields> / <Field>
<Fields> listet die Felder, die im Ergebnis zurückgegeben werden sollen.
Attribut auf <Fields> |
Typ | Standard | Beschreibung |
|---|---|---|---|
|
|
Vorauswahl der zurückzugebenden Felder (überschreibbar durch einzelne |
Das Attribut field_schema auf <Fields> steuert, welche Felder standardmäßig einbezogen
werden — einzelne <Field>-Elemente ergänzen oder überschreiben diese Auswahl.
Attribut auf <Field> |
Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:string |
— |
Anzeigename des Felds |
|
xs:string |
— |
Interner Name (empfohlen) |
|
xs:string |
— |
Datenbankspaltname |
|
xs:string |
— |
GUID |
|
xs:short |
|
|
|
xs:long |
|
Sortierposition im Ergebnis ( |
|
xs:string |
— |
Sortierrichtung: |
|
xs:string |
— |
Aliasname für den Feldwert — ermöglicht Nutzung als Bedingungswert in |
Systemfelder für Positionsinformationen (nur in Relation-Tabellen): folder_id, register_id, register_type.
|
5.6. <Conditions> / <ConditionObject>
<Conditions> enthält entweder eine Liste von <ConditionObject>-Elementen oder eine Liste
von <ObjectID>-Elementen (direkter Abruf nach ID).
5.6.1. Variante 1 — Feldbasierte Bedingungen (<ConditionObject>)
Jedes <ConditionObject> trägt dieselben Identifikationsattribute wie <ObjectType> und
enthält beliebig viele Bedingungselemente:
-
<FieldCondition>— Bedingung auf ein einfaches Feld -
<FieldGroup>— logische Gruppe von Bedingungen (AND/OR) -
<TableCondition>— Bedingung auf ein Tabellenfeld -
<Fulltext>— Volltextbedingung
Jedes <ConditionObject> gilt für genau einen Objekttyp. Blöcke für verschiedene Objekttypen
werden mit UND verknüpft, mehrere Blöcke für denselben Objekttyp mit ODER.
Da <FieldGroup> immer innerhalb eines Blocks liegt, lässt sich eine ODER-Verknüpfung
nicht über zwei Objekttypen hinweg formulieren. Ein Ausdruck wie (Dokumentstatus = offen) ODER
(Ordnername = Archiv) ist in einer einzelnen DMSQuery nicht darstellbar und muss auf zwei
Anfragen aufgeteilt werden.
|
5.7. <FieldCondition>
Die zentrale Bedingung für ein Indexfeld.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:string |
— |
Interner Feldname (empfohlen) |
|
xs:string |
— |
Datenbankspaltname |
|
xs:string |
— |
Anzeigename |
|
xs:short |
|
|
|
|
Vergleichsoperator |
|
|
|
Wird vom Server nicht ausgewertet — siehe Warnung unterhalb der Tabelle |
Das Attribut bool_op wird von enaio® 12.0 nicht ausgewertet. Alle Bedingungen
innerhalb eines <ConditionObject>- oder <SubConditions>-Blocks werden unabhängig vom
Attributwert mit UND verknüpft. Eine ODER-Verknüpfung ist ausschließlich über
<FieldGroup operator="OR"> möglich. Das Attribut bleibt im Schema zulässig,
damit bestehende Anfragen weiter validieren.
|
Als Kindelement (Wert der Bedingung) ist genau einer der folgenden Typen anzugeben — bei
BETWEEN, IN und NOT IN sind zwei bzw. mehrere <Value>-Elemente erforderlich:
| Kindelement | Bedeutung |
|---|---|
|
Literaler Vergleichswert |
|
Platzhalterwert (vgl. Platzhalter) |
|
Verweis auf einen deklarierten |
|
Verweis auf den Feldwert eines Felds im Hauptobjekt (für |
|
Prüfung auf NULL (kein Wert) |
|
Interner Spezialwert |
<!-- Gleichheit -->
<FieldCondition internal_name="status" operator="="><Value>approved</Value></FieldCondition>
<!-- Datumsbereich -->
<FieldCondition internal_name="date" operator="BETWEEN">
<Value>2024-01-01</Value>
<Value>2024-12-31</Value>
</FieldCondition>
<!-- Liste von Werten -->
<FieldCondition internal_name="category" operator="IN">
<Value>A</Value>
<Value>B</Value>
<Value>C</Value>
</FieldCondition>
<!-- NULL-Prüfung -->
<FieldCondition internal_name="archived_by" operator="="><NULL/></FieldCondition>
<!-- Aktuell angemeldeter Benutzer -->
<FieldCondition internal_name="owner" operator="=">
<Value special="1">#BENUTZER#</Value>
</FieldCondition>
5.7.1. Platzhalter in Textbedingungen
Ein Vergleich auf einem Textfeld ist ein Mustervergleich, auch mit dem Operator =. Die
Platzhalter von DMSQuery sind:
| Zeichen | Bedeutung |
|---|---|
|
Beliebig viele Zeichen, auch keines |
|
Genau ein Zeichen |
% und _ sind keine Platzhalter. Der Server maskiert sie im Wert, sie werden also
literal gesucht. Wer aus SQL kommt und % als Platzhalter einsetzt, bekommt kommentarlos ein
leeres Ergebnis.
|
Der Operator LIKE verhält sich identisch zu =; den Unterschied macht nicht der Operator,
sondern der Wert. Gemessen an enaio®-Server 12.0.769.25242 über das Attribut sql="1", das
das erzeugte Statement mitliefert:
| Bedingung im DMSQuery | Erzeugtes SQL |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Enthält der Wert keinen Platzhalter und kein zu maskierendes Zeichen, erzeugt der Server ein
einfaches =. Apostrophe im Wert werden korrekt verdoppelt; eine eigene Maskierung durch den
Aufrufer ist weder nötig noch richtig.
5.8. <FieldGroup>
Gruppiert mehrere Bedingungen zu einer logischen Einheit. Ermöglicht verschachtelte AND/OR-Ausdrücke.
| Attribut | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
Ja |
|
Kindelemente: <FieldCondition>, <TableCondition>, Datumsbedingungen, <FieldGroup> (rekursiv).
<!-- (status = "open" OR status = "pending") AND amount >= 500 -->
<ConditionObject type="DOCUMENT" internal_name="invoice">
<FieldGroup operator="OR">
<FieldCondition internal_name="status" operator="="><Value>open</Value></FieldCondition>
<FieldCondition internal_name="status" operator="="><Value>pending</Value></FieldCondition>
</FieldGroup>
<FieldCondition internal_name="amount" operator=">=">
<Value>500</Value>
</FieldCondition>
</ConditionObject>
5.9. <TableCondition>
Bedingung für ein Tabellenfeld (Grid-Control). Jede <TableColumn> entspricht einer Spalte
des Tabellenfelds und trägt dieselben Attribute und Kindelemente wie <FieldCondition>.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:string |
— |
Identifikation des Tabellenfelds |
|
xs:long |
|
Zeilennummer ( |
<!-- Suche nach Rechnungen, die eine Position mit Betrag > 1000 enthalten -->
<TableCondition internal_name="positions">
<TableColumn internal_name="pos_amount" operator=">">
<Value>1000</Value>
</TableColumn>
</TableCondition>
5.10. <ChildObjects>
Nur für HOL-Anfragen. Bestimmt, welche Kinderobjekte hierarchisch mitgeliefert werden.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
|
|
|
|
xs:short |
|
Tiefe der Hierarchie ( |
|
— |
Standard-Feldauswahl für alle Kinder |
Kindelemente: <ChildObjectType> (je ein Element pro anzufragendem Kindtyp) oder <SubObjectType>.
<ChildObjectType> trägt dieselben Identifikationsattribute wie <ObjectType> plus:
- alias — Aliasname für die Trefferliste
- <Fields> — gewünschte Felder
- <SubConditions> — zusätzliche Filterbedingungen für die Kinderobjekte (nur HOL, siehe <SubConditions>)
- <ExternalObjects> — verknüpfte Fremdarchiv-Objekte der Kinder
Das ausgelieferte Hersteller-Schema führt <Fields> in <ChildObjectType> und
<SubObjectType> sowie <ExternalObjects> in <ChildObjectType> und <ParentObjectType> als
Pflichtelemente. Der Server beantwortet Anfragen auch dann, wenn sie fehlen: ohne <Fields> gilt
das field_schema des umschließenden Elements. In der korrigierten Schema-Fassung sind beide
Elemente optional (siehe Abweichungen zwischen Schema und Serververhalten).
|
5.11. <ParentObjects>
Nur für HOL-Anfragen. Liefert den Pfad zu übergeordneten Objekten (Ordner, Register) mit.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
|
Welche Elterntypen zurückgeliefert werden |
|
|
— |
Standard-Feldauswahl für Elternobjekte |
Kindelemente:
- <ParentObjectType>+ — explizite Elterntypen
- <SubObjectType> — das eigentliche Zielobjekt im Pfad
5.11.1. Aufbau der Antwort
Die Antwort enthält kein <ParentObjects>-Element. Der Server dreht die Hierarchie
um und liefert einen gewöhnlichen Baum von oben nach unten: das oberste Elternobjekt steht als
<Object> an der Wurzel, jede weitere Ebene hängt in dessen
<ChildObjects>. Das angefragte Objekt liegt
zuunterst. Eine Auswertung darf also nicht nach <ParentObjects> suchen, sondern muss den
<ChildObjects>-Baum bis zum Blatt durchlaufen.
|
Gemessen an enaio®-Server 12.0.769.25242 mit einer Anfrage auf ein Dokument über Ordner, Register und Unterregister:
<ObjectType internal_name="Folder" type="FOLDER">
<ObjectList><Object id="145151"> <!-- Ordner: oberstes Elternobjekt -->
<ChildObjects>
<ObjectType internal_name="Register" type="REGISTER">
<ObjectList><Object id="145153">
<ChildObjects>
<ObjectType internal_name="Subregister" type="REGISTER">
<ObjectList><Object id="145155">
<ChildObjects>
<ObjectType internal_name="Document" type="DOCUMENT">
<ObjectList><Object id="145156"/></ObjectList> <!-- das angefragte Objekt -->
</ObjectType>
</ChildObjects>
</Object></ObjectList>
</ObjectType>
</ChildObjects>
</Object></ObjectList>
</ObjectType>
</ChildObjects>
</Object></ObjectList>
</ObjectType>
5.12. <ExternalObjects>
Verknüpfte Objekte aus anderen Archiven — ermöglicht archivübergreifende Joins.
Jedes <ExternalArchive> identifiziert ein Fremdarchiv (via archive_ident-Attribute)
und enthält optional ein <ExternalObjectType>-Element, das den fremden Objekttyp
und seine Felder/Bedingungen definiert.
Feldwerte des Hauptobjekts können als Bedingungswerte verwendet werden:
-
Im Hauptobjekt das
<Field>-Element mitlink_name="meinAlias"versehen. -
Im
<ExternalObjectType>die Bedingung mit<LinkedValue ref="meinAlias"/>formulieren.
<ObjectType type="DOCUMENT" internal_name="invoice">
<Fields>
<Field internal_name="customer_id" link_name="cust_ref"/>
</Fields>
<ExternalObjects>
<ExternalArchive internal_name="contacts">
<ExternalObjectType internal_name="company">
<Fields>
<Field internal_name="company_name"/>
</Fields>
<SubConditions>
<FieldCondition internal_name="id" operator="=">
<LinkedValue ref="cust_ref"/>
</FieldCondition>
</SubConditions>
</ExternalObjectType>
</ExternalArchive>
</ExternalObjects>
</ObjectType>
ref verweist auf den mit link_name vergebenen Alias, nicht auf den internen
Namen, den Anzeigenamen oder den Datenbanknamen des Feldes. Fehlt Schritt 1, oder passt der Alias
nicht, lässt sich der Verweis nicht auflösen — der Server meldet das nicht, sondern liefert
einen leeren Fremdarchiv-Block mit total_hits="0" und ein leeres <Messages>. Beide Stufen
müssen also zusammen gesetzt werden.
|
Gemessen an enaio®-Server 12.0.769.25242: mit link_name und passendem ref liefert die
Abfrage das erwartete Fremdobjekt, bei einem nicht vergebenen Alias kommentarlos nichts.
link_name wirkt an Indexfeldern jeden Typs ebenso wie an Systemfeldern (gemessen an
OBJECT_ID). Der Wert wird je Treffer des Hauptobjekts aufgelöst — die Fremdarchiv-Bedingung
wird also für jedes Objekt der Haupttrefferliste einzeln ausgewertet.
Der Aufbau der Antwort ist bei
<ExternalObjects> im DMSContent-Format
beschrieben.
5.13. <SubConditions>
Zusätzliche Filterbedingungen für Kind-, Eltern- und Fremdarchiv-Objekte. Verwendbar in
<ChildObjectType>, <SubObjectType> und <ExternalObjectType>; für Kindobjekte nur in
HOL-Anfragen.
Zulässige Kindelemente:
-
<FieldCondition>— Bedingung auf ein einfaches Feld -
<FieldGroup>— logische Gruppe von Bedingungen (AND/OR), auch verschachtelt -
<TableCondition>— Bedingung auf ein Tabellenfeld -
<Expression>— Ausdruck
<FieldGroup> ist im Inhaltsmodell von <SubConditions> im ausgelieferten
Hersteller-Schema nicht aufgeführt; die korrigierte Fassung ergänzt es. Der Server akzeptiert und
verarbeitet das Element dort einschließlich Verschachtelung. Da bool_op nicht ausgewertet wird, ist <FieldGroup> die einzige Möglichkeit,
Bedingungen für Kindobjekte mit ODER zu verknüpfen. Unbekannte Elemente weist der Server an dieser
Stelle mit -1029 zurück — <FieldGroup> wird also tatsächlich ausgewertet und nicht nur toleriert.
|
<!-- liefert die Register mit Name "A" oder "B" -->
<ChildObjectType type="REGISTER" internal_name="invoice_register">
<Fields field_schema="DEF">
<Field internal_name="name"/>
</Fields>
<SubConditions>
<FieldGroup operator="OR">
<FieldCondition internal_name="name" operator="="><Value>A</Value></FieldCondition>
<FieldCondition internal_name="name" operator="="><Value>B</Value></FieldCondition>
</FieldGroup>
</SubConditions>
</ChildObjectType>
5.14. Basisparameter-Suche
Suche nach Basisparametern (Metadaten) ermöglicht die Filterung ohne Kenntnis der Indexfelder.
5.14.1. <FolderBaseParams> / <RegisterBaseParams>
Suche nach Ordnern oder Registern anhand von Metadaten. Enthält die Kindelemente:
| Element | Beschreibung |
|---|---|
|
Erstellt von (bis zu 2 Werte; implizit OR-verknüpft) |
|
Erstelldatum-Bereich |
|
Zuletzt geändert von |
|
Änderungsdatum-Bereich |
|
Besitzer (immer OR-verknüpft) |
|
Kinderobjekte der gefundenen Elternobjekte anfragen (HOL) |
5.14.2. <DocumentBaseParams>
Wie <FolderBaseParams>, zusätzlich:
| Element | Beschreibung |
|---|---|
|
Filter nach Archivierungsstatus (ein oder mehrere Werte; implizit OR) |
|
Filter nach Checkout-Status |
5.15. <FulltextQuery>
Volltextsuche über alle Dokumente des Archivs.
<FulltextQuery>
<Fulltext MODE="PATTERN">
<Value>Entlassung* AND Müller</Value>
</Fulltext>
</FulltextQuery>
Optionale Steuerattribute (für die RetrievalWare-Volltext-Engine):
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
|
Suchmodus |
|
|
xs:short |
|
Expansionsstufe für Synonyme |
|
xs:boolean |
|
Fuzzy-Suche für halbe Wörter |
|
xs:short |
|
Schwellwert für Fuzzy-Rechtschreibkorrektur |
|
xs:short |
|
Maximale Fuzzy-Alternativen |
|
xs:short |
|
Maximale Regex-Expansionen |
|
xs:short |
|
Limit für Worterweiterungen |
6. Aufzählungstypen
6.1. requesttypes
| Wert | Ergebnis-Format | Beschreibung |
|---|---|---|
|
DMSContent |
Linear Object List — tabellarisches Format |
|
DMSContent |
Hierarchical Object List — vollständige Objektdaten |
|
DMSContent |
Mixed — HOL-Daten + optionale LOL-Daten für Eltern/Kinder |
|
— |
Veraltet — stattdessen |
6.2. field_schema
| Wert | Beschreibung |
|---|---|
|
Standard-Felder gemäß Objekttyp-Konfiguration |
|
Alle Felder des Objekttyps |
|
Alle Felder inklusive relationaler (verknüpfter) Felder |
|
Minimaler Feldsatz (nur ID und Pflichtfelder) |
|
Der Server prüft die Enumeration nicht. Ein unbekannter oder leerer Wert führt weder zu einem
Fehler noch zum dokumentierten Standard
Ein Tippfehler im Attribut bleibt damit unbemerkt: die Abfrage wird teurer und liefert mehr Felder als gewollt, ohne Hinweis. Aufrufer sollten den Wert vor dem Senden selbst prüfen. |
6.3. object_schema
| Wert | Beschreibung |
|---|---|
|
Nur explizit aufgelistete Typen |
|
Alle Objekttypen des Archivs |
|
Nur Registertypen |
|
Nur Dokumenttypen |
6.5. ComparisonOperators
| Operator | Bedeutung |
|---|---|
|
Gleich |
|
Ungleich |
|
Kleiner als |
|
Kleiner oder gleich |
|
Größer als |
|
Größer oder gleich |
|
Wert ist in einer Liste — mehrere |
|
Wert ist nicht in einer Liste |
|
Wert liegt zwischen zwei Grenzen — genau zwei |
|
Wert liegt nicht zwischen zwei Grenzen |
|
Gleich — gleichbedeutend mit |
|
Ungleich — gleichbedeutend mit |
|
Nicht kleiner als — gleichbedeutend mit |
|
Nicht größer als — gleichbedeutend mit |
|
Mustervergleich mit Platzhaltern — verhält sich identisch zu |
Die Operatoren ==, !==, !<, !> und LIKE fehlen im ausgelieferten
Hersteller-Schema, werden vom Server aber unterstützt — er führt sie in der Fehlermeldung zum
Fehlercode -1033 selbst auf; ihre Bedeutung folgt der SQL-Konvention. Operatornamen vergleicht der
Server ohne Beachtung der Groß-/Kleinschreibung (between wirkt wie BETWEEN).
|
6.7. FullTextSearchModeType
| Wert | Bedeutung |
|---|---|
|
Mustererkennung mit Wildcards ( |
|
Boolesche Ausdrücke ( |
|
Konzeptuelle Suche (semantische Ähnlichkeit) |
6.8. Platzhalter (special="1")
Spezialwerte werden in <Value special="1"> eingesetzt und zur Laufzeit durch den Server aufgelöst:
| Platzhalter | Aufgelöster Wert |
|---|---|
|
Anmeldename des aktuellen Benutzers |
|
Besitzer des aktuellen Benutzers |
|
Aktuelles Datum |
|
Ersteller (Anmeldename) |
|
Erstelldatum |
|
Archivar (Anmeldename) |
|
Archivierungsdatum |
|
Rechnername des Clients |
|
IP-Adresse des Clients |
|
GUID des Clients |
7. Vollständige Beispiele
7.1. Mehrstufige Suche mit FieldGroup (OR/AND-Kombination)
Dokumente suchen, die (offen ODER ausstehend) UND Betrag ≥ 500 sind:
<DMSQuery requesttype="LOL" pagesize="50" offset="0" baseparams="0">
<Archive internal_name="accounting">
<ObjectType type="DOCUMENT" internal_name="invoice">
<Fields>
<Field internal_name="invoice_number" sortpos="1" sortorder="DESC"/>
<Field internal_name="date"/>
<Field internal_name="status"/>
<Field internal_name="amount"/>
</Fields>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="invoice">
<FieldGroup operator="OR">
<FieldCondition internal_name="status" operator="=">
<Value>open</Value>
</FieldCondition>
<FieldCondition internal_name="status" operator="=">
<Value>pending</Value>
</FieldCondition>
</FieldGroup>
<FieldCondition internal_name="amount" operator=">=">
<Value>500</Value>
</FieldCondition>
</ConditionObject>
</Conditions>
</ObjectType>
</Archive>
</DMSQuery>
7.2. HOL-Anfrage mit BaseParams und Zugriffsrechten
Alle Dokumente des aktuellen Benutzers aus dem Jahr 2024, mit Basisparametern und Rechten:
<DMSQuery requesttype="HOL" baseparams="1" rights="1" pagesize="20" offset="0">
<Archive internal_name="patient">
<ObjectType type="DOCUMENT" internal_name="medical_letter">
<Fields field_schema="ALL"/>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="medical_letter">
<FieldCondition internal_name="date" operator="BETWEEN">
<Value>2024-01-01</Value>
<Value>2024-12-31</Value>
</FieldCondition>
</ConditionObject>
</Conditions>
</ObjectType>
<DocumentBaseParams>
<Owner operator="=">
<Value special="1">#BENUTZER#</Value>
</Owner>
<ArchiveState>
<ArchiveStateValue>ARCHIVED</ArchiveStateValue>
<ArchiveStateValue>ARCHIVABLE</ArchiveStateValue>
</ArchiveState>
</DocumentBaseParams>
</Archive>
</DMSQuery>
7.3. Suche über Tabellenfeld
Rechnungen mit einer Position über 1.000 €, sortiert nach Rechnungsnummer:
<DMSQuery requesttype="LOL" pagesize="20" offset="0">
<Archive internal_name="accounting">
<ObjectType type="DOCUMENT" internal_name="invoice">
<Fields>
<Field internal_name="invoice_number" sortpos="1" sortorder="ASC"/>
<Field internal_name="date"/>
</Fields>
<Conditions>
<ConditionObject type="DOCUMENT" internal_name="invoice">
<TableCondition internal_name="positions">
<TableColumn internal_name="pos_amount" operator=">">
<Value>1000</Value>
</TableColumn>
</TableCondition>
</ConditionObject>
</Conditions>
</ObjectType>
</Archive>
</DMSQuery>
7.4. Volltextsuche mit Kinderobjekten (HOL)
Volltextsuche im Archiv und hierarchische Rückgabe mit Unterregistern:
<DMSQuery requesttype="HOL" baseparams="0" pagesize="10" offset="0">
<Archive internal_name="patient">
<FulltextQuery>
<ChildObjects child_schema="DEF">
<ChildObjectType type="DOCUMENT" internal_name="medical_letter">
<Fields field_schema="DEF"/>
</ChildObjectType>
</ChildObjects>
<Fulltext MODE="PATTERN">
<Value>Entlassungsbrief*</Value>
</Fulltext>
</FulltextQuery>
</Archive>
</DMSQuery>
8. Abweichungen zwischen Schema und Serververhalten
An den folgenden Stellen beschreibt das vom Hersteller ausgelieferte DMSQuery.xsd etwas anderes,
als der Server tatsächlich verlangt oder auswertet. Gemessen an enaio®-Server 12.0.769.25242.
Die zu dieser Dokumentation gepflegte Schema-Fassung ist an allen genannten Stellen korrigiert
(siehe Korrigierte Schema-Dateien).
| Stelle | Ausgeliefertes Schema | Serververhalten (gemessen) |
|---|---|---|
|
Verknüpfung mit der vorigen Bedingung ( |
Wird nicht ausgewertet; innerhalb eines Blocks gilt immer UND. ODER nur über |
|
Nicht im Inhaltsmodell enthalten |
Wird akzeptiert und ausgewertet, auch verschachtelt — die einzige Möglichkeit, Kindobjekt-Bedingungen mit ODER zu verknüpfen |
Position von |
Vor dem ersten |
Bei falscher Position kein Fehler, sondern stiller Wegfall aller Parameterbedingungen |
|
Nicht deklariert |
Erforderlich — |
|
Pflichtelement |
Optional; ohne Angabe gilt das |
|
Pflichtelement |
Optional |
Elf Operatoren |
Zusätzlich |
|
|
Nicht deklariert |
Wird akzeptiert und ausgewertet; der Server liefert dann je Objekt ein |
Antwort auf |
— |
Enthält kein |
Nicht auflösbares |
— |
Kein Fehler, sondern ein leerer Fremdarchiv-Block mit |
|
Wirkt nur bei LOL |
Wirkt auch bei HOL — der |
|
Gleichheitsvergleich |
Mustervergleich mit |