Moin,
Danke für die Antwort!
Müssen es AutoIt Skripte sein?
- Ja
Kannst du nicht einfach Lua einbinden?
- Nein. Außerdem verstehe ich noch nicht, wie ich das Problem mit den geteilten Daten dann besser löse.
Müssen diese Skripte independent laufen? Also eigenständige Programme? Oder nur reine Funktionssammlungen?
- Prinzipiell braucht nichts als eigentständiges Script laufen, wenn es denn eine andere Möglichkeit gibt, das Coding einer AutoItObject-Methode zur Laufzeit zu definieren.
Müssen unbedingt COM Objekte erstellt werden?
- Nein. Aber es müssen AutoItObject Objekte sein. - Technisch gesehen sind das aber keine COM Objekte.
Dürfen die eingebundenen Skripte uneingeschränkten Zugriff haben, oder sind da einige Beeinträchtigungen notwendig?
- Uneingeschränkt. Also entsprechend der Sichtbarkeit von Attributen und Methoden der Objekte - da kümmert sich AutoItObject dann drum.
Es gibt da einige Wege um das zu realisieren. Je nach Anforderung ist das eine besser geeignet als das andere. Aber es kommt wirklich sehr stark darauf an was genau gefordert ist. Kannst du mehr Informationen geben? Oder eine genauere Erläuterung über das System in welches es intigriert werden soll? Je mehr Informationen um so besser.
Ich freue mich über konkrete Vorschläge.
Das System, in das diese Skripte integriert werden sollen, ist ein ERP System auf Basis von AutoItObject. Das heißt die gesamte Anwendung, und alle Daten/Funktionen sind in Objekte gekapselt ( - ich benutze das Wort "Objekte" ab hier quasi-äquivalent zu "Klassen"). Es gibt da sozusagen
- Systemobjekte (z.B. "Application", "Database", "ObjectBuilder", "Printer", etc.) und
- Businessobjekte (z.B. "Material", "Materialprice", "Customer", "Salesorder", "Materialtext", "Contract", "Invoice", "ContractReleaseOrder", etc.).
Die Systemobjekte sind fix und kapseln nur die Applikation und alles was "im Hintergrund" läuft.
Die Business-Objekte werden zur Laufzeit erstellt: Long Story short: Am Anfang der Applikation wird ein Verzeichnis mit XML-Dateien ausgelesen. Für jede Datei wird ein entsprechendes AutoItObject-Objekt erstellt, ggf. eine Datenbanktabelle erzeugt, Referenzen auf andere Objekte aufgelöst, etc. Die Dateien werden noch von Hand erstellt aber das ultimative Ziel ist die Pflege in einem eigenen Screen in der Applikation.
Func __Application__UpdateBObjects($oSelf)
Local $aFiles = _FileListToArray(@ScriptDir & "\Objects", "*.xml")
$oBObject = $oSelf.BObject($aFiles[$i]))
EndFunc ;==>__Application__UpdateBObjects
Func __Application__BObject($oSelf, $sObjectName, $oContext = Null)
$oObject = $oSelf.ObjectBuilder.Build($sObjectName, $oContext)
If Not $oSelf.Database.TableExists($sObjectName) Then
$oSelf.Database.TableCreate($sObjectName, $oObject.db_resolve_attributes())
EndFunc ;==>__Application__Object
Func __ObjectBuilder__Build($oSelf, $sObjectName, $oContext = Null)
$oObject = _AutoItObject_Create()
;$oSelf.AddSystemProperties($oObject, $oObject.ObjectName) ->
_AutoItObject_AddProperty($oObject, "Application", $ELSCOPE_PUBLIC, $oSelf)
_AutoItObject_AddProperty($oObject, "ObjectName", $ELSCOPE_PUBLIC, $sObjectName)
_AutoItObject_AddProperty($oObject, "Definition", $ELSCOPE_PUBLIC, $oXMLDoc)
_AutoItObject_AddProperty($oObject, "Context", $ELSCOPE_PUBLIC, $oContext)
$oSelf.AddCustomProperties($oObject, $oObject.ObjectName)
IF $sParentName <> "" AND ... $oContext.ObjectName = $sParentName then
_AutoItObject_AddProperty($oObject, $sParentName, $ELSCOPE_PUBLIC, $oContext)
$oSelf.AddCustomProperties($oContext, $oObject.ObjectName, 2)
$oSelf.AddCustomMethods($oObject, $oObject.ObjectName)
$oSelf.dbObjectMethods($oObject)
Alles anzeigen
Die Business-Objekte sehen zum Beispiel so aus - heir mal ein "material". Also ein Artikel oder eine Dienstleistung, etc. Das besteht wiederum aus einem Materialtext und einem Materialpreis, der wiederum aus einem Kunden und einem Preis besteht, etc., etc., etc.
Aktuell ist es so, dass - wenn ein neues Business Objekt gefunden wurde - eine Include-Anweisung in einem Sammelinclude eingefügt wird. Das Programm wird dann nach Aktualisierung der Objekte neugestartet . Es läuft unkompiliert, also geht das.
$sFilePath = StringFormat('.\Objects\%s', $sObjectName & '.au3')
$sIncludeStr = StringFormat('#include "%s"', $sFilePath)
If FileExists('.\Objects\' & $sObjectName & '.au3')
And Not StringInStr(FileRead('.\ObjectsCollectiveInclude.au3'), $sIncludeStr) Then
FileWrite('.\ObjectsCollectiveInclude.au3', $sIncludeStr & @CRLF)
$oSelf.Application.Restart()
Alles anzeigen
Die Business Objekte können dann im Programm genutzt werden und miteinander interagieren. Teilweise sind sie miteinander verbunden, übernehmen Attribute, Methoden oder Werte voneinander, etc. AutoItObject ist da echt flexibel. Beispiel: Ein Material kann abhängig von dem Kontext, in dem es erstellt wurde (ein Material speziell für einen Kunden, ein Material in einem Beleg, ein Material in einem Abruf, etc.), andere Attribute haben.
; Erstelle Kontrakt mit KUNDEN als basis
$oCustomer = $oSelf.Application.BObjects.Customer()
$oCustomer.name = 'Max Musterbert'
$oCustomer.address = 'Mustermannstr. 144,\n12345 Musterhausen'
$oCustomer.country = 'DE'
; Kontrakt im Kontext des Kunden erstellen
$oContract = $oSelf.Application.BObjects.Contract($oCustomer)
$oContract.ID = 'DL_2021_124556'
; Material im Kontext des Kontraktes (im Kontext des Kunden) erstellen
$oMaterial = $oContract.Add($oSelf.Application.BObjects.Material($oContract))
$oMaterial.number = 900001
$oMaterial.price = '120,00'
$oMaterial.text = "Stunden vor Ort"
$oMaterial.quantity = 100
; Material im Kontext des Kontraktes (im Kontext des Kunden) erstellen
$oMaterial = $oContract.Add($oSelf.Application.BObjects.Material($oContract))
$oMaterial.number = 900002
$oMaterial.price = '100,00'
$oMaterial.text = "Stunden Remote"
$oMaterial.quantity = 350
Alles anzeigen
Dieses wäre ein Beispielscript, das ein User erstellen können sollte. Das Objekthandling klappt alles ganz gut. - Aber es ist nicht schön, dass man keine neuen Business-Objekte anlegen kann, ohne die Anwendung neu zu starten. Ich hoffe das erklärt den Sachverhalt besser.
Ich kann aus Lizenzgründen keine lauffähige Version hier im Forum posten.
Viele Grüße