Zur Homepage www.HI-Tier.de HIT-QL
Zurück Home Nach oben Weiter
Öffentlicher Bereich für Entwickler

 

Allgemeines

Kontext

Die HIT-QL (Query-Language) ist die formale Beschreibung einer einfachen Datenbankabfragesprache. Sie ist inhaltlich stark an die Abfragesprache für Relationale Datenbanksysteme SQL ("structured query language") angelehnt. Es geht dabei um das Holen von Daten aus tabellenartigen Strukturen durch Auswahl der gewünschten Tabelle oder Meldungsart (Entität), Auswahl oder Einschränkung der gewünschten Spalten (Feldliste) und Einschränken der Datenzeilen durch Suchbedingungen sowie ggf. Sortieren und Gruppieren des Ergebnisses und Ermitteln abgeleiteter Werte wie Zeilenzahl oder Min/Max-Werte. Der Zugriff auf die verschiedenen Entitäten sowie Daten innerhalb der Tabellen wird durch die Kompetenz des Abfragenden beschränkt.

Die Kommunikation zwischen beliebigen HIT-Clients und einem HIT-Server erfolgt über eine geregelte Befehls/Antwortfolge im sog. HIT-Protokoll (HITP). Im Rahmen des HITP kann der Client im Abfrage-Befehl (RETRIEVE) die HIT-QL benutzen um Daten anzufordern. Der Server liefert daraufhin die entsprechenden selektierten Sätze als Ergebnisantwort im HIT-Protokoll an den Client zurück.

Man muss grundsätzlich zwischen der abstrakten Formulierung der HIT-QL, z.B. wie werden Objekte, Feldlisten, Bedingungen usw. formuliert oder Funktionen benutzt und der konkreten Ausprägung im Rahmen der VVVO-Rinderkennzeichnung (HIT im engeren Sinn), also z.B. welche Entitäten bzw. in diesem Fall HIT-Meldungen stehen zur Abfrage bereit oder welche Funktionen liefern VVVO-speziefische Ergebnisse wie Bestandsregister, Tierstammdaten usw.

Stichpunkte und Verweise

bulletkonkrete Ausführungen für das HIT-Projekt siehe HIT-Abfragen
bulletViele, aber nicht alle Entitäten unterstützen Historisierung und Zeitpunktabfragen, siehe Felder FELDVON und FELDBIS in der Meldungsbeschreibung. Damit sind sogenannte Delta-Transfers möglich, d.h. es werden nur Sätze übertragen die seit der letzten Übertragung neu oder verändert sind, siehe auch QL-Delta - DELTA-Transfer.
bulletSie können nur Datensätze abrufen, für die der gerade angemeldete Betrieb unmittelbar Kompetenz hat. Unternehmen die direkt für ihre Betriebsstätten oder Gesamt-Bevollmächtigte die für ihren Vollmachtsgeber einen RETRIEVE absetzen wollen, müssen eine Mandanten-Anmeldung ausführen. Melde-Vollmacht berechtigt nicht zur Abfrage. Siehe auch Abschnitt über Vertretung und Vollmacht.
bulletWenn Entitäten eine Kompetenz-Einschränkung auf Betriebsnummernbereiche haben (siehe Feld FELDBNR in der Meldungsbeschreibung) wird entsprechend dem Kompetenzbereich (E=Eigen, L=Land, A=Alle) die interne Where-Bedingung automatisch erweitert. Sie erhalten keine Fehlermeldung beim Versuch auf andere Sätze zuzugreifen, sondern nur keine oder weiniger Daten.

Ergebnisaufbau

bulletsimple - uniforme Sätze, CSV geeignet
bulletsemi-complex - Sätze mit verschiedenen Objektlisten
bulletcomplex - XML und XML-QL (zur Zeit nicht realisiert), siehe http://www.w3.org/TR/NOTE-xml-ql/

Abfrage-Typen

simple

bulletDaten-Meldungen: Geburt, Markierung, Nachkennzeichnung, EU-Einfuhr, Import, ... , BETRD ... PRAEM , VOK
SELECT a,b,c FROM m WHERE x AND/OR y ORDER z
bulletSysterm-Meldungen: Aktionen, Codesets, ... , Meldungen
bulletView-Meldungen: Joins als vorgefertigte View mit eigenem Namen und nicht als QL-Syntaxelement
bulletdoppelte Spaltennamen werden in Viewdefinition aufgelöst, Tabellenqualifier sind unnötig
bulletJoinbedingungen werden fest vorgegeben und können nicht vergessen werden
bulletDatenbereiche sind bezüglich Kompetenz besser überwachbar

semi-complex

bullethat Ähnlichkeiten mit einem UNION, z.B. Rind-Lebenslauf mit Geburt,Abgang,Zugang,Schlachtung...
bulletSpaltenauswahl problematisch
bulletentweder nur "<Objekt>/*" zulassen und betreffende der jeweiligen Entität ausgeben
bulletoder bei Spaltenauswahl "Select *" ausführen und dann nur gegebene übertragen
bulletalle Spalten aller Teil-Entitäten vereinigen, nicht existierende leer, NULL-Values mit %-- ausgeben ??

complex

bulletnicht realisiert

Befehls- und Antwortsyntax

Befehlsaufbau (Erweiterungen für Query Language)

Syntax und Bestandteile

Token Definition Bemerkung
<Befehl> <Einleitung>:<Aktion>:<Objekt>:<Queryelemente> 4 Haupt-Elemente, mit Doppelpunkt getrennt
<Einleitung> analog zu HITP-Allgemein siehe HITP-Spezifikation
<Aktion> <Aktions-Code><Stückelung>[/<Sub-Liste>]  
<Aktions-Code> R R (=Retrieve)
<Stückelung> S S (=Satz)
<Sub-Liste> <Sub-Code>[;<Sub-Liste>]   Hinweis *1) ein oder mehrere Subcodes mit Semikolon getrennt
<Sub-Code>  I | D | H | M | N | R<n> | Z<n> | ... I (=Inklusive) | D (=Delta) | H (=Histo) | M (=Modified) | N (=Neue) | R (=Rows) | Z (=Zeitstempel)
<Objekt> [<Meldung>][/<Feldliste>|<*>] siehe HITP-Spezifikation
<Feldliste> <Feldname>|<Funktion>[;<Feldliste>] ein Feld oder eine Funktion, bzw. mehrere Semikolon getrennte Felder, bestimme Funktionen dürfen nur am Ende der Liste stehen
<Feldname> BNR15 | PIN | ... komplette Liste je nach Meldung, siehe Meldungselemente
<*> * (Stern) * (Stern) an Stelle der Feldliste bedeutet alle Felder
<Funktion> <Fkt-Name>(<Input>[/<Output>]) Funktionsname mit Klammern, Input-Parametern und ggf. mit Schrägstrich getrennt Outputliste, nähere Erläuterungen unter HIT-Abfragefunktionen
<Fkt-Name> <Fkt-Typ><Fkt-Basename> Typkenner und Basisname der Funktion
<Fkt-Typ>  $ (Dollar) | # (Hash) | ! (Rufzeichen) $ (=Inline-Funktion) | # (=Newline-Funktion) | ! (=Mixtline-Funktion)
<Fkt-Basename> COUNT | MIN | ALPHALOM | TIEREIN | ORGDATEN | ... Erläuterung zu den einzelnen Funktionen, siehe HIT-Abfragefunktione#Funktionen
<Input>  * | <Inputliste> die Standardparameter werden i.d.R. durch Stern angegeben
<Inputliste> <Inputfeldname>|<Konstante>[;<Inputliste>] die Inputparameter können aus Feldnamen und Konstanten bestehen
<Output> * | <Outputliste> Stern für alle Outputfelder oder konkrete Angabe der Feldnamen als Liste
<Outputliste> <Outputfeldname>[;<Outputliste>] ein oder mehrere Feldnamen mit Semikolon getrennt
<Queryelemente> <Bedingungsliste>[;<Sortierung>|<Gruppierung>|<Kommentar>] Bestandteile der Abfrage
<Bedingungsliste> <Bedingungselement>[;<Verknüpfung>;<Bedingungsliste>] eine Abfragebedingung oder mit Semikolon und Verknüpfungsoperator verbunden mehrere Abfragebedingungen.

In der Bedingungsliste ist auch eine einfache Verwendung von Klammern erlaubt, siehe Klammerung *3).

<Bedingungselement> <Feldname>;<Operator>;<Vergleichsliste>  
<Feldname> BNR15 | LOM | ... Feld je nach abzufragender Datenstruktur
<Operator> EQ | = | GT | > | IN | ... Vergleichsoperator (siehe Operator-Liste)
<Vergleichsliste> <Feldinhalt>|<Konstantenliste> je nach Operator ein, zwei oder mehrere Angaben mit Inhalt eines Feldes oder Konstanten
<Feldinhalt> [<Feldname>] , z.B.  [BNR15]   Hinweis *2) Feldname einer Tabellenspalte in eckigen Klammern. Die Klammer sind nötig um einen Spalteninhalt von einer String-Konstanten unterscheiden zu können.
<Konstantenliste> <Konstante>[;<Konstante>] ein bzw. mehrere Semikolon getrennte Konstanten
<Konstante> <Zahl>|<String>|<Datum>|<Zeit>|<TS> Typ der Konstante muss dem Typ des zu vergleichenden Feldes entsprechen
<Zahl> z.B. 100 oder 123.78 oder -1 Zahl mit Ziffern, Vorzeichen und Dezimalpunkt
<String> z.B. Meier Text ohne jegliche Hochkommas, Sonderzeichen sind hex-quoted
<Datum> T.M.J deutsches Format, mit T=1 oder 01...31, M=1 oder 01...12, J=1 oder 01...99 bzw, 1900...2100
<Zeit> H.N[.S] deutsches Format, mit H=0 oder 00...23, N=0 oder 00...59, S=0 oder 0=...99
<Timestamp> T.M.J/H.N[.S.X] deutsches Format, mit X=0 oder 000000...999999
<Verknüpfung> AND | OR | NAND | NOR logische Verknüpfung zwischen den Bedingungen (siehe Verknüpfungs-Liste)
<Sortierung> ORDER;<Sortliste> Schlüsselwort 'ORDER' gefolgt von Sortierelementen
<Sortliste> <Sortelement>[;<Sortliste>][;<Sortfolge>] ein oder mehrere Angaben mit Semikolon getrennt
<Sortelement> <Feldname>|<Feldnummer> Name oder Nummer des zu sortierenden Feldes
<Sortfolge> + | - Sortierfolge '+' (Plus) ist aufsteigend (default) oder '-' (Minus) absteigend
<Gruppierung> GROUP;<Gruppenliste>[;<Havingclause>] Schlüsselwort 'GROUP' gefolgt von Sortierelementen, optional gefolgt von Having-Bedingung
<Gruppenliste> <Gruppenelement>[;<Gruppenliste>] ein oder mehrere Angaben mit Semikolon getrennt
<Gruppenelement> <Feldname>|<Funktion> Name des zu gruppierenden Feldes oder Name einer gruppierbaren Inline-Funktion. Gruppierbar sind skalare Funktionen wie z.B: $YEAR, $BNRLAND, nicht verwendbar sind Aggrgatsfunktionen wie $MAX, $AVG
<Havingclause> HAVING;<Havingliste>  
<Havingliste> <Havingelement>[;<Operator>;<Havingelement>] Where-Bedingung für GROUP-Ergebnis
<Havingelement> <Gruppenelement>;<Operator>;<Wert>|<Gruppenelement> Name eines Feldes oder einer Funktion aus dem GROUP wird vergleichen mit konstantem Wert oder anderem Gruppenelement
<Kommentar> --;<Kommentarliste> Schlüsselwort '--' gefolgt von beliebig vielen Elementen, die ignoriert werden
<Kommentarliste> <Kommentarelement>[;<Kommentarliste>] ein oder mehrere Angaben mit Semikolon getrennt
<Kommentarelement> beliebiger Text Text ohne jegliche Hochkommas, Sonderzeichen sind hex-quoted

Hinweise:

*1) Es sind nur bestimmte sinnvolle Kombinationen erlaubt. Delta (/D/M/H/N) und zugleich Zeitpunkt-Abfragen (/Z...) sind unvereinbar

*2) Eckige Klammern "[..]" bezeichnen oben i.d.R. optionale Elemente. Nur beim Token Feldinhalt sind die eckigen Klammer wirklicher Bestandteil der Schreibweise in der Syntax, also z.B. "BNR15P;=;[BNR15C]"

*3) Runde Klammern "(" und ")" sind in der Bedingungsliste als separate  Elemente zur Änderung der AND/OR-Vorrangigkeit erlaubt. Sie sind analog zum SQL-Standard zu setzten und werden nur rudimentär syntaktisch überprüft. Klammerung sollte sparsam verwendet werden, da das entstehende SQL-Statement oft zum Durchsuchen der ganzen Tabelle mit sehr schlechter Performance führt:

Beispiel: 
*1:RS:BTR_T/*:(;BNR15;EQ;276090000000015;OR;BNR15;EQ;276090000000011;);AND;TYP_BETR;NE;0
*2:RS:BTR_D/BNR15;$COUNT(/Anzahl);$MIN(STR_NR);$MAX(STR_NR):BNR15;IS;01;GROUP;BNR15;HAVING;$COUNT();>;1;AND;$MIN(STR_NR);NE;$MAX(STR_NR)

Operator-Liste

Operator Vergleichsziel oder Definition Beschreibung entspricht
EQ <Feldinhalt>|<Konstante> = EQUAL gleich

=

EQX <Feldinhalt>|<Konstante>   EQUAL EXTENDED gleich, case insensitiv  
NE <Feldinhalt>|<Konstante> ^= NOT EQUAL nicht gleich ^=
NEX <Feldinhalt>|<Konstante>   NOT EQX nicht gleich, case insensitiv  
LT <Feldinhalt>|<Konstante> < LESS TO kleiner als <
LE <Feldinhalt>|<Konstante> <= LESS EQUAL kleiner gleich <=
GT <Feldinhalt>|<Konstante> > GREATER TO größer als >
GE <Feldinhalt>|<Konstante> >= GREAT EQUAL größer gleich >=
IN <Konstantenliste> IN IN in nachfolgender Liste IN ( x , y , z )
NI <Konstantenliste> NOT IN NOT IN nicht in Liste NOT IN ( x , y , z )
BW <Konstante>;<Konstante> BETWEEN BETWEEN zwischen x und y BETWEEN x AND y
NB <Konstante>;<Konstante> NOT BETWEEN NOT BETWEEN nicht zwischen NOT BETWEEN
LI <Konstante> mit Wildcard "%25" LIKE LIKE gleich mit Wildcard/Joker  
LIX <Konstante> mit Wildcard "%25" LIKEX LIKE EXTENDED gleich mit Wildcard/Joker, case insensitiv  
NL <Konstante> mit Wildcard "%25" NOT LIKE NOT LIKE nicht gleich mit Wildcard/Joker  
NLX <Konstante> mit Wildcard "%25" NOT LIKEX NOT LIKE EXTENDED nicht gleich mit Wildcard/Joker, case insensitiv  
IS <erweiterte Vergleichsbedingung> * Kontext spezifisch in der Vergleichsbedingung können Werte, Listen und erweiterte Bereiche angegeben werden, darunter auch Landkreisbereichskürzel und KFZ-Kennzeichen. Genaue Beschreibung siehe bei "erweiterte Vergleichsbedingung".  
NIS <erweiterte Vergleichsbedingung>   Kontext spezifisch Negation zur gesamten IS-Bedingung, also "NOT IS"  
WI <Feldname>;<Konstante>;<Konstante> WITHIN Kontext spezifisch im Intervall um einen anderen Feldwert herum. Genaue Beschreibung siehe bei "Within-Operator".  
NW <Feldname>;<Konstante>;<Konstante> NOT WITHIN Kontext spezifisch Nicht im Intervall um einen anderen Feldwert herum  

Verknüpfungs-Liste

Operator Definition Beschreibung
AND logisches UND und zugleich
OR logisches ODER oder
NAND logisches UND NICHT und nicht
NOR logisches ODER NICHT oder nicht

Schematische Darstellung

*<Nr>:<Aktions-Code><Stückelung>/<Sub-Code>:<Meldung>/<Feldliste>:<Bedingungsliste>                    

Sub-Codes (speziell für Aktion RETRIEVE)

Token Definition Bemerkung
I INCLUSIVE Normalerweise werden bei Tabellen, die Historisierung unterstützen, nur aktuelle Sätze angezeigt (BIS-Timestamp offen, bzw. 31.12.2100). Mit dem Subcode I erhält man alle Sätze, inklusive der Stornierten.
D
D<n>
D<ts>
DELTA "Delta" im engeren Sinn überträgt alle geänderten aber noch aktuellen Daten seit der letzten gleichartigen RETRIEVE-Aktion eines angemeldeten Benutzers. Nach Erzeugen der Abfrage, wird in den System-Protokoll-Tabellen RETRIEVE und RETRCOND überprüft, ob und wann der angemeldete Betrieb diese Abfrage das letzte mal ausgeführt hat. Wenn die Entität Timestamp-Abfragen unterstützt erhält werden nur Datensätze deren Änderungs-Zeitstempel neuer als der Zeitpunkt der letzten Ausführung ist zurückgegeben. Nach erfolgreicher Transfer wird der Zeitstempel (Timestamp) des Übertragungsbeginns in die Tabelle RETRIEVE abgespeichert, so dass bei dem nächsten Delta auf die selbe Entität dort automatisch wieder aufgesetzt wird. Bei diesem Subcode wird der Ausführungszeitpunkt abgespeichert. Die Varianten /D<n> siehe Hinweis *1) und  /D<ts> siehe Hinweis *2).
H
H<n>
H<ts>
HISTO analog DELTA, aber nicht nur aktuelle sondern auch historisierete Sätze, weitere Erläuterungen siehe QL-Delta, ebenso wie bei DELTA wird der Timestamp der Ausführung dieser konkreten Querybedingung für den Benutzer abgespeichert. Nachfolgende /D, /H, /M, /N des selben angemeldeten Benutzers mit exakt der selben Bedingung greifen wieder auf diesen gespeicherten Wert zurück und übertragen alle Änderungen ab diesem Zeitpunkt. Bei diesem Subcode wird der Ausführungszeitpunkt abgespeichert. Die Variante /H<n> siehe Hinweis *1).
M
M<n>
M<ts>
MODIFIED "Modified" funktioniert analog zu Delta, schreibt aber den Ausführungszeitpunkt nicht weg. Und kann so als Test für Delta dienen. Bei diesem Subcode wird der Ausführungszeitpunkt nicht abgespeichert. Die Variante /M<n> siehe Hinweis *1).
N
N<n>
N<ts>
NEUE analog MODIFIED, aber nicht nur aktuelle sondern auch historisierete Sätze, weitere Erläuterungen siehe QL-Delta. Bei diesem Subcode wird der Ausführungszeitpunkt nicht abgespeichert. Die Variante /N<n> siehe Hinweis *1).
B
B<TS>
BASIS Basis für Delta setzen, d.h. eine Bedingung mit aktuellem Timestamp als Ausgangsbasis für nachfolgende Delta-Transfers setzen ohne die Daten jetzt wirklich zu übertragen.
R<n> ROWS begrenze Anzahl der übertragenen Ergebnis-Zeilen ("Rows") auf <n>, z.B: /R100 ("Mengenbegrenzung"). Diese einfache Form unterscheidet nicht zwischen Datenzeilen einer Entität und Funktionszeilen. Da der Abfrageprozess die Grenze intern nur bei Sätzen der Führungsentität prüft kann es vorkommen, dass mehr als die angegebene Anzahl von Datenzeilen geliefert wird. Wenn die Grenze gerade mitten in der Funktionsausgabe liegt werden noch alle Sätze der Funktion geliefert, z.B:  "RS/R1:BTR_D/#BESTREG(...):BNR15;=;.." liefert immer das ganze Register zum ersten Stammsatz, aber falls mehrere Betriebsstammsätze existieren bricht die Ausgabe dann ab.
R<+n> ersten F.ROWS begrenze Anzahl der übertragenen Ergebnis-Zeilen bei "/R<+n>" auf exakt die ersten n Rows (egal ob aus Führungsentität oder Funktionszeilen).
R<+n>;<#..> ersten F.ROWS begrenze Anzahl der übertragenen Ergebnis-Zeilen bei "/R<+n>;#RONLYF=1" auf exakt die ersten n der Führungsentität (alle Funktionszeilen ggf. zusätzlich).
R<-n> letzten F.ROWS begrenze Anzahl der übertragenen Ergebnis-Zeilen bei "/R<-n>" auf exakt die letzten n Rows (egal ob aus Führungsentität oder Funktionszeilen).
R<-n>;<#..> letzten F.ROWS begrenze Anzahl der übertragenen Ergebnis-Zeilen bei "/R<-n>;#RONLYF=1" auf exakt die letzten n der Führungsentität (alle Funktionszeilen ggf. zusätzlich).
Z<TS> TIMESTAMP Zeitpunktabfrage mit Angabe eines Timestamps i.d.F. T.M.J/H.N[.S[.X]] (siehe Timestamp-Format ) zur Abfrage von Werten die genau zu diesem Zeitpunkt aktuell und gültig waren.
F
F<TS>
FACHZEITPUNKT Abfrage nur fachlich aktueller Datensätze (/F) bzw. zu einem konkreten fachlichen Zeitpunkt (/F<ts>) mit Angabe eines Timestamps i.d.F. T.M.J/H.N[.S[.X]] (siehe Timestamp-Format ) zur Abfrage von Werten die genau zu diesem Zeitpunkt fachlich gültig waren. (vorausgesetzt, die Entity beinhaltet fachliche Historisierung)
C DISTINCT Bewirkt einen "SELECT DISTINCT ..." in der Datenbank, d.h. Sätze die bezüglich der explizit und implizit ausgewählten Spalten völlig identisch sind werden nur einmal ausgegeben. Implizite Argumente sind die Standardparameter in der Abfrage verwendeter Funktionen. Bei größeren Datenmengen ist eine Geschwindigkeitseinbuße bei einer Abfrage hinzunehmen und sollte daher nur mit Bedacht verwendet werden. Der Distinct eliminiert keine doppelte Sätze die von Abfragefunktionen herrühren.
Q<a> QUOTA Zufallsauswahl auf die mit <a> als Anteil zu übertragende Quote. Der Anteil <a> ist als Dezimalzahl von 1.0 bis 0.0 anzugeben, z.B. /Q0.05 (entspricht 5%) und gibt an welcher zufällige Anteil der Ausgabesätze einer Abfrage übertragen werden soll. Die Ergebnismenge wird durch ein Monte-Carlo Zufallsauswahlverfahren auf den angegebenen Anteil beschränkt.
W<s> WIEDERHOLBAR Wenn eine Zufallsauswahl mit /Q.. gewünscht, wird normalerweise immer ein und derselbe feste Startwert "Random-Seed" für den Zufallsgenerator verwendet. Damit sind die Muster gleich und reproduzierbar. Wenn für mehrere Zufallsreihen verschiedene Seeds verwendet werden sollen, können diese mit /W<s> bei s >0 bis s <=999999999999999 gewählt werden, also z.B. /W12345 oder auch /W0917712345678 (in Form einer Betriebsnummer). Wenn definitiv eine nicht reproduzierbare Folge gewünscht ist, muss der Seed explizit mit 0 also /W0 angegeben werden.
G
G<m>
GESICHERT Über die gesendeten Daten wird eine Prüfsumme gebildet und als zusätzlicher Hinweisantwort ausgegeben. Zur Unterscheidung zukünftig geplanter verschiedener Methoden dient <m> , z.Zt. ist Default m=1. Die Prüfmethoden werden in Kürze offen gelegt, so dass Client-Programm die Unversehrtheit der Daten prüfen können. Gegen böswilligen Manipulationen ist aber eine gesicherte Verbindung notwendig.
Y
Y<m>
QUERYMODE Für die Optimierung zeitaufwendiger Abfragen kann der Subcode Y helfen. Je nach Anwendung werden intern die DB-Abfragen mit Konstanten oder in parametrisierter Form aufgebaut und abgesetzt. Folgende Modi <m> gibt es:

0 = nie Konstante, immer Parameter bei Kompetenz und Userparameter
1 = keine Konstante, sondern Parameter bei Kompetenz, Konstante bei Userparameter
2 = Konstante bei Kompetenz, Parameter bei Userparameter
3 = Konstante bei Kompetenz und bei Userparameter

Die Anwendung dieses Subcodes ist IMMER mit der Zentralen Datenbank abzustimmen!!!

T TROTZDEM analog zur satzweisen Übertragung
S SICHER analog zur satzweisen Übertragung
J JUNK liefere leeren Dummy-Datensatz wenn keine Daten gefunden

Spezielle Erläuterungen zu diesen Sub-Codes siehe QL-Delta - DELTA-Transfer

Hinweis *1) : Für diese Subcodes gibt es noch eine Variante mit Angabe eine Generationenangabe <n> wenn nicht auf dem letzten sondern einem früheren abgespeicherten Delta-Ausführungs-Timestamp aufgesetzt werden soll. Dabei bedeutet /x1 eine Generation, /x2 zwei Generationen vor dem letzten Delta.

Hinweis *2) : Bei verschiedenen Subcodes (siehe /) kann auch direkt ein Timestamp angegeben werden, der dann anstelle des in der RETRIEVE-Tabelle gespeicherten verwendet wird.

Mit Hit-Server Version 12, Stand 20.01.2000 dürfen mehrere Subcodes als Semikolon separierte Liste angegeben werden, also z.B.  "RS/Z1.1.2000;R100" - Zeitpunktabfrage mit Mengenbegrenzer.

Antwortaufbau

Der Antwortaufbau ist prinzipiell analog zu Antworten für Meldungen, siehe HIT-Protokoll#Antwortaufbau.

Alle Datenzeilen werden als einzelne Antwortzeilen mit der Schwere -1 übermittelt. Damit sind sie von echten Antworten unterscheidbar. Als letzte Antwort kommt eine echte Antwort mit der Schwere 1 und einem Hinweis auf die Anzahl übertragener Sätze wenn alle Sätze korrekt gesendet wurden oder eine oder ggf. auch mehrere Antworten mit Schwere > 1 und entsprechenden Fehlermeldungen wenn es zu Problemen bei der Ausführung des RETRIEVE-Befehls gekommen ist.

Neben dem Hinweis auf die Anzahl übertragener Sätze wird das erzeugte SQL-Statement zur Dokumentation und Fehleranalyse mit ausgegeben. Wir behalten uns vor dieses Feature in Zukunft ggf. ab zu schalten.

Die Datensätze sind als Teilantworten mit dem Kenner % und der laufenden Nummer als Antwortteilnummmer gekennzeichnet. Die letzte Antwort mit der Abschlussmeldung ist wie üblich mit dem Kenner = versehen.

Beispiele

Einfache Abfragen

C:  *1:RS/D:GEBURT/*:                    
C:  *1:RS:GEBURT/LOM:BNR15;BW;276090000000000;276090000000000                    
C:  *1:RS:GEBURT/LOM;BNR15:RASSE;IN;1;2;3;5;19;68                    
C:  *1:RS:BETRD/*:NACHNAME;=;[VORNAME]                    
C:  *1:RS/Z01.01.1999:GEBURT/*:                    

Fehlerhafte Befehle

C:  *1:RF:GEBURT:27609123456789
S:  =1:3/3001:GEBURT/*:Syntax - Falscher Befehl // Nicht akzeptierbarer Fehler
                    
C:  *1:RS:GEBURT/LOM:BNR15;BW;276090000000000
S:  =1:3/3002:GEBURT/BNR15:Vergleichsziel unvollständig
                    

Satzweise Abfrage mit Ergebnis-Antwort

C:  *2:RS/D:GEBURT/*:        // satzweises, nur Delta
S:  %2%1:-1/0:GEBURT/LOM;BNR;RASSE:276000912345678;276091234567890;12
S:  %2%2:-1/0::276000912345699;276091234567899;4
S:  ...
S:  %2%670:-1/0::276000912345688;276091234567888;9
S:  =2%671:1/121:GEBURT:"Anzahl Datenzeilen - 670";"Select ..."                    

 

C:  *2:RS:GEBURT/LOM;BNR;RASSE:MEHRLING;EQ;1;AND;RASSE;BW;1;99;ORDER;BNR;+
S:  %2%1:-1/0:GEBURT/LOM;BNR;RASSE:276000912345678;276091234567890;12
S:  %2%2:-1/0::276000912345699;276091234567899;4
S:  ...
S:  %2%670:-1/0::276000912345688;276091234567888;9
S:  =2%671:1/121:GEBURTLOM;BNR;RASSE:"Anzahl Datenzeilen - 670";"Select ..."                    

 

C:  *2:RS:RIND/*:GETDAT_R;EQ;01.01.1998    // semi-komplex ??
S:  %2%1:-1/0:RIND/LOM:276000912345678
S:  %2%1:-1/0:GEBURT/LOM;BNR;RASSE:276000912345678;276091234567890;12
S:  %2%1:-1/0:ABGANG/LOM;BNR;ABG_DAT:276000912345678;276091234567890;31.04.1998
S:  %2%1:-1/0:ZUGANG/LOM;BNR;ZUG_DAT:276000912345678;276091234561111;31.04.1998
S:  %2%1:-1/0:TOD/LOM;BNR;TOD_DAT:276000912345678;276091234567890;31.12.1998
S:  %2%1:-1/0:RIND/LOM:276000912349999
S:  ...
S:  %2%1:-1/0:TOD/LOM;BNR;TOD_DAT:276000912349999;276091234567777;20.02.1998
S:  =2%671:1/121:RIND:"Anzahl Datenzeilen - 670";"Select ..."                    

Semi-complexe Abfrage mittels Abfrage-Funktionen

C:  *2:RS/D:GEBURT/*:        // satzweises, nur Delta
S:  %2%1:-1/0:GEBURT/LOM;BNR;RASSE:276000912345678;276091234567890;12
S:  %2%2:-1/0::276000912345699;276091234567899;4
S:  ...
S:  %2%670:-1/0::276000912345688;276091234567888;9
S:  =2%671:1/121:GEBURT:"Anzahl Datenzeilen - 670";"Select ..."                    

vereinfachte Abfragesyntax - "lazy QL"

Seit August 2019 in Erprobung - können HIT-QL-Abfragen auch ohne Semikolon geschrieben werden, also  BNR15 = 90000000001 and TYP_BETR BW 1 99 ORDER 1 2 4

Dabei sind folgende Regeln zu beachteten

bulletDie Trennung von Feldnamen, Operatoren und Operanden (Vergleichswerte) muss klar erkennbar sein
bulletdurch Leerzeichen, z.B.  BNR15 IS AC+
bulletoder wenn Operatoren mit den Zeichen =, !=, >, < verwendet werden, z.B.  BNR15=090000000001
bulletwenn innerhalb von Vergleichswerten spezielle Zeichen wie Leerzeichen, Operatorzeichen oder Hochkommas (einfache wie ' oder doppelte wie " ) verwendet werden sollen, muss der Vergleichswert in Hochkommas eingeschlossen werden
bulletdoppelte Hochkommas werden beim Übersetzen in die originale HIT-QL erhalten, also  SETNAME = "Bundesland"  ->  SETNAME;=;"Bundesland"
bulleteinfache Hochkommas werden beim Übersetzen in die originale HIT-QL verworfen, also  SETNAME = 'Bundesland'  ->  SETNAME;=;Bundesland
bulletHochkommas als Zeichen in Zeichenketten, die in identischen Hochkommas eingeschlossen sind, müssen verdoppelt werden,
also  SETNAME = "B""land"  ->  SETNAME;=;"B""land"  
und  SETNAME = 'B''land'  ->  SETNAME;=;B'land
bulletBeim Vergleich eines Feldnamen mit einem anderen Feld - laut strikter HIT-QL  BNR15_C;=;[BNR15_P]  darf auch vereinfacht geschrieben werden   BNR15_C = BNR15_P ,
außer es besteht Verwechslungsmöglichkeit mit dem Kürzel eines Codesets wie bei  RASSE = SBT  , dann wie früher RASSE != [RASSE_MUT]

FAQ - frequently asked questions

bulletFrage: Worauf bezieht sich Where-Clause in semi-komplexer Abfrage: GEBURT.RASSE  or RASSE egal in welcher Meldung
Antwort: Where-Bedingungen werden nur für die Führungsentität unterstützt. Ein Filtern der Funktionsergebnisse ist nur lokal möglich.
bulletFrage: Bei einer Query muss der Typ der Felder bekannt sein. Wenn erst im Server entschieden würde, könnten insbesondere in der Where-Clause Feldnamen und String-Konstanten nicht unterschiedenen werden. Wie kann die Erkennung am einfachste stattfinden?
Antwort: Client kennzeichnet die Spalten mittels [xx] und setzt String nicht in Hochkommas, der Server kennt die Datentypen und bereitet die Vergleichswerte richtig auf.
bulletFrage: Wie kann eine Abfrage mit "Datenstand" zu einem bestimmten Stichtag bzw. Zeitpunkt erfolgen?
Antwort: Subcode RS/Z<timestamp>
bulletFrage: Kennzeichnen von Daten und Status-Antwort
Antwort: Schwere -1 oder >= 0
bulletFrage: Keine Bedingung nur Sortierung ...
Antwort: kein führendes Semikolon
bulletFrage: Werden leere Elemente ;; ignoriert?
Antwort: Ein einzelnes leeres Element ist ein Befehl ohne Bedingung, leere Elemente innerhalb der Bedingungselemente ist syntaktisch falsch und führt zu einem Fehler, außer als Vergleichswert bei Stringfelder.
bulletFrage: Wie werden NULL-Values im RETRIEVE gehandhabt?
Antwort: Bei echt optionalen Feldern kann NULL in der Form %-- als Vergleichswert bei einem "EQ" (EQUAL) oder "NE" (NOT EQUAL) verwendet werden. Es wird entsprechen als "IS NULL" bzw. "IS NOT NULL" ins SQL übernommen.

Erweiterte Vergleichsbedingung für "IS" - Operator

Kurzdarstellung

bulletDie komplexen Abfragen haben die Form: "<Feldname>;IS;<Komplexe Vergleichsbedingung>", z.B:  "BNR15;IS;09177, 09164".
bulletDie Vergleichsbedingung kann aus einem Wert, einer Abkürzung oder einem Bereich bestehen oder mittels Komma getrennt eine Liste von vorgenannten beinhalten.
bulletBereiche können differenziert (auch mittels Schlüsselwörter wie "ab", "bis", "größer") angeben ob es sich um einseitige oder zweiseitige Beschränkungen handelt und ob Unter- bzw. Obergrenze enthalten sein sollen.
bulletFür Betriebsnummernbereiche existieren einfache Einschränkungsmöglichkeiten über Kreisnummern und KFZ-Kennzeichen.

verschiedene Beispiele

Komplex Strenge LOM BNR DEC (x,0) DEC (x,y) INT / LONG CODE DATE TIME TIMESTAMP CHAR / VCHAR HITP
single strict 276000912345678 276091234567890 123 123.45 123 12 01.12.2010 12:17 31.12.16.23.59 "'Meier" COL;EQ;Wert
  lazy … DE 09 123 45678 09 123 456 7890 123. 123,45   SBT 1.12.2010 (unklar) (unklar) Meier  
        123,       01.12.10        
list                       COL;IN;Wert;Wert..
range   DEaaa - DEzzz 09 123 456 7890 - 09 123 456 7890 123 - 199 123.45 - 199.99 123 - 199 123 - 199 1.12.2010 - 31.12.2010       COL;BW;Wert;Wert
      09 123 456 123. - 199. 123,45 - 199,99   SBT - RBT          
      09 123 123, - 199,                
      09                  

Betriebsbereiche

Kreis, Kurzschreibweise 09 162
Gemeinde, Kurzschreibweise 09 178 148
Kreis-Liste 09 162, 09 184
KFZ Kennzeichen für Landkreis LA
KFZ Kennzeichen mit Erweiterung
zur Anzeige Landkreis + Zuständigkeit
oder einschließlich alter Kreise bei Gebietsreform
UN+

Verweise:

bulletListe der KFZ Kennzeichen Kürzel, siehe Codeset KURZ_KFZ
bulletListe der Landkreise für Kürzel, siehe Codeset LKR

Erweitere Bereichsangaben

Intention Schreibweise bei String bei Zahlen bei BNR mathematisch HITP
Range, inklusive Untergrenze, ohne Obergrenze ab X ab "Meier" ab 123.45 ab 09 123 456 7890 [ x - MAX ] Feld;GE;X
  ab einschließlich Y          
   >= X >= "Meier"       Feld;>=;X
Range, exklusive Untergrenze, ohne Obergrenze größer X größer "Meier" größer 123.45 größer 09 123 456 7890 ] x - MAX ] Feld;GT;X
  ab größer X         Feld;>;X
   > X          
Range, ohne Untergrenze, inklusive Obergrenze bis Y bis "Meier" bis 123.45 bis 09 123 456 7890 [ MIN - y ] Feld;LE;Y
  bis einschließlich Y          
   <= Y         Feld;<=;Y
Range, ohne Untergrenze, exklusive Obergrenze kleiner Y kleiner "Meier" kleiner 123.45 kleiner 09 123 456 7890 [ MIN - y [ Feld;LT;Y
  bis kleiner Y         Feld;<;Y
   < Y          
Range, inklusive Untergrenze, inklusive Obergrenze ab X bis Y       [ x - y ] Feld;GE;X;AND;Feld;LE;Y
   >= X <= Y         Feld;>=;x;AND;Feld;<=;Y
  X bis Y         Feld;BW;X;Y
  X - Y          
Range, inklusive Untergrenze, exklusive Obergrenze ab X bis kleiner Y       [ x - y [ Feld;GE;X;AND;Feld;LT;Y
   >= X < Y         Feld;>=;x;AND;Feld;<;Y
  X bis kleiner Y          
  ab X kleiner Y          
Range, exklusive Untergrenze, inklusive Obergrenze größer X bis y       ] x - y ] Feld;GT;X;AND;Feld;LE;Y
  ab größer X bis y         Feld;>;x;AND;Feld;<=;Y
   > X <= Y          
Range, exklusive Untergrenze, exklusive Obergrenze größer X bis kleiner y       ] x - y [ Feld;GT;X;AND;Feld;LT;Y
  größer X kleiner  y         Feld;>;x;AND;Feld;<;Y
  ab größer X kleiner  y          
   > X < Y          

System-Variablen

Variable Beschreibung Inhaltsbeispiel
$bnr$ Betriebsnummer des angemeldeten Betriebs 276059151230008
$staat_land_kreis$ Staat, Land und Kreis zum angemeldeten Betrieb 27605915
$staat_land$ Staat und Land zum angemeldeten Betrieb 27605
$land_kreis$ Land und Kreis zum angemeldeten Betrieb 05915
$kreis$ Kreis (ohne Land) 915
$staat$ Staat (numerisch, i.d.R. 276) 276
$kfz+$ Erweiterter Landkreis (Zuständigkeitsbereich) über KFZ - Kennzeichen mit Kenner Plus UN+
$kfz$ Einfacher Landkreis über KFZ - Kennzeichen HAM
$heute$ aktueller Tag als Datum 21.11.2016
$heute_jetzt_ms$ Aktueller Zeitpunkt mit Datum, Uhrzeit und Mikrosekunden 21.11.2016/17.40.20.104
$heute_jetzt$ Aktueller Zeitpunkt mit Datum und Uhrzeit 21.11.2016/17.40.20
$jetzt_ms$ Aktuelle Zeit mit Uhrzeit und Mikrosekunden 17.40.20.104
$jetzt$ Aktuelle Zeit mit Uhrzeit 17.40.20
$gestern$ Vortag als Datum 20.11.2016
$vorgestern$ Vor-Vortag als Datum 19.11.2016
$morgen$ Nächster Tag als Datum 22.11.2016
$heuer$ Aktuelles Jahr 2016

Within-Operator

Syntax und Semantik

<Feld>:WITHIN;<Feldname>;<Untergrenze>;<Obergrenze>  - Suche wo Wert von "Feld" im Intervall Wert von "Vergleichsfeld" + Untergrenze bis "Vergleichsfeld" + Obergrenzegrenze

Die Grenzewerte gehören zum Interwall, es entspricht also: Where X between Y + UG and Y + OG

Bestandteile

Token Definition Bemerkung
<Within-Konstrukt> <WI-Operator>:<Feldname>:<Untergrenze>:<Obergrenze> Operator mit Vergleichsfeld und 2 Vergleichswerten als Untergrenze und Obergrenze
<WI-Operator> WI | WITHIN | NW | NOT WITHIN Operator-Name
<Feldname> MELD_DAT | SCHL_LEB | ... Feldname für Vergleichsfeld mit kompatiblen Typ. Kompatibel sind untereinander Zahlenformate und Datum/Zeitformate
<Untergrenze> <Konstante> Operator-Name
<Konstante> <Zahl>|<Intervallkürzel>|<Intervall> Typ der Konstante muss dem Typ des zu vergleichenden Feldes entsprechen
<Zahl> z.B. 100 oder 123.78 oder -1 Zahl mit Ziffern, Vorzeichen und Dezimalpunkt
<Intervallkürzel> <Ganzzahl><Einheit> minus oder plus x Jahre, Monate, Tage, Stunden, Minuten, Sekunden
<Ganzzahl> Zahl Ganzzahl ohne Dezimalteil, ggf. mit Vorzeichen + oder -
<Einheit> Y | J
M
D | T
N
H
S
Years / Jahre
Months / Monate
Days / Tage
Hours / Stunden
Minutes
Seconds
<Intervall> +/-x years +/-x mons +/-x days +/-x hour +/-x min +/-x sec Vollständiges Intervall gemäß Postgre-Spezifikation, mit Leerzeichen!
z.B. +1 years -2 mons 3 days;+1 years -2 month +3 day -4 hour +5 min +6.78 sec

Beispiele

*2:RS/Y3:SCHLACHTUN/SCHL_LEB;SCHL_GEW;$SUBTRACT(SCHL_LEB;SCHL_GEW/DIFF):BNR15;IS;09 000 000 0004;AND;SCHL_GEW;WITHIN;SCHL_LEB;-10;+0

Suche Schlachtungen mit Schlachtgewicht im Bereich von Lebendgewicht - 10 bis Lebendgewicht, also wo Unterschied <= 10 kg

*2:RS/C;R10;Y3:SCHLACHTUN/SCHL_DAT;MELD_DAT;$DATE_DIFF(SCHL_DAT;MELD_DAT/Differenz);$MELD_FRST(SCHL_DAT/MELD_FRST):BNR15;IS;09 000 000 0004;AND;SCHL_DAT;WITHIN;MELD_DAT;-7;-2;ORDER;1;2
*3:RS/C;R10;Y3:SCHLACHTUN/SCHL_DAT;MELD_DAT;$DATE_DIFF(SCHL_DAT;MELD_DAT/Differenz);$MELD_FRST(SCHL_DAT/MELD_FRST):BNR15;IS;09 000 000 0004;AND;MELD_DAT;WITHIN;SCHL_DAT;2;7;ORDER;1;2

Suche Schlachtungen mit Schlachtdatum im Bereich von Meldedatum - 7 bis Meldedatum - 2, also Meldefrist zwischen 2 - 7 Tagen
oder analog mit Meldedatum im Bereich Schlachtdatum +2 bis Schlachtdatum +7

*2:RS/Y3:SCHLACHTUN/$COUNT():SYS_VON;NW;SYS_BIS;+1 years -2 mons 3 days;+1 years -2 month +3 day -4 hour +5 min +6.78 sec

Suche Schlachtungen mit ganz speziellen Intervall für SYS_VON vs. SYS_BIS

Spezialfälle

Zusätzliche Sub-Codes (speziell für Aktion RETRIEVE)

siehe jetzt HIT-Protokoll / Subcodes / Spezialfälle

Zum Seitenanfang


© 1999-2021 Bay.StMELF, verantwortlich für die Durchführung sind die  Stellen der Länder , fachliche Leitung ZDB: Frau Dr. Kaja.Kokott@hi-tier.de, Technik: Helmut.Hartmann@hi-tier.de
Seite zuletzt bearbeitet: 03. November 2021 16:34, Anbieterinformation: Impressum - Datenschutz - Barrierefreiheit