Zur Homepage www.HI-Tier.de ADIS-Abfragen
Zurück Home Nach oben
Öffentlicher Bereich für Entwickler

 

Inhalt

Abfragen in ADIS bestehen im wesentlichen aus zwei Teilen:

bulletNormale Abfragen gemäß ADIS-Spezifikation
bulletFunktionelle Abfragen in ADIS-Schreibweise für HIT
bulletAllgemeine Anmerkungen

horizontal rule

Normale Abfragen gemäß ADIS-Spezifikation

Eine Abfrage in ADIS hat etwa folgendes Format:

Ein oder mehrere Search-Zeilen (mit S beginnend)

S<Status><Ereignis-Nr.>(<DDI-Nr.><Feldlänge><Auflösung><Niedrigster Wert><Höchster Wert>)<Max. Anzahl von Aufzeichnungen><CR><LF>

und abgeschlossen mit einer Retrieve-Zeile (mit R beginnend)

R<Status><Ereignis-Nr.>(<DDI-Nr.><Feldlänge><Auflösung>)<CR><LF>

Bezogen auf das HIT ist die Ereignis-Nr. die Meldung, die beim HIT gemacht wird, also z.B. für GEBURT die 882080 (6stellig). Die DDI-Nr. ist ein zur Ereignis-Nr. zugeordnetes Element, das 8stellig ist (ggf. mit 0en vorne auffüllen). Feldlänge ist 2stellig und die Auflösung (Anzahl Nachkommastellen) ist 1stellig. Die Werte Niedrigster Wert und Höchster Wert grenzen die Abfrage der DDI auf diese Werte ein. Intern werden alle DDI einer Search-Zeile und sämtliche Search-Zeilen selbst mit UND verknüpft. Die Retrieve-Zeile gibt die Elemente einer Ereignis-Nr. an, die zurückgegeben werden sollen.

Beispiel:

SN882080009000530801900010119991001000100
SN88208000820054150276090000000001276090000000001000100
RN8820800090008015000900053080

Aus der Tabelle GEBURT (882080) sollen alle GEB_DATR (900053) zwischen dem 1.1.1900 (19000101) und dem 1.10.1999 (19991001) ermittelt werden, die höchstens 100 Zeilen liefern soll (erste SN-Zeile).

Zusätzlich soll die Suche in der Tabelle GEBURT (882080) auf die BNR15 (820054) auf 276090000000001 und 276090000000001 eingegrenzt werden,die auch höchstens 100 Zeilen liefern soll (zweite SN-Zeile).

Die Retrieve-Zeile gibt an, daß aus der Tabelle GEBURT (882080) die Spalten LOM (900080) und GEB_DATR (900053) zurückgegeben werden sollen.

Die Antwort sieht dann etwa so aus:

DN8820800090008015000900053080
VN88208027600091234567619990926
VN88208027600090000000219990926
VN88208027600091234560119990926
VN88208027609123456780119990926
VN88208027609123456780419990926
VN88208027609123456780719990926
VN88208027609123456780919990926
VN88208027609123456780219990926
VN88208027609123456780319990926
VN88208027600091234567919990929
VN88208027600211234567819990926
VN88208027600211234567719990929
VN88208027600211234566619990930
VN88208027600211234566719990929
VN88208027600091234565419990929
VN88208027600091234565519990929
VN88208027600099874569619990930
VN88208027600099876544519991001

Die DN-Zeile gibt genau die Spalten an, die in der RN-Zeile spezifiert wurden. Darunter folgen hier im Beispiel 18 Ergebnisse der Abfrage in VN-Zeilen.

 

Funktionelle Abfragen in ADIS-Schreibweise für HIT

Das HIT-Protokoll läßt neben den normalen Abfragen mit der HIT-QueryLanguage auch funktionelle Abfragen zu. Die normalen Abfragen werden lediglich fast 1:1 in SQL-Syntax umgesetzt. Die funktionellen Abfragen enthalten Funktionen mit Parametern, die in die HIT-QL eingebettet werden. Es werden drei Arten von Funktionen angeboten:

bulletInline-Funktionen (mit $ beginnend)

Diese erzeugen eine eigene Spalte in einer Abfrage:

$COUNT Anzahl Zeilen
$COUNTF Zeilenzähler mit Feld gefüllt (&quot;not&nbsp;NULL&quot;)
$COUNTD Anzahl verschiedener ("distinct") Werte im Feld
$MIN Minimum-Wert
$MAX Maximum-Wert
$AVG Durchschnittswert
$SUM Numerische Summe
$ALPHALOM Alpha-Darstellung von Ohrmarken
$ALPHABNR Gegliederte Darstellung von Betriebsnummern

Diese Art von Funktionen wird vom HitBatch im Zusammenhang mit ADIS nicht unterstützt. Mehr hierzu siehe Anmerkungen.

 

bulletNewline-Funktionen (mit # beginnend)

Diese erzeugen neue Zeilen in einer Abfrage:

#TIEREIN liefert Tiereingang und Vorbesitzer
#TIERAUS liefert Tierausgang und Nachbesitzer
#TIERSTAMM liefert Tierstammdaten
#TIERENDE liefert Tierende-Daten
#BESTREG liefert ein Bestandsregister zu einem Zeitraum
#ADDRPOST liefert Postanschrift zm Betrieb
#ADDRHOF liefert Hofanschrift zum Betrieb
#ETIKETT liefert Etikettierungsdaten

Newline-Funktionen werden von ADIS unterstützt, siehe Beispiel.

 

bulletMixline-Funktionen (mit ! beginnend)

Diese Funktionen liefern je nach vorliegenden Daten andere Antwortzeilen zurück:

!ORGDATEN liefert Originaldatensatz zum Fehlervorgang
!BEWMELD liefert alle Meldungen zur LOM in einem Zeitraum

Diese Art von Funktionen kann wegen der unterschiedlichen Antwortsätze, deren Aufbau wir in der Anfrage angeben müßten, nicht implementiert werden. Mehr hierzu siehe Anmerkungen.

 

Diese Funktionen wurden als Entitäten in HIT definiert, damit man sie in ADIS einsetzen kann. Gemäß der ADIS-Definition lassen sich funktionale Abfragen nicht anwenden. Sie lassen sich jedoch durch eine Kombination von mehreren Abfrage-Blöcken aufbauen, die jeweils aus Search- und Retrieve-Zeilen bestehen. Die Inline- und Newline-Funktionen können mit diesem Schema erstellt werden. Der HitBatch muß dann nur die Aufgabe übernehmen, diese mehrfachen Search-Retrieve-Blöcke zu einer HIT-Anweisung zusammenzufassen. Für die Mixline-Funktionen gibt es wegen der unterschiedlichen Ausgabeentitäten keine Möglichkeit, dies in ADIS anzugeben, da der HitBatch die Information benötigt, welche Spalten er wie aufbereiten muß, wenn der HitServer eine Antwort schickt. Die einzige Möglichkeit hier wäre die Angabe aller möglichen Entitäten samt ihrer Felder in den Retrieve-Zeilen, aber da nur eine Retrieve-Zeile pro Abfragefunktion möglich ist, scheitert auch dies.

Das Grundprinzip der ADIS-Abfragen: Der erste Search-Retrieve-Block definiert die Meldung, auf die die Abfrage zugreifen soll. Die Retrieve-Zeile enthält dann NUR die Spalten, die normal ohne Funktion ausgegeben werden sollen. In weiteren Search-Retrieve-Blöcken folgen jeweils die einzelnen Funktionen mit ihren Parametern. Als Ende-Kennung wird die Terminate-Zeile (TN) verwendet, d.h. zwischen den zusammenhändenden Search-Retrieve-Blöcken darf dann keine TN-Zeile auftauchen. Ein Search-Retrieve-Block besitzt dabei folgenden Aufbau:
- SN <Funktion> (<Input-Feld> <Feldlänge> <Auflösung> <Input-Wert oder ?> <?>) 000000
- hier weitere SN-Zeilen mit ein oder mehreren Funktionen
- RN <Funktion> (<Output-Feld> <Feldlänge> <Auflösung>)
In () eingeschlosse Terme können ein oder mehrfach auftreten.

Im folgenden nun ein Beispiel zur Umsetzung von Hit-Anweisungen mit funktionalen Abfragen.

Beispiel:

bulletHit-Beispiel für Newline-Funktion:

Beginnen wir mit einem ADIS-Beispiel:

SN 882081 00820054 15 0 276090000000001 276090000000001 000100
RN 882081 00820054 15 0 00900080 15 0 00820034 08 0
RN 003101 00001127 15 0 00800603 30 0
RN 003103 00001989 20 0 00001988 20 0
TN

Dies definiert die Tabelle ZUGANG (882081) als Abfragetabelle, die alle BNR15 (820054) zwischen 276090000000001 und 276090000000001 (d.h. zur BNR15 276090000000001) ermitteln und die BNR15 (820054), die LOM (900080) und ZUGA_DAT (820034) zurückgeben soll. Das zweite RN ermittelt den Vorbesitzer der ermittelten Tiere über die Entität #TIEREIN (3101) mit den Feldern BNR15_VB (1127) und NAME (800603). Da die SN-Zeile fehlt, werden alle Zeilen der vorherigen Abfrage angenommen. Der dritte Block (hier auch nur eine RN-Zeile ohne vorherige SN-Zeile) fragt schließlich den #TIERSTAM (3103) ab, von dem wir nur LOM_X(1989) und LOM_MUTX(1988) des #BESTREG (3106) erhalten wollen. Diese gesamte Abfrage ermittelt also zu allen zugegangenen Tieren die BNR und ZUGA_DAT, dazu den Vorbesitzer und schließlich noch die Ohrmarken in einem bestimmten Zeitraum. Nochmals der Hinweis: Zwischen den RN-Zeilen darf kein TN stehen, da dieses das Ende einer kombinierten Abfrage darstellt.

Der für Hit aufbereitete Befehl sieht dann so aus:

*n:RS/R100:882081/820054;900080;820034;3101(*/1127;800603);3103(*/1989;1988):820054;EQ;276090000000001

Diese Abfrage wird 3 Antwortblöcke liefern: der erste liefert BNR15 und ZUGA_DAT, deren BNR15 gleich 276090000000001 ist. Der zweite liefert die Tiereingangsdaten der Vorbesitzer zu den in Block 1 ermittelten Tierdaten, Block 3 liefert aus dem Tierstamm für die in Block 1 ermittelten BNR15 die Ohrmarke und die Mutterohrmarke in alphanumerischer Form.

Zu beachten ist, daß nicht erst alle BNR15 aus Teil 1, dann alle Tiereingangsdaten aus Teil 2 und schließlich alle Tierstammdaten aus Teil 3 ausgegeben werden. Es werden zu jeder gefundenen BNR15 aus Teil 1 nacheinander die Funktionen #TIEREIN und #TIERSTAM ausgeführt und wenn diese Ergebnisse liefern, direkt hinter der dazugehörigen BNR15 ausgegeben.

Eine ADIS-Antwort (ohne Header etc.) sieht etwa so aus:

DN 882081 00820054 15 0 00900080 15 0 00820034 08 0
VN 882081 276090000000001 276000700000017 20000111
TN
DN 003101 00001127 15 0 00800603 30 0
VN 003101 276070000000002 Name-2
TN
DN 003103 00001989 20 0 00001988 20 0
VN 003103 DE 07 000 00017 DE 11 987 65432
TN
DN 882081 00820054 15 0 00900080 15 0 00820034 08 0
VN 882081 276090000000001 276000762993094 19991025
VN 882081 276090000000001 276000767755675 20000204
VN 882081 276090000000001 276000777878787 20000204
VN 882081 276090000000001 276000912345678 20000207
TN
DN 003103 00001989 20 0 00001988 20 0
VN 003103 DE 09 123 45678 DE 09 876 54321
TN
DN 882081 00820054 15 0 00900080 15 0 00820034 08 0
VN 882081 276090000000001 276001400092197 20000202
VN 882081 276090000000001 276001400115298 20000202
VN 882081 276090000000001 276001400140307 20000127
VN 882081 276090000000001 276001400140373 20000127
...
Der erste Antwortblock enthält die erste BNR15, die der gegebenen Bedingung genügt.

Von dieser ersten BNR15 wird im zweiten Block #TIEREIN ausgegeben.

Auch von dieser ersten BNR15 wird im dritten Block #TIERSTAM ausgegeben.

Block 4 gibt vier BNR15 aus. Die ersten drei dieser BNR15 haben keinen #TIEREIN, jedoch hat die vierte BNR15 wieder eine Ausgabe bei einer Funktion.

Block 5 zeigt nur den #TIERSTAM der letzten BNR15 aus Block 4 an. Ein #TIEREIN gibt es hier nicht.

Block 6 setzt wieder die BNR15-Liste fort.

Ein Einleseprogramm müßte die #TIEREIN- und #TIERSTAM-Ergebnisse den übergeordneten BNR15 zuordnen.

Allgemeine Anmerkungen

bullet

Bis heute sind fast alle Funktionen im HitServer implementiert worden. Alle Inline-Funktionen und die meisten Newline-Funktionen stehen bereits zur Verfügung.

bullet

Damit eine Antwort im ADIS-Format generiert werden kann, MUß die Anfrage selbst auch in ADIS geschrieben worden sein. Eine normale HIT-Anfrage kann keine ADIS-Antwort liefern, da notwendige Dateninformationen fehlen.

bullet

Es macht keinen Sinn, mehrere Abfragen pro Set zu definieren. Sie erhalten sonst eine Ausgabedatei mit aneinandergereihten Daten, die möglicherweise nicht zusammengehören. Zudem erschwert das ADIS-Format ein 'Fortsetzen' einer Ausgabedatei, da grundsätzlich beim Schließen der Datei die Befehle 'EN' und 'ZN' geschrieben werden müssen. Alles danach nachträglich angehängte wird nach ADIS-Definition nicht mehr betrachtet und somit auch die Antworten von weiteren ADIS-Abfragen innerhalb eines Set. Selbst wenn Sie manuell die dazwischenstehenden 'EN' und 'ZN' entfernen, Sie können nicht erkennen, welche Daten zu welcher Abfrage gehören. Genauso verhält es sich bei den 'normalen' CSV-Abfragen.

bullet

Um dennoch Inline- und Mixline-Funktionen verwenden zu können, ist folgender Weg denkbar: Anfrage in CSV stellen und die Antworten im CSV-Format per Zusatzprogramm ins ADIS-Format umwandeln lassen.

Zurück zum Anfang