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

dms.GetResultList

Primärer Recherche-Job — führt die Anfrage aus und liefert Treffer im DMSContent-Format zurück

dms.GetDeletedObjects

Suche im Papierkorb — Anfrage im DMSQuery-Format

dms.AddStoredQuery

Gespeicherte Suche anlegen — speichert eine DMSQuery auf dem Server

dms.UpdateStoredQuery

Gespeicherte Suche aktualisieren — ersetzt eine vorhandene DMSQuery

dms.GetStoredQuery

Gespeicherte Suche abrufen — liefert die gespeicherte DMSQuery zurück

dms.ConvertQuery

Konvertiert eine DMSQuery in ein anderes Anfrageformat (oder umgekehrt)

dms.ExecuteStoredQuery

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

LOL

Linear Object List

Tabellarische Trefferliste (<Rowset> in DMSContent). Standard und performanteste Option.

HOL

Hierarchical Object List

Hierarchische Objektliste (<ObjectList> in DMSContent) mit vollständigen Felddaten, optional mit BaseParams, Rechten, Kind- und Elternobjekten.

MIX

Mixed

HOL-Daten für das angefragte Objekt kombiniert mit LOL-Daten für Eltern und Kinder.

DTL

Detail (veraltet)

Nicht mehr verwenden — stattdessen MIX einsetzen.

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

requesttype

requesttypes

LOL

Anfragetyp: LOL, HOL, MIX oder DTL (veraltet)

pagesize

xs:long

0

Maximale Trefferanzahl pro Antwort (0 = alle)

offset

xs:long

0

0-basierter Startindex für Seitenblättern

maxhits

xs:long

-1

Absolutes Trefferlimit (-1 = kein Limit)

baseparams

xs:short

0

1 = Basisparameter (Ersteller, Datum, Archivstatus …) zurückliefern

variants

xs:short

0

1 = Dokumentvarianten-Informationen zurückliefern (nur HOL)

combined

xs:short

0

1 = Informationen zu kombinierten Dokumenten zurückliefern (nur HOL)

rights

xs:short

0

1 = Zugriffsrechte je Objektinstanz zurückliefern

fileinfo

xs:short

0

1 = Dateiinformationen (MIME-Typ, Größe, Seitenanzahl) zurückliefern

object_inserts

xs:short

0

1 = Erlaubte Kinderobjekt-Typen und -Anzahlen zurückliefern

icons

xs:short

0

1 = Icon-ID je Objekt zurückliefern

remarks

xs:short

0

1 = Notizen je Objekt als <Remarks>-Element zurückliefern (nur HOL)

sql

xs:short

0

1 = Ausgeführtes SQL-Statement als <SQL>-Block in das Ergebnisdokument schreiben. Wirkt bei LOL und HOL

5.1.2. Suchverhalten

Attribut Typ Standard Beschreibung

disablesearchgroups

xs:short

1

1 = Suchgruppen deaktivieren; 0 = Suchgruppen des Benutzers anwenden

narrowsearch

xs:short

0

0 (broad) = Bei Registerklauseln werden auch Objekte direkt unterhalb der Ordnerebene zurückgeliefert.
1 (narrow) = Nur Objekte in den explizit angegebenen Registern.

registercontext

xs:short

0

0 = Registerklauseln werden bei HOL ignoriert; nur Objekte in Registern werden angefragt

status

xs:short

0

Statusfilter für Objekte (reserviert)

outputformat

xs:short

—

Numerischer Ausgabeformatcode (ergänzend zu requesttype)

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

<Value>Wert</Value>

Fester Standardwert

<NULL/>

Parameter ist leer (NULL)

<LinkedValue ref="link_name"/>

Wert wird zur Laufzeit aus dem Feld mit dem angegebenen link_name übernommen

<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

id

xs:long

0

Numerische Archiv-ID

name

xs:string

—

Anzeigename

internal_name

xs:string

—

Interner Name (empfohlen)

osguid

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

type

objecttypes

—

FOLDER, REGISTER oder DOCUMENT (zur Disambiguierung bei gleichem Namen empfohlen)

id

xs:long

0

Numerische ID des Objekttyps

name

xs:string

—

Anzeigename

internal_name

xs:string

—

Interner Name (empfohlen)

osguid

xs:string

—

GUID

table

xs:string

—

Datenbanktabellenname

alias

xs:string

—

Aliasname, der in der Trefferliste erscheint (schnellerer Zugriff bei mehreren Objekttypen)

Kindelemente:

Element Zweck

<Fields> (optional)

Welche Felder im Ergebnis erscheinen sollen

<Conditions> (optional)

Filterbedingungen — welche Objekte zurückgeliefert werden

<ChildObjects> (optional, nur HOL)

Kinderobjekte, die hierarchisch mitgeliefert werden sollen

<ParentObjects> (optional, nur HOL)

Elternpfad (Ordner/Register), der mitgeliefert werden soll

<ExternalObjects> (optional)

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

field_schema

field_schema

DEF

Vorauswahl der zurückzugebenden Felder (überschreibbar durch einzelne <Field>-Elemente)

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

name

xs:string

—

Anzeigename des Felds

internal_name

xs:string

—

Interner Name (empfohlen)

dbname

xs:string

—

Datenbankspaltname

osguid

xs:string

—

GUID

system

xs:short

0

1 = Systemfeld (z. B. OBJECT_ID, folder_id)

sortpos

xs:long

0

Sortierposition im Ergebnis (0 = keine Sortierung, 1 = primäres Sortierfeld, …)

sortorder

xs:string

—

Sortierrichtung: ASC (aufsteigend) oder DESC (absteigend)

link_name

xs:string

—

Aliasname für den Feldwert — ermöglicht Nutzung als Bedingungswert in <ExternalObjectType> via <LinkedValue ref="link_name">

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:

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.6.2. Variante 2 — Direktabruf nach ID (<ObjectID>)

<Conditions>
  <ObjectID>9823</ObjectID>
  <ObjectID>9824</ObjectID>
</Conditions>

5.7. <FieldCondition>

Die zentrale Bedingung für ein Indexfeld.

Attribut Typ Standard Beschreibung

internal_name

xs:string

—

Interner Feldname (empfohlen)

dbname

xs:string

—

Datenbankspaltname

name

xs:string

—

Anzeigename

system

xs:short

0

1 = Systemfeld

operator

ComparisonOperators

=

Vergleichsoperator

bool_op

BooleanOperators

AND

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

<Value>text</Value>

Literaler Vergleichswert

<Value special="1">#BENUTZER#</Value>

Platzhalterwert (vgl. Platzhalter)

<ParamValue ref="paramname"/>

Verweis auf einen deklarierten <Param>-Parameter

<LinkedValue ref="link_name"/>

Verweis auf den Feldwert eines Felds im Hauptobjekt (für <ExternalObjectType>)

<NULL/>

Prüfung auf NULL (kein Wert)

<SpecialValue>text</SpecialValue>

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

= mit abcdef

d.feld2 = 'abcdef'

= mit abc*def

d.feld2 LIKE 'abc%def'

= mit abc?def

d.feld2 LIKE 'abc_def'

= mit abc%def

d.feld2 LIKE 'abc\%def'

= mit abc_def

d.feld2 LIKE 'abc\_def'

LIKE mit abc*def

d.feld2 LIKE 'abc%def'

!= mit abc*def

d.feld2 NOT LIKE 'abc%def'

= mit O’Brien

d.feld2 = 'O''Brien'

= auf einem Zahlenfeld

d.zahl3 = 42

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

operator

BooleanOperators

Ja

AND oder OR — verbindet alle Elemente innerhalb der Gruppe

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

name / internal_name / dbname

xs:string

—

Identifikation des Tabellenfelds

row

xs:long

0

Zeilennummer (0 = beliebige Zeile)

<!-- 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

child_schema

object_schema

DEF

DEF = nur explizit aufgelistete Typen; ALL = alle Objekttypen des Archivs

export_depth

xs:short

0

Tiefe der Hierarchie (0 = eine Ebene, 1 = zwei Ebenen, …)

field_schema

field_schema

—

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

parent_schema

object_schema

DEF

Welche Elterntypen zurückgeliefert werden

field_schema

field_schema

—

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:

  1. Im Hauptobjekt das <Field>-Element mit link_name="meinAlias" versehen.

  2. 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:

<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

<Creator><Value>name</Value></Creator>

Erstellt von (bis zu 2 Werte; implizit OR-verknüpft)

<Created><From>datum</From><To>datum</To></Created>

Erstelldatum-Bereich

<Modifier><Value>name</Value>…</Modifier>

Zuletzt geändert von

<Modified><From>datum</From><To>datum</To></Modified>

Änderungsdatum-Bereich

<Owner operator="=" bool_op="OR"><Value>name</Value>…</Owner>

Besitzer (immer OR-verknüpft)

<ChildObjects>…</ChildObjects>

Kinderobjekte der gefundenen Elternobjekte anfragen (HOL)

5.14.2. <DocumentBaseParams>

Wie <FolderBaseParams>, zusätzlich:

Element Beschreibung

<ArchiveState><ArchiveStateValue>ARCHIVED</ArchiveStateValue></ArchiveState>

Filter nach Archivierungsstatus (ein oder mehrere Werte; implizit OR)

<Locked><LockStateValue>UNLOCKED</LockStateValue></Locked>

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

MODE

FullTextSearchModeType

PATTERN

Suchmodus

EXPANSION_LEVEL_PROPERTY

xs:short

4

Expansionsstufe für Synonyme

FUZZY_SPELL_HALF_WORDS

xs:boolean

false

Fuzzy-Suche für halbe Wörter

FUZZY_SPELL_THRESHOLD

xs:short

0

Schwellwert für Fuzzy-Rechtschreibkorrektur

MAX_FUZZY_SPELL_PROPERTY

xs:short

15

Maximale Fuzzy-Alternativen

MAX_REG_EXPR_PROPERTY

xs:short

4

Maximale Regex-Expansionen

WORD_EXPANSION_LIMIT_PROPERTY

xs:short

20

Limit für Worterweiterungen

6. Aufzählungstypen

6.1. requesttypes

Wert Ergebnis-Format Beschreibung

LOL

DMSContent <Rowset>

Linear Object List — tabellarisches Format

HOL

DMSContent <ObjectList>

Hierarchical Object List — vollständige Objektdaten

MIX

DMSContent <ObjectList>

Mixed — HOL-Daten + optionale LOL-Daten für Eltern/Kinder

DTL

—

Veraltet — stattdessen MIX verwenden

6.2. field_schema

Wert Beschreibung

DEF

Standard-Felder gemäß Objekttyp-Konfiguration

ALL

Alle Felder des Objekttyps

ALLREL

Alle Felder inklusive relationaler (verknüpfter) Felder

MIN

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 DEF, sondern wird stillschweigend wie ALL behandelt. Gemessen an enaio®-Server 12.0.769.25242 an einem Objekttyp mit elf Indexfeldern:

field_schema Zurückgegebene Spalten

MIN

0

DEF

0

ALL

11

GIBTESNICHT

11

leerer Wert

11

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

DEF

Nur explizit aufgelistete Typen

ALL

Alle Objekttypen des Archivs

REGISTER

Nur Registertypen

DOCUMENTS

Nur Dokumenttypen

6.4. objecttypes

Wert Bedeutung

FOLDER

Ordner

REGISTER

Register

DOCUMENT

Dokument

6.5. ComparisonOperators

Operator Bedeutung

=

Gleich

<> / !=

Ungleich

<

Kleiner als

<=

Kleiner oder gleich

>

Größer als

>=

Größer oder gleich

IN

Wert ist in einer Liste — mehrere <Value>-Elemente angeben

NOT IN

Wert ist nicht in einer Liste

BETWEEN

Wert liegt zwischen zwei Grenzen — genau zwei <Value>-Elemente angeben

NOT BETWEEN

Wert liegt nicht zwischen zwei Grenzen

==

Gleich — gleichbedeutend mit =

!==

Ungleich — gleichbedeutend mit <>

!<

Nicht kleiner als — gleichbedeutend mit >=

!>

Nicht größer als — gleichbedeutend mit <=

LIKE

Mustervergleich mit Platzhaltern — verhält sich identisch zu =, siehe Platzhalter in Textbedingungen

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.6. BooleanOperators

Wert Bedeutung

AND

Verknüpfung mit UND (Standard)

OR

Verknüpfung mit ODER

6.7. FullTextSearchModeType

Wert Bedeutung

PATTERN

Mustererkennung mit Wildcards (*, ?)

BOOLEAN

Boolesche Ausdrücke (AND, OR, NOT)

CONCEPT

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

BENUTZER

Anmeldename des aktuellen Benutzers

BESITZER

Besitzer des aktuellen Benutzers

DATUM

Aktuelles Datum

ANLEGER

Ersteller (Anmeldename)

ANLEGEDATUM

Erstelldatum

ARCHIVAR

Archivar (Anmeldename)

ARCHIVIERUNGSDATUM

Archivierungsdatum

COMPUTER-NAME

Rechnername des Clients

COMPUTER-IP

IP-Adresse des Clients

COMPUTER-GUID

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)

bool_op an <FieldCondition>

Verknüpfung mit der vorigen Bedingung (AND/OR)

Wird nicht ausgewertet; innerhalb eines Blocks gilt immer UND. ODER nur über <FieldGroup>.

<FieldGroup> in <SubConditions>

Nicht im Inhaltsmodell enthalten

Wird akzeptiert und ausgewertet, auch verschachtelt — die einzige Möglichkeit, Kindobjekt-Bedingungen mit ODER zu verknüpfen

Position von <Params>

Vor dem ersten <Archive>

Bei falscher Position kein Fehler, sondern stiller Wegfall aller Parameterbedingungen

name an <Param>

Nicht deklariert

Erforderlich — <ParamValue ref="…"/> verweist darauf

<Fields> in <ChildObjectType> / <SubObjectType>

Pflichtelement

Optional; ohne Angabe gilt das field_schema des umschließenden Elements

<ExternalObjects> in <ChildObjectType> / <ParentObjectType>

Pflichtelement

Optional

ComparisonOperators

Elf Operatoren

Zusätzlich ==, !==, !<, !> und LIKE; Operatornamen werden ohne Beachtung der Groß-/Kleinschreibung verglichen

remarks an <DMSQuery>

Nicht deklariert

Wird akzeptiert und ausgewertet; der Server liefert dann je Objekt ein <Remarks>-Element

Antwort auf <ParentObjects>

—

Enthält kein <ParentObjects>; die Hierarchie kommt umgekehrt als <ChildObjects>-Baum zurück

Nicht auflösbares <LinkedValue ref="…"/>

—

Kein Fehler, sondern ein leerer Fremdarchiv-Block mit total_hits="0" und leerem <Messages>

sql an <DMSQuery>

Wirkt nur bei LOL

Wirkt auch bei HOL — der <SQL>-Block kommt je <ObjectType>

= auf einem Textfeld

Gleichheitsvergleich

Mustervergleich mit * und ?; identisch zu LIKE, siehe Platzhalter in Textbedingungen