infra:NET Expert
 
×
15.01 infra-Makros
infra-Makros bilden eine vielseitige Erweiterungsmöglichkeit, um eigene Aktionen, Ergänzungen oder Funktionen in infra:NET zu integrieren, ohne Programme ändern zu müssen. Die Makros können an geeigneter Stelle in INI-Dateien bei der Einbindung eigener Menüeinträge oder Schaltflächen in der Symbolleiste (siehe Beispiel zu "SendMail"), bei der Druckausgabe (siehe Beispiel zu "KW"), innerhalb der Medien-/Druckerkonfiguration oder in Ausnahmefällen in CGW-Dateien benutzt werden. Innerhalb dieses Dokuments wird generell an den Stellen, die den Einsatz von infra-Makros zulassen, darauf hingewiesen.
Makros können auch zu komplexen Ausdrücken miteinander kombiniert werden (siehe Beispiele  zu "KW" und "SendMail").
Um Makros unabhängig von den in infra:NET dafür vorgesehenen Stellen benutzen zu können, sei hier gesondert auf die Prozedur CBgDo(...) in Kapitel 15.02 infra-Prozeduren (CallBacks) und das Druckkommando "C:$Do (...)" im Kapitel 13.44 Erweiterte MIL-Operatoren (z.B. für Grafikausgabe) hingewiesen. Das Druckkommando "C:$Do (...)" kann auch kanalabhängige Globalvariablen (KV_...) benutzen sowie die speziellen Globalvariablen "kanal" und "seite".
Hinweis zu infra-Makros und reservierten Zeichen
Zeichen wie Komma, Leerzeichen, Klammer, Slash und Backslash haben bei der Auflösung von Makros eine bestimmte Bedeutung, z.B. das Komma als Trenner für Parameter. Falls nun solche Zeichen Bestandteile von einzelnen Parametern sind, müssen diese in doppelte Anführungszeichen (" ") gesetzt werden.
Beispiel
Sektion [TOOLBAR]:
EKA731_110=     {
                TB_WFL_291,Umrechnung erfassen,"291:/Startupmode=Create /IniQualifier=731 /SetGV0(GV_731tnr,"LBUF(107,DDp(107,8),DDl(107,8))") /SetGV0(GV_731me,ToUpper(ReadDlgField(EKA731_110,EKA731_110_D23F33xx)))/SDFFile=SDA291-731",CBsCallModProc
                }
Mit dem Makro LBUF wird hier eine Teilenummer ausgelesen. Da diese Teilenummer z.B. Kommas enthalten kann, müssen die Anführungszeichen verwendet werden, damit das Makro SetGV0 korrekt aufgelöst wird.
Kritische infra-Makros sind z.B. LBUF, GV, DBFIELD und TRIM
Ausnahmen:
Folgende Makros in Standard-INI-Einträgen sind nicht mit Anführungszeichen zu versehen, weil diese von AUF43A nicht erkannt werden:
[AUF43AL]
Wiederholdruck=1,,,%0\wdh\GV(GV_database)
[AUF43AR]
Wiederholdruck     = 1,,,%0\wdh\GV(GV_database)
WiederholdruckPf   = 1,,,%0\wdh\GV(GV_database)
WiederholdruckVk   = 1,,,%0\wdh\GV(GV_database)
[AUF43AG]
Wiederholdruck=1,,,%0\wdh\GV(GV_database)
[AUF466]
StdPRNPath=%0\WDH\GV(GV_database)

%(wert,satz)
Das Makro liefert den Anteil laut angegebenen Prozentsatz vom angegebenen Wert. Das Ergebnis ist eine Dezimalzahl mit unbestimmter Anzahl Nachkommastellen
Beispiel:
%(200,25)
liefert 25% von 200, also 50 (siehe auch Beispiele bei Makro MUL(), analog kann Makro %() verwendet werden.)
Hinweis
Zur Rundungsproblematik bitte Hinweis bei Makro MUL() beachten.

ActDate()
Liefert das aktuelle Tagesdatum im Format "tt.mm.jjjj".

ActivateControl(GritID)
Das Control mit der angegebenen GritID wird im aktuellen Dialog (der Dialog, der zuletzt den Eingabefokus besaß) aktiviert. D.h. eine Schaltfläche wird beispielsweise betätigt, eine Registerseite ausgewählt oder ein Doppelklick auf einem Listcontrol simuliert. Das CBActivate-Ereignis wird für Schaltflächen und Registerseiten ausgelöst. Bei Listen (ScrolledList) wird das CBDefault-Ereignis ausgelöst.

ActTime()
Liefert die aktuelle Uhrzeit im Format "hh:mm:ss".

ADD(wert1,wert2)
Das Makro addiert die beiden angegebenen Werte. Das Ergebnis ist eine Dezimalzahl mit unbestimmter Anzahl Nachkommastellen.
Beispiel:
ADD(100,2.75)
liefert 102.75 (siehe auch Beispiele bei Makro MUL(), analog kann Makro ADD() verwendet werden.)
Hinweis:
Zur Rundungsproblematik bitte Hinweis bei Makro MUL() beachten.

ASCToInt(text)
Der in Klammern angegebene Text wird vom ASCII-Format in das interne Datenbankformat umgewandelt und zurückgegeben. Es wird nicht geprüft, ob der angegebene Text tatsächlich im ASCII-Format vorliegt, d.h. bei Anwendung dieser Funktion auf einen Text, der im ISO-Format vorliegt, ist das Ergebnis nicht vorhersehbar. Das interne Datenbankformat wird aus dem INI-Datei Eintrag "DBSFormat" entnommen.

ASCToISO(text)
Der in Klammern angegebene Text wird von ASCII-Format in ISO umgewandelt und zurückgegeben. Es wird nicht geprüft, ob der angegebene Text tatsächlich im ASCII-Format vorliegt, d.h. bei Anwendung dieser Funktion auf einen Text im ISOC-Format ist das Ergebnis nicht vorhersehbar.

ASC(Zahl)
Liefert entsprechenden Character, zum Beispiel ASC(65) für "A".

Ask(Hinweistext,Vorbelegungstext)
Dieses Makro öffnet ein Eingabefenster und liefert den eingegebenen Wert als Text zurück. In dem Fenster wird der angegebene Hinweistext angezeigt. Der Vorbelegungstext wird als Vorbelegung in das Eingabefeld geschrieben. Das Makro kann zum Beispiel in der Medienkonfiguration zur Eingabe einer Faxnummer oder E-Mail-Adresse oder während der Druckausgabe über die MIL zur Eingabe einer Überschrift, eines Verantwortlichen, eines Datums oder ... oder .. oder ... eingesetzt werden.

AsString(text)
Der in Klammern angegebene Text wird mit Anführungszeichen (") verziert. Dies ist zum Beispiel erforderlich, wenn in IMA-Dateien infra-Makros benutzt werden und das Ergebnis kann Leerzeichen am Anfang oder Ende enthalten oder aber Kommata oder Klammern.
In allen diesen Fällen würde bei der Abarbeitung der IMA ein Syntaxfehler gemeldet oder es wird mit unvollständigen Daten weitergearbeitet.
Beispiel aus IMA-Datei:
do_infra_macro(this,"SetGV0(GV_AUFTRAG,AsString(LBUF(DDp(38,1),DDI(38,1))))");
Hier wird die Auftragsnummer aus dem Kundenauftragskopf in die Globalvariable GV_AUFTRAG geschrieben. Ohne das Makro ASSTRING würde die Auftragsnummer ohne führende Leerzeichen übergeben.

CheckUstId( DBFIELD(KUNDE, Knd),K))
CheckUstId (DBFIELD(EKA-LIEF, Lieferant),L))
Der Aufruf startet den Webservice zur Online-Prüfung der Umsatzsteuer-Identifikationsnummer.
Beispiel: Einbau einer Schaltfläche in AUF411 / EKA711 um den Service für den ausgewählten Kunden/Lieferanten aufzurufen.

CrystalReportViewer(reportdatei,reportparameter,aktionsparameter)
Dieses Makro startet einen Crystal Reports Bericht in einem infra-Fenster (genaue Beschreibung siehe Kapitel 17.01 Makrobeschreibung)

CurrentDate()
Liefert das aktuelle Tagesdatum im Format D (JJMMTT). Dieses Makro darf nur bei Feldern im D-Format eingesetzt werden. Für Felder im d-Format (Datumsformat mit 4-stelliger Jahreszahl) muss CurrentDateLong() eingesetzt werden.
Für den Zugriff auf das aktuelle infra-Arbeitsdatum muss das Makro InfraDate() benutzt werden.

CurrentDateLong()
Liefert analog zu CurrentDate() das aktuelle Tagesdatum, allerdings im 8-stelligen Datumformat d (JJJJMMTT). Dieses Makro muss anstelle von CurrentDate() z.B. in Range-Angaben bei Feldern mit Format d verwendet werden.
Für den Zugriff auf das aktuelle infra-Arbeitsdatum muss das Makro InfraDateLong() benutzt werden.

CurrentWeek()
Liefert die aktuelle Kalenderwoche im Format W (JJWW).
Für den Zugriff auf die Kalenderwoche zum aktuellen infra-Arbeitsdatum muss das Makro InfraWeek() benutzt werden.
CurrentWeekLong()
Liefert analog zu CurrentWeek() die aktuelle Kalenderwoche, allerdings im 6-stelligen Format w (JJJJWW). Dieses Format wird in der infra-Datenbank bisher nicht verwendet.
Für den Zugriff auf die Kalenderwoche zum aktuellen infra-Arbeitsdatum muss das Makro InfraWeekLong() benutzt werden.
DateFromWeek(KW,Tag)
DateLongFromWeek(KW,Tag)
Liefert ein Datum zur angegebenen Kalenderwoche (KW) im kurzen (DateFromWeek) oder langen (DateLongFromWeek) internen Datumsformat („JJMMTT“ bzw. „JJJJMMTT“). Dabei bestimmt der zweite Parameter den Tag innerhalb der Woche, für den das Datum berechnet werden soll (0=Montag, 1=Dienstag, …, 6=Sonntag).
Die Kalenderwoche kann wahlweise im internen Datenformat (z.B. „JJWW“ oder „JJJJWW“) oder formatiert (z.B. „WW.JJ“ oder „WW.JJJJ“) angegeben werden.
Beispiel:
DateFromWeek(201717,0) -> liefert Montag in KW17/2017 JJMMTT: 170424
DateFromWeek(1817,6)   -> liefert Sonntag in KW17/2018 JJMMTT: 180429
DateLongFromWeek(201717,0) -> liefert Montag in KW17/2017 JJJJMMTT: 20170424
DateLongFromWeek(18.17,6)  -> liefert Sonntag in KW18/2017 JJJJMMTT: 20170507
DBDelete(Dateiindex,“kompletter Roh-Datensatz“)
DBDeleteWhere(DateiIndex,PfadIndex,“Schlüsselfeld1“,“Schlüsselfeld2“,…)
DBDeleteWhere(DateiIndex,PfadIndex,“Schlüsselfeld1“,unformatiertes Schlüsselfeld2,…)
Löscht einen vorhandenen Datensatz aus der mit „DateiIndex“ angegebenen infra:NET Datenbankdatei. Das Lösch-Ereignis wird auch an alle Backup-Datenbanken (z.B. SQL-Replikation) weitergereicht.
Bei „DBDelete(…)“ muss der zu löschende Datensatz laut DataDictionary in doppelten Hochkommata angegeben werden. Dabei müssen alle Felder des ersten eindeutigen Zugriffspfades der Datenbankdatei gefüllt sein. Das Datensatz-Format entspricht dem Ergebnis eines DBSelect-Makros ohne Feldindex.
Mit „DBDeleteWhere(…)“ können der für die Suche des Satzes zu verwendende Zugriffspfad und die Inhalte der Schlüsselfelder des zu löschenden Datensatzes laut DataDictionary angegeben werden. Dabei müssen alle Schlüsselfeldinhalte angegeben werden! Ein unvollständiger Schlüssel mit nicht eindeutigem Ergebnis bei der Datensatzsuche führt zu einem Fehlercode 10 und es wird kein Satz gelöscht.
Wird der Feldinhalt eines Schlüsselfeldes in doppelte Hochkommata gesetzt, muss der Inhalt 1:1 dem Rohformat des jeweiligen Feldes im Datensatz der Datenbank entsprechen (z.B. numerische Werte formatgerecht rechtsbündig mit allen Nachkommastellen).
Ohne doppelte Hochkommata wird der Inhalt entsprechend dem Datenbankformat des jeweiligen Feldes aufbereitet.
Wichtig:
Bei numerischen Feldern muss der Dezimaltrenner IMMER als Punkt angegeben werden. Tausender-Gruppierungen sind nicht zulässig. Datumsfelder sollten IMMER mit doppelten Hochkommata im internen Datenbankformat angegeben werden, also „JJJJMMTT“ (Format „d“) bzw. „JJMMTT“ (Format „D“).
In der Globalvariablen „GV_DBError“ wird der Fehlercode nach Ausführung des Makros zurückgegeben. Der Fehlercode „0“ bedeutet immer „erfolgreich“, andere Werte signalisieren einen Fehler.
Ein typischer Fehlercode ist „10“. Er bedeutet, dass zu den angegebenen Schlüsselwerten kein Datensatz gefunden wurde.
Wird der zu löschende Datensatz durch einen anderen infra:NET Benutzer oder durch ein anderes Programm in der gleichen Sitzung verwendet (gesperrt), erscheint eine Lock-Meldung. Wenn die Lock-Meldung durch den Benutzer abgebrochen wird, liefert die Globalvariable „GV_DBError“ den Fehlercode „641“.
Weitere Fehlercodes siehe Kapitel 12.02 Kernsystemfehler)
WARNUNG! Durch den Einsatz dieses Makros können Dateninkonsistenzen entstehen, sofern nicht alle datenbanktechnischen und betriebswirtschaftlichen Abhängigkeiten berücksichtigt werden. Die Nutzung ist nur für ausgebildetes Servicepersonal zulässig!
Beispiel:
DBDeleteWhere(6,1,“test“)
MsgBox(Fehlercode GV(GV_DBError))
Löscht den Datensatz mit der Teilenummer „test“ aus Datei 6 (Teilestamm).

DBFetchNext(Datei-Index,Pfadindex,Feld-Index,Schlüsselinhalt1,...,Schlüsselinhalt6)
Analog zu „DBSelect“ können über dieses Makro Felder und Sätze aus der Datenbank gelesen werden. Allerdings werden hier die Daten des laut Pfadindex logisch nächsten Datensatzes ausgehend vom vorherigen Ergebnis eines „DBSelect“ oder „DBFetchNext“ geliefert. Als Ergebnis wird der Inhalt des gewünschten Felds (Feld-Index) bzw. der gesamte gelesene Datensatz (bei fehlendem Feld-Index) geliefert.
Die Globalvariable "GV_DBError“ dient als Fehlerindikator für den letzten Datenzugriff mit „DBSelect“, „DBSelectN“ und „DBFetchNext“. Sobald der Inhalt dieser Variablen ungleich Null ist, war der letzte Zugriff nicht erfolgreich, d.h. die gesuchten Daten wurden nicht gefunden bzw. es gab keinen weiteren passenden Datensatz.
Der Fehlerindikator kann im Drucksystem (MIL) per Q-Operator abgefragt werden (siehe Beispiel).
Hinweise:
  • Voraussetzung für die Verwendung von „DBFetchNext“ ist immer ein vorheriger Datenzugriff mit „DBSelect“ oder „DBFetchNext“ mit gleichem Datei- und Pfad-Index.
    Die angegebenen Schlüsselinhalte dienen der Überprüfung des gefundenen Datensatzes.
    Passen die Angaben nicht zum gefundenen Datensatz oder ist kein weiterer Datensatz vorhanden, werden Leerzeichen als Ergebnis geliefert und der Fehlerindikator 2GV_DBError“ ist ungleich Null.
    Sollen Daten unabhängig von bestimmten Schlüsselangaben geliefert werden, können die entsprechenden Schlüsselinhalte einfach weggelassen werden.
    Das Makro liefert dann "jeden“ logisch nächsten Datensatz laut Pfadindex.
  • Da in einem Datensatz oder Feld auch Kommata oder Klammern oder andere Zeichen enthalten sein können, die für die Makrosyntax Steuerinformationen darstellen, sollte das Makro immer in Anführungszeichen eingeschlossen sein.
  • Bei Angabe von numerischen Schlüsselfeldern muss der Wert in Anführungszeichen stehen und mit führenden Leerzeichen angegeben werden (zum Beispiel N1-Feld: " 1"). Numerische Felder reservieren die erste Stelle für das Vorzeichen.
Datei-Index
Index der Datenbankdatei, aus der gelesen werden soll.
Pfadindex
Index des Zugriffspfads, über den gelesen werden soll.
Feld-Index
Index des Felds aus der zu lesenden Datenbankdatei, dessen Inhalt als Ergebnis zurückgeliefert werden soll. Wird der Parameter ausgelassen bzw. auf "0" gesetzt, liefert das Makro den gesamten Datensatz. In Kombination mit SetGV(...), GV(...) und MID(...) kann der Datensatz dann weiterverarbeitet werden.
Schlüsselinhalt1
Inhalt des ersten Schlüsselfelds für den gewünschten Zugriff. Durch den Einsatz von infra-Makros lassen sich die Inhalte der für den Zugriff benötigten Schlüsselfelder flexibel gestalten.
Schlüsselinhalt 2...6
Für jedes Schlüsselfeld des verwendeten Zugriffspfads kann hier ein Wert angegeben werden.
Beispiel:
C:$DO(2,DBSelect(7,1,7,"LBUF2(6,3)"))#
l:nochmal#
Q:!(GV(GV_DBError)),!0,3,J:>weiter#
D:1#
C:$DO(2,DBFetchNext(7,1,7,"LBUF2(6,3)"))#
J:>nochmal#
l:weiter#
liefert alle Baukastenpositionen zu dem Teil, dessen Daten aktuell im Datenpuffer 6 gespeichert sind.
Hinweis:
Weitere Beispiele siehe bei "DBSelect“.

DBFIELD(tabelle,feldname)
Liefert - ähnlich wie LBUF() - einen Wert aus einem Satzpuffer der Datenbank. Als Parameter wird hier allerdings der Name der Datenbankdatei (Tabelle) und des Felds, dessen Inhalt geliefert werden soll, angegeben. Die Namen der Datenbankdateien (Tabellen) werden im infra-Datenbank­status in Klammern hinter der Bezeichnung einer Datenbankdatei in der Auswahlliste angezeigt. Die Feldnamen stehen in der Spalte "Feldname" in der Liste der Felder einer Datenbankdatei.
Soll beispielsweise die Faxnummer aus der Kundenstammtabelle geliefert werden, wäre die Syntax "DBFIELD(KUNDE,Fax)".
WICHTIG:
Der Aufruf liefert das Ergebnis im Gegensatz zu LBUF() in dem Format, in dem es auch an der infra-Oberfläche angezeigt wird. Zum Beispiel liefert DBFIELD() bei numerischen Werten mit Format N7.3 als Ergebnis " 1.000.000,000" anstelle von " 1000000,000" bei Verwendung von LTRIM().
Das Makro liefert nur dann das gewünschte Ergebnis, wenn die interne Dateinummer der gewünschten Datenbankdatei (hier z.B. 41) und die Nummer des beim Lesen verwendeten Puffers im Anwendungsprogramm gleich sind. In der Regel ist das so, Sicherheit bringt ein Blick in den Steckbrief zum jeweiligen Programm. Sind die Nummern unterschiedlich, so muss weiterhin mit LBUF(...) gearbeitet werden.
Vorsicht, wenn zum Beispiel Schlüsselfelder für den Zugriff auf eine Datei mit diesem Makro versorgt werden. Das Makro formatiert Feldinhalte nicht nur für die Anzeige an der Oberfläche, sondern schneidet zusätzlich auch noch Leerzeichen ab und kann so im Ergebnis falsche Daten liefern. Daher in solchen Fällen immer das Makro LBUF() verwenden.

DBInsert(DateiIndex,“kompletter Roh-Datensatz“)
DBInsertValues(DateiIndex,FeldIndex1,“Inhalt“,FeldIndex2,“Inhalt“,…)
DBInsertValues(DateiIndex,FeldIndex1,unformatierter Inhalt,…)
Schreibt einen neuen Datensatz in die mit „DateiIndex“ angegebene infra:NET Datenbankdatei. Der Datensatz wird auch auf alle Backup-Datenbanken (z.B. SQL-Replikation) verteilt.
Bei „DBInsert(…)“ muss der vollständige zu schreibende Datensatz laut DataDictionary in doppelten Hochkommata angegeben werden. Das Datensatz-Format entspricht dem Ergebnis eines DBSelect-Makros ohne Feldindex.
Mit „DBInsertValues(…)“ können beliebig viele Felder des neuen Datensatzes anhand der Feldnummern (FeldIndex) laut DataDictionary angegeben werden. Dabei folgt jedem FeldIndex die Angabe des gewünschten Feldinhaltes. Wird der Feldinhalt in doppelte Hochkommata gesetzt, muss der Inhalt 1:1 dem Rohformat des jeweiligen Feldes im Datensatz der Datenbank entsprechen (z.B. numerische Werte formatgerecht rechtsbündig mit allen Nachkommastellen).
Ohne doppelte Hochkommata wird der Inhalt entsprechend dem Datenbankformat des jeweiligen Feldes aufbereitet.
Wichtig: Bei numerischen Feldern muss der Dezimaltrenner IMMER als Punkt angegeben werden. Tausender-Gruppierungen sind nicht zulässig. Datumsfelder sollten IMMER mit doppelten Hochkommata im internen Datenbankformat angegeben werden, also „JJJJMMTT“ (Format „d“) bzw. „JJMMTT“ (Format „D“).
In der Globalvariablen „GV_DBError“ wird der Fehlercode nach Ausführung des Makros zurückgegeben. Der Fehlercode „0“ bedeutet immer „erfolgreich“, andere Werte signalisieren einen Fehler.
Ein typischer Fehlercode ist „14“. Er bedeutet, dass ein Schlüssel des neuen Datensatzes bereits in der Datenbank existiert und der Satz nicht eingefügt werden kann.
Weitere Fehlercodes siehe Kapitel 12.02 Kernsystemfehler).
WARNUNG! Durch den Einsatz dieses Makros können Dateninkonsistenzen entstehen, sofern nicht alle datenbanktechnischen und betriebswirtschaftlichen Abhängigkeiten berücksichtigt werden. Die Nutzung ist nur für ausgebildetes Servicepersonal zulässig!
Beispiel:
DBInsertValues(6,3,“test“,4,“Testteil“,22,100)
MsgBox(Fehlercode GV(GV_DBError))
Legt einen neuen Datensatz in Datei 6 (Teilestamm) mit der Teilenummer „test“, der Bezeichnung „Testteil“ und dem Verrechnungspreis „100,00“ an.

DBSelect(Datei-Index,Pfadindex,Feld-Index,Schlüsselinhalt1,...,Schlüsselinhalt6)
Über dieses Makro können Felder und Sätze aus der Datenbank gelesen werden. Als Ergebnis wird der Inhalt des gewünschten Felds (Feld-Index) bzw. der gesamte gelesene Datensatz (bei fehlendem Feld-Index) geliefert.
Die Globalvariable "GV_DBError“ dient als Fehlerindikator für den letzten Datenzugriff mit "DBSelect“, "DBSelectN“ und "DBFetchNext“. Sobald der Inhalt dieser Variablen ungleich Null ist, war der letzte Zugriff nicht erfolgreich, d.h. die gesuchten Daten wurden nicht gefunden bzw. es gab keinen weiteren passenden Datensatz.
Der Fehlerindikator kann im Drucksystem (MIL) per Q-Operator abgefragt werden (siehe Beispiel bei "DBFetchNext“).
Hinweise:
  • Da in einem Datensatz oder Feld auch Kommata oder Klammern oder andere Zeichen enthalten sein können, die für die Makrosyntax Steuerinformationen darstellen,
    sollte das Makro immer in Anführungszeichen eingeschlossen sein.
  • Bei Angabe von numerischen Schlüsselfeldern muss der Wert in Anführungszeichen stehen und formatgerecht (d.h. mit führenden Leerzeichen) angegeben werden.
    Das Vorzeichen muss als Leerzeichen berücksichtigt werden.
    Beispiel für N7-Feld: "      1".
  • Wird der gewünschte Datensatz nicht gefunden (oder sind die Schlüsselinformationen unvollständig) liefert das Makro einen leeren Datensatz bzw. ein leeres Feld zurück. Das
    Makro "DBSelectN(...)" liefert auch Daten, wenn der gewünschte Datensatz nicht gefunden wird.
Datei-Index
Index der Datenbankdatei, aus der gelesen werden soll.
Pfadindex
Index des Zugriffspfads, über den gelesen werden soll.
Feld-Index
Index des Felds aus der zu lesenden Datenbankdatei, dessen Inhalt als Ergebnis zurückgeliefert werden soll. Wird der Parameter ausgelassen bzw. auf "0" gesetzt, liefert das Makro den gesamten Datensatz. In Kombination mit SetGV(...), GV(...) und MID(...) kann der Datensatz dann weiter verarbeitet werden.
Schlüsselinhalt1
Inhalt des ersten Schlüsselfelds für den gewünschten Zugriff. Durch den Einsatz von infra-Makros lassen sich die Inhalte der für den Zugriff benötigten Schlüsselfelder flexibel gestalten.
Schlüsselinhalt 2...6
Für jedes Schlüsselfeld des verwendeten Zugriffspfads kann hier ein Wert angegeben werden.
Beispiel 1:
DBSelect(6,1,4,0110012)
liefert die Bezeichnung des Artikels und der Artikelnummer "0110012".
Zum Beispiel kann dies in einer Drucksteuertabelle für die Ausgabe der Bezeichnung verwendet werden:
C:$DO(10,"DBSelect(6,1,4,0110012)",DDf(6,4))#
Ausgabe der Bezeichnung an Position 10 im Format laut DataDictionary.
Hinweis:
Die Anführungszeichen beim DBSelect müssen sein, da im Bezeichnungsfeld Kommata vorhanden sein können, die dann einer weiteren korrekten Makroauflösung im Wege stehen.
Oder Speichern des Satzes in einer Globalvariablen und anschließend mehrere Felder ausgegeben. Voraussetzung für nachfolgendes Beispiel ist, dass wie zum Beispiel im Programm FST541 der Fertigungs­auftragskopf in Puffer 40 zur Verfügung steht:
C:$DO( , SetGV(GV_AEFSATZ,"DBSelect(28,1,,"LBUF(40,DDp(40,18),DDl(40,18))")"), )#
S:1,ME Verkauf:#
C:$DO(13, "MID(GV(GV_AEFSATZ), DDp(28,2), DDl(28,2))", DDf(28,2))#
S:20, Verkaufspreis:#
C:$DO(36, "MID(GV(GV_AEFSATZ), DDp(28,3), DDl(28,3))", DDf(28,2))#
Beispiel 2:
Aus infra:NET kann eine E-Mail an den Ansprechpartner aus dem Kundenauftragskopf beim Druck der Auftragsbestätigung als angehängtes PDF-Dokument gesendet werden.
Dazu muss folgende Einrichtung vorgenommen werden:
  • Erstellen eines neuen Druckermediums mit Typ E-Mail. In dem Register "Datei" muss als Dateityp «PDF-Datei» ausgewählt werden.
  • Im Register "Fax und E-Mail" muss als E-Mail-Adresse der Eintrag "INIMACROS(EMAIL,ASP)" hinterlegt werden und im Feld «E-Mail-Betreff» kann, um die Auftragsnummer anzugeben, der Eintrag "Auftrags-Nr. DBFIELD(KKOPF,Auftrag)" eingegeben werden.
  • Um das E-Mail-Medium automatisch der Auftragsbestätigung zuzuweisen, muss dies in der formularspezifischen Konfiguration für Auftragsbestätigungen eingetragen werden.
  • Nun wird noch ein Eintrag in der INDIVID.INI benötigt. Dieser Eintrag bezieht sich auf das Feld «E-Mail-Adresse» in dem neu angelegten E-Mail-Medium (Register "Fax und E-Mail") und kann selbst definiert werden. Wichtig ist dabei, dass ein Bezug zwischen den beiden Werten besteht.
[EMAIL]
ASP=DBSelect(98,1,10,DBFIELD(KKOPF,Knd),DBFIELD(KKOPF,Asp))

DBSelectN(Datei-Index,Pfadindex,Feld-Index,Schlüsselinhalt1,Schlüsselinhalt2,...)
Dieses Makro arbeitet wie das Makro "DBSelect(...)", nur liefert es auch dann Daten, wenn der gewünschte Datensatz nicht gefunden wurde (bzw. die Schlüsselinformationen unvollständig sind). Es wird dann auf den Datensatz zugegriffen, der laut den angegebenen Schlüsselwerten im angegebenen Index logisch als nächster folgt.
Bei Angabe von numerischen Schlüsselfeldern muss der Wert in Anführungszeichen stehen und formatgerecht (d.h. mit führenden Leerzeichen) angegeben werden. Das Vorzeichen muss als Leerzeichen berücksichtigt werden.
Beispiel für N7-Feld: "      1".

DBUpdate(Dateiindex,“kompletter Roh-Datensatz mit neuen Werten“)
DBUpdateWhere(DateiIndex,PfadIndex,“Schlüsselfeld1“,…,SET,FeldIndex1,“Inhalt“,…)
DBUpdateWhere(DateiIndex,PfadIndex,“Schlüsselfeld1“,…,SET,FeldIndex1,Inhalt,…)
Aktualisiert einen vorhandenen Datensatz der mit „DateiIndex“ angegebenen infra:NET Datenbankdatei.
Die Aktualisierung wird auch an alle Backup-Datenbanken (z.B. SQL-Replikation) weitergereicht.
Bei „DBUpdate(…)“ muss der Datensatz laut DataDictionary in doppelten Hochkommata angegeben werden.
Dabei müssen alle Felder des ersten eindeutigen Zugriffspfades der Datenbankdatei gefüllt sein.
Die Inhalte aller anderen Felder des Datensatzes werden in die Datenbank übernommen.
Das Datensatz-Format entspricht dem Ergebnis eines DBSelect-Makros ohne Feldindex.
Mit „DBUpdateWhere(…)“ können der für die Suche des Satzes zu verwendende Zugriffspfad und die Inhalte der Schlüsselfelder des zu aktualisierenden Datensatzes laut DataDictionary angegeben werden.
Dabei müssen alle Schlüsselfeldinhalte angegeben werden! Ein unvollständiger Schlüssel mit nicht eindeutigem Ergebnis bei der Datensatzsuche führt zu einem Fehlercode 10 und es wird kein Satz aktualisiert.
Das Schlüsselwort „SET“ signalisiert den Beginn der Feldliste mit neuen Feldinhalten – jeweils eine Feldnummer (FeldIndex) und der zu schreibende Inhalt. Es können beliebig viele Felder gleichzeitig aktualisiert werden.
Wird der Feldinhalt eines Schlüsselfeldes oder zu aktualisierenden Feldes in doppelte Hochkommata gesetzt, muss der Inhalt 1:1 dem Rohformat des jeweiligen Feldes im Datensatz der Datenbank entsprechen (z.B. numerische Werte formatgerecht rechtsbündig mit allen Nachkommastellen).
Ohne doppelte Hochkommata wird der Inhalt entsprechend dem Datenbankformat des jeweiligen Feldes aufbereitet.
Wichtig:
Bei alphanumerischen Feldern müssen die Anführungszeichen zwingend vorhanden sein und über das Makro ASC oder mittels „\“ angegeben werden, also z.B.:
do_infra_macro(this,"DBUpdateWhere(6,1,ASC(34)0110012 ASC(34),SET,1,E)");
do_infra_macro(this,"DBUpdateWhere(6,1,\ "0110012\ ",SET,1,E)");
Das ist so kompliziert, weil der Makrointerpreter einen Anhaltspunkt benötigt, ob die Schlüsselangaben numerisch oder textlich sind. Z.B. bei numerischen Keyteilen kann man die Anführungszeichen weglassen und es wird automatisch formatgerecht aufbereitet.
Bei numerischen Feldern muss der Dezimaltrenner IMMER als Punkt angegeben werden. Tausender-Gruppierungen sind nicht zulässig. Datumsfelder sollten IMMER mit doppelten Hochkommata im internen Datenbankformat angegeben werden, also „JJJJMMTT“ (Format „d“) bzw. „JJMMTT“ (Format „D“).
In der Globalvariablen „GV_DBError“ wird der Fehlercode nach Ausführung des Makros zurückgegeben. Der Fehlercode „0“ bedeutet immer „erfolgreich“, andere Werte signalisieren einen Fehler.
Ein typischer Fehlercode ist „10“. Er bedeutet, dass zu den angegebenen Schlüsselwerten kein Datensatz gefunden wurde.
Wird der zu aktualisierende Datensatz durch einen anderen infra:NET Benutzer oder durch ein anderes Programm in der gleichen Sitzung verwendet (gesperrt), erscheint eine Lock-Meldung. Wenn die Lock-Meldung durch den Benutzer abgebrochen wird, liefert die Globalvariable „GV_DBError“ den Fehlercode „641“.
Weitere Fehlercodes siehe Kapitel 12.02 Kernsystemfehler)
WARNUNG! Durch den Einsatz dieses Makros können Dateninkonsistenzen entstehen, sofern nicht alle datenbanktechnischen und betriebswirtschaftlichen Abhängigkeiten berücksichtigt werden. Die Nutzung ist nur für ausgebildetes Servicepersonal zulässig!
Beispiel:
DBUpdateWhere(6,1,ASC(43)test ASC(43),SET,22,55.5,2,151101)
MsgBox(Fehlercode GV(GV_DBError))
Aktualisiert den Verrechnungspreis und das Änderungsdatum des Teilestammsatzes mit der Teilenummer „test“.

DDf(Datei-Index,Feldnummer)
DDf(Datei-Index,Feldnummer,Still)
Liefert für das angegebene Feld das Feldformat laut DataDictionary.
Ist das gewünschte Feld nicht definiert, so liefert das Makro C als Ergebnis und bringt ohne Option Still keine Fehlermeldung.
Wird als Option Still der Wert 0 mitgegeben, kann bei nichtvorhandener Felddefinition eine Fehlermeldung erzwungen werden.
Beispiele:
Druckausgabe eines Feldes aus einem in einer Globalvariablen gespeicherten Datensatz mit Fehlermeldung bei nicht definiertem Feld:
C:$DO(13, "MID("GV(GV_AEFSATZ)", DDp(28,2,0), DDl(28,2))", DDf(28,2))#
Abfrage ob Feld existiert:
Q:(DDf(28,50)),’C’,0,J:>FeldFehlt#

DDl(Datei-Index,Feldnummer)
DDl(Datei-Index,Feldnummer,Still)
Liefert für das angegebene Feld die Feldlänge laut DataDictionary. Ist das gewünschte Feld nicht definiert, so liefert das Makro 0 als Ergebnis und bringt ohne Option Still keine Fehlermeldung.
Wird als Option Still der Wert 0 mitgegeben, kann bei nichtvorhandener Felddefinition eine Fehlermeldung erzwungen werden.
Beispiel:
Abfrage, ob Feld existiert:
Q:!(DDl(28,50)),!0,0,J:>FeldFehlt#

DDp(Datei-Index,Feldnummer)
DDp(Datei-Index,Feldnummer,Still)
Liefert für das angegebene Feld die Position im Datensatz laut DataDictionary. Ist das gewünschte Feld nicht definiert, so liefert das Makro 0 als Ergebnis und bringt ohne Option Still keine Fehlermeldung.
Wird als Option Still der Wert 0 mitgegeben, kann bei nichtvorhandener Felddefinition eine Fehlermeldung erzwungen werden.
Beispiel:
Abfrage, ob Feld existiert:
Q:!(DDp(28,50)),!0,0,J:>FeldFehlt#

DIV(wert1,wert2)
Das Makro dividiert die angegebenen Werte durcheinander (wert1 : wert2). Das Ergebnis ist eine Dezimalzahl mit unbestimmter Anzahl Nachkommastellen.
Beispiel:
DIV(100,2)
liefert 50 (siehe auch Beispiele bei Makro MUL(), analog kann Makro DIV() verwendet werden.)
Hinweis:
Zur Rundungsproblematik bitte Hinweis bei Makro MUL() beachten.

ExcelClose()
Das aktuelle Excel-Sheet wird geschlossen (zum Beispiel nachdem es mit "ExcelSaveSheet“ gespeichert wurde). Anschließend lässt sich das Excel-Sheet nicht weiter manipulieren. Es kann aber ein neues Excel-Sheet mit "ExcelNewSheet“ angelegt werden.

ExcelNewRow()
Fügt unterhalb der aktuellen Zelle eine neue leere Zeile ein. Der Inhalt der nachfolgenden Zeilen wird nach unten verschoben. Anschließend befindet sich die aktuelle Zelle in der neuen Zeile und in der mit dem letzten "ExcelSetFirstCell“ gesetzten Spalte bzw. in Spalte 1, wenn kein "ExcelSetFirstCell“ benutzt wurde. Damit lassen sich auch neue Zeilen innerhalb eines bereits vorhandenen Excel-Sheets einfügen.
Beispiel:
Siehe "ExcelNewSheet“.

ExcelNewSheet(XLS-Datei)
Dieses Makro öffnet die angegebene Excel-Datei zur weiteren Verwendung mit den Makros ExcelSetValue, ExcelSetFirstCell, ExcelNewRow, ExcelSaveSheet, etc.. Wird keine XLS-Datei angegeben, erzeugt das Makro ein neues Excel-Sheet im Hauptspeicher, das dann mit Werten gefüllt werden kann.
Beispiel:
C:$DO(,ExcelNewSheet("d:\Customer BackLog Excel Template.xls"))#
C:$DO(,ExcelSetFirstCell(3,1))#
C:$DO(,ExcelSetValue(LBUF2(6,3)))#
C:$DO(,ExcelSetValue(LBUF2(6,4)))#
C:$DO(,ExcelSetValue(LBUF2(6,16),DDf(6,16)))#
C:$DO(,ExcelSetValue(LBUF2(6,2),d))#
C:$DO(,ExcelNewRow())#
C:$DO(,ExcelSaveSheet("d:\test.xls"))#
C:$DO(,ExcelShow())#
Öffnet eine XLS-Datei und fügt ab der 3.Zeile neue Werte aus Feldern der Tabelle 6 (Teilestamm) ein. Anschließend wird das Excel-Sheet gespeichert und angezeigt.

ExcelSaveSheet(XLS-Datei)
ExcelSaveSheet(XLS-Datei,Y)
ExcelSaveSheet(XLS-Datei,Y/N,Y)
Speichert das aktuelle Excel-Sheet als XLS- oder CSV-Datei. Es sind Laufwerks- und Pfadangaben zulässig. Zusätzlich kann durch den zweiten Parameter Y angegeben werden, ob eine ggf. vorhandene Datei mit identischem Namen ohne Nachfrage überschrieben werden soll. Ansonsten wird standardmäßig bei vorhandener Datei gefragt, ob die jeweilige Datei überschrieben werden soll.
Der dritte Parameter Y gibt an, dass die Datei nicht als XLS, sondern als CSV-Datei gespeichert werden soll.
Beispiel:
Siehe "ExcelNewSheet“.

ExcelSetFirstCell(Reihe,Spalte)
Setzt die nächste zu füllende Zelle im aktuellen Excel-Sheet (siehe "ExcelNewSheet“). Ohne diese Angabe wird immer links oben (Reihe 1, Spalte 1) begonnen. Das Makro kann immer wieder verwendet werden, um innerhalb des Excel-Sheets zu springen.
Beispiel:
C:$DO(,ExcelNewSheet())#
C:$DO(,ExcelSetFirstCell(1,5))#
C:$DO(,ExcelSetValue(Wert 1))#
C:$DO(,ExcelSetFirstCell(2,6))#
C:$DO(,ExcelSetValue(Wert 2))#
Füllt die Zellen (1/5) und (2/6).

ExcelSetValue(Wert,Format)
Füllt die aktuelle Zelle formatgerecht mit dem angegebenen Wert. Wird kein Format angegeben, geht das System vom Typ „Text“ aus. Es wird anschließend auf die nächste Zelle (Spalte) weitergesprungen, d.h. das nächste "ExcelSetValue“-Makro füllt automatisch die nächste Spalte.
Es ist zu beachten, dass die angegebenen Werte im infra-internen Datenformat erwartet werden - also so, wie sie in der Datenbank gespeichert sind.
Beispiel:
Siehe "ExcelNewSheet“.

ExcelShow()
Zeigt das aktuelle Excel-Sheet am Bildschirm an. Anschließend kann das Excel-Sheet nicht weiter manipuliert werden.
Beispiel:
Siehe "ExcelNewSheet“.

FILE(Dateiname, Typ, Satznummer bzw. Position, Länge)
Liest Daten aus der entsprechenden Datei. Kann zum Beispiel verwendet werden, um eine verschachtelte Menüstruktur in der Sektion [MENU]) aus einer externen Datei zu lesen. Menüstrukturen im numerischen Format müssen über das Makro "Menu(...)" eingebunden werden.
Typ I (INI):
Default, kann fehlen. Die ganze Datei wird eingelesen. Fehlt die Pfadangabe beim Dateinamen, gilt der INI-Pfad. Die letzten beiden Parameter sind ohne Bedeutung.
Typ T (TEXT):
Es wird nur der Satz mit der angegebenen Satznummer gelesen. Der letzte Parameter ist ohne Bedeutung.
Typ B (Binär):
Ab der angegebenen Position (beginnt bei 0) wird in der angegebenen Länge eingelesen.

GetClipboard()
Dieses Makro liefert den Inhalt der Windows-Zwischenablage als Text, falls dort ein Text abgelegt ist, sonst wird ein leerer Text zurückgegeben. Das Makro kann zum Beispiel dazu eingesetzt werden, um Daten mit anderen Windows-Anwendungen auszutauschen.
Beispiel
Siehe "SetClipboard"

GetEnv(name)
Das infra-Makro GetEnv(...) erlaubt das Abfragen von System-Umgebungsvariablen zum Beispiel in IMAs oder bei der Druckausgabe. Als Parameter wird der name der abzufragenden Variable angegeben.
Beispiel
GetEnv(USERNAME)
liefert den Namen des angegebenen Windows-Benutzers.

GetFocusField()
GetFocusField(DialogID)
Liefert die GRIT-ID des Objekts, das zuletzt den Eingabefokus im aktuellen Programm besaß. Wenn die GRIT-ID eines Dialogs (DialogID) mitgegeben wird, gibt das Makro die GRIT-ID des Objekts, das zuletzt in diesem Dialog den Eingabefokus besaß, zurück. Diese Makros können zum Beispiel zusammen mit ReadDlgField oder WriteDlgField sinnvoll eingesetzt werden, um den Wert des Eingabefelds, auf dem sich zuletzt der Eingabefokus befand, zu verändern oder auszulesen.

GV(Globalvariablenname)
Liefert den Inhalt der entsprechenden Globalvariablen. Die Funktion liefert immer den programmspezifischen Inhalt der gewünschten Globalvariablen. Um auf den systemspezifischen Wert einer Globalvariablen zuzugreifen muss die Funktion GV0() verwendet werden. Eine Liste der verfügbaren Variablennamen samt Bedeutung gibt es im Kapitel 15.03 infra-Globalvariablen (siehe auch Kapitel 13.044 Erweiterte MIL-Operatoren (z.B. für Grafikausgabe)). Das Druckkommando "C:$Do (...)" kann auch kanalabhängige Globalvariablen (KV_...) benutzen sowie die speziellen Globalvariablen "kanal" und "seite".

GV0(Globalvariablenname)
Liefert den systemspezifischen Wert der entsprechenden Globalvariablen. Der systemspezifische Wert einer Globalvariable bleibt über die gesamte Laufzeit auch über Programmwechsel hinweg erhalten. Eine Globalvariable kann programmspezifisch übersteuert werden. Eine Veränderung des Inhalts gilt dann nur im Kontext des entsprechenden Programms und wirkt sich nicht auf den systemspezifischen Inhalt der Variable aus. Um den programmspezifischen Wert einer Globalvariablen zu erhalten, muss die Funktion GV() verwendet werden. Eine Liste der verfügbaren Variablennamen samt Bedeutung gibt es im Kapitel 15.03 infra-Globalvariablen (siehe auch Kapitel 13.044 Erweiterte MIL-Operatoren (z.B. für Grafikausgabe)). Das Druckkommando "C:$Do (...)" kann auch kanalabhängige Globalvariablen (KV_...) benutzen sowie die speziellen Globalvariablen "kanal" und "seite".

GVID(Globalvariablenname)
Liefert den internen Ident der entsprechenden Globalvariablen. Dieser Ident wird vom System für den Schreib-/Lesezugriff auf die entsprechende Globalvariable verwendet. Eine Liste der verfügbaren Variablennamen samt Bedeutung gibt es im Kapitel 15.03 infra-Globalvariablen.

HTML2ISO(text)
Der in Klammern angegebene Text wird von HTML-Darstellung in ISO umgewandelt und zurückgegeben.
Ein Merkmal der HTML-Textdarstellung ist die Darstellung von Sonderzeichen mittels einer Code-Sequenz der Form &#xxx, wobei xxx der numerische Code des darzustellenden Zeichens ist. Das Makro wandelt diese Sequenzen wieder zurück in ISO-Zeichen (siehe auch Makro ISO2HTML und XMLDATE).

InfraDate()
Liefert das aktuelle infra-Arbeitsdatum im Format D (JJMMTT). Dieses Makro darf nur bei Feldern im Format D eingesetzt werden. Für Felder im Format d (Datumsformat mit 4-stelliger Jahreszahl) muss InfraDateLong() eingesetzt werden. Das infra-Arbeitsdatum kann vom tatsächlichen Datum abweichen.
Für das aktuelle Tagesdatum muss das Makro CurrentDate() benutzt werden.

InfraDateLong()
Liefert analog zu InfraDate() das aktuelle infra-Arbeitsdatum, allerdings im 8-stelligen Datumsformat d (JJJJMMTT). Dieses Makro muss anstelle von InfraDate() z.B. in Range-Angaben bei Feldern mit Format d verwendet werden.
Für das aktuelle Tagesdatum muss das Makro CurrentDateLong() benutzt werden.

InfraWeek()
Liefert die Kalenderwoche zum aktuellen infra-Arbeitsdatum im Format W (JJWW).
Für die Kalenderwoche zum aktuellen Tagesdatum muss das Makro CurrentWeek() benutzt werden.

InfraWeekLong()
Liefert analog zu InfraWeek() die aktuelle Kalenderwoche, allerdings im 6-stelligen Format w (JJJJWW). Dieses Format wird in der infra-Datenbank bisher nicht verwendet.
Für die Kalenderwoche zum aktuellen Tagesdatum muss das Makro CurrentWeekLong() benutzt werden.

INI(Sektion, Schlüsselwort)
Auslesen von Werten aus der INI-Datei.

INIMACROS(Sektion, Schlüsselwort)
Dieses Makro liest analog zum Makro INI(...) einen Eintrag mit dem angegebenen Schlüssel aus der INI-Datei. Dabei werden allerdings weitere Makros, die eventuell in dem gelesenen Eintrag vorhanden sind, ausgeführt bzw. weiter aufgelöst.

IntToASC(text)
Der in Klammern angegebene Text wird vom internen Datenbankformat in ASCII umgewandelt und zurückgegeben. Es wird nicht geprüft, ob der angegebene Text tatsächlich im Datenbankformat vorliegt, d.h. bei Anwendung dieser Funktion auf einen Text, der nicht im Datenbankformat vorliegt, ist das Ergebnis nicht vorhersehbar. Das interne Datenbankformat wird aus dem INI-Datei Eintrag "DBSFormat" entnommen.

IntToISO(text)
Der in Klammern angegebene Text wird vom internen Datenbankformat in ISO umgewandelt und zurückgegeben. Es wird nicht geprüft, ob der angegebene Text tatsächlich im Datenbankformat vorliegt, d.h. bei Anwendung dieser Funktion auf einen Text, der nicht im Datenbankformat vorliegt, ist das Ergebnis nicht vorhersehbar. Das interne Datenbankformat wird aus dem INI-Datei Eintrag "DBSFormat" entnommen.

InStr(text,muster)
InStr(text,muster,x)
Sucht „muster“ in „text“ und liefert die Zeichenposition, ab der „muster“ in „text“ enthalten ist oder „0“, wenn „muster“ in „text“ nicht gefunden wird. Mit „x“ kann eine Position innerhalb von „text“ angegeben werden, ab der gesucht werden soll. Die Positionen werden ab 1 gezählt.
Die Suche berücksichtigt Groß/Kleinschreibung (case-sensitiv).
Beispiel:
InStr(“Hallo Du da“,“a“)
liefert 2
InStr(“Hallo Du da“,“a“,3)
liefert 11
InStr(“Hallo Du da“,“Du“)
liefert 7

IsLicensedEx(type,id)
Über dieses Makro kann geprüft werden, ob ein Softwarebestandteil für die jeweilige Anwendung über die Lizenzdatei freigeschaltet ist. Als Ergebnis wird entweder „0“ für „nicht lizensiert“ oder „1“ für „lizensiert“ zurückgegeben.
Das zu prüfende Software-Element wird über den Typ „type“ und eine eindeutige „id“ identifiziert:
type
Beschreibung
0
Prüfung einer Funktions-/Menünummer:
Als „id“ wird die 3stellige FK-Nummer des zu prüfenden Menüpunkts angegeben
1
Prüfung eines Software-Pakets:
Als „id“ wird die Positionsnummer des zu prüfenden Pakets innerhalb der Lizenzdatei angegeben
2
Prüfung eines Features:
Als „id“ wird der Featurecode der zu prüfenden Eigenschaft angegeben

ISO2HTML(text)
Der in Klammern angegebene Text wird HTML-konform umgewandelt und zurückgegeben.
Ein Merkmal der HTML-Textdarstellung ist die Darstellung von Sonderzeichen mittels einer Code-Sequenz der Form &#xxx, wobei xxx der numerische Code des darzustellenden Zeichens ist. Das Makro wandelt alle ISO-Sonderzeichen (auch Umlaute und HTML-spezifische Steuerzeichen) in diese Darstellung um. Mit ISO2HTML werden außerdem bei negativen numerischen Ausdrücken alle Leerzeichen zwischen Vorzeichen und Zahl eliminiert („-     2.5“ wird zu „-2.5“). Das Makro kann zum Beispiel eingesetzt werden, um in einer Infodatei (siehe Drucksystem) im XML-Format Daten aus der infra-Datenbank entsprechend aufzubereiten (siehe auch Makro HTML2ISO und XMLDATE).

ISO2XML(text)
Der in Klammern angegebene Text wird XML-konform umgewandelt und zurückgegeben.
Umgewandelt werden XML-spezifische Sonderzeichen (wie z.B. &, >, <, “ und ‘).
Die Zeichen werden durch die entsprechenden HTML-Sequenzen „&amp;“, „&gt;“, „&lt;“, „&quot;“ und „&apos;“ umgewandelt.
Das Makro kann z.B. beim Export von Daten im XML-Format eingesetzt werden (z.B. beim infocenter-Export).
Siehe auch Pendant ISO2XML.

ISOToASC (text)
Der in Klammern angegebene Text wird von ISO-Format in ASCII umgewandelt und zurückgegeben. Es wird nicht geprüft, ob der angegebene Text tatsächlich im ISO-Format vorliegt, d.h. bei Anwendung dieser Funktion auf einen Text im ASCII-Format ist das Ergebnis nicht vorhersehbar.

ISOToInt(text)
Der in Klammern angegebene Text wird vom ISO-Format in das interne Datenbankformat umgewandelt und zurückgegeben. Es wird nicht geprüft, ob der angegebene Text tatsächlich im ISO-Format vorliegt, d.h. bei Anwendung dieser Funktion auf einen Text, der im ASCII-Format vorliegt, ist das Ergebnis nicht vorhersehbar. Das interne Datenbankformat wird aus dem INI-Datei Eintrag "DBSFormat" entnommen.

KO(bereich, offset [, länge])
Liest Daten aus der Konfigurationsdatei KO.DAT. Gelesen wird aus dem angegebenen Bereich (1 = Bildschirmsteuerung, 2 = Druckersteuerung, 3 = Konfigurationsdaten, 4 = Netzsteuerungsdaten, 5 = OS/2-Schnittstelle, 6 = Datenbank, 7 = Indexverwaltung, 8 = Sprachschnittstelle) ab dem angegebenen Offset in der gegebenenfalls angegebenen Länge. Bei fehlender Längenangabe wird nur ein Zeichen gelesen.
Beispiel:
KO(3,687)
Liefert das eingestellte Statistikperiodenraster aus der Konfigurationsdatei. Damit wäre auch folgende Aufgabe lösbar: Im Register "Lager" (siehe 111 Teilestamm bearbeiten) soll je nach Konfiguration der Statistik ein Text ausgegeben werden (Woche, Monat, Quartal). Dazu wird ein Label mit der GRIT-ID "PDV111_5_PERTEXT" (ohne Text) in den Dialog eingebaut, das beim CBCreate als SibDef-Eintrag die Ausgabe der entsprechenden Periodisierung enthält:
[GuiCBControl]
CBShow=CBgDo,WriteDlgField(PDV111_5_PERTEXT,MsgTextDefault(Trim(STA_PER)
KO(3,687),Akt. Periode))
Falls nun in "934 Konfigurationsparameter MWI" zum Beispiel Woche (=1) konfiguriert ist und in der Datei SIBPPS.MSG ein Texteintrag "STA_PER1: Woche" existiert, wird der Text "Woche" angezeigt (Default-Text ist "akt. Periode").

KW (Datum)
Als Parameter kann ein Datum im beliebigen Format (auch Buffer-Darstellung - also zum Beispiel "000207") angegeben werden. Das Ergebnis ist die zugehörige Kalenderwoche (formatiert) in der Form "ww.jj", also zum Beispiel "06.00". Dieses Makro kann zum Beispiel in der MIL zur Ausgabe einer Kalenderwoche eingesetzt werden:
"C:$DO(8,KW(LBUF(23,DDp(23,5),DDl(23,5))))" oder
"C:$DO(8,KW(DBFIELD(DISPAUF,ErfDat)))".

Left$(text,x)
Es werden die ersten x Zeichen von „text“ zurückgegeben – dabei ist es unerheblich, ob „text“ in doppelten Hochkommata steht oder nicht (werden ignoriert und nicht mitgezählt). Bei x=0 wird ein leerer Text „“ geliefert. Es werden maximal so viele Zeichen zurückgegeben, wie in „text“ enthalten sind.
Beispiel:
Left$(“Hallo Du da“,8)
liefert “Hallo Du“ (ohne Hochkommata)

LBUF(Puffer-Index, Position, Länge)
Liefert den entsprechenden Buffer-Ausschnitt, z.B. Verwendung für den Aufruf von externen Programmen über infra-Menüs:
...Programmname LBUF(41,DDp(41,17),DDl(41,17)) .....  ---> Übergabe der Telefonnummer aus der Kundenstammdatei (Datei 41).

LBUF2(Datei-Index, Feld-Index)
LBUF2(Buffer-Index, Datei-Index, Feld-Index)
Funktioniert analog zu Makro LBUF und liefert Daten aus einem Datensatz-Buffer. Anders als bei LBUF wird aber hier nur die Feldnummer und nicht die Position und Länge des gewünschten Feldes angegeben. Entspricht der Buffer-Index dem jeweiligen Datei-Index, reicht die Angabe von Datei- und Feld-Index. Außerdem werden eventuell vorhandene Leerzeichen vor und nach Nutzdaten entfernt. Es ist keine zusätzliche Verwendung des Trim-Makros notwendig.
Beispiel
C:$DO(,SetGV(GV_Gewicht,ScreenFormat(MUL("LBUF2(6,24)","LBUF2(40,19)"),N9.3),)#

LBUF2SQL(Datei-Index, Feld-Index)
LBUF2SQL(Puffer-Index, Datei-Index, Feld-Index)
Funktioniert analog zu Makro LBUF2 und liefert Daten aus einem Datensatz-Puffer. Anders als bei LBUF2 werden aber im Rückgabetext enthaltene einfache und doppelte Hochkomma SQL-gerecht umgewandelt, so dass das Ergebnis an eine SQL Datenbank übergeben werden kann. Einfache Hochkomma werden zu „'' "“ (2 einzelne Hochkomma), doppelte Hochkomma zu „'+CHAR(34)+'“
Beispiel
INSERT INTO test (Teil, Bez) VALUES ('$Macros[LBUF2SQL(6,3)]', '$Macros[LBUF2SQL(6,4)] $Macros[LBUF2SQL(6,57)]')
MENU(Dateiname)
Liest eine Menüstruktur im numerischen Format (s.u.) aus der entsprechenden Datei und wandelt sie in eine verschachtelte Menüstruktur um, so dass sie im infra-Menüexplorer oder in Einträgen der Sektion [MENU] verwendet werden kann. Die angegebene Datei wird bei fehlender Pfadangabe im INI-Verzeichnis der Anwendung gesucht.
Wird im Standard für die Definition des Menüs MODUL über die Datei SIBPPS.MEN eingesetzt (siehe Sektion [MENU]).
Beispiel für das numerische Format der Menüstruktur:
01: "&100", 1000, FLDR_1 
# Produktionsdaten
01.01: "1&10", 1100, FLDR_11 
# Teilestamm
01.01.01: "11&1", 1110, 111  
# Teilestamm bearbeiten
01.01.02: "11&2", 1120, 112  
# Teilestamm loeschen
01.01.03:
SEPARATOR
Der numerische Schlüssel bestimmt die Position und Stufe eines Eintrags innerhalb der Menüstruktur. Über einen Eintrag „Include: Datei1, Datei2, …“ können ein oder mehrere Dateien mit Menüstruktureinträgen inkludiert werden.
MID(text,position,länge)
Dieses Makro liefert einen Ausschnitt aus dem angegebenen Text. Der Ausschnitt beginnt dabei ab der angegebenen Position und enthält so viele Zeichen, wie als Länge angegeben werden. Bei fehlender Länge wird der gesamte Text ab der angegebenen Position geliefert.
Hinweis:
Da in einem Datensatz oder Feld auch Kommata oder Klammern oder andere Zeichen enthalten sein können, die für die Makrosyntax Steuerinformationen darstellen, sollte das Makro immer in Anführungszeichen eingeschlossen sein.
Beispiel:
MID("Das ist ein Test",5,3)
liefert als Ergebnis "ist" (siehe auch Beispiel bei "DBSelect").
MimTriggerMimAction(F.Function)
MimTriggerMimAction(F.Function,No)
MimTriggerMimAction(F3.Function)
MimTriggerMimAction(F3.Function,No)
Diese Makroanweisung übermittelt die angegebene Funktionsnummer (F.Function) oder eine F3-Funktionsnummer (F3.Function) an das Programm, in dessen Kontext dieses Makro ausgeführt wird. Die Funktionsnummern entsprechen den Eintragungen in der Sektion [MimAction] eines Controls (CGW- oder SDF-Datei).
Das Makro findet in der Regel im Zusammenhang mit dem Einsatz der Registertechnik Verwendung (siehe Sektion [GuiFramePatch], Eintrag "FromPatchID_...").
Vor der eigentlichen Aktion wird eine Feldprüfung des zuletzt verlassenen Feldes ausgeführt. Um dies bei Bedarf zu verhindern, kann hinter der Funktionsnummer "No" angegeben werden.
MKEY(Schlüssel Meldungsdatei)
Auslesen von Texten aus der Meldungsdatei (nicht bei Hinweisen für die Hinweiszeile benutzen !).
MsgBox(Text,Titel,Typ)
Dieses infra-Makro gibt abhängig vom angegebenen Typ (Typ) ein Meldungs- oder Abfragefenster mit dem gewünschten Meldungstext (Text) und einem Meldungstitel (Titel) aus. Die Makroausführung wird solange unterbrochen, bis der Benutzer das Meldungsfenster bestätigt bzw. beantwortet. In einer IMA-Datei ist es beispielsweise möglich, so auf Fehlersituationen aufmerksam zu machen oder den Ablauf der IMA-Datei durch Fragen an den Benutzer flexibel zu gestalten.
Die Nummer der vom Benutzer betätigten Schaltfläche wird als Text zurückgeliefert und kann so weiter ausgewertet werden.
Folgende Meldungstypen (Typ) werden unterstützt:
1 = Info
2 = Warnung
3 = Schwerwiegender Fehler
4 = Ja / Nein-Abfrage
5 = Meldung in Hinweiszeile (ohne Warten)
6 = Meldungsfenster ohne Kopf (ohne Warten)
7 = Wiederholen / Abbrechen-Abfrage
8 = Ja / Nein / Abbrechen-Abfrage
9 = Wiederholen / Ignorieren / Abbrechen-Abfrage
Folgende Tastenwerte können zurückgeliefert werden:
0 = Okay
1 = Ja
2 = Nein
3 = Abbrechen
4 = Ignorieren
5 = Wiederholen
Beispiel
In einer IMA-Datei soll die weitere Verarbeitung von einer Abfrage abhängig gemacht werden. Bei "Nein" wird die IMA-Datei beendet:
if ( do_infra_macro(this,"MsgBox(Verarbeitung fortsetzen?,IMA Abfrage,4) ") == "2" )
    return TRUE;

MsgText(schlüssel)
Liest den Text zum angegebenen Schlüssel aus der Message-Datei SIBPPS.MSG. Im Fehlerfall wird ein Fehlertext zurückgeliefert.
Beispiel:
WriteDlgField(PDV111_L999,MsgText(TEXT_1))
Schreibt den Text zum Schlüssel "TEXT_1:" aus der Datei SIBPPS.MSG in das Feld mit der GRIT-ID "PDV111_L999".

MsgTextDefault(schlüssel,default)
Liest den Text zum angegebenen Schlüssel aus der Message-Datei SIBPPS.MSG. Wenn der Schlüssel nicht gefunden wird, liefert das Makro den angegebenen Default-Text zurück.
Beispiel:
WriteDlgField(PDV111_L999,MsgTextDefault(TEXT_1,Das ist mein Text))
Schreibt den Text zum Schlüssel "TEXT_1:" aus der Datei SIBPPS.MSG in das Feld mit der GRIT-ID "PDV111_L999". Ist der Text in der Datei nicht vorhanden, wird "Das ist mein Text" in das entsprechende Feld geschrieben.

MUL(wert1,wert2)
Das Makro multipliziert die angegebenen Werte miteinander (wert1 x wert2). Das Ergebnis ist eine Dezimalzahl mit unbestimmter Anzahl Nachkommastellen.
Beispiel:
MUL(100,2.75)
liefert 275.
Weiteres Beispiel:
Multiplikation von Gewicht und Menge und Ausgabe des Positionsgewichts und des Gesamtgewichts auf einer Liste (Beispiel in FST541 nachvollziehbar):
In Tabelle 10 wird die Globalvariable für die Summe auf 0 gesetzt, damit bei jeder neuen Druckausgabe wieder mit Summe 0 begonnen wird.:
C:$DO(,SetGV(GV_GesGewicht,0),)#
In Tabelle100 wird multipliziert und das Ergebnis wird in einer weiteren Globalvariablen gespeichert, die dann ausgegeben wird. Die Positionssumme wird aufaddiert:
C:$DO(,SetGV(GV_Gewicht,MUL("LBUF(6,DDp(6,24),DDl(6,24))","LBUF(40,DDp(40,19),
DDl(40,19))")),)#
C:$DO(116,GV(GV_Gewicht),N9.3)#
C:$DO(,SetGV(GV_GesGewicht,ADD("GV(GV_GesGewicht)","GV(GV_Gewicht)")),)#
D:1#
In Tabelle 40 wird das Gesamtgewicht ausgegeben:
C:$DO(116,GV(GV_GesGewicht),N9.3)#
Hinweis:
Berechnungsergebnisse werden nicht automatisch gerundet. Um zum Beispiel Rundungsdifferenzen zwischen der Summe der gerundet ausgegebenen Positionswerte und der Gesamtsumme zu vermeiden, kann das Makro ScreenFormat eingesetzt werden. ScreenFormat rundet bei der Ausgabe eines Wertes entsprechend dem angegebenen Format. Das Ergebnis von ScreenFormat kann beispielsweise in einer Globalvariablen gespeichert und für weitere Berechnungen verwendet werden.
Beispiel
C:$DO(,SetGV(GV_Gewicht,ScreenFormat(MUL("LBUF(6,DDp(6,24),DDl(6,24))",
"LBUF(40,DDp(40,19),DDl(40,19))"),N9.3),)#

PhoneCall(Telefonnummer[,Bezeichnung])
Dieses Makro setzt über die Windows Wählhilfe unter Verwendung des Telephony Application Programming Interfaces (TAPI) einen Telefonanruf ab. Voraussetzung ist natürlich das Vorhandensein entsprechender Hardware am jeweiligen Arbeitsplatz und die korrekte Konfiguration der Windows Wählhilfe.
Der erste Parameter gibt die zu wählende Rufnummer (Sonderzeichen wie / und () sind erlaubt) an. Mit dem optionalen 2. Parameter kann eine zusätzliche Bezeichnung für diesen Anruf angegeben werden, die dann im Fenster der Windows Wählhilfe angezeigt wird.
Die Parameter können natürlich aus weiteren infra-Makros bestehen, so dass zum Beispiel auf Datenbankinhalte zurückgegriffen werden kann.
Beispiel:
Der Eintrag in der Symbolleiste des Kundenstamms soll einen Anruf beim jeweiligen Kunden ermöglichen. Dazu werden folgende Einträge in der Datei SIBPPS.INI ergänzt:
[ToolBitmaps]
TB_PHONE=phone
[ToolBar]
AUF411_1=TB_PHONE,"Kunde anrufen",PhoneCall(DBFIELD(KUNDE,Tel),DBFIELD(KUNDE,Bez)),CBgDO

Print(BS,MIL-Datei,Formular,Ausgabe,Kanal)
Dieses Makro stößt eine Druckausgabe auf einem oder allen Kanälen an. Es wird genau ein Dokument gedruckt und folgende Parameter steuern die Ausgabe:
BS
Bildschirmausgabe (Anzeige des Preview-Fensters)
0 = keine Anzeige
1 = mit Anzeige
MIL-Datei
Name der zu verwendenden Druckdefinition (MIL)
Formular
Tabellennummer der Tabelle, die innerhalb der angegebenen MIL-Datei die Formulardefinition enthält (Default = 1)
Ausgabe
Tabellennummer der Tabelle, die die Ausgabebeschreibung enthält (Default = 100)
Kanal
Nummer des zu verwendenden Druckkanals (Default = 0 = alle).
Wird als Kanal „CRM“ angegeben, wird bei Aktivierung des PDF-Exports für CRM (siehe INI-Einstellung ExportDocToCRM=Yes in Sektion [PrintEngine]) automatisch der höchste verfügbare Druckkanal (i.d.R. Kanal 5) und die entsprechenden CRM-Zusatzkanäle verwendet.
Innerhalb der Drucktabellen kann auf alle im aufrufenden Programm zur Verfügung gestellten Druckpuffer und Globalvariablen zugegriffen werden.
Das Print-Makro bietet folgende Einsatzmöglichkeiten:
  • Begleitendes Druckprotokoll zur Verbucherschnittstelle (siehe unten)
  • Belegübergabe je Buchung zum Beispiel an CRM-Schnittstelle beim Wareneingang
  • Belegdruck in Stammdatenprogrammen (siehe unten) oder anderen Nicht-Druckprogrammen (zum Beispiel zur Überprüfung/Genehmigung)
    Drucken aus einer IMA-Datei: Daten könnten per DBSelect- oder SQLSelect-Makro in Globalvariablen gespeichert und per MIL-Datei ausgegeben werden
Beispiel Verbucherschnittstelle
Zusammen mit der buchungsabhängigen Makroausgabe des infra:NET Verbuchers (Menü 31M) ergeben sich so interessante Möglichkeiten einer Druckausgabe begleitend zu den ausgeführten Buchungen, zum Beispiel in Form von Etiketten. Dabei lassen sich über das Makro XMLGVValue die Daten aus der Verbucherschnittstelle lesen und ausgeben oder für Abfragen (Q-Operator) verwenden.

INI-Datei (Sektion [MDE]):
PostingCode.194=Bestandskorrektur,3193:/StartBV=311-5 /StartDialog=MWI319_5,"Teil: @itemno, Lager: @fromstoreid, Menge: @bookquantity, ME: @quantityunit",Print(0,31MOK),Print(0,31MERR)
Bei Bestandskorrektur-Buchungen soll bei erfolgreicher Buchung die Ausgabe der MIL-Datei „31MOK“ und im Fehlerfall „31MERR“ ausgedruckt werden – jeweils ohne Bildschirmausgabe.

MIL-Datei (Tabelle 1):
Q:(XMLGVValue(GV_MWI31M_xmldata,postingcode)),'194',0,C:!MEDIUM("MED00007")#
Abhängig vom Buchungscode (postingcode) wird das zu verwendende Druckmedium gewechselt.
Beispiel Stammdatenprogramm
Um einen Belegdruck aus "111 Teilestamm bearbeiten" zu realisieren, sind nur 2 Dinge notwendig:
  • eine Schaltfläche (oder ein Kontextmenüeintrag) zum Aufruf des Druckmakros
  • eine MIL-Datei (Druckausgabesteuerungsdatei) zur Ausgabe der Daten
Bei der Schaltfläche (oder dem Menüeintrag) wird der Aufruf des Printmakros zum Beispiel wie folgt als SibDef hinterlegt:

CGW-Datei (SibDef-Eintrag):
[GuiCBControl]
CBActivate=CBgDo,(Print(1,PDV113))
Der Einfachheit halber wird hier die MIL-Datei des Programms 113 (Teilestammliste) für den Belegdruck verwendet. Alle in der Tabelle 100 verwendeten Puffer werden auch in "111 Teilestamm bearbeiten" zur Verfügung gestellt.
Man beachte die zusätzlichen Klammern um das Print-Makro, die verhindern, dass das Makro direkt beim Laden des Dialogs ausgeführt wird (siehe Beschreibung CBgDo).
Beim Erstellen einer eigenen MIL-Datei für die Belegausgabe ist zu beachten, dass nur auf die Datenpuffer zugegriffen werden kann, die das jeweilige Programm zum Druckzeitpunkt zur Verfügung stellt (siehe Steckbrief zum Programm).
Zusätzliche Daten können zum Beispiel über die Makros DBSelect oder SQLSelect innerhalb der MIL-Datei gelesen werden.

ReadDlgField(GritID)
ReadDlgField(DialogID,GritID)
Liefert den Inhalt eines Felds mit der angegebenen GritID innerhalb des Dialogs mit der angegebenen DialogID im internen Zeichensatz (in der Regel ASCII). Die GritID wird in jedem Dialog des aktuellen Programms gesucht, wenn die Angabe der DialogID fehlt.
Dann wird das zuerst gefundene Feld mit dieser ID benutzt. ReplaceCGW-Angaben werden bei Angabe einer Dialog-ID berücksichtigt.
Beispiel:
Siehe Beispiel für Übernahme der eingegebenen Mengeneinheit aus "731 Einkaufsvorgänge bearbeiten" in "291 Umrechnungen bearbeiten" in Kapitel "Aufrufparameter (z.B. für eigene Vorbelegungen)".

ReadDynVar(variablenname)
Auslesen von dynamischen Vorbelegungsvariablen. Dieses Makro erlaubt den lesenden Zugriff auf die bei der dynamischen Vorbelegung definierten Variablen über deren Variablennamen.

ReadRegistry(Schlüssel)
ReadRegistry(Schlüssel,Name)
Das infra-Makro ReadRegistry(…) erlaubt das Lesen von Zeichenketten aus der Windows-Registry zum Beispiel in IMAs, bei der Druckausgabe oder in INI-Einträgen. Als Parameter wird der komplette Schlüssel des zu lesenden Registry-Wertes und ggf. der entsprechende Name angegeben. Ohne Angabe des Namens wird der Standard-Wert des jeweiligen Schlüssel gelesen (in RegEdit als „(Standard)“ bzw. „(Default)“ sichtbar).
Das Makro erleichtert so zum Beispiel den Aufruf externer Programme auf unterschiedlichen Rechnern, bei denen das gewünschte Programm unter Umständen in unterschiedlichen Verzeichnissen installiert ist.
Das funktioniert natürlich nur, wenn das jeweilige Programm auch über einen entsprechenden Registry-Eintrag verfügt.
Beispiel:
[EXTERN]
ACROBAT    = ReadRegistry(HKEY_CLASSES_ROOT\SOFTWARE\Adobe\Acrobat\Exe)
Aufruf des Acrobat Readers über entsprechenden Registry-Eintrag.

RelativeDate([Datum,]Offset)
RelativeDateLong([Datum,]Offset)
Liefert ein um den angegebenen Offset vom aktuellen Tagesdatum abweichendes Datum im Format D (JJMMTT) bei RelativeDate() und im Format d (JJJJMMTT) bei RelativeDateLong().
Als Offset wird die Anzahl Tage angegeben. Bei negativen Werten wird rückwärts gerechnet.
Beispiel
In der Drucksteuertabelle (MIL-Datei) soll "Tagesdatum - 4 Tage" im Format D ausgegeben werden:
C:$DO(1,RelativeDate(-4),D)#
In der Drucksteuertabelle (MIL-Dateien) soll "Termin aus Dispo - 4 Tage" im Format d ausgegeben werden:
C:$DO(1,RelativeDateLong(LBUF(23,DDp(23,31),8),-4),d)#
Hinweise
  • Als erster optionaler Parameter kann ein Ausgangsdatum angegeben werden, das als Grundlage für die Berechnung dienen soll.
    So kann z.B. durch Kombination mit dem Makro InfraDate() ein Termin ausgehend vom aktuellen infra-Arbeitsdatum berechnet werden.
    Z.B. wird mit "RelativeDate(InfraDate(), 7)" ein Datum ermittelt, das 7 Tage nach dem Arbeitsdatum liegt.
    Die Datumsangabe kann im internen Format (JJMMTT) oder formatiert (TT.MM.JJ bzw. TT.MM.JJJJ) erfolgen.
  • Die Makros können auch für statische Vorbelegungen in den PRE-Dateien benutzt werden (siehe Kapitel "Statische Vorbelegungen",

RelativeWeek()
RelativeWeekLong(Offset)
Liefert eine um den angegebenen Offset von der aktuellen Woche laut Tagesdatum abweichende Wochenangabe im Format W (JJWW) bei RelativeWeek() und im Format w (JJJJWW) bei RelativeWeekLong().
Als Offset wird die Anzahl Wochen angegeben. Bei negativen Werten wird rückwärts gerechnet.
Ansonsten siehe Beschreibung und Beispiele bei den RelativeDate()-Makros.

Replace("Text","Suchen","Ersetzen")
Der jeweilige Text wird nach der angegebenen Zeichenfolge Suchen durchsucht. Bei jedem Treffer wird die gesuchte Zeichenfolge durch die angegebene Zeichenfolge Ersetzen ersetzt. Enthält die zu suchende oder zu ersetzende Zeichenfolge ein doppeltes Anführungszeichen (Gänsefüßchen), so muss vor dem Anführungszeichen ein sogenanntes Escape-Zeichen (\) gesetzt werden. Die Anführungszeichen um die einzelnen Parameter des Makros sind nicht zwingend erforderlich, werden aber grundsätzlich bei jedem Makro empfohlen, sobald ein Parametertext Zeichen enthalten könnte, die die korrekte Interpretation von Makros gefährden könnten, z. B. ein Komma oder runde Klammern.
Beispiel
Innerhalb der Druckausgabe soll die Teilebezeichnung ausgegeben werden. In der Teilebezeichnung vorkommende doppelte Anführungszeichen sollen dabei durch die Maßeinheit Zoll ersetzt werden.
S:1,Replace(”DBFIELD(TEILE,Bez)“,“\““,“Zoll“)#

ReplaceChr("Text","Folge von Suchzeichen","Folge von Ersatzzeichen")
Im Gegensatz zum Makro "Replace" arbeitet dieses Makro auf Zeichenbasis, d.h. es werden nur einzelne Zeichen und nicht komplette Zeichenfolgen ersetzt. Dabei wird der jeweilige Text nach jedem einzelnen der aufgeführten Suchzeichen durchsucht und durch das entsprechende Ersatzzeichen ersetzt. Es können auch mehrere Suchzeichen ohne Trenner hintereinander angegeben werden. Analog müssen dann bei der Ersatzzeichenangabe ebenso viele Zeichen in analoger Reihenfolge angegeben werden (siehe Beispiel). Wird als Such- oder Ersatzzeichen ein doppeltes Anführungszeichen (Gänsefüßchen) angegeben, so muss vor dem Anführungszeichen ein sogenanntes Escape-Zeichen (\) gesetzt werden. Das so entstehende zweistellige Zeichen wird bei der Bestimmung des Ersatzzeichens aber als ein einziges Zeichen betrachtet.
Die Anführungszeichen um die einzelnen Parameter des Makros sind nicht zwingend erforderlich, werden aber grundsätzlich bei jedem Makro empfohlen, sobald ein Parametertext Zeichen enthalten könnte, die die korrekte Interpretation von Makros gefährden könnten, z. B. ein Komma oder runde Klammern.
Beispiel
Innerhalb der Druckausgabe soll die Teilebezeichnung ausgegeben werden. In der Teilebezeichnung vorkommende doppelte Anführungszeichen (\“) sollen dabei durch einfache Hochkommata (’), Unterstriche (_) durch Leerzeichen und Minus (-) durch Plus (+) ersetzt werden.
S:1,ReplaceChr(”DBFIELD(TEILE,Bez)“, “\“_-“, “’ +“)#

Right$(text,x)
Es werden die letzten x Zeichen von „text“ zurückgegeben – dabei ist es unerheblich, ob „text“ in doppelten Hochkommata steht oder nicht (werden ignoriert und nicht mitgezählt). Bei x=0 wird ein leerer Text „“ geliefert. Es werden maximal so viele Zeichen zurückgegeben, wie in „text“ enthalten sind.
Beispiel:
Right$(“Hallo Du da“,5)
liefert “Du da“ (ohne Hochkommata)

ScreenFormat(Text,Format)
Der als Parameter übergebene Text wird laut dem angegebenen Format aufbereitet. So können zum Beispiel Datumsangaben vom internen Datenbankformat (JJMMTT) in das Eingabeformat (TT.MM.JJ) umgewandelt werden. Bei numerischen Werten rundet ScreenFormat den auszugebenden Wert entsprechend der Formatangabe. So lassen sich zum Beispiel Berechnungsergebnisse aus anderen Makros (MUL, DIV, ADD,SUB) zunächst runden, bevor sie etwa in einer Globalvariablen zwischengespeichert oder ausgegeben werden (siehe Hinweise bei Makro MUL()).
Beispiel 1
Ein Eintrag im Popup-Menü (rechte Maustaste) soll das heutige Datum + 7 Tage in das aktuelle Eingabefeld schreiben. Dazu wird folgender Eintrag in der Datei SIBPPS.INI ergänzt:
[POPUP]
StandardMenu={ "in einer Woche",WriteDlgField(GetFocusField(),ScreenFormat( RelativeDate(7),D)),CBgDo, }
Beispiel 2
Aus dem Erfassungspuffer sollen Zahlen über LBUF ausgelesen und als Barcode ausgegeben werden. Problem: Dezimaltrenner werden als Punkt und nicht als Komma ausgegeben. Abhilfe zum Beispiel über:
C:$BC(Znn,pp,"ScreenFormat(LBUF(...),D)")

SendMailDialog(Empfänger,Kopieempfänger,Betreff,Nachrichtentext,Anhang1[Anhang2,...])
Wird wie "SendMail(...)" zur Versendung von E-Mails aus infra:NET eingesetzt. Im Unterschied zu "SendMail(...)" wird mit "SendMailDialog(...)" aber auf jeden Fall der E-Mail-Dialog des verwendeten E-Mail-Systems geöffnet, um so zum Beispiel den Text der E-Mail vor der Versendung bearbeiten zu lassen. Die Parameter, deren Bedeutung und Beispiele können bei "SendMail(...)" nachgelesen werden.

SendMail(Empfänger,Kopieempfänger,Betreff,Nachrichtentext,Anhang1[Anhang2,...])
SendMailEx(MailAccount,Empfänger,Kopieempfänger,Betreff,Nachrichtentext,Anhang1[Anhang2,...])
Dieses Makro versendet eine E-Mail über ein MAPI-fähiges (MAPI = Messaging Application Programming Interface) E-Mail-System oder (wenn aktiviert) das infraMail-Plugin (siehe Mail=infraMail in Sektion [PLUGIN]).
Das .Net basierte infraMail-Plugin unterstützt den Versand direkt aus infra:NET über Outlook, Exchange oder SMTP/IMAP. Bei Aktivierung werden automatisch alle in infra:NET integrierten Mail-Funktionen (Druckmedien, Druckvorschau, SendMail-Makros) über das PlugIn umgeleitet.
Zu den Voraussetzungen siehe Beschreibung zum Eintrag „Mail = infraMail“ in INI-Sektion [PLUGIN]
Die Parameter haben folgende Bedeutung:
MailAccount
Bei SendMailEx kann ein alternativer MailAccount angegeben werden, über den die E-Mail verschickt werden soll. Voraussetzung ist der Einsatz des infraMail-Plugins. Der angegebene MailAccount muss in der INI-Datei in einer entsprechenden Sektion [MailProvider Accountname] definiert sein
Empfänger
E-Mail-Adresse des E-Mail-Empfängers. Wird kein Empfänger angegeben, so meldet sich das E-Mail-System mit einer Aufforderung zur Eingabe einer gültigen Adresse. Eine Eingabe der Adresse mit Vorbelegung kann über das infra: Makro Ask(...) realisiert werden. Außerdem kann die Adresse zum Beispiel über die Makros DBFIELD(...) oder LBUF(...) aus der Datenbank oder mittels ReadDlgField(...) aus einem Dialogfeld gelesen werden.
Kopieempfänger
Optionale E-Mail-Adresse eines Kopieempfängers. Der Parameter kann fehlen. Ansonsten existieren die gleichen Möglichkeiten der Adressangabe wie beim 1. Empfänger.
Betreff
Hier kann ein Text für den E-Mail-Betreff angegeben werden. Auch hier kann der Text aus anderen infra-Makros erstellt bzw. ergänzt werden.
Nachrichtentext
Der hier angegeben Text wird als E-Mail-Text versandt. Auch hier stehen wieder alle infra-Makros zur Verfügung. So ist z.B. auch das Übernehmen eines Textes über FILE(...) aus einer Textdatei für den Nachrichtentext möglich. Eine Besonderheit ist hierbei, dass der eingelesene Text ebenfalls nach infra-Makros durchsucht wird. So lassen sich auch einfache Weise dynamische Nachrichtentexte erzeugen.
Bei Einsatz des infraMail-Plugins kann der Nachrichtentext im HTML-Format angegeben werden. Wichtig ist dabei, dass der Text mit einem <html>-Tag beginnt.
Anhang1 ...
Optional können an die zu versendende E-Mail ein oder mehrere Dateien angehängt werden. Die jeweiligen Dateinamen müssen mit Pfad angegeben werden.
Beispiele
In der SIBPPS.INI wird ein E-Mail-Symbol für die Symbolleiste  hinterlegt:
[ToolBitmaps]
TB_EMAIL=mil12
1. Beispiel
[ToolBar]
PDV111={ TB_EMAIL,"eMail senden","SendMail(Ask(eMail-Adresse,INI(EMAIL,DBFIELD(TEILE,Disponent))),,
"Ask(Mail-Betreff,Information)","Ask(Nachrichtentext,Teilenummer DBFIELD(TEILE,Teil)
wurde von Benutzer DBFIELD(TEILE,SbAend) bearbeitet.)")" ,CBgDo, }
[EMAIL]
XY=Fritz.maier@test.de
Mit diesen Einträgen in die Datei SIBPPS.INI kann aus dem Teilestamm eine E-Mail an den Disponenten verschickt werden. Der Eintrag, zum Beispiel XY, wird aus dem Feld «Disponent» ermittelt und aus der Sektion [EMAIL] wird die entsprechende E-Mail-Adresse dazu gelesen. Als Nachrichtentext wird dann folgender Text vorgeschlagen: "Teilenummer ... wurde von Benutzer ... bearbeitet". Der Benutzername wird aus dem Feld «SbAend» gelesen.
2. Beispiel
Über ein Symbol in der Symbolleiste des Programms PDV113 wird eine E-Mail mit dem Betreff "Herzlichen Glückwunsch!" und dem Text "Alles Gute!" an die Adresse info@infragmbh.de verschickt:
[ToolBar]
PDV113={ TB_EMAIL,"1.Beispiel","SendMail(info@infragmbh.de,,"Herzlichen Glückwunsch!","Alles Gute!")
",CBgDo, }
3. Beispiel
Ein Menüeintrag "E-Mail - Beispiel 2" im Programm FST531 verschickt eine E-Mail mit dem Betreff "Testnachricht" und dem Text "Ich arbeite am Fertigungsauftrag xyz" an eine Adresse, die per Abfrage eingegeben und mit "info@infragmbh.de" vorbelegt wird. "XYZ"  soll dabei durch die Nummer des Fertigungsauftrags, der gerade bearbeitet wird, ersetzt werden:
[MENU]
FST531_10   =,2,INI(MENUEXT,531_10)
 
[MENUEXT]
531_10={
&eMail,,,,
 {
 "&Beispiel 2",," SendMail(Ask(eMail-Adresse,info@infragmbh.de),,"Testnachricht",
"Ich arbeite am Fertigungsauftrag DBFIELD(FKOPF,Auftrag)")",CBgDo
 }
}
4. Beispiel
Über ein Symbol in der Symbolleiste soll aus der Auftragsabwicklung eine E-Mail an den Lageristen (lager@meinefirma.de) verschickt werden. Gleichzeitig soll eine Kopie der Nachricht an den Verkauf (verkauf@meinefirma.de) geschickt werden. Im Betreff der E-Mail soll der Text "Info zu Auftrag xyz" (XYZ soll durch die aktuell in Arbeit befindliche Auftragsnummer ersetzt werden) erscheinen. Der Nachrichtentext lautet "ACHTUNG! Eilauftrag - bitte mit Vorrang bearbeiten!". Als Anhang werden 2 Bilddateien verschickt:
[ToolBar]
AUF435={ TB_EMAIL,"3.Beispiel","SendMail(Lager@MeineFirma.de,Verkauf@MeineFirma.de,
"Info zu Auftrag DBFIELD(KKOPF,Auftrag)", "ACHTUNG! Eilauftrag - bitte mit Vorrang bearbeiten!",
e:\bilder\bild1.jpg, e:\bilder\bild2.jpg) ",CBgDo, }
5. Beispiel
Wie Beispiel 3, nur soll der Nachrichtentext aus einer externen Textdatei gelesen werden:
[ToolBar]
AUF435={ TB_EMAIL,"4.Beispiel","SendMail(lager@meinerirma.de,
verkauf@meinefirma.de,
"Info zu Auftrag DBFIELD(KKOPF,Auftrag)",
"FILE(e:\infra\grafik\texte\email.txt,B)",
e:\bilder\bild1.jpg, e:\bilder\bild2.jpg) ",CBgDo, }
Hinweis:
Bitte beachten, dass die Zeilenumbrüche innerhalb einer Anweisung NICHT eingegeben werden dürfen. Die Einträge in der Sektion [ToolBar] müssen also wie folgt aussehen:
[ToolBar]
AUF435={ TB_EMAIL,"3.Beispiel ",   ...    ,CBgDo, }
6. Beispiel
Eintrag in der Datei SIBPPS.INI:
[ToolBitmaps]
TB_EMAIL=email
[ToolBar]
PDV111={ TB_EMAIL,"eMail senden","SendMail(Ask(eMail-Adresse,INI(EMAIL,DBFIELD(TEILE,Disponent))),,
"Ask(Mail-Betreff,Information)","Ask(Nachrichtentext,Teilenummer DBFIELD(TEILE,Teil)
wurde von Benutzer DBFIELD(TEILE,SbAend) bearbeitet.)")",CBgDo, }
[EMAIL]
XY=fritz.maier@test.de
Erklärung:
Mit diesen Einträgen in der SIBPPS.INI kann aus dem Teilestamm eine E-Mail an den Disponenten verschickt werden. Der Eintrag, zum Beispiel XY, wird aus dem Feld «Disponent» ermittelt und aus der Sektion [EMAIL] wird die entsprechende E-Mail-Adresse dazu gelesen. Als Nachrichtentext wird dann folgender Text vorgeschlagen: "Teilenummer … wurde von Benutzer … bearbeitet." Der Benutzername wird aus dem Feld «SbAend» gelesen.

SetClipboard(text)
Mit diesem Makro kann ein Text an die Windows-Zwischenablage übergeben werden. Dieser Text steht dann in anderen Windows-Anwendungen zur Verfügung. Das Makro kann zum Beispiel eingesetzt werden, um Daten mit anderen Windows-Anwendungen auszutauschen.
Beispiel
Mit einer IMA-Datei (siehe Kapitel 16.01 Makrogesteuerte Abläufe) soll ein Wert aus infra:NET an Microsoft Excel übergeben und anschließend ein neuer Wert, der zum Beispiel von Excel zur Verfügung gestellt wird, entgegen genommen werden (beachten Sie dazu auch unsere ausgelieferten Beispieldateien "FRACHT.IMA" und "FRACHT.XLS"):
gewicht = do_infra_macro(this,"Trim(DBFIELD(KKOPF,Gewicht))");      //Gewicht merken für später
do_infra_macro(this,"SetClipboard(Trim(DBFIELD(KKOPF,Gewicht)))");  //Gewicht in Zwischenablage
execute_callback(this,"CBgLaunchProcess","AsString(D:\\Programme\\Microsoft Office\\Office\\EXCEL.EXE)
E:\\fracht.xls");
wait(2);                                                            
// Um festzustellen, ob Excel bereits einen Wert ermittelt und in der Zwischenablage
// zur Verfügung gestellt hat, wird hier solange gewartet, bis in der Zwischenablage
// etwas Neues abgelegt wurde.
preis = do_infra_macro(obj,"GetClipboard()");
while( preis == "" || preis == gewicht )
    {
    wait(0.1);
    preis = do_infra_macro(obj,"GetClipboard()");
    }

SetGV(variable,wert)
Erlaubt das Ändern oder Neuanlegen der angegebenen Globalvariablen. Diese Globalvariable ist nur gültig im Kontext des geöffneten Programms, nicht im globalen infra-Kontext. Die Funktion ändert immer den programmspezifischen Inhalt der gewünschten Globalvariablen. Um den systemspezifischen Wert einer Globalvariablen zu verändern muss die Funktion "SetGV0()" verwendet werden. Eine Liste der verfügbaren Variablennamen samt Bedeutung gibt es im Kapitel "infra-Globalvariablen". Wird eine Name verwendet, der dem System noch nicht bekannt ist, wird die entsprechende Variable neu angelegt.
Der Wert muss in doppelte Hochkommata gesetzt werden, wenn zum Beispiel Klammern oder Kommata darin enthalten sind. Statt eines festen Wertes können natürlich auch weitere Makroausdrücke angegeben werden.
Siehe Beispiel zum Aufruf von "291 Umrechnungen bearbeiten" aus einem anderen Programm mit Vorbelegung der aktuellen Teilenummer im Kapitel 06.03 Aufrufparameter (z.B. für eigene Vorbelegungen).
Hinweis:
Werden Globalvariable für Rechnungen innerhalb der Drucksteuerung benutzt, bitte beachten, dass alle Angaben in der Kopftabelle (zum Beispiel Initialisierung von Summenfeldern) erst nach dem ersten Zeilendruck ausgewertet werden. Gegebenenfalls muss in der Zeilentabelle vor der ersten Nutzung von Globalvariablen ein D:0#-Operator eingefügt werden.

SetGV0(variable,wert)
Erlaubt das Ändern oder Neuanlegen der angegebenen Globalvariablen. Diese Globalvariable ist gültig im globalen infra-Kontext. Die Funktion ändert immer den systemspezifischen Inhalt der gewünschten Globalvariablen. Der systemspezifische Wert einer Globalvariable bleibt über die gesamte Laufzeit auch über Programmwechsel hinweg erhalten. Eine Globalvariable kann programmspezifisch übersteuert werden. Eine Veränderung des Inhalts gilt dann nur im Kontext des entsprechenden Programms und wirkt sich nicht auf den systemspezifischen Inhalt der Variable aus. Um den programmspezifischen Wert einer Globalvariablen zu verändern muss die Funktion "SetGV()" verwendet werden. Eine Liste der verfügbaren Variablennamen samt Bedeutung gibt es im Kapitel "infra-Globalvariablen". Wird eine Name verwendet, der dem System noch nicht bekannt ist, wird die entsprechende Variable neu angelegt.
Der Wert muss in doppelte Hochkommata gesetzt werden, wenn zum Beispiel Klammern oder Kommata darin enthalten sind. Statt eines festen Wertes können natürlich auch weitere Makroausdrücke angegeben werden.
Hinweis:
Werden Globalvariable für Rechnungen innerhalb der Drucksteuerung benutzt, bitte beachten, dass alle Angaben in der Kopftabelle (zum Beispiel Initialisierung von Summenfeldern) erst nach dem ersten Zeilendruck ausgewertet werden. Gegebenenfalls muss in der Zeilentabelle vor der ersten Nutzung von Globalvariablen ein D:0#-Operator eingefügt werden.

SQLSelect(INI-Sektion, SQL-Statement, Optionen)
Dieses Makro liefert das Ergebnis einer SQL-Abfrage im infra-Datenformat, d.h. numerische und Datumsfelder werden so formatiert, wie sie intern in Datenpuffern gespeichert werden, z. B. JJJJMMTT als Datumsformat. Dadurch ist es möglich, das Ergebnis der Abfrage beispielsweise durch weitere Makros zu verarbeiten. Für die Darstellung am Bildschirm oder bei der Druckausgabe muss dann ggf. das Makro ScreenFormat oder das gewünschte Ausgabeformat bei C:$DO(…) angegeben werden. Der Zugriff auf die SQL-Datenquelle erfolgt anhand eines ConnectionStrings, der in der als Parameter angegebenen Sektion der INI-Datei beim Schlüssel "ConnectionString" hinterlegt sein muss.
Die auszuführende SQL-Anweisung kann entweder direkt angegeben oder ebenfalls in der INI-Sektion hinterlegt werden.
Hinweise
  • Das Plugin INFRAADO muss in der Sektion [PLUGIN] der INI-Datei eingetragen sein.
  • Liefert das angegebene SQL-Statement mehrere Ergebnisfelder, so gibt das Makro SQLSelect alle Ergebnisfelder getrennt durch Kommata zurück.
  • Wenn alphanumerische Ergebnisfelder abgefragt werden, können diese möglicherweise Kommata oder Klammern oder andere Zeichen enthalten, die für die Makrosyntax Steuerinformationen darstellen. Daher sollte in diesem Fall immer mit der Option /WRAP gearbeitet werden.
  • Schlägt die SQL-Abfrage fehl, liefert das Makro einen Fehlertext.
Parameter
Beschreibung
INI-Sektion
In der angegebenen Sektion der INI-Datei muss ein Eintrag "ConnectionString=…" existieren, der eine Verbindung zu einer SQL-Datenquelle beschreibt. Für die Verbindung können beliebige im System verfügbare ADO-kompatible Daten-Provider verwendet werden.
Beispiel
ConnectionString= "Provider=SQLOLEDB;Data Source=MEINSERVER;Initial Catalog=Diamant_Demo;Integrated Security=SSPI;Auto Translate=0; Application Name=infra"
Hinweis
Auf der Internet-Seite www.connectionstrings.com findet man die Syntax von Verbindungsangaben (ConnectionStrings) für beinahe jede erdenkliche Datenverbindung.
SQL-Statement
Hier kann ein Schlüssel für die INI-Sektion aus Parameter 1 angegeben werden, unter dem das auszuführende SQL-Statement hinterlegt ist. Wenn dieser Parameter nicht angegeben wird, wird automatisch der Schlüssel "SQLCmd=…" verwendet.
Alternativ ist auch die direkte Angabe des auszuführenden SQL-Statements möglich. Dazu muss die Option /CMD mitgegeben werden (siehe Parameter "Optionen"). Das SQL-Statement muss wegen der darin vorkommenden Kommata ggf. in doppelte Hochkommata eingeschlossen werden. SQL-Anweisungen können auch strukturiert und über mehrere Zeilen der INI-Datei verteilt werden. Dazu muss das gesamte SQL-Statement in geschweifte Klammern eingeschlossen werden. Die öffnende Klammer muss dabei in der INI-Zeile des Schlüsselworts stehen, doppelte Hochkommata sind dann nicht notwendig. Das SQL-Statement muss der allgemeinen SQL-Syntax entsprechen. Um über die where-Klausel anhand von Daten aus infra:NET die Ergebnismenge einzugrenzen, können infra-Makros wie zum Beispiel LBUF, DBFIELD oder ReadDlgField verwendet werden.
Beispiel
"SELECT SUM(Betrag) FROM SOPProKonto where Klasse='D' AND Kontonummer='Trim(DBFIELD(KUNDE,KndFibu))'"
Bei SQL-Statements, die sich über mehrere INI-Zeilen erstrecken, muss der Operator „$Macros[…]“ für den Einbau der Makros verwendet werden (siehe Beispiel bei SQLShowResults). "
Optionen
/CMD
Der Parameter "SQL-Statement" wird dann nicht als Verweis auf einen Schlüssel in der INI-Datei interpretiert, sondern als SQL-Anweisung, siehe nachfolgendes Beispiel
 
/ALL
Ohne /ALL liefert das Makro SQLSelect nur das/die Ergebnisfeld/er des ersten gefundenen Datensatzes. Mit /ALL werden alle gefundenen Datensätze getrennt durch \n (ASCII-Code 13) geliefert. In der ersten Zeile werden dabei die Namen der Ergebnisspalten getrennt durch Kommata zurückgegeben
 
/SEP:[x
Angabe eines alternativen Feldtrenners, der dann statt eines Kommas zwischen den einzelnen Ergebnisfeldern und Spaltennamen bei Option /ALL zurückgegeben wird. Der Feldtrenner x wird als ASCII-Code angegeben.
 
/WRAP
Die einzelnen Ergebnisfelder werden in doppelte Hochkommata (Gänsefüßchen) eingeschlossen.
 
/CP850
Diese Option muss angegeben werden, wenn als Ergebnis der SQL-Abfrage Daten im DOS-Zeichensatz (CP850) geliefert werden. Das Makro SQLSelect erwartet sonst Ergebnisse im ISO-Format und wandelt die Ergebnisse automatisch in den infra-Zeichensatz um.
 
/NOHEAD
Diese Option verhindert in Kombination mit /ALL die Rückgabe der Spaltennamen in der ersten Ergebniszeile.
 
/XML
Das Ergebnis wird nicht direkt zurückgegeben, sondern als XML-Datenstruktur aufbereitet in der Globalvariablen "GV_SQLSelect_XML". Der Inhalt der Globalvariablen kann z.B. bei der Druckausgabe über das Makro "XMLGVValue" ausgelesen werden.
Ohne /ALL wird das Ergebnis der Abfrage im Knoten <Data>, mit /ALL wird je Zeile ein <Data>-Knoten innerhalb eines <ResultSet>-Knotens geliefert. Die Ergebnisspalten werden jeweils als <Spaltenname>Wert</Spaltenname>-Knoten im <Data>-Knoten ausgegeben.
Beispiel:
<ResultSet>
  <Data>
    <Teil>0110012</Teil>
    <Lager>H</Lager>
    <Menge>100,00</Menge>
  </Data>
 
  <Data>
    <Teil>0110512</Teil>
    <Lager>1</Lager>
    <Menge>55,00</Menge>
  </Data>
</ResultSet>
Beispiel 1:
C:$DO(1,SQLSelect(DIAMANT435, OffenePostenJeKunde,/WRAP),N9.2)#
liefert das Ergebnis der SQL-Abfrage, die in der INI-Sektion [DIAMANT435] beim Schlüssel "OffenePostenJeKunde=…" hinterlegt ist und druckt es im Format N9.2
In der INI-Datei kann dazu Folgendes angegeben sein:
[DIAMANT435]
ConnectionString="Provider=SQLOLEDB;Data Source=KS-ESPRIMO;Initial Catalog=Diamant_Demo;
Integrated Security=SSPI;Auto Translate=0;Application Name=infra"
OffenePostenJeKunde="SELECT SUM(Betrag) FROM SOPProKonto where Klasse='D' AND
Kontonummer='Trim(DBFIELD(KUNDE,KndFibu))'"
Beispiel 2 wie Bespiel 1, aber SQL-Statement direkt angegeben:
C:$DO(1,SQLSelect(DIAMANT435, "SELECT SUM(Betrag) FROM SOPProKonto where Klasse='D'
AND Kontonummer='Trim(DBFIELD(KUNDE,KndFibu))'",/CMD/WRAP),N9.2)#
liefert das Ergebnis der angegebenen SQL-Abfrage. In der INI-Sektion [DIAMANT435] muss beim Schlüssel "ConnectionString" aber wie oben die Verbindungsinformation hinterlegt sein.

SQLShowResults(DialogID,ObjektID,INI-Sektion,SQL-Statement,Optionen)
Dieses Makro sammelt die Ergebnismenge einer SQL-Abfrage und zeigt diese formatiert in einer Liste, einem Textfeld, einer Auswahlliste oder einem Eingabefeld an. Als Ergebnis liefert das Makro die Anzahl gefundener Zeilen oder im Fehlerfall einen Fehlertext. Der Zugriff auf die SQL-Datenquelle erfolgt anhand eines ConnectionStrings, der in der als Parameter angegebenen Sektion der INI-Datei beim Schlüssel "ConnectionString" hinterlegt sein muss. Die auszuführende SQL-Anweisung kann entweder direkt angegeben oder ebenfalls in der INI-Sektion hinterlegt werden.
Hinweise
  • Das Plugin INFRAADO muss in der Sektion [PLUGIN] der INI-Datei eingetragen sein.
  • Liefert das angegebene SQL-Statement mehrere Ergebnisfelder, so zeigt das Makro SQLShowResults alle Ergebnisfelder getrennt durch Kommata in einer Zeile an.
  • Schlägt die SQL-Abfrage fehl, zeigt das Makro einen Fehlertext im jeweiligen Dialogobjekt an.
  • Wenn die SQL-Anweisung keine Ergebniszeilen liefert, werden nur die Spaltenüberschriften angezeigt,
  • Beim Füllen eines Eingabefeldes wird das Ergebnis entsprechend der Formatangabe des Feldes formatiert oder bei leerem Ergebnis formatgerecht initialisiert.
 
Parameter
Beschreibung
DialogID
Grit-ID des Dialoges der das Objekt enthält, in dem das Ergebnis der SQL-Abfrage präsentiert werden soll. Fehlt die Angabe der DialogID, wird das Anzeigeobjekt in allen Dialogen des aktuellen infra-Programms gesucht.
ObjektID
Grit-ID des Objekts, in dem das Ergebnis der SQL-Abfrage präsentiert werden soll. Dabei kann es sich um eine mehrspaltige Liste, ein Textfeld, eine Auswahlliste oder ein Eingabefeld handeln. In einer mehrspaltigen Liste werden automatisch die Namen der Ergebnisspalten der SQL-Abfrage als Spaltenüberschriften gesetzt, es sei denn, für die Liste wurden explizit Spaltenüberschriften mit dem Grit-Editor definiert. In einem Textfeld werden die Namen der Ergebnisspalten in der ersten Zeile vor den Ergebniszeilen angezeigt. In einer Auswahlliste oder einem Eingabefeld werden keine Spaltennamen angezeigt, sondern nur die Ergebnisfelder bzw. das Ergebnisfeld.
INI-Sektion
In der angegebenen Sektion der INI-Datei muss ein Eintrag "ConnectionString=…" existieren, der eine Verbindung zu einer SQL-Datenquelle beschreibt. Für die Verbindung können beliebige im System verfügbare ADO-kompatible Daten-Provider verwendet werden.
Beispiel
ConnectionString= "Provider=SQLOLEDB;Data Source=MEINSERVER;Initial Catalog=Diamant_Demo;Integrated Security=SSPI;Auto Translate=0; Application Name=infra"
Hinweis
Auf der Internet-Seite www.connectionstrings.com findet man die Syntax von Verbindungsangaben (ConnectionStrings) für beinahe jede erdenkliche Datenverbindung.
SQL-Statement
Hier kann ein Schlüssel in der INI-Sektion laut Parameter "INI-Sektion" angegeben werden, bei dem das auszuführende SQL-Statement in der Datei SIBPPS/INDIVID.INI hinterlegt ist. Wenn dieser Parameter nicht angegeben wird, wird automatisch der Schlüssel "SQLCmd=…" verwendet.
Alternativ ist auch die direkte Angabe des auszuführenden SQL-Statements möglich. Dazu muss die Option /CMD mitgegeben werden (siehe Parameter "Optionen"). Das SQL-Statement muss ggf. wegen der darin vorkommenden Kommata in doppelte Hochkommata eingeschlossen werden. SQL-Anweisungen können auch strukturiert und über mehrere Zeilen der INI-Datei verteilt werden. Dazu muss das gesamte SQL-Statement in geschweifte Klammern eingeschlossen werden. Die öffnende Klammer muss dabei in der INI-Zeile des Schlüsselworts stehen, doppelte Hochkommata sind dann nicht notwendig.
Das SQL-Statement muss der allgemeinen SQL-Syntax entsprechen. Um über die where-Klausel anhand von Daten aus infra:NET die Ergebnismenge einzugrenzen, können infra-Makros wie zum Beispiel LBUF, DBFIELD oder ReadDlgField verwendet werden.
Beispiel
" SELECT * FROM SOPProKonto where Klasse='D' AND Kontonummer='Trim(DBFIELD(KUNDE,KndFibu))'"
Bei SQL-Statements, die sich über mehrere INI-Zeilen erstrecken, muss der Operator „$Macros[…]“ für den Einbau der Makros verwendet werden (siehe Beispiel).
Optionen
/CMD
 Der Parameter "SQL-Statement" wird dann nicht als Verweis auf einen Schlüssel in der INI-Datei interpretiert, sondern als SQL-Anweisung. Siehe auch Beispiel für Makro SQLSelect.
 
/SEP:[x]
Angabe eines alternativen Feldtrenners, der dann statt eines Kommas zwischen den einzelnen Ergebnisfeldern und Spaltennamen bei /ALL zurückgegeben wird. Der Feldtrenner x wird als ASCII-Code angegeben. Bei der Anzeige des Ergebnisses in einer mehrspaltigen Liste hat dieser Parameter keine Wirkung
 
/CP850 
Diese Option muss angegeben werden, wenn als Ergebnis der SQL-Abfrage Daten im DOS-Zeichensatz (CP850) geliefert werden. Das Makro SQLSelect erwartet sonst Ergebnisse im ISO-Format und wandelt die Ergebnisse in den infra:NET Zeichensatz um.

Zeilen/Spalten markieren
Mit SQLShowResults können Ergebniszeilen und einzelne Zellen in einer Liste (MultiColumnScrolledList) markiert werden. Zeilen können farbig markiert werden, Zellen mit einem vorangestellten Stern (*). Um eine Zeile oder Zelle zu markieren, muss das SQL-Ergebnis einen der folgenden Tags am Ende eines Spaltenwerts beinhalten:
$$MarkRow                                              markiert die gesamte Ergebniszeile Rot auf Gelb
$$MarkRow(Vordergrund, Hintergrund)      markiert die Ergebniszeile in den angegebenen Farben
$$MarkCell                                               markiert die jeweilige Zelle mit einem Stern
$$MarkCell$$MarkRow                              markiert die jeweilige Zelle und die gesamte Zeile
Der jeweilige Tag kann einfach, z. B. innerhalb einer CASE-WHEN-Anweisung, an einen Spaltenwert angehängt werden:
CASE
            WHEN b.Lief=tss.Lief AND CAST(tsslief.SperreJN+L.SpBestHinzuJN+L.SpBestJN AS int)=0      THEN b.Lief+'$$MarkRow(,yellow)'
            WHEN b.Lief=tss.Lief AND CAST(tsslief.SperreJN+L.SpBestHinzuJN+L.SpBestJN AS int)>0
            THEN b.Lief+'$$MarkRow(red,yellow)'
            WHEN b.Lief<>tss.Lief AND CAST(tsslief.SperreJN+L.SpBestHinzuJN+L.SpBestJN AS int)>0
            THEN b.Lief+'$$MarkRow(red,)'
            ELSE b.Lief
END
Beispiele:
[GuiCBControl]
CBActivate=CBgDo,(SQLShowResults(,SQLQUERY_RESULT,SQLQUERY,"ReadDlgField(SQLQUERY_CMD)",/CMD))
zeigt das Ergebnis der SQL-Abfrage, die im Feld „SQLQUERY_CMD“ im aktuellen Dialog eingegeben wurde, in der Liste „SQLQUERY_RESULT“ des aktuellen Dialogs an. In der INI-Sektion [SQLQUERY] sind die Verbindungsangaben für die Abfrage gespeichert.
In der INI-Datei kann dazu Folgendes angegeben sein:
[SQLQUERY]
ConnectionString="Provider=SQLOLEDB;Data Source=MEINSERVER;Initial Catalog=INFRA;Integrated Security=SSPI;Auto Translate=0;Application Name=infra"
Mehrzeiliges SQL-Statement mit Makros:
SQL_sqlBestandVB={
    Select CONVERT(Decimal(12,3),Menge+TEILE.LagBstX)
    From (
    select SUM (
    CASE
       WHEN UmrFakt=0 THEN
               CASE
                      WHEN BstArt='K' THEN –MngRest
                      WHEN BstArt='B' AND SUBSTRING(Steuer,5,1)='E' THEN MngRest
                      WHEN BstArt='F' THEN MngRest
                      WHEN BstArt='R' THEN –MngRest
                      WHEN BstArt='V' THEN MngRest
                      ELSE 0
               END
       ELSE
               CASE
                      WHEN BstArt='K' THEN -MngRest*UmrFakt
                      WHEN BstArt='B' AND SUBSTRING(Steuer,5,1)='E' THEN MngRest*UmrFakt
                      WHEN BstArt='F' THEN MngRest*UmrFakt
                      WHEN BstArt='R' THEN -MngRest*UmrFakt
                      WHEN BstArt='V' THEN MngRest*UmrFakt
                      ELSE 0
               END
    END
    ) As Menge
    from DISPBEW dispo
    where      dispo.Teil='$Macros[LBUF2(6,3)]'
       AND dispo.Stat=' '
       AND Zustand>9
       AND Zustand<60
       AND MngRest>0
       AND EndTerm>'01.01.1900'
       AND EndTerm<='$Macros[ScreenFormat(GV(PV_OMA_EINKAUFASSIST_FS_2),d)]'
    ) a,TEILE where Teil='$Macros[LBUF2(6,3)]'
    }

SQLExec(INI-Sektion, SQL-Statement, Optionen)
Analog zu „SQLSelect“ führt dieses Makro eine SQL-Anweisung aus, erwartet aber keine auswertbaren Ergebnisse, wie das zum Beispiel bei einem Select-Statement der Fall wäre. Daher kann das Makro „SQLExec“ unter anderem zum Ausführen verändernder SQL-Kommandos wie „Insert“, „Update“ oder „Delete“ verwendet werden. Das Makro liefert nur dann einen Text als Ergebnis, wenn beim Ausführen des SQL-Kommandos ein Fehler auftritt. In diesem Fall wird die Fehlermeldung des ADO-Datenbankzugriffs als Klartext zurückgegeben.
Der Zugriff auf die SQL-Datenquelle erfolgt anhand eines ConnectionStrings, der in der als Parameter angegebenen Sektion der INI-Datei beim Schlüssel "ConnectionString" hinterlegt sein muss.
Die auszuführende SQL-Anweisung kann entweder direkt angegeben oder ebenfalls in der INI-Sektion hinterlegt werden.
Hinweise
  • Das Plugin INFRAADO muss in der Sektion [PLUGIN] der INI-Datei eingetragen sein.
  • Schlägt die SQL-Abfrage fehl, liefert das Makro einen Fehlertext – ansonsten nichts.
Parameter
Beschreibung
INI-Sektion
In der angegebenen Sektion der INI-Datei muss ein Eintrag "ConnectionString=…" existieren, der eine Verbindung zu einer SQL-Datenquelle beschreibt. Für die Verbindung können beliebige im System verfügbare ADO-kompatible Daten-Provider verwendet werden.
Beispiel
ConnectionString= "Provider=SQLOLEDB;Data Source=MEINSERVER;Initial Catalog=Diamant_Demo;Integrated Security=SSPI;Auto Translate=0; Application Name=infra;Connect Timeout=30;Command Timeout=120"
Hinweis
Auf der Internet-Seite www.connectionstrings.com findet man die Syntax von Verbindungsangaben (ConnectionStrings) für beinahe jede erdenkliche Datenverbindung.
SQL-Statement
Hier kann ein Schlüssel für die INI-Sektion aus Parameter 1 angegeben werden, unter dem das auszuführende SQL-Statement hinterlegt ist. Wenn dieser Parameter nicht angegeben wird, wird automatisch der Schlüssel "SQLCmd=…" verwendet. Alternativ ist auch die direkte Angabe des auszuführenden SQL-Statements möglich. Dazu muss die Option /CMD mitgegeben werden (siehe Parameter "Optionen"). Das SQL-Statement muss wegen der darin vorkommenden Kommata ggf. in doppelte Hochkommata eingeschlossen werden. SQL-Anweisungen können auch strukturiert und über mehrere Zeilen der INI-Datei verteilt werden. Dazu muss das gesamte SQL-Statement in geschweifte Klammern eingeschlossen werden. Die öffnende Klammer muss dabei in der INI-Zeile des Schlüsselworts stehen – doppelte Hochkommata sind dann nicht notwendig. Das SQL-Statement muss der allgemeinen SQL-Syntax entsprechen. Um über die where-Klausel anhand von Daten aus infra:NET die Ergebnismenge einzugrenzen, können infra-Makros wie zum Beispiel LBUF, DBFIELD oder ReadDlgField verwendet werden. 
Optionen
/CMD
Der Parameter "SQL-Statement" wird dann nicht als Verweis auf einen Schlüssel in der INI-Datei interpretiert, sondern als SQL-Anweisung.
Beispiel 1:
C:$DO(1,SQLExec(SQLTEST, TeileArt))#
führt die SQL-Abfrage, die in der INI-Sektion [SQLTEST] beim Schlüssel "TeileArt=…" hinterlegt ist, aus
In der INI-Datei kann dazu Folgendes angegeben sein:
[SQLTEST]
ConnectionString="Provider=SQLOLEDB;Data Source=KS-QUAD;Initial Catalog=INFRA_ECHT; Integrated Security=SSPI;Auto Translate=0;Application Name=infra;Connect Timeout=60;Command Timeout=90"
TeileArt="UPDATE TEILE SET Art=’A’ WHERE Teil='Trim(DBFIELD(TEILE,Teil))'"

StrLen(text)
Liefert die Anzahl Zeichen, die in „text“ enthalten sind (inkl. Leerzeichen). Dabei ist es unerheblich, ob „text“ in doppelten Hochkommata steht oder nicht – diese werden nicht mitgezählt.
Beispiel:
StrLen(“Hallo Du da“)
liefert 11

SUB(wert1,wert2)
Das Makro subtrahiert die angegebenen Werte voneinander (wert1-wert2). Das Ergebnis ist eine Dezimalzahl mit unbestimmter Anzahl Nachkommastellen.
Beispiel:
SUB(100,2.75)
liefert 97.25 (siehe auch Beispiele bei Makro MUL(), analog kann Makro SUB() verwendet werden.)
Hinweis:
Zur Rundungsproblematik bitte Hinweis bei Makro MUL() beachten.

ToLower(text)
Dieses Makro liefert den angegebenen Text komplett in Kleinbuchstaben zurück.

ToUpper(text)
Dieses Makro liefert den angegebenen Text komplett in Großbuchstaben zurück.

TRIM(text)
Liefert den Text ohne führende und abschließende Leerzeichen zurück.
Beispiel um laufende Nummer mit führenden Nullen aufzufüllen und hinter eine Auftragsnummer zu hängen, z.B. im Listengenerator (Puffer 10):
C:$DO(,SetGV(GV_LFD,ADD(GV(GV_LFD),1)))#   ’laufende Nummer um 1 erhoehen
C:$BC(9,3,"TRIM(LBUF(10,DDp(40,1),DDl(40,1)))Replace("ScreenFormat(GV(GV_LFD),n3)"," ","0")",)#  ’Barcodeausgabe Auftrag + 3-stellige laufende Nummer

UpdateControl(GritID)
Das Control mit der angegebenen GritID wird im aktuellen Dialog (der Dialog, der zuletzt den Eingabefokus besaß) aktualisiert. D.h. Daten aus einem zugeordneten Buffer werden angezeigt bzw. eine Markierung entsprechend des Wertes im Buffer gesetzt. Anschließend werden das CBBufferChanged und das CBActivate Ereignis für das angegebene Control ausgelöst (unabhängig vom Typ des Controls).

UpdateControlBuffer(Buffer,Pos,Len)
Das Control, dessen [GuiBuffer]-Angaben sich auf die angegebene Position und Länge im angegebenen Buffer beziehen, wird im gesamten Anwendungsprogramm gesucht und aktualisiert. D.h. Daten aus einem zugeordneten Buffer werden angezeigt bzw. eine Markierung entsprechend des Wertes im Buffer gesetzt. Anschließend werden das CBBufferChanged und das CBActivate Ereignis für das gefundene Control ausgelöst (unabhängig vom Typ des Controls).

WeekFromDate(Datum)
WeekLongFromDate(Datum)
Liefert die Kalenderwoche zu einem Datum im kurzen (WeekFromDate) oder langen (WeekLongFromDate) internen Datumsformat („JJWW“ bzw. „JJJJWW“). Das Datum kann wahlweise im internen Datenformat (z.B. „JJMMTT“ oder „JJJJMMTT“) oder formatiert (z.B. „TT.MM.JJ“ oder „TT.MM.JJJJ“) angegeben werden.
Beispiel:
WeekFromDate(20170425) -> liefert KW17/2017 JJWW: 1717
WeekFromDate(29.04.18) -> liefert KW17/2018 JJWW: 1817
WeekLongFromDate(20170425) -> liefert KW17/2017 JJJJWW: 201717
WeekLongFromDate(07.05.2017) -> liefert KW18/2017 JJJJWW: 201718

WriteDlgField(GritID,Wert)
WriteDlgField(DialogID,GritID,Wert)
Schreibt den angegebenen Wert in das Feld mit der angegebenen GritID innerhalb des Dialogs mit der angegebenen DialogID. Die GritID wird in jedem Dialog des aktuellen Programms gesucht, wenn die Angabe der Dialog-ID fehlt. Dann wird das zuerst gefundene Feld mit dieser ID benutzt. Der zu schreibende Wert muss im internen Zeichensatz (in der Regel ASCII) angegeben werden. ReplaceCGW-Angaben werden bei Angabe einer Dialog-ID berücksichtigt.
Beispiel
Über die Datei SIBPPS.INI wird ein ToolButton erzeugt, der im Dialog AUF435_140 ein Feld aus einer ASCII-Datei mit Daten versorgt:
[ToolBar]
AUF435_140= ( TB_435_GEWICHT,"Gewicht übernehmen",WriteDlgField(AUF435_140,AUF435_140_F39,
FILE(E:\test.txt)),CBgDo, )
Wichtig ist in diesem Zusammenhang die Verwendung der globalen Prozedur (CallBack) "CBgDo", die im Kapitel 15.02 infra-Prozeduren (CallBacks) beschrieben wird.

XML2ISO(text)
Pendant zu ISO2XML – der in Klammern angegebene Text wird von einer XML-konformen Darstellung in „normale“ Zeichen umgewandelt. Umgewandelt werden XML-spezifische Sonderzeichen (wie z.B. &, >, <, “ und ‘), die als HTML-Sequenz in der Zeichenkette enthalten sind.

XMLDATE(datum)
Das Makro liefert ein übergebenes Datum in interner Darstellung (JJMMTT oder JJJJMMTT) in der Darstellung JJJJ-MM-TT zurück. Diese Darstellung ist abhängig vom Zielsystem in XML-Dateien zur Datenübergabe gebräuchlich.
Beispiel:
XMLDATE(000325)
liefert
2000-03-25

XMLGVValue(Globalvariable, Attributname)
Der Inhalt der angegebenen Globalvariablen wird als XML-Zeichenkette interpretiert und der Wert des angegebenen XML-Attributes (Feldes) wird als Ergebnis zurückgegeben. Über dieses Makro lassen sich zum Beispiel im Rahmen einer Druckausgabe Daten des infra:NET Verbuchers (Menü 31M) auslesen, die der Verbucher über die Buchungsschnittstelle (beispielsweise der SQL-Datenbank) empfangen hat. Die Daten werden in der Globalvariablen „GV_MWI31M_xmldata“ zur Verfügung gestellt.
Beispiel aus MIL-Datei:
S:1,Postingcode: XMLGVValue(GV_MWI31M_xmldata,postingcode)#
D:1#
S:1,Teil: XMLGVValue(GV_MWI31M_xmldata,itemno)#
D:1#
Hier werden die Felder „postingcode“ und „itemno“ aus der Verbucherschnittstelle ausgegeben.