| |
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
| konkrete Ausführungen für das HIT-Projekt siehe HIT-Abfragen |
| Viele, 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. |
| Sie 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. |
| Wenn 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
| simple - uniforme Sätze, CSV geeignet |
| semi-complex - Sätze mit verschiedenen Objektlisten |
| complex - XML und XML-QL (zur Zeit
nicht realisiert), siehe http://www.w3.org/TR/NOTE-xml-ql/
|
Abfrage-Typen
simple
| Daten-Meldungen: Geburt, Markierung, Nachkennzeichnung, EU-Einfuhr, Import, ... , BETRD
... PRAEM , VOK
SELECT a,b,c FROM m WHERE x AND/OR y ORDER z |
| Systerm-Meldungen: Aktionen, Codesets, ... , Meldungen |
| View-Meldungen: Joins als vorgefertigte View mit eigenem Namen und nicht als
QL-Syntaxelement
| doppelte Spaltennamen werden in Viewdefinition aufgelöst, Tabellenqualifier sind
unnötig |
| Joinbedingungen werden fest vorgegeben und können nicht vergessen werden |
| Datenbereiche sind bezüglich Kompetenz besser überwachbar |
|
semi-complex
| hat Ähnlichkeiten mit einem UNION, z.B. Rind-Lebenslauf mit
Geburt,Abgang,Zugang,Schlachtung... |
| Spaltenauswahl problematisch
| entweder nur "<Objekt>/*" zulassen und betreffende der jeweiligen
Entität ausgeben |
| oder bei Spaltenauswahl "Select *" ausführen und dann nur gegebene
übertragen |
| alle Spalten aller Teil-Entitäten vereinigen, nicht existierende leer, NULL-Values mit
%-- ausgeben ?? |
|
complex
| nicht 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
|
V<m> |
VERBOSE |
Zusätzliche Information zum Spaltenformat in der Überschriftspalte (kann
auch mittel LOGON/RS_V_DEF für die Siztung eingestellt werden):
0 = Standard, nur Feldnamen
1 = Feldnamen mit Informationen aus Data-Dictionary
|
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.
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 ..."
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
| Die Trennung von Feldnamen, Operatoren und Operanden (Vergleichswerte)
muss klar erkennbar sein
| durch Leerzeichen, z.B.
BNR15 IS AC+
|
| oder wenn Operatoren mit den Zeichen =, !=, >, < verwendet werden, z.B.
BNR15=090000000001
|
|
| wenn 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
| doppelte Hochkommas werden beim Übersetzen in die originale HIT-QL
erhalten, also SETNAME = "Bundesland"
-> SETNAME;=;"Bundesland"
|
| einfache Hochkommas werden beim Übersetzen in die originale HIT-QL
verworfen, also
SETNAME = 'Bundesland' ->
SETNAME;=;Bundesland
|
| Hochkommas 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 |
|
| Beim 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
| Frage: 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. |
| Frage: 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.
|
| Frage: Wie kann eine Abfrage mit "Datenstand" zu einem
bestimmten Stichtag bzw. Zeitpunkt erfolgen?
Antwort: Subcode RS/Z<timestamp>
|
| Frage: Kennzeichnen von Daten und Status-Antwort
Antwort: Schwere -1 oder >= 0
|
| Frage: Keine Bedingung nur Sortierung ...
Antwort: kein führendes Semikolon
|
| Frage: 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.
|
| Frage: 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
| Die komplexen Abfragen haben die Form: "<Feldname>;IS;<Komplexe
Vergleichsbedingung>", z.B: "BNR15;IS;09177,
09164". |
| Die Vergleichsbedingung kann aus einem Wert, einer
Abkürzung oder einem Bereich bestehen oder mittels Komma getrennt eine Liste
von vorgenannten beinhalten. |
| Bereiche 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. |
| Fü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:
| Liste der KFZ Kennzeichen Kürzel, siehe Codeset
KURZ_KFZ |
| Liste 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 |
Syntax und
Semantik<Feld>:WITHIN;<Feldname>;<Untergrenze>;<Obergrenze>
- Suche wo Wert von "Feld" im Intervall Wert von "Vergleichsfeld" +
Untergrenze bis "Vergleichsfeld" + ObergrenzegrenzeDie
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
Zusätzliche Sub-Codes (speziell für Aktion RETRIEVE)
siehe jetzt HIT-Protokoll / Subcodes /
Spezialfälle
Zum Seitenanfang
|