Tipps & Tricks - Connector für M-Files für alle M-Files Objekte erweitern

Der Connector für M-Files kann im Standard nur mit Objekten mit dem Typ document in Wechselwirkung stehen. Hier wird beschrieben, wie Sie den Connector erweitern, damit er mit jedem M-Files-Objekt arbeiten kann. Dafür muss das Scripting für die entsprechenden Java-Klassen aktiviert werden. Außerdem wird ein Prozess mit Groovy eingesetzt.

Intrexx aufbereiten, um M-Files-Objekte vollständig zu unterstützen

Kopieren Sie die Datei scripting.cfg in das Portalverzeichnis /internal/cfg/scripting und starten Sie den Portal-Dienst neu. Die Datei kann hier heruntergeladen werden. Konfigurieren Sie dann den Connector für M-Files.

Groovy-Prozesses

In diesem Beispiel werden Kunden in M-Files gepflegt. Intrexx soll so angepasst werden, dass die Daten in Intrexx und nicht mehr in M-Files geändert werden. Dazu wird eine Intrexx-Applikation mit einer Datengruppe benötigt, die die Kundendaten enthält. Fügen Sie in der Intrexx-Applikation Datenfelder hinzu, die den verschiedenen Metainformationen in M-Files entsprechen. Anschließend legen Sie einen neuen Prozess mit einem Timer und einem Timer-Ereignisbehandler an. Dazu kommt eine Groovy-Aktion, um M-Files und Intrexx zu synchronisieren. Diese wird benötigt, um Ihre Kunden-Datengruppe zu initialisieren und alle zukünftigen Änderungen abzurufen.



Legen Sie drei Datengruppen-Ereignishandler an, die auf Einfügen, Ändern und Löschen eines Datensatzes reagieren. Dann verbinden Sie jeweils eine Groovy-Aktion damit.

Login-Methoden für M-Files mit Groovy

Login anhand der Einstellungen der Intrexx-Datengruppe

Für diese Methode ist eine entsprechende Dateifeldkonfiguration in der Datengruppe der Intrexx-Applikation erforderlich. Das Groovy-Skript für die Anmeldung in M-Files sehen Sie hier:
import de.uplanet.lucy.server.mfiles.connector.*
import de.uplanet.scripting.groovy.util.Safely

def mfField = g_rtCache.fields["438574D09FB71551BED47EFD5FF03BA02A62656A"]// M-Files File Field GUID
def mfCfgGuid = mfField?.properties["mfiles.cfg.guid"]
g_log.info("mfCfgGuid: " + mfCfgGuid)
def mfVaultGuid = mfField?.properties["mfiles.vault.guid"]
def mfUserGuid = "903B5453FAE24B3618018562C316061F5C147346" // Intrexx User GUID mit einem statischen M-Files User
def mfService = MFilesService.getInstance()
def mfSession = mfService.login(mfCfgGuid, mfVaultGuid, mfUserGuid)

Login mit Benutzername und Passwort

In diesem Fall wird kein Objekt vom Typ document benötigt. Hier das entsprechende Groovy-Skript:
import de.uplanet.lucy.server.mfiles.connector.*
import de.uplanet.scripting.groovy.util.Safely
def mfSession = mfService.login("mfileUser", "password", <VaultGuid>, <M-Files Service Configuration-GUID>)
Die M-Files Service Configuration GUID kann im Portalverzeichnis \internal\cfg\mfiles\*.xml ermittelt werden.

Die vier unterstützen HTTP-Methoden

Die folgenden vier HTTP-Methoden werden unterstützt: GET, POST, PUT und DELETE. Hier finden Sie eine Beschreibung der unterschiedlichen Parameter von String p_strService, die in den nachfolgenden Definitionen eingesetzt werden.

Definitionen

GET-Statement

Struktur:
httpReq.getAsString(IMFilesSession p_session, String p_strService,  Map<String, String> p_qsParam)
Beispiel: Alle Objekte einer Wertliste abrufen.
def httpReq = new MFilesHttpRequest("http://mfiles/REST") // M-Files http request helper
/*
"http://mfiles/REST" - Tragen Sie hier Ihren Pfad zum M-Files REST Service ein.
*/
def response = httpReq.getAsString(mfSession, "/valuelists/2/items", [:])
def jsonObj = g_json.parse(response)  // JSON string ins JSON object parsen
jsonObj["Items"].each { obj -> // Objekte der Wertliste auswerten
	g_log.info(obj)
	obj.each { prop -> // Eigenschaften der Objekte der Wertliste auswerten
	 g_log.info(prop)
	}
}

POST-Statement

Struktur:
httpReq.postAsString(IMFilesSession p_session, String p_strService, Map<String, String> p_qsParam, String p_strJSON)
POST wird lediglich im Statement enthaltene Eigenschaften aktualisieren – alle andere werden nicht geändert. Beispiel: Die Eigenschaft Telefon zu einem Kunden hinzufügen.
def httpReq = new MFilesHttpRequest("http://mfiles/REST") // M-Files http request helper
/*
"http://mfiles/REST" - Tragen Sie hier Ihren Pfad zum M-Files REST Service ein. */

def fone = g_record["91E9B6070ECF427AB1CB157BD2F30B6C98EFE9DC"].value /* datafield telefon <string> */
def json = """[{"PropertyDef":1085, "TypedValue":{"Value":"${telefon}","DataType":1}}]"""
def response = httpReq.postAsString(mfSession, "/objects/${objType}/${objId}/latest/properties", [:], json.toString())if (httpReq.lastResponseCode <= 200 && httpReq.lastResponseCode >= 300)
	throw new Exception("Objekt kann nicht im M-files aktualisiert werden.", httpReq.lastResponseMsg)

PUT-Statement

Struktur:
httpReq.putAsString(IMFilesSession p_session, String p_strService, String p_strJSON,  Map<String, String> p_qsParam)
PUT aktualisiert alle im Statement enthaltene Eigenschaften. Das heißt, dass alle vorhandenen Eigenschaften, die nicht im PUT-Statement enthalten sind, gelöscht werden. Beispiel: Ort, Telefon, Anschrift1, Anschrift2, Land, Webseite und PLZ eines bestehenden Kunden aktualisieren.
def httpReq = new MFilesHttpRequest("http://mfiles/REST") // M-Files http request helper
/*
"http://mfiles/REST" - Tragen Sie hier Ihren Pfad zum M-Files REST Service ein.
*/
def companyName = g_record["A912CE2C8A07B360D474FCBCA9776999FFEDDD40"].value /* datafield Kundenname <string> */
def ort = g_record["92B1D86B2AF96AD197934BD6BEFF503A8ED1E931"].value /* datafield Ort <string> */
def telefon = g_record["91E9B6070ECF427AB1CB157BD2F30B6C98EFE9DC"].value /* datafield Telefon <string> */
def anschrift1 = g_record["25816F534C9A08F435330D5347F283470728D5E2"].value /* datafield Anschrift1 <string> */
def anschrift2 = g_record["B37E65221D5CE1FA53EA52E8F4D4D27DC8DBBA98"].value /* datafield Anschrift2 <string> */
def land = g_record["13E26F368C3263EBD0056AEB2286EB9CE5E241FD"].value /* datafield Land <string> */
def webseite = g_record["56C987F67570C055431B11E57FCB58404C261977"].value /* datafield Webseite <string> */
def plz = g_record["33FBD51075EFF4D8285B99A9B2CEFAF211935A37"].value /* datafield PLZ <string> */


def json = """{"PropertyValues": [
{"PropertyDef":1110, "TypedValue":{"Value":"${companyName}","DataType":1}},
{"PropertyDef":1085, "TypedValue":{"Value":"${telefon}","DataType":1}},
{"TypedValue":{"Lookup":{"Item":78},"DataType":9}, "PropertyDef":100},
{"PropertyDef":1088, "TypedValue":{"Value":"${ort}","DataType":1}},
{"PropertyDef":1073, "TypedValue":{"Value":"${anschrift1}","DataType":1}},
{"PropertyDef":1082, "TypedValue":{"Value":"${anschrift2}","DataType":1}},
{"PropertyDef":1090, "TypedValue":{"Lookup":{"Item":7},"DataType":10}},
{"PropertyDef":1086, "TypedValue":{"Value":"${webseite}","DataType":1}},
{"PropertyDef":1087, "TypedValue":{"Value":"${plz}","DataType":1}},
]}"""

def response = httpReq.putAsString(mfSession, "/objects/${objType}/${objId}/ latest/properties", json.toString(), [:])

if (httpReq.lastResponseCode <= 200 && httpReq.lastResponseCode >= 300)
	throw new Exception("Objekt kann nicht im M-files aktualisiert werden.", httpReq.lastResponseMsg)

def jsonResp = g_json.parse(response)
def objId = jsonResp.ObjVer.ID
def objVer = jsonResp.ObjVer.Version
def objType = jsonResp.ObjVer.Type

def conn = g_dbConnections.systemConnection
def stmt = null

try
{
	stmt = g_dbQuery.prepare(conn, "UPDATE DATAGROUP(<Intrexx DG-Guid>) SET L_OBJECTID=?, L_OBJECTVERSION=?, L_OBJECTTYPE=? WHERE STRID=?")

	stmt.setInt(1, objId)
	stmt.setInt(2, objVer)
	stmt.setInt(3, objType)
	stmt.setString(4, <STRID>)

	stmt.executeUpdate()
}
finally
{
	stmt = Safely.close(stmt)
}

DELETE-Statement

Struktur:
httpReq.deleteAsString(IMFilesSession p_session, String p_strService, Map<String, String> p_qsParam, String p_strJson)
Beispiel:
def httpReq = new MFilesHttpRequest("http://mfiles/REST") // M-Files http request helper
/*
"http://mfiles/REST" - Tragen Sie hier Ihren Pfad zum M-Files REST Service ein.
*/
def objType = g_record["2B7E7E29192A49070BFEEB35E099286C888BB27F"].value /* datafield Object-Type <integer> */
def objId = g_record["F2E54C2CC0D7FEE4BA80C931F4DF72DDC307A46F"].value /* datafield Object ID <integer> */
def objVer = g_record["08E12D364FA15DE1A4AB30E404A8521997565097"].value /* datafield Object Version <integer> */

def companyName = g_record["A912CE2C8A07B360D474FCBCA9776999FFEDDD40"].value /* datafield Kundenname <string> */
def ort = g_record["92B1D86B2AF96AD197934BD6BEFF503A8ED1E931"].value /* datafield Ort <string> */
def telefon = g_record["91E9B6070ECF427AB1CB157BD2F30B6C98EFE9DC"].value /* datafield Telefon <string> */

def json = """[{"PropertyDef":1085, "TypedValue":{"Value":"${phone}","DataType":1}}]"""
g_log.info("POST" + json)
def response = httpReq.deleteAsString(mfSession, "/objects/${objType}/${objId}/latest", ["allVersions":"true"], "{}")