# DocumentFields-Element

Im Bereich `DocumentFields` definieren Sie, die einzelnen Felder, welche beim Import befüllt werden sollen.&#x20;

```xml
<DocumentFields>
  <DOCDATE>GetFileDate()</DOCDATE>
  <DOCNUMER>GetFileName().Split('_', '.')[2]</DOCNUMER>
  <KEYWORD>"Bestellung Nr. " + GetFileName().Split('_', '.')[2]</KEYWORD>
  <CATEGORY>"Bestellung"</CATEGORY>
  <OWNERNAME>"Alle (öffentlich)"</OWNERNAME>
</DocumentFields>
```

Das Element wird dabei immer so bezeichnet, wie das Feld in der Datenbank heisst (Beispiel: Stichwort = KEYWORD). Der Inhalt der Elemente ist Programmcode und kann beliebig zusammengestellt werden. Bitte beachten Sie, dass der Datentyp des Programmcodes mit dem Feldtyp übereinstimmen muss.

{% tabs %}
{% tab title="Beispiel" %} <mark style="color:red;">**FALSCH:**</mark> \<KEYWORD>GetFileDate()\</KEYWORD>

{% hint style="info" %}
Das Feld Keyword ist ein varchar-Feld, somit muss der Datums-Wert in einen String gewandelt werden.
{% endhint %}

<mark style="color:green;">**RICHTIG:**</mark> \<KEYWORD>GetFileDate().ToString()\</KEYWORD>
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Beispiel" %} <mark style="color:red;">**FALSCH:**</mark> \<DOCDATE>"14.07.2014"\</DOCDATE>

{% hint style="info" %}
Das Feld DocDate ist ein Datumsfeld welches keinen String-Wert aufnehmen kann.
{% endhint %}

<mark style="color:green;">**RICHTIG:**</mark> \<DOCDATE>DateTime.Parse("14.07.2014")\</DOCDATE>
{% endtab %}
{% endtabs %}

Soll ein Text ausgegeben werden, muss dieser in Anführungszeichen gesetzt werden. Sollte in solchen Elementen Zeichen notwendig sein, die in XML-Elementen nicht erlaubt sind (z.B. > oder <), kann der komplette Inhalt in CData-Tags eingefasst werden. Beispiel:

```xml
<DocumentFields>
  <Keyword><![CDATA["Dokument < Auftrag vom " + DateTime.Now.ToString()]]></Keyword>
</DocumentFields>
```

Für den Zugriff auf Informationen der Quelldatei stehen folgende Funktionen zur Verfügung:b

<table><thead><tr><th width="315">Funktion</th><th>Beschreibung</th></tr></thead><tbody><tr><td><strong>GetFileDate()</strong></td><td>Liefert das Änderungsdatum der zu importierenden Datei zurück</td></tr><tr><td><strong>GetFileDate().ToShortDateString()</strong></td><td>Liefert das Änderungsdatum der zu importierenden Datei in der Kurzform (dd.mm.YYYY) zurück</td></tr><tr><td><strong>GetFileName()</strong></td><td>Liefert den Namen der zu importierenden Datei (ohne Pfad inkl. Dateiendung) zurück</td></tr><tr><td><strong>System.IO.Path.GetFileNameWithoutExtension(GetFileName())</strong></td><td>Liefert den Namen der zu importierenden Datei (ohne Pfad und ohne Dateiendung) zurück</td></tr><tr><td><strong>GetFilePath()</strong></td><td>Liefert den vollständigen Pfad der zu importierenden Datei zurück</td></tr></tbody></table>

Um eine hohe Flexibilität und Erweiterbarkeit zu erreichen, wurde die Anwendung so erstellt, dass verschiedene Werte als C#-Programmcode interpretiert werden. Somit kann bei der Definition der Parameter auf die komplette .NET Bibliothek und sogar eigene Bibliotheken zugegriffen werden. Als Faustregel gilt: Alle Werte, die innerhalb von Elementen definiert werden, sind Programmcode und müssen entsprechend formuliert sein. Hier einige oft eingesetzte Beispiele:

<table><thead><tr><th width="312">Funktion</th><th>Beschreibung</th></tr></thead><tbody><tr><td><strong>GetFileName().Split('_', '.')[0]</strong></td><td><p>Splittet den Dateinamen in einzelne Bereiche. Als Trennzeichen wird nach dem '_' oder '.' gesucht. Die [0] gibt an, welcher Wert zurückgeliefert wird.</p><p></p><p><strong>Beispiel:</strong> der Dateiname lautet <code>1023_Rechnung_23923.pdf</code> </p><p>Ergebnis: mit [0] wird der Wert 1023 zurückgeliefert.</p><p></p><p>Mit [1] würde der Wert <strong>Rechnung</strong> und mit [2] der Wert <strong>23923</strong> zurückgeliefert.</p></td></tr><tr><td><strong>GetFileName().Substring(0,2)</strong></td><td><p>Liefert einen Bestandteil (Substring) des Dateinamens zurück. Dabei ist die Startposition und die Länge des Wertes einstellbar.</p><p></p><p><strong>Beispiel:</strong> der Dateiname lautet <code>RE1023_23923.pdf</code> </p><p>Ergebnis: mit (0,2) wird der Wert <strong>RE</strong> zurückgeliefert.</p><p></p><p>Mit (3,4) würde der Wert <strong>1023</strong> und mit (8,5) der Wert <strong>23923</strong> zurückgeliefert.</p><p></p><p>Die Methode setzt voraus, dass der Dateiname immer im gleichen Schema daherkommt.</p></td></tr><tr><td><strong>LeftOf(GetFileName(), "_")</strong></td><td>Liefert den Text, der links neben dem angegebenen Trenner steht</td></tr><tr><td><strong>RightOf(GetFileName(), "_")</strong></td><td>Liefert den Text, der rechts neben dem angegebenen Trenner steht</td></tr><tr><td><strong>RightOfLastElement (System.IO.Path.GetFileNameWithoutExtension(GetFileName()),"-")</strong></td><td>Liefert den Text von rechts bis zu einem definierten Trenner (im Beispiel - )</td></tr></tbody></table>

Soll ein Text ausgegeben werden, muss dieser in Anführungszeichen gesetzt werden. Beispiel:

```xml
<CATEGORY>"Rechnung"</CATEGORY>
```

Dies lässt sich auch individuell kombinieren, wenn Sie etwa eine fixe Bezeichnung sowie einen Bestandteil aus dem Dateinamen kombinieren möchten. Beispiel:

```xml
<KEYWORD>"Rechnung Nr. " + GetFileName().Split('_', '.')[2]</KEYWORD>
```

## Automatische Dokumentnummer

Die Dokumentennummer lässt sich mit folgendem Befehl automatisch generieren. Dabei wird die nächst verfügbare Nummer aus CAS genesisWorld ausgelesen und gesetzt.

```xml
<DOCNUMBER>GenerateNewNumber()</DOCNUMBER>
```

{% hint style="info" %}
**Gut zu wissen**

Da diese Routine nichts von dem Datensatz weiss, wo die generierte Nummer eingetragen werden soll, kann diese nicht prüfen, ob dort bereits eine vorhanden ist. Sprich: wird der Versionstyp ‘NewOrUpdateDocument’ verwendet und ist das Dokument bereits vorhanden, wird auch dort eine neue Nummer generiert.
{% endhint %}

Um im Fall 'NewOrUpdateDocument' nur eine Nummer zu generieren, wenn es das Dokument noch nicht im CRM gibt, steht folgende Option zur Verfügung:

```xml
<DOCNUMBER>GenerateNewNumberIfNotExists("DOC_BELEGNUMMER = '" + GetFileName().Split('_')[0] + "'")</DOCNUMBER>
```

Das Beispiel generiert eine neue Nummer, wenn der Datensatz über den angegebenen Filter (im Beispiel Datenbankfeld DOC\_BELEGNUMMER) nicht gefunden wird.

## Teilnehmer/Fremdzugriffsrechte

Die Teilnehmer und Fremdzugriffsrechte lassen sich ebenfalls individuell vergeben. Dabei muss der Wert eine kommaseparierte Liste von Benutzer- oder Gruppennamen enthalten. Werden keine Angaben gemacht, werden die Dokumente mit dem Teilnehmer 'Alle öffentlich' archiviert. Beispiel:

```xml
<OWNERNAME>"Buchhaltung, Verwaltung"</OWNERNAME>
<FOREIGNEDITPERMISSION>"-1"</FOREIGNEDITPERMISSION>
```

Mit FOREIGNEDITPERMISSION lassen sich die Fremdzugriffsrechte setzen. Dabei werden folgende Werte unterstützt:

<table><thead><tr><th width="116">Wert</th><th>Beschreibung</th></tr></thead><tbody><tr><td>"-1"</td><td>Das Dokument wird mit dem Fremdzugriffsrecht 'persönlich' archiviert</td></tr><tr><td>"0"</td><td>Das Dokument wird mit dem Fremdzugriffsrecht 'vertraulich' archiviert</td></tr><tr><td>"65535"</td><td>Das Dokument wird mit dem Fremdzugriffsrecht 'vollständige Rechte' archiviert</td></tr></tbody></table>

Im obigen Beispiel würde das Dokument mit den Teilnehmern 'Buchhaltung' und 'Verwaltung' archiviert werden und das Fremdzugriffsrecht auf persönlich gesetzt. Es ist dabei wichtig, dass die Schreibweise 1:1 den Gruppen/Benutzernamen aus CAS genesisWorld entsprechen.

<div align="left"><figure><img src="/files/l4K8uNR8hE76uSXVfk2q" alt=""><figcaption></figcaption></figure></div>

<br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.artwin.ch/dokumentimporter/dokumentation/job-definition/documentfields-element.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
