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"], "{}")