Datenbank
Diese Datei dokumentiert alle Makrofunktionen der Kategorie Datenbank.
Inhaltsverzeichnis
- AttDelete(Table,ID)
- AttExport(ID,Index,Verzeichnis,[Text])
- AttGetCount(ID)
- AttGetId(ID,Index)
- AttGetName(ID,Index)
- AttGetProperties(ID,Index)
- AttImport(Table,FileName,[DeleteAfterImport])
- AttLoadBinary(ID,Index)
- CacheInserter(Table,[Begin])
- Close(Table)
- Delete(Table)
- First(Table)
- GetFld(Field,Table,[PlainText])
- IsField(Tablename,Field)
- KeyReorg(Pfad,Dokumentart,[Verschmelzung])
- Last(Table)
- Next(Table)
- Open(Tablename)
- Prev(Table)
- QueryPrintJobs(Result,Dokumentart,ID)
- Reset(Table)
- Select(Table,Filter)
- SetFld(Field,Value,Table)
- Sort(Table,[Field1],[Field2],[Field3],[Field4])
- SortDir(Table,Field1Dir,[Field2Dir],[Field3Dir],[Field4Dir])
- Sql(Query,[MaxRows],[RowDel],[ColDel],[Msg],[Titel],[CacheSeconds])
- SqlArray(Array,Query,[MaxRows],[Msg],[Titel],[CacheSeconds])
- SqlExecute(Query,[Msg])
- SqlValue(Query,[Msg],[CacheSeconds])
- Start(Funktion,[Par1],[Par2])
- StartImport([SessionID],[Validate])
- Update(Table,[InsertOnly])
- XmlExport(Table,FileName,[Schema],[MaxRecords],[Open],[Filter])
- XmlGet(Table,[InsertHeader])
- XmlImport(FileName,[Schema],[ElementTag],[RecordIndex],[Recursive],[Replace])
- XmlLoad(Table,FileName,ElementTag,[Index])
- XmlSave(Table,FileName)
AttDelete(Table,ID)
Löscht eine Datei aus einem Dokument
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | ID | GUID/ID des Anhangs |
Rückgabewert
0:Fehler, 1:Datei entfernt
Verfügbarkeit
42 Makro Runtime
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttExport(ID,Index,Verzeichnis,[Text])
Speichert das Dokument des Anhangs im angegebenen Verzeichnis ab
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | ID | GUID/ID des Anhangs |
| 2 | Index | Index des Dokumentes |
| 3 | Verzeichnis | Zielverzeichnis für die Kopie des Dokumentes |
| 4 | Text | Optional: Abweichender Dateiname [wenn leer dann wird Dokumentname verwendet] |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttGetCount(ID)
Ermittelt die Anzahl der enthaltenen Dokumente im Anhang
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | ID | GUID/ID des Anhangs |
Rückgabewert
Anzahl der im Anhang enthaltenen Dokumente
Verfügbarkeit
Standard
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttGetId(ID,Index)
Ermittelt die ID des Dokumentes im Anhang
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | ID | GUID/ID des Anhangs |
| 2 | Index | Index des Anhangs beginnend mit 0 für das erste Dokument |
Rückgabewert
ID des Dokuments
Verfügbarkeit
Standard
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttGetName(ID,Index)
Ermittelt den Namen des Dokumentes im Anhang
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | ID | GUID/ID des Anhangs |
| 2 | Index | Index des Anhangs beginnend mit 0 für das erste Dokument |
Rückgabewert
Name des Dokuments
Verfügbarkeit
Standard
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttGetProperties(ID,Index)
Ermittelt die Eigenschaften des Dokumentes im Anhang
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | ID | GUID/ID des Anhangs |
| 2 | Index | Index des Anhangs beginnend mit 0 für das erste Dokument |
Rückgabewert
Eigenschaften des Dokuments
Verfügbarkeit
Standard
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttImport(Table,FileName,[DeleteAfterImport])
Importiert ein Dokument aus einer Datei
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | FileName | Name der Datei |
| 3 | DeleteAfterImport | Optional: Datei nach Import aus Verzeichnis löschen |
Rückgabewert
0:Fehler, 1:Datei hinzugefügt, 2: Datei ersetzt
Verfügbarkeit
42 Makro Runtime
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
AttLoadBinary(ID,Index)
Liest einen Anhang als Base64 kodierten String
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | ID | GUID/ID des Anhangs |
| 2 | Index | Index des Dokumentes |
Rückgabewert
Dateiinhalt BASE64 kodiert
Verfügbarkeit
42 Makro Runtime
Beispiel
Importiert eine Datei als Anhang eines Artikels und verwendet anschließend alle Att*-Funktionen, um die Anhänge auszulesen, zu exportieren, als Base64-Inhalt zu laden und den importierten Anhang wieder zu löschen.
Das Makro arbeitet mit dem Artikel 000001. Für diesen Artikel müssen im Register Dokumente bereits Dateien hinterlegt sein. Sind dort noch keine Dokumente vorhanden, sind zunächst entsprechende Dateien beim Artikel zu hinterlegen.
Zusätzlich muss die Importdatei Testdatei.txt im Benutzerverzeichnis erstellt werden. Das Benutzerverzeichnis ist das persönliche 42-ERP-Verzeichnis des aktuell angemeldeten Windows-Benutzers. Ein typischer Pfad ist:
C:\Users\[Benutzer]\Documents\42 ERP
Der tatsächliche Pfad ist vom angemeldeten Windows-Benutzer und der jeweiligen Installation abhängig. Deshalb wird er im Makro mit GetDirectory(14) ermittelt. Der Wert 14 steht bei GetDirectory() für das Benutzerverzeichnis.
Die Importdatei wird unter folgendem Pfad erwartet:
C:\Users\[Benutzer]\Documents\42 ERP\Testdatei.txt
Die exportierten Dokumente werden im Unterverzeichnis Export des Benutzerverzeichnisses abgelegt:
C:\Users\[Benutzer]\Documents\42 ERP\Export
Ist das Verzeichnis Export noch nicht vorhanden, wird es vom Makro automatisch mit CreateDir() angelegt.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
Importdatei = Benutzerverzeichnis + "\\Testdatei.txt";
Exportverzeichnis = Benutzerverzeichnis + "\\Export";
// Exportverzeichnis anlegen, wenn es noch nicht vorhanden ist
if(strlen(FindFirstDir(Exportverzeichnis)) == 0)
{
if(CreateDir(Exportverzeichnis))
{
print("Exportverzeichnis wurde erstellt.");
}
else
{
print("Exportverzeichnis konnte nicht erstellt werden.");
}
}
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
// Dokument importieren
if(AttImport(db,Importdatei,0))
{
Update(db);
print("Dokument wurde importiert.");
}
}
if(First(db))
{
// Anhangs-ID des aktuellen Datensatzes ermitteln
Anhang = GetFld("Anhang",db);
// Anzahl der Dokumente im Anhang
Anzahl = AttGetCount(Anhang);
print("Anzahl der Dokumente: " + Anzahl);
for(i = 0; i = i + 1 ; i < Anzahl)
{
// Informationen zum Dokument ermitteln
Name = AttGetName(Anhang,i);
ID = AttGetId(Anhang,i);
Eigenschaften = AttGetProperties(Anhang,i);
print("Name: " + Name);
print("ID: " + ID);
print("Eigenschaften: " + Eigenschaften);
// Dokument exportieren
if(AttExport(Anhang,i,Exportverzeichnis))
{
print("Dokument wurde exportiert.");
}
// Dokument als Base64-kodierten String laden
Base64 = AttLoadBinary(Anhang,i);
print("Base64-Inhalt: " + Base64);
}
// Das zuvor importierte Dokument wieder löschen
if(strcmp(Name,"Testdatei.txt") == 0)
{
if(AttDelete(db,ID))
{
print("Dokument wurde gelöscht.");
}
}
Update(db);
}
Close(db);
}
CacheInserter(Table,[Begin])
Startet oder beendet den Inserter-Cache einer Tabelle
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | Begin | Optional: 0=Flush/End, 1:Begin |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
42 Makro Runtime
Beispiel
CacheInserter() eignet sich insbesondere für den Import von Massendaten, da Datensätze gesammelt verarbeitet und der Cache in definierten Abständen geschrieben werden kann. Bei größeren Datenmengen kann es sinnvoll sein, den Cache beispielsweise nach jeweils 1000 Datensätzen zu schreiben und anschließend erneut zu aktivieren.
rec = rec + 1;
...
...
...
if(rec % 1000 == 0)
{
CacheInserter(Table);
CacheInserter(Table,1);
}
Öffnet die Tabelle IKATALOG und aktiviert mit CacheInserter(Table,1) den Inserter-Cache. Anschließend werden mehrere Datensätze mit SetFld() vorbereitet und mit Update(Table,1) eingefügt. Mit CacheInserter(Table) wird der Cache abschließend geschrieben und beendet. Danach wird die Tabelle geschlossen.
Main()
{
Table = Open("IKATALOG");
CacheInserter(Table,1);
SetFld("Artikelnummer","10001",Table);
SetFld("Bezeichnung","Beispielartikel",Table);
Update(Table,1);
SetFld("Artikelnummer","10002",Table);
SetFld("Bezeichnung","Weiterer Beispielartikel",Table);
Update(Table,1);
CacheInserter(Table);
Close(Table);
}
Close(Table)
Schließt eine geöffnete Datenbank
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Öffnet die Kundendatenbank und schließt sie anschließend wieder.
Main()
{
db = Open("Kunde");
Close(db);
}
Delete(Table)
Löscht den aktuellen Datensatz
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Das Beispiel löscht den Artikel mit der Artikelnummer 999999 aus den Tabellen ARTIKEL und ARTIKELSTATISTIK.
Zunächst wird die Tabelle ARTIKEL geöffnet und nach der Artikelnummer 999999 gefiltert. Wird der Datensatz mit First() gefunden, wird er mit Delete() gelöscht.
Anschließend wird die Tabelle ARTIKELSTATISTIK geöffnet. Auch dort wird nach der Artikelnummer 999999 gesucht und der zugehörige Datensatz gelöscht, wenn er vorhanden ist.
Auf diese Weise werden sowohl der Artikeldatensatz als auch der zugehörige Statistikdatensatz entfernt.
Main()
{
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '999999'");
if(First(db))
{
Delete(db);
}
Close(db);
db = Open("ARTIKELSTATISTIK");
Select(db,"Artikelnummer == '999999'");
if(First(db))
{
Delete(db);
}
Close(db);
}
First(Table)
Aktiviert den ersten Datensatz
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Das Beispiel öffnet die Tabelle ARTIKEL und selektiert den Artikel mit der Artikelnummer 000001. Mit First() wird der erste Datensatz der aktuellen Selektion aktiviert. Liefert First() den Wert 1, wurde ein Datensatz gefunden und die Artikelnummer wird ausgegeben. Bei einem Rückgabewert von 0 wurde kein passender Datensatz gefunden.
Main()
{
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
Artikelnummer = GetFld("Artikelnummer",db);
print("Artikelnummer: " + Artikelnummer);
}
else
{
print("Artikel wurde nicht gefunden.");
}
Close(db);
}
GetFld(Field,Table,[PlainText])
Ermittelt den Wert des Datenbankfeldes
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Field | Feldname |
| 2 | Table | Datenbanknummer |
| 3 | PlainText | Optional: 1=Plaintext, [0=Richtext] |
Rückgabewert
Text
Verfügbarkeit
Standard
Beispiel
Das Beispiel öffnet die Tabelle ARTIKEL und selektiert den Artikel mit der Artikelnummer 000001. Mit GetFld() werden die Werte der Felder Artikelnummer und Bezeichnung des aktuellen Datensatzes gelesen und ausgegeben.
Beim Feld Zusatztext wird der optionale Parameter PlainText = 1 verwendet. Dadurch wird der Feldinhalt als reiner Text ohne Richtext-Formatierungen zurückgegeben.
Main()
{
db = Open("ARTIKEL");
Select(db,"Artikelnummer == '000001'");
if(First(db))
{
Artikelnummer = GetFld("Artikelnummer",db);
Bezeichnung = GetFld("Bezeichnung",db);
Zusatztext = GetFld("Zusatztext",db,1);
print("Artikelnummer: " + Artikelnummer);
print("Bezeichnung: " + Bezeichnung);
print("Zusatztext: " + Zusatztext);
}
Close(db);
}
IsField(Tablename,Field)
Ermittelt, ob ein bestimmtes Feld in der Tabelle vorhanden ist
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Tablename | Name der Datenbank |
| 2 | Field | Feldname |
Rückgabewert
1:Gültig, 0:Ungültig
Verfügbarkeit
Standard
Beispiel
Das Beispiel prüft, ob die angegebenen Felder in der Tabelle ARTIKEL vorhanden sind. IsField() liefert 1, wenn das Feld vorhanden ist, und 0, wenn das Feld nicht vorhanden ist.
Main()
{
if(IsField("ARTIKEL","Artikelnummer"))
{
print("Das Feld Artikelnummer ist vorhanden.");
}
else
{
print("Das Feld Artikelnummer ist nicht vorhanden.");
}
if(IsField("ARTIKEL","NichtVorhandenesFeld"))
{
print("Das Feld ist vorhanden.");
}
else
{
print("Das Feld ist nicht vorhanden.");
}
}
KeyReorg(Pfad,Dokumentart,[Verschmelzung])
Ändert mehrere Artikelnummern oder Kundennummern anhand einer Steuerdatei
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Pfad | Dateipfad der Steuerdatei |
| 2 | Dokumentart | Zurzeit nur Artikel oder Kunde möglich |
| 3 | Verschmelzung | Optional: 0=Keine Verschmelzung, 1=Verschmelzung der Daten |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Die Steuerdatei enthält je Zeile die bisherige und die neue Nummer, getrennt durch einen Tabulator.
Beispiel für Kunde.txt:
4711 4712
4713 4713
Bei Verschmelzung = 0 wird die Kundennummer geändert. Die neue Kundennummer darf dabei noch nicht vorhanden sein.
Bei Verschmelzung = 1 werden die Daten des bisherigen Kunden mit dem Zielkunden zusammengeführt. Im Beispiel werden die Daten des Kunden 4711 dem Kunden 4712 zugeordnet. Der Kunde 4711 wird anschließend gelöscht.
Für Artikel kann KeyReorg() entsprechend mit der Dokumentart Artikel verwendet werden.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
KundeDatei = Benutzerverzeichnis + "\\Kunde.txt";
ArtikelDatei = Benutzerverzeichnis + "\\Artikel.txt";
// Kundennummern anhand der Steuerdatei ändern
KeyReorg(KundeDatei,"Kunde",0);
// Kunden anhand der Steuerdatei zusammenführen
KeyReorg(KundeDatei,"Kunde",1);
// Artikelnummern anhand der Steuerdatei ändern
KeyReorg(ArtikelDatei,"Artikel");
}
Last(Table)
Aktiviert den letzten Datensatz
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Das Beispiel liest Daten aus der Textdatei XIMPORT.TXT im Benutzerverzeichnis ein. Für neue Artikel wird mit Last() der letzte Datensatz aktiviert und mit Next() ein neuer Datensatz vorbereitet.
Das Benutzerverzeichnis wird mit GetDirectory(14) ermittelt. Der tatsächliche Pfad ist benutzerabhängig und wird deshalb nicht fest vorgegeben.
Main()
{
Dateiname = strcat(GetDirectory(14), "\\XIMPORT.TXT");
OpenWait();
SetWaitText("Lesen (" + Dateiname + ")");
flnr = OpenFile(Dateiname,0);
Zeile = fgets(flnr);
weiter = strlen(Zeile);
while(weiter)
{
Zeile = fgets(flnr);
if(strlen(Zeile))
{
AN = strtok(Zeile,";",0);
BZ = strtok(Zeile,";",1);
P1 = Replace(strtok(Zeile,";",2),", ",".");
SetWaitText("Lesen (" + AN + ")");
Q = "select bezeichnun from lager ";
Q = Q + "where lager.artikelnum='" + AN + "'";
Ergebnis = strtok(Sql(Q),unmask("\\r\\n"),1);
if(strlen(Ergebnis) > 0)
{
Q = "update lager set ";
Q = Q + "lager.preis1=" + P1 + " ";
Q = Q + "where lager.artikelnum='" + AN + "';";
Sql(Q);
}
else
{
dbnr = Open("ARTIKEL");
Last(dbnr);
Next(dbnr);
SetFld("Artikelnummer",AN,dbnr);
SetFld("Bezeichnung",BZ,dbnr);
SetFld("Preis1",P1,dbnr);
Update(dbnr);
Close(dbnr);
dbnr = Open("ARTIKELSTATISTIK");
Last(dbnr);
Next(dbnr);
SetFld("Artikelnummer",AN,dbnr);
Update(dbnr);
Close(dbnr);
}
}
else
{
weiter = 0;
}
}
CloseFile(flnr);
CloseWait();
}
Next(Table)
Aktiviert den nächsten Datensatz
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Das Beispiel öffnet die Tabelle ARTIKEL und aktiviert mit First() den ersten Datensatz. Anschließend werden die Datensätze mit Next() nacheinander durchlaufen. Solange Next() den Wert 1 liefert, ist ein weiterer Datensatz vorhanden. Für jeden aktivierten Datensatz wird die Artikelnummer ausgegeben.
Main()
{
db = Open("ARTIKEL");
weiter = First(db);
while(weiter)
{
Artikelnummer = GetFld("Artikelnummer",db);
print("Artikelnummer: " + Artikelnummer);
weiter = Next(db);
}
Close(db);
}
Open(Tablename)
Öffnet eine Datenbank und liefert eine Datenbanknummer für den direkten Zugriff
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Tablename | Name der Datenbank |
Rückgabewert
Datenbanknummer, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Das Beispiel öffnet die Tabelle ARTIKEL mit Open(). Bei erfolgreichem Öffnen liefert die Funktion eine Datenbanknummer, die für den weiteren direkten Zugriff auf die Tabelle verwendet wird. Liefert Open() den Wert 0, konnte die Tabelle nicht geöffnet werden.
Nach der Verarbeitung wird die geöffnete Datenbank mit Close() wieder geschlossen.
Main()
{
db = Open("ARTIKEL");
if(db)
{
print("Datenbank wurde geöffnet. Datenbanknummer: " + db);
Close(db);
}
else
{
print("Datenbank konnte nicht geöffnet werden.");
}
}
Prev(Table)
Aktiviert den vorherigen Datensatz
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
QueryPrintJobs(Result,Dokumentart,ID)
Ermittelt die Druckjobs eines Dokuments
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Result | Name des Ergebnis-Arrays |
| 2 | Dokumentart | Angebot; Rechnung; Artikel |
| 3 | ID | ID des Dokuments |
Rückgabewert
Anzahl Druckjobs
Verfügbarkeit
42 Makro Runtime
Beispiel
Das Beispiel ermittelt die Druckjobs der Rechnung 000001 und exportiert die zugehörigen Dokumente in das Unterverzeichnis PrintJobs des Benutzerverzeichnisses.
Voraussetzung ist, dass die Rechnung bereits mindestens einmal gedruckt wurde und dadurch Druckjobs vorhanden sind. Das Benutzerverzeichnis wird mit GetDirectory(14) ermittelt. Ist das Unterverzeichnis PrintJobs noch nicht vorhanden, wird es automatisch erstellt.
Main()
{
Array = "PrintJobs";
Benutzerverzeichnis = GetDirectory(14);
Path = Benutzerverzeichnis + "\\PrintJobs";
if(strlen(FindFirstDir(Path)) == 0)
{
if(CreateDir(Path))
print("Exportverzeichnis wurde erstellt.");
else
print("Exportverzeichnis konnte nicht erstellt werden.");
}
db = Open("Rechnung");
Nr = "000001";
Filter = "Nummer == '" + Nr + "' ";
Select(db,Filter);
if(First(db))
{
ID = GetFld("Rechnungid",db,0);
Anzahl = QueryPrintJobs(Array,"Rechnung",ID);
print("Arr = " + GetArrayString(Array));
if(Anzahl)
{
for(i = 0; i = i + 1; i < Anzahl)
{
Name = GetArrayVal(Array,i,2);
AnID = GetArrayVal(Array,i,0);
if(AttExport(AnID,i,Path))
print(Name + " erfolgreich exportiert!");
else
print("Fehler bei Export von " + Name + "!");
}
}
}
Close(db);
}
Reset(Table)
Setzt den aktuellen Datensatz zurück
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Das Beispiel sucht den Kunden 000001 und setzt zunächst einen neuen Wert für Name2. Anschließend wird geprüft, ob beim Kunden eine Postleitzahl vorhanden ist. Fehlt die Postleitzahl, werden die mit SetFld() vorgenommenen Änderungen mit Reset() zurückgenommen. Nur wenn die Bedingung erfüllt ist, wird der Datensatz mit Update() gespeichert.
Reset() ist sinnvoll, wenn Änderungen an einem Datensatz zunächst vorbereitet werden, vor dem Speichern aber aufgrund einer Bedingung wieder verworfen werden sollen. SetFld() ändert dabei zunächst den aktuellen Arbeitsstand des Datensatzes. Erst Update() speichert die Änderungen dauerhaft. Wird vor Update() festgestellt, dass der Datensatz nicht gespeichert werden soll, können die Änderungen mit Reset() zurückgenommen werden.
Main()
{
db = Open("Kunde");
Select(db,"Kundennummer == '000001'");
if(First(db))
{
// Änderung zunächst vorbereiten
SetFld("Name2","Geänderter Wert",db);
// Fachliche Voraussetzung prüfen
PLZ = GetFld("PLZ",db);
if(strlen(PLZ) == 0)
{
// Änderung verwerfen und Datensatz nicht speichern
Reset(db);
print("Änderung wurde verworfen, da keine PLZ vorhanden ist.");
}
else
{
// Änderung speichern
Update(db);
print("Änderung wurde gespeichert.");
}
}
Close(db);
}
Select(Table,Filter)
Selektiert die Datenbank nach dem Filterkriterium
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | Filter | Selektion |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Select(db,"Name == 'Huber' || Name == 'Meier'");
SetFld(Field,Value,Table)
Setzt den Inhalt eines Datenbankfeldes
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Field | Feldname |
| 2 | Value | Feldinhalt |
| 3 | Table | Datenbanknummer |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Bewegung innerhalb einer Datenbank, Löschen oder Editieren von Datensätzen.
Main()
{
// Datenbank öffnen
dbnr = Open ("Kunde");
// sortieren
Sort (dbnr, "Kundennummer", "Name");
// Sortierrichtung abwärts
SortDir (dbnr, 1);
// selektieren
Name1 = "Huber";
Name2 = "Meier";
Filter = "Name == '" + Name1 + "' || Name == '" + Name2 + "'";
Select (dbnr, Filter);
// zum ersten Datensatz
weiter = First (dbnr);
// alle lesen
while(weiter)
{
// Daten lesen
Name = GetFld ("Name", dbnr);
Name = Name + "YYY";
// Daten schreiben
SetFld ("Name2", Name, dbnr);
// Datensatz updaten
Update (dbnr);
// nächster Datensatz aktivieren
weiter = Next (dbnr);
}
// letzten löschen
Delete (dbnr);
// Datenbank schließen
Close (dbnr);
// Datenbank von vorne nach hinten durchlaufen
dbnr = Open("Kunde");
weiter = First(dbnr);
while(weiter)
{
print("Name = "+GetFld("Name", dbnr));
weiter = Next(dbnr);
}
Close(dbnr);
}
Sort(Table,[Field1],[Field2],[Field3],[Field4])
Sortiert die Datenbank nach bis zu 4 Datenbankfeldern
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | Field1 | Optional: 1.Sortierfeld |
| 3 | Field2 | Optional: 2.Sortierfeld |
| 4 | Field3 | Optional: 3.Sortierfeld |
| 5 | Field4 | Optional: 4.Sortierfeld |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Bewegung innerhalb einer Datenbank, Löschen oder Editieren von Datensätzen.
Main()
{
// Datenbank öffnen
dbnr = Open ("Kunde");
// sortieren
Sort (dbnr, "Kundennummer", "Name");
// Sortierrichtung abwärts
SortDir (dbnr, 1);
// selektieren
Name1 = "Huber";
Name2 = "Meier";
Filter = "Name == '" + Name1 + "' || Name == '" + Name2 + "'";
Select (dbnr, Filter);
// zum ersten Datensatz
weiter = First (dbnr);
// alle lesen
while(weiter)
{
// Daten lesen
Name = GetFld ("Name", dbnr);
Name = Name + "YYY";
// Daten schreiben
SetFld ("Name2", Name, dbnr);
// Datensatz updaten
Update (dbnr);
// nächster Datensatz aktivieren
weiter = Next (dbnr);
}
// letzten löschen
Delete (dbnr);
// Datenbank schließen
Close (dbnr);
// Datenbank von vorne nach hinten durchlaufen
dbnr = Open("Kunde");
weiter = First(dbnr);
while(weiter)
{
print("Name = "+GetFld("Name", dbnr));
weiter = Next(dbnr);
}
Close(dbnr);
}
SortDir(Table,Field1Dir,[Field2Dir],[Field3Dir],[Field4Dir])
Setzt die Sortierrichtung innerhalb einer Datenbank
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | Field1Dir | Richtung: 0=Vorwärts, 1=Rückwärts |
| 3 | Field2Dir | Optional: Richtung: 0=Vorwärts, 1=Rückwärts |
| 4 | Field3Dir | Optional: Richtung: 0=Vorwärts, 1=Rückwärts |
| 5 | Field4Dir | Optional: Richtung: 0=Vorwärts, 1=Rückwärts |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
Beispiel
Bewegung innerhalb einer Datenbank, Löschen oder Editieren von Datensätzen.
Main()
{
// Datenbank öffnen
dbnr = Open ("Kunde");
// sortieren
Sort (dbnr, "Kundennummer", "Name");
// Sortierrichtung abwärts
SortDir (dbnr, 1);
// selektieren
Name1 = "Huber";
Name2 = "Meier";
Filter = "Name == '" + Name1 + "' || Name == '" + Name2 + "'";
Select (dbnr, Filter);
// zum ersten Datensatz
weiter = First (dbnr);
// alle lesen
while(weiter)
{
// Daten lesen
Name = GetFld ("Name", dbnr);
Name = Name + "YYY";
// Daten schreiben
SetFld ("Name2", Name, dbnr);
// Datensatz updaten
Update (dbnr);
// nächster Datensatz aktivieren
weiter = Next (dbnr);
}
// letzten löschen
Delete (dbnr);
// Datenbank schließen
Close (dbnr);
// Datenbank von vorne nach hinten durchlaufen
dbnr = Open("Kunde");
weiter = First(dbnr);
while(weiter)
{
print("Name = "+GetFld("Name", dbnr));
weiter = Next(dbnr);
}
Close(dbnr);
}
Sql(Query,[MaxRows],[RowDel],[ColDel],[Msg],[Titel],[CacheSeconds])
Ermittelt das Ergebnis einer SQL-Abfrage
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Query | SQL Abfrage |
| 2 | MaxRows | Optional: Maximale Anzahl der Ergebniszeilen |
| 3 | RowDel | Optional: Delimiter für Zeilen |
| 4 | ColDel | Optional: Delimiter für Spalten |
| 5 | Msg | Optional: Fehlermeldungen (1/0) |
| 6 | Titel | Optional: Titel ausgeben [1=Ja] |
| 7 | CacheSeconds | Optional: Dauer in Sekunden, wie lange diese Abfrage zwischengespeichert wird (nur für Statische Zwecke geeignet) |
Rückgabewert
Text
Verfügbarkeit
Standard
Beispiel
Das Beispiel liest Daten aus der Textdatei XIMPORT.TXT ein und verarbeitet diese weiter.
Die Textdatei ist semikolongetrennt aufgebaut. Die erste Zeile enthält die Feldbezeichnungen, die folgenden Zeilen die zu importierenden Datensätze.
ArtNr;Bezeichnung;Preis1
123456;Dampflok schwarz und rot;80,50
123457;Dampflok schwarz und gelb;82,50
Main()
{
// Grundwerte
Dateiname = strcat(GetDirectory (14), "\\XIMPORT.TXT");
// Öffnen
OpenWait ();
SetWaitText ("Lesen ("+Dateiname+")");
flnr = OpenFile (Dateiname, 0);
// einlesen
Zeile= fgets (flnr);
weiter=strlen(Zeile);
while(weiter)
{
// Zeile einlesen
Zeile=fgets(flnr);
// ist was vorhanden
if(strlen(Zeile))
{
AN= strtok (Zeile, ";", 0);
BZ=strtok(Zeile, ";", 1);
P1= Replace (strtok(Zeile, ";", 2), ", ", ".");
SetWaitText("Lesen ("+AN+")");
// suchen
Q="select bezeichnun from lager ";
Q=Q+"where lager.artikelnum='"+AN+"'";
Ergebnis=strtok(SQL (Q), unmask("\r\n"), 1);
// schon vorhanden
if(strlen(Ergebnis)>0)
{
// Update, die schon drin sind
Q="update lager set ";
Q=Q+"lager.preis1="+P1+" ";
Q=Q+"where lager.artikelnum='"+AN+"';";
SQL (Q);
}
else
{
// einfügen in LAGER
dbnr= Open ("ARTIKEL");
Last (dbnr);
Next (dbnr);
SetFld ("Artikelnummer", AN, dbnr);
SetFld("Bezeichnung", BZ, dbnr);
SetFld("Preis1", P1, dbnr);
Update (dbnr);
Close (dbnr);
// einfügen in ARTSTAT
dbnr=Open("ARTIKELSTATISTIK");
Last(dbnr);
Next(dbnr);
SetFld("Artikelnummer", AN, dbnr);
Update(dbnr);
Close(dbnr);
}
}
else
weiter=0;
}
// beenden
CloseFile (flnr);
CloseWait ();
}
SqlArray(Array,Query,[MaxRows],[Msg],[Titel],[CacheSeconds])
Führt eine SQL-Abfrage aus und speichert das Ergebnis in einem Array
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Array | Name des Arrays |
| 2 | Query | SQL Abfrage |
| 3 | MaxRows | Optional: Maximale Anzahl der Ergebniszeilen |
| 4 | Msg | Optional: Fehlermeldungen (1/0) |
| 5 | Titel | Optional: Titel ausgeben [1=Ja] |
| 6 | CacheSeconds | Optional: Dauer in Sekunden, wie lange diese Abfrage zwischengespeichert wird (nur für Statische Zwecke geeignet) |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Main()
{
erg = SqlArray("Kunden", "select1 kundennumm nummer, name, ort from kunde");
print("Ergebnis = "+erg);
print("Inhalt des Array = "+GetArrayString("Kunden"));
}
SqlExecute(Query,[Msg])
Führt SQL-Befehle aus, bei denen kein Resultset zurückgegeben wird.
SqlExecute() ist für Schreibzugriffe und SQL-Anweisungen vorgesehen, die Daten oder Datenbankobjekte verändern, beispielsweise INSERT, UPDATE, DELETE, SELECT ... INTO, CREATE TABLE oder DROP TABLE.
Im Unterschied zu Sql() werden die Befehle bei SqlExecute() auf einer Ebene ausgeführt, bei der die verwendete Datenbankverbindung gehalten wird. Dadurch können beispielsweise temporäre Tabellen innerhalb dieser Verbindung weiterhin verwendet werden.
Mit der DB-Schnittstelle werden Datenbankverbindungen nach normalen SQL-Abfragen aktiv geschlossen. Temporäre Tabellen sind nach dem Schließen der Verbindung nicht mehr verfügbar. Dies wirkt sich insbesondere auf SQL-Anweisungen wie SELECT ... INTO, CREATE TABLE oder DROP TABLE aus. Normale lesende Abfragen sind davon nicht betroffen.
Für reine Abfragen mit einem Ergebnis sollten Sql(), SqlArray() oder SqlValue() verwendet werden. SqlExecute() ist insbesondere dann zu verwenden, wenn Schreibzugriffe ohne Ergebnis ausgeführt werden sollen oder eine bestehende Verbindung für nachfolgende SQL-Anweisungen benötigt wird.
Hinweis: Direkte Schreibzugriffe sowie das Anlegen oder Löschen von Tabellen über SQL werden grundsätzlich nicht empfohlen und sollten nur verwendet werden, wenn dies für den jeweiligen Anwendungsfall erforderlich ist.
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Query | SQL Abfrage |
| 2 | Msg | Optional: Fehlermeldungen (1/0) |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
SqlValue(Query,[Msg],[CacheSeconds])
Ermittelt das Ergebnis einer SQL-Abfrage mit einem einzigen Ergebniswert
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Query | SQL Abfrage |
| 2 | Msg | Optional: Fehlermeldungen (1/0) |
| 3 | CacheSeconds | Optional: Dauer in Sekunden, wie lange diese Abfrage zwischengespeichert wird (nur für Statische Zwecke geeignet) |
Rückgabewert
Text
Verfügbarkeit
42 Makro Runtime
Beispiel
Das Beispiel ermittelt den Namen des Kunden mit der Kundennummer 000001. Da SqlValue() genau einen einzelnen Ergebniswert zurückliefert, kann der Rückgabewert direkt einer Variablen zugewiesen werden.
Mit dem Parameter Msg kann die Ausgabe von Fehlermeldungen gesteuert werden. CacheSeconds gibt an, wie viele Sekunden das Ergebnis der SQL-Abfrage zwischengespeichert wird. Der Wert 0 bedeutet, dass keine Zwischenspeicherung erfolgt.
Die Zwischenspeicherung eignet sich insbesondere für Abfragen auf Werte, die sich nur selten ändern. Bei häufig veränderten Daten sollte CacheSeconds entsprechend klein gewählt oder auf 0 gesetzt werden.
Main()
{
Kundennummer = "000001";
Query = "select name from kunde ";
Query = Query + "where kundennumm='" + Kundennummer + "'";
Name = SqlValue(Query,1,0);
print("Kundenname: " + Name);
}
Start(Funktion,[Par1],[Par2])
Startet eine interne freigegebene Programmfunktion
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Funktion | Funktionsname |
| 2 | Par1 | Optional: [1.Parameter] |
| 3 | Par2 | Optional: [2.Parameter] |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
Standard
StartImport([SessionID],[Validate])
Aktiviert und verarbeitet den Importstapel
Mit dem Parameter SessionID kann gezielt eine bestimmte Importsession gestartet werden. Dabei werden ausschließlich die Datensätze verarbeitet, die über die ISTARTID dieser Session zugeordnet sind. Andere gleichzeitig im Importverzeichnis vorhandene Datensätze bleiben unberücksichtigt.
Die Verwendung einer ISTARTID ist insbesondere im Mehrbenutzerbetrieb empfehlenswert. Ohne eine Zuordnung über die ISTART-Tabelle verarbeitet der Belegimport grundsätzlich alle gefundenen Importdateien, die keinem ISTART-Eintrag zugeordnet sind. Die ISTARTID stellt somit die eindeutige Verbindung zwischen einem gestarteten Import und den dazugehörigen Datensätzen her und verhindert, dass versehentlich Daten eines anderen Imports mit verarbeitet werden.
Mit dem Parameter Validate kann festgelegt werden, ob der Import tatsächlich ausgeführt oder nur geprüft werden soll. Bei Validate = 1 wird ein reiner Validierungslauf durchgeführt. Die Daten werden dabei geprüft, jedoch nicht importiert. Mit Validate = 0 erfolgt der tatsächliche Import.
Wird keine SessionID angegeben, erfolgt keine gezielte Einschränkung auf eine bestimmte Importsession. Für Prozesse, bei denen mehrere Benutzer oder Anwendungen gleichzeitig Importdaten bereitstellen, sollte daher nach Möglichkeit mit einer eindeutigen ISTARTID gearbeitet werden.
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | SessionID | Optional: Started eine einzelne Importsession, bei der die Spalte IStartID des Importstapels verwendet wurde |
| 2 | Validate | Optional: Nur Validierungslauf: Es werden dabei keinerlei Datensätze importiert! ([0:Echtlauf], 1=Validierung) |
Rückgabewert
0: OK, >0: Anzahl ignorierter Belege, da in Bearbeitung oder fehlerhaft, -1: Stapel in Benutzung, Vorgang abgebrochen
Verfügbarkeit
Standard
Beispiel
Main()
{
StartImport();
StartImport("B2C78264-F823-7F4D-ABD3-3FE8CE849FE8");
StartImport("B2C78264-F823-7F4D-ABD3-3FE8CE849FE8", "1");
StartImport("", "1");
}
Update(Table,[InsertOnly])
Speichert den aktuellen Datensatz der entsprechenden Datenbank zurück
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | InsertOnly | Optional: 0=Insert oder Update, 1=Neu |
Rückgabewert
1:OK, 0:Fehler
Verfügbarkeit
Standard
Beispiel
Bewegung innerhalb einer Datenbank, Löschen oder Editieren von Datensätzen.
Main()
{
// Datenbank öffnen
dbnr = Open ("Kunde");
// sortieren
Sort (dbnr, "Kundennummer", "Name");
// Sortierrichtung abwärts
SortDir (dbnr, 1);
// selektieren
Name1 = "Huber";
Name2 = "Meier";
Filter = "Name == '" + Name1 + "' || Name == '" + Name2 + "'";
Select (dbnr, Filter);
// zum ersten Datensatz
weiter = First (dbnr);
// alle lesen
while(weiter)
{
// Daten lesen
Name = GetFld ("Name", dbnr);
Name = Name + "YYY";
// Daten schreiben
SetFld ("Name2", Name, dbnr);
// Datensatz updaten
Update (dbnr);
// nächster Datensatz aktivieren
weiter = Next (dbnr);
}
// letzten löschen
Delete (dbnr);
// Datenbank schließen
Close (dbnr);
// Datenbank von vorne nach hinten durchlaufen
dbnr = Open("Kunde");
weiter = First(dbnr);
while(weiter)
{
print("Name = "+GetFld("Name", dbnr));
weiter = Next(dbnr);
}
Close(dbnr);
}
XmlExport(Table,FileName,[Schema],[MaxRecords],[Open],[Filter])
Erstellt eine XML Datei mit dem Inhalt des Datensatzes mit oder ohne XML Definition
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | FileName | Dateiname |
| 3 | Schema | Optional: XML Definition |
| 4 | MaxRecords | Optional: Maximale Anzahl der exportieren Datensätze [0=Alle] |
| 5 | Open | Optional: Nach erfolgreichen Export XML Dokument anzeigen [1=Anzeige] |
| 6 | Filter | Optional: Selektion |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
42 Makro Runtime & 42 XML
Beispiel
Das Beispiel exportiert ausschließlich den Artikel mit der Artikelnummer 000001 als XML-Datei.
Das Benutzerverzeichnis wird mit GetDirectory(14) ermittelt. Die erzeugte Datei wird dort unter dem Namen Artikel_Export.xml gespeichert.
Mit dem Filter
Artikelnummer == '000001'
wird festgelegt, dass nur dieser Artikeldatensatz exportiert wird.
Der Parameter MaxRecords = 1 begrenzt den Export auf maximal einen Datensatz. Mit Open = 1 wird die erzeugte XML-Datei nach dem erfolgreichen Export automatisch geöffnet.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
ExportDatei = Benutzerverzeichnis + "\\Artikel_Export.xml";
db = Open("ARTIKEL");
// Nur den Artikel 000001 als XML-Datei exportieren
XmlExport(db,ExportDatei,"",1,1,"Artikelnummer == '000001'");
Close(db);
}
XmlGet(Table,[InsertHeader])
Liefert den Inhalt des Datensatzes als XML
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | InsertHeader | Optional: Header einfügen [1=Ja] |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
42 Makro Runtime & 42 XML
XmlImport(FileName,[Schema],[ElementTag],[RecordIndex],[Recursive],[Replace])
Importiert eine XML Datei mit oder ohne XML Definition
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | FileName | Dateiname |
| 2 | Schema | Optional: XML Definition |
| 3 | ElementTag | Optional: XML Tagname, z.B. KUNDE |
| 4 | RecordIndex | Optional: [-1]=Alle, 0-?=Index des zu Importierenden Datensatzes |
| 5 | Recursive | Optional: Rekursiv [0]=Nein, nur Hauptdatensätze, [1]=Inklusive sämtlicher Childnodes. |
| 6 | Replace | Optional: [0]=Nur neue Datensätze importieren, 1=Ersetzen |
Rückgabewert
0:Success: Import erfolgreich
1:Error: Fehler beim Import
Verfügbarkeit
42 Makro Runtime & 42 XML
Beispiel
Das Beispiel importiert einen neuen Artikel mit der Artikelnummer 999999 und legt anschließend den dazugehörigen Datensatz in der Artikelstatistik an.
Die beiden XML-Dateien müssen im Benutzerverzeichnis vorhanden sein. Das Benutzerverzeichnis wird mit GetDirectory(14) ermittelt.
Für den Artikelimport wird die Datei XMLImport_Artikel.xml verwendet. Anschließend wird mit XML_ImportArtikelstatistik.xml der zugehörige Statistikdatensatz angelegt.
Der Rückgabewert von XmlImport() lautet bei einem erfolgreichen Import 0: Success und bei einem Fehler 1:Error. Im Beispiel wird deshalb das erste Zeichen des Rückgabewerts geprüft. Nur wenn der Artikel erfolgreich importiert wurde, erfolgt anschließend der Import der Artikelstatistik.
Main()
{
Benutzerverzeichnis = GetDirectory(14);
ArtikelDatei = Benutzerverzeichnis + "\\XMLImport_Artikel.xml";
StatistikDatei = Benutzerverzeichnis + "\\XML_ImportArtikelstatistik.xml";
// Artikel importieren
Ergebnis = XmlImport(ArtikelDatei,"","",0,0,0);
if(stricmp(Left(Ergebnis,1),"0") == 0)
{
print("Artikel 999999 wurde erfolgreich importiert.");
// Zugehörigen Statistikdatensatz importieren
Ergebnis = XmlImport(StatistikDatei,"","",0,0,0);
if(stricmp(Left(Ergebnis,1),"0") == 0)
{
print("Artikelstatistik wurde erfolgreich importiert.");
}
else
{
print("Fehler beim Import der Artikelstatistik: " + Ergebnis);
}
}
else
{
print("Fehler beim Import des Artikels: " + Ergebnis);
}
}
Aufbau der Datei XMLImport_Artikel.xml
Die XML-Datei enthält den anzulegenden Artikel. Im Beispiel wird der Artikel 999999 mit der Bezeichnung XMLImport, dem Preis 19.990 und dem Zusatztext Artikel per XML-Import angelegt angelegt.
Für LAGERID muss eine eindeutige GUID verwendet werden. Die im Beispiel angegebene GUID darf bei einer erneuten Verwendung des Beispiels nicht bereits vorhanden sein.
Der Inhalt der Datei kann wie folgt aufgebaut werden und direkt kopiert werden:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<ARTIKEL>
<ARTIKELNUMMER>999999</ARTIKELNUMMER>
<BEZEICHNUNG>XMLImport</BEZEICHNUNG>
<PREIS1>19.990</PREIS1>
<LAGERID><![CDATA[81ff0133-fa50-4563-b267-36d750593503]]></LAGERID>
<ZUSATZTEXT><![CDATA[Artikel per XML-Import angelegt]]></ZUSATZTEXT>
</ARTIKEL>
</ROOT>
Aufbau der Datei XML_ImportArtikelstatistik.xml
Beim XML-Import eines Artikels wird der zugehörige Datensatz in ARTIKELSTATISTIK nicht automatisch angelegt. Dieser muss deshalb mit einer zweiten XML-Datei importiert werden.
Die Statistikfelder enthalten die Initialwerte 0.000, 0.00000 beziehungsweise 0.00. Die ARTIKELNUMMER muss mit der Artikelnummer des zuvor importierten Artikels übereinstimmen. Für ARTSTATID muss eine eigene eindeutige GUID verwendet werden.
Der Inhalt der Datei kann wie folgt aufgebaut werden und direkt kopiert werden:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<ARTIKELSTATISTIK>
<ABRUFAUFTRAG>0.000</ABRUFAUFTRAG>
<ABRUFBESTELLUNG>0.000</ABRUFBESTELLUNG>
<ARTIKELNUMMER>999999</ARTIKELNUMMER>
<ARTSTATID><![CDATA[916c1644-1c48-4837-a77c-8fcef211fc67]]></ARTSTATID>
<AUFTRAG>0.000</AUFTRAG>
<BEARBEITET><![CDATA[04.09.2026 14:42:17]]></BEARBEITET>
<BESTAND>0.000</BESTAND>
<BESTELLUNG>0.000</BESTELLUNG>
<EKMITTEL>0.00000</EKMITTEL>
<EKMITTEL2>0.00000</EKMITTEL2>
<EXTERNRESERVE>0.000</EXTERNRESERVE>
<FERTIGUNG>0.000</FERTIGUNG>
<GESAMTANZAHL>0.000</GESAMTANZAHL>
<GESAMTPREIS>0.00</GESAMTPREIS>
<LETZTEANZAHL>0.000</LETZTEANZAHL>
<LETZTEREK>0.00000</LETZTEREK>
<UMSATZ>0.00</UMSATZ>
<UMSATZANZAHL>0.000</UMSATZANZAHL>
<WARENZUGANG>0.000</WARENZUGANG>
</ARTIKELSTATISTIK>
</ROOT>
XmlLoad(Table,FileName,ElementTag,[Index])
Lädt einen Datensatz von einer XML Datei
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | FileName | Dateiname |
| 3 | ElementTag | Elementname |
| 4 | Index | Optional: Index |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
42 Makro Runtime & 42 XML
XmlSave(Table,FileName)
Speichert den Datensatz als XML Datei
Parameter
| Nr. | Parameter | Beschreibung |
|---|---|---|
| 1 | Table | Datenbanknummer |
| 2 | FileName | Dateiname |
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
Verfügbarkeit
42 Makro Runtime & 42 XML