Beispiel für die Anbindung an ein ALVA DMS


Im folgenden wird Anhand eines Beispieles kurz beschrieben, wie Daten von Xima® Formcycle an ein ALVA9 System übertragen werden können. 

Grundlegende Vorgehensweise

Zum Übertragen von Daten aus einem Formular an ein ALVA9 System muss eine XML-Datei mit den Informationen generiert und zusammen mit allen anderen zu speichernden Daten in einem ZIP-Archiv gepackt und in einem Austauschverzeichnis abgelegt werden, von dem aus ALVA9 sie automatisch importiert.

Workflow im Beispiel

Im Formularstore kann das Beispielformular mit dem Namen "ALVA Sonn- und Feiertagsverbot" importiert oder heruntergeladen werden. In diesem werden Informationen gesammelt und diese nach dem Absenden des Formulars im Workflow über eine XSL-Transformation in ein für ALVA9 importierbares XML-Format umgewandelt. Anschließend erstellt der Workflow aus diese XML-Datei, allen im Formular übertragenen Daten und einer PDF-Druckquittung ein ZIP-Archiv.
Dieses wird anschließend in das Austauschverzeichnis gespeichert. Das Austauschverzeichnis ist im Beispielformular noch nicht konfiguriert und muss in den jeweiligen Aktionen zunächst noch festgelegt werden. Der Grund dafür ist, dass der Pfade nicht allgemengültig sind und vom jeweiligen System abhängen, in welches das Beispielformular importiert wurde.

Inhalt und Erstellung der XML-Datei

Die XML-Datei mit allen im Formular eingegebenen Daten wird über eine sagenannte XSL-Transformation erzeugt. Die Struktur der erzeugten XML-Datei wird dabei von ALVA9 vorgegeben und besteht im Beispiel aus den Konten daten und datensatz, wobei in letzteren die einzelnen Informationen als eigene Unterknoten eingefügt werden. 

Die vollständige XSL-Transformation für das Beispiel sieht wie folgt aus:

XSL-Transformation des Beispielformulars

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="process">
<daten>
 <datensatz>
<NAME1><xsl:value-of select="form/field[@name='tfOrgName']/plainValue"/> <xsl:value-of select="form/field[@name='Rechtsform']/plainValue"/></NAME1>
<NAME2><xsl:value-of select="form/field[@name='tfAntragstellerAnrede']/plainValue"/> <xsl:value-of select="form/field[@name='tfAntragstellerTitel']/plainValue"/> <xsl:value-of select="form/field[@name='tfAntragstellerVorname']/plainValue"/> <xsl:value-of select="form/field[@name='tfAntragstellerName']/plainValue"/></NAME2>
<NAME3><xsl:value-of select="form/field[@name='']/plainValue"/></NAME3>
       <NAME4><xsl:value-of select="form/field[@name='']/plainValue"/></NAME4>
<STRASSE><xsl:value-of select="form/field[@name='tfAntragstellerAdresse']/plainValue"/></STRASSE>
<HAUS_NR><xsl:value-of select="form/field[@name='']/plainValue"/></HAUS_NR>
<ORT><xsl:value-of select="form/field[@name='tfAntragstellerOrt']/plainValue"/></ORT>
<PLZ><xsl:value-of select="form/field[@name='tfAntragstellerPLZ']/plainValue"/></PLZ>
<TELEFON><xsl:value-of select="form/field[@name='tfAntragstellerTelefon']/plainValue"/></TELEFON>
<EMAIL><xsl:value-of select="form/field[@name='tfAntragstellerEmail']/plainValue"/></EMAIL>
<FAX><xsl:value-of select="form/field[@name='tfAntragstellerFax']/plainValue"/></FAX>
<SONNTAGE><xsl:value-of select="form/field[@name='cbSONNTAGE']/plainValue"/></SONNTAGE>
<FERIEN><xsl:value-of select="form/field[@name='cbFERIEN']/plainValue"/></FERIEN>
       <GRUND2><xsl:value-of select="form/field[@name='cbGRUND2']/plainValue"/></GRUND2>
       <GRUND1><xsl:value-of select="form/field[@name='cbGRUND1']/plainValue"/></GRUND1>
<ANTR_DATUM><xsl:value-of select="substring-before(./@creation-date, ' ')" /></ANTR_DATUM>  
<NAME_HALT><xsl:value-of select="form/field[@name='tfNAME_HALT']/plainValue"/></NAME_HALT>
<FIRMA_HALT><xsl:value-of select="form/field[@name='tfFIRMA_HALT']/plainValue"/></FIRMA_HALT>
<POS_HALTER><xsl:value-of select="form/field[@name='tfPOS_HALTER']/plainValue"/></POS_HALTER>
<xsl:if test="form/field[@name='cbLKW']/plainValue!=1"><LKW>0</LKW></xsl:if>
<xsl:if test="form/field[@name='cbLKW']/plainValue=1"><LKW><xsl:value-of select="form/field[@name='cbLKW']/plainValue"/></LKW></xsl:if>
<xsl:if test="form/field[@name='cbANHAENGER']/plainValue!=1"><ANHAENGER>0</ANHAENGER></xsl:if>
<xsl:if test="form/field[@name='cbANHAENGER']/plainValue=1"><ANHAENGER><xsl:value-of select="form/field[@name='cbANHAENGER']/plainValue"/></ANHAENGER></xsl:if>
<xsl:if test="form/field[@name='cbZUGMASCHIN']/plainValue!=1"><ZUGMASCHIN>0</ZUGMASCHIN></xsl:if>
<xsl:if test="form/field[@name='cbZUGMASCHIN']/plainValue=1"><ZUGMASCHIN><xsl:value-of select="form/field[@name='cbZUGMASCHIN']/plainValue"/></ZUGMASCHIN></xsl:if>
<xsl:if test="form/field[@name='cbAUFLIEGER']/plainValue!=1"><AUFLIEGER>0</AUFLIEGER></xsl:if>
<xsl:if test="form/field[@name='cbAUFLIEGER']/plainValue=1"><AUFLIEGER><xsl:value-of select="form/field[@name='cbAUFLIEGER']/plainValue"/></AUFLIEGER></xsl:if>
<xsl:if test="form/field[@name='cbERSATZ1']/plainValue!=1"><ERSATZ1>0</ERSATZ1></xsl:if>
<xsl:if test="form/field[@name='cbERSATZ1']/plainValue=1"><ERSATZ1><xsl:value-of select="form/field[@name='cbERSATZ1']/plainValue"/></ERSATZ1></xsl:if>
<xsl:if test="form/field[@name='cbERSATZ2']/plainValue!=1"><ERSATZ2>0</ERSATZ2></xsl:if>
<xsl:if test="form/field[@name='cbERSATZ2']/plainValue=1"><ERSATZ2><xsl:value-of select="form/field[@name='cbERSATZ2']/plainValue"/></ERSATZ2></xsl:if>    
<LKW_KENNZ><xsl:value-of select="form/field[@name='tfLKW_KENNZ']/plainValue"/></LKW_KENNZ>
<ANH_KENNZ><xsl:value-of select="form/field[@name='tfANH_KENNZ']/plainValue"/></ANH_KENNZ>
<ZUG_KENNZ><xsl:value-of select="form/field[@name='tfZUG_KENNZ']/plainValue"/></ZUG_KENNZ>
<AUF_KENNZ><xsl:value-of select="form/field[@name='tfAUF_KENNZ']/plainValue"/></AUF_KENNZ>
<ERS_KENNZ1><xsl:value-of select="form/field[@name='tfERS_KENNZ1']/plainValue"/></ERS_KENNZ1>
<ERS_KENNZ2><xsl:value-of select="form/field[@name='tfERS_KENNZ2']/plainValue"/></ERS_KENNZ2>
<LKW2KENNZ><xsl:value-of select="form/field[@name='tfLKW2KENNZ']/plainValue"/></LKW2KENNZ>
<ANH2KENNZ><xsl:value-of select="form/field[@name='tfANH2KENNZ']/plainValue"/></ANH2KENNZ>
<ZUG2KENNZ><xsl:value-of select="form/field[@name='tfZUG2KENNZ']/plainValue"/></ZUG2KENNZ>
<AUF2KENNZ><xsl:value-of select="form/field[@name='tfAUF2KENNZ']/plainValue"/></AUF2KENNZ>
<ERS2KENNZ1><xsl:value-of select="form/field[@name='tfERS2KENNZ1']/plainValue"/></ERS2KENNZ1>
<ERS2KENNZ2><xsl:value-of select="form/field[@name='tfERS2KENNZ2']/plainValue"/></ERS2KENNZ2>
<LKW_GEWICH>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfLKW_GEWICH']/plainValue" />
</xsl:call-template>
</LKW_GEWICH>
<ANH_GEWICH>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfANH_GEWICH']/plainValue" />
</xsl:call-template>
</ANH_GEWICH>
<ZUG_GEWICH>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfZUG_GEWICH']/plainValue" />
</xsl:call-template>
</ZUG_GEWICH>
<AUF_GEWICH>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfAUF_GEWICH']/plainValue" />
</xsl:call-template>
</AUF_GEWICH>
<!--
<LKW_LEER><xsl:value-of select="form/field[@name='']/plainValue"/></LKW_LEER>
<ANH_LEER><xsl:value-of select="form/field[@name='']/plainValue"/></ANH_LEER>
<ZUG_LEER><xsl:value-of select="form/field[@name='']/plainValue"/></ZUG_LEER>
<AUF_LEER><xsl:value-of select="form/field[@name='']/plainValue"/></AUF_LEER>
-->

<ERS_GEWI_1>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfERS_GEWI_1']/plainValue" />
</xsl:call-template>
</ERS_GEWI_1>
<ERS_GEWI_2>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfERS_GEWI_2']/plainValue" />
</xsl:call-template>
</ERS_GEWI_2>
<ART><xsl:value-of select="form/field[@name='tfART']/plainValue"/></ART>
<ART_GEWICH>
<xsl:call-template name="formatWeight">
<xsl:with-param name="weight" select="form/field[@name='tfART_GEWICH']/plainValue" />
</xsl:call-template>
</ART_GEWICH>
<STARTORT><xsl:value-of select="form/field[@name='tfSTARTORT']/plainValue"/></STARTORT>
<ZIELORT><xsl:value-of select="form/field[@name='tfZIELORT']/plainValue"/></ZIELORT>
<UEBER><xsl:value-of select="form/field[@name='tfUEBER']/plainValue"/></UEBER>
<ZEIT_VON>
<xsl:call-template name="formatDate">
<xsl:with-param name="dateTime" select="form/field[@name='tfZEIT_VON']/plainValue" />
</xsl:call-template>
</ZEIT_VON>
<VON_UHR><xsl:value-of select="form/field[@name='tfVON_UHR']/plainValue"/></VON_UHR>
<ZEIT_BIS>
<xsl:call-template name="formatDate">
<xsl:with-param name="dateTime" select="form/field[@name='tfZEIT_BIS']/plainValue" />
</xsl:call-template>
</ZEIT_BIS>
<BIS_UHR><xsl:value-of select="form/field[@name='tfBIS_UHR']/plainValue"/></BIS_UHR>
<ORT_LEERFA><xsl:value-of select="form/field[@name='tfORT_LEERFA']/plainValue"/></ORT_LEERFA>
<BEGRUENDG><xsl:value-of select="form/field[@name='tfBEGRUENDG']/plainValue"/></BEGRUENDG>
<!--
<ORTSLAGE><xsl:value-of select="form/field[@name='tfORTSLAGE']/plainValue"/></ORTSLAGE>
<NOTIZ><xsl:value-of select="form/field[@name='tfNOTIZ']/plainValue"/></NOTIZ>
-->

       <ORTSLAGE><xsl:value-of select="form/field[@name='edAnmerkungen']/plainValue"/></ORTSLAGE>
<NOTIZ><xsl:value-of select="form/field[@name='edAnmerkungen']/plainValue"/></NOTIZ>
<SACHGEBIET>Z</SACHGEBIET>
<FORMID><xsl:value-of select="form/field[@name='tfFORMID']/plainValue"/></FORMID>
<SERVICE_ID><xsl:value-of select="./@process-uid" /></SERVICE_ID>
 </datensatz>
</daten>
</xsl:template>
<xsl:template name="formatDate">
<xsl:param name="dateTime"/>
<xsl:variable name="day" select="substring-before($dateTime, '.')" />
       <xsl:variable name="month" select="substring-before(substring-after($dateTime, '.'), '.')" />
<xsl:variable name="year" select="substring-after(substring-after($dateTime, '.'), '.')" />

<xsl:choose>
<xsl:when test="$dateTime !=''">
<xsl:value-of select="concat($year, '-', $month, '-', $day)" />
</xsl:when>
<xsl:otherwise>
 
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="formatWeight">
<xsl:param name="weight"/>
<xsl:value-of select="translate($weight, ',', '.')" />
</xsl:template>
</xsl:stylesheet>

Im Beispiel werden über die am Ende stehenden Templates formatDate und formatWeight Datumswerte und Gewichte in das Format überführt, welches ALVA9 erwartet. Eine Überführung von im Formular eingegebenen Werten in eine für ALVA9 erwartetes Format kann gegebenenfalls auch bei anderen Daten nötig sein. In den meisten Fällen ist die Verwendung von speziellen Templates häufig die einfachste Lösung, um die Werte in das gewünschte Format zu konvertieren.

Speichern von zusätzlichen Dokumenten

Im Beispiel wird zunächst über eine Aktion vom Typ ZIP Komprimieren ein ZIP-Archiv mit allen an das Formualar angehangenen Dateien und einer mithilfe einer PDF-Print-Aktion generierte PDF-Quittung des Formulars sowie der erstellten XML-Datei erzeugt. Dieses Archiv wird dann über eine Aktion vom Typ TODO an eine Stelle im Dateisystem des Servers gespeichert, die als Austauschverzeichnis für ALVA9 gedacht ist und von der aus sich das System dann die Datei selbstständig abholt. Es ist wichtig, dass alle Dokumente, die 

Benennung der erzeugten Dateien

Im Beispiel

das ist wichtig weil

Selbe, eindeutige ID -> Es empfiehlt sich, Process_ID zu verwenden

-Hierbei ist die Verwendung gl dateinamen

Ansprechpartner für Fragen

Für weitere Fragen zur Anbindung und der nötigen Konfiguration für den Import in ALVA9 steht folgender Ansprechpartner auf Seiten der Ascherslebener Computer GmbH zur Verfügung:

TODO Name
TODO Kontaktdaten