Beispiel für die Anbindung an ein ALVA DMS
Im folgenden wird Anhand eines Beispielformulars kurz beschrieben, wie Daten von Xima® Formcycle an ein ALVA9 System (Link zum Hersteller) ü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 der Aktionen zunächst noch festgelegt werden. Der Grund dafür ist, dass der Pfad nicht allgemengültig ist und vom jeweiligen System abhängt, in welches das Beispielformular importiert wurde.
Inhalt und Erstellung der XML-Datei
Die vollständige XSL-Transformation für das Beispiel sieht wie folgt aus:
XSL-Transformation des Beispielformulars
<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 Konvertierung von im Formular eingegebenen Werten in ein von ALVA9 erwartetes Format kann gegebenenfalls auch bei anderen Daten nötig sein. In den solchen Fällen ist die Verwendung von speziellen Templates häufig die einfachste Lösung.
Speichern von zusätzlichen Dokumenten
Benennung der erzeugten Dateien
Im Beispiel wird die XML-Datei ALVA_SONNTAG_[%$PROCESS_ID%].xml und das ZIP-Archiv ALVA_SONN_[%$PROCESS_ID%].zip genannt. Es ist wichtig, dass der Dateiname der ZIP-Datei eindeutig ist und nicht bei verschiedenen Vorgängen gleich ist. Im Beispiel wird dafür der Platzhalter für die Prozess-ID verwendet, welche bei jedem Vorgang unterschiedlich ist. Grundsätzlich können hierfür aber auch andere Werte wie zum Beispiel Werte von Zählern verwendet werden. Auch bei der XML-Datei empfiehlt es sich, auch einen eindeutigen Namen zu verwenden.
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