irgendt sowas wie eine SDK

25/03/2009 - 21:08 von Andreas Vogt | Report spam
Hallo NG,
hatte ja schon mal vor lànger Zeit die Idee entworfen sowas wie eine
SDK für VBA zu entwickeln.
Hintergrund:
Bei einem Kunde gibts immer mal wieder größere aber auch kleinere
Codeànderungen.
Kein Problem an sich, aber der Kunde bearbeitet das Frontend nochmals
und macht dann 3-4 versch. Frontends daraus. Das ist natürlich schon
mühselig und viel Arbeit, und es àrgert mich tierisch wenn er das
machen müsste weil ich ein Fehler gemacht hàtte. (was natürlich nie
nie nie vorkommt)

Also hab ich mal ein bisschen gebastelt da die Zeit das auch zuließ.
Hier nun mein erster Ansatz dazu.
Zuerst die XML-Datei die die Änderungsinformation enthaltet:
<sdk>
<title>Anpassung Steuerventile</title>
<description>Hier dann ein entsprechender Text</description>
<pubDate>23.03.2009</pubDate>
<object>
<name>TestModul</name>
<type>module</type>
<sub>
<subname>Max</subname>
<search>Max = nMax</search>
<addafter>MsgBox Max</addafter>
</sub>
</object>
</sdk>

Und hier mal mein "SDK" Modul:
Option Compare Database
Option Explicit

Public arrSDK(99) As Variant 'Knotenarray
Dim nz As Long 'Knotenzàhler

Public Sub LoadXML()
Dim oXML As Object 'MSXML2 Objekt
Dim oNode As Object 'Knoten Objekt
Dim k As Long, m As Long 'àußerer/inner Schleifenzàhler
Dim strOName As String 'Objektname
Dim strOType As String 'Objekttyp
Dim strSubname As String 'Prozedurname
Dim strSearch As String 'gesuchter String
Dim strModify As String 'modifizierender String
Dim strModType As String 'Art der Modifizierung

Set oXML = CreateObject("MSXML2.DOMDocument.4.0")
oXML.Load "C:\sdk.xml"

For Each oNode In oXML.childNodes
Call loadAllNodes(oNode)
Next
Set oNode = Nothing
Set oXML = Nothing

For k = LBound(arrSDK) To UBound(arrSDK)
If arrSDK(k) = "object" Then
strOName = arrSDK(k + 2)
strOType = arrSDK(k + 4)
For m = k + 5 To UBound(arrSDK)
strModify = ""
strModType = ""
If arrSDK(m) = "Sub" Then
strSubname = arrSDK(m + 2)
strSearch = arrSDK(m + 4)
strModify = arrSDK(m + 6)
strModType = arrSDK(m + 5)
Call Modify(strOName, strOType, strSubname,
strSearch, strModify, strModType)
End If
m = m + 6
Next m
Exit For
End If
Next k
End Sub

Function Modify(oName As String, oType As String, Subname As String,
Search As String, strModify As String, strModType As String) As
Boolean
Dim mdl As Module
Dim SL As Long, SC As Long, EL As Long, EC As Long

DoCmd.OpenModule oName, Subname
Set mdl = Modules(oName)
mdl.Find Search, SL, SC, EL, EC
If SL = 0 And SC = 0 Then
'Prüfe ob strSearch in erster Zeile
If InStr(1, mdl.Lines(0, 1), Search) = 0 Then
'Abbruch todo: gesamter Ablauf abbrechen/rückgàngig machen
MsgBox "gesuchter Begriff nicht gefunden"
Exit Function
End If
End If

If strModType = "addbefore" Then
mdl.InsertLines SL, repl(" ", SC - 1) & strModify
ElseIf strModType = "addafter" Then
mdl.InsertLines SL + 1, repl(" ", SC - 1) & strModify
ElseIf strModType = "addreplace" Then
mdl.ReplaceLine SL, repl(" ", SC - 1) & strModify
End If

DoCmd.Close acModule, oName, acSaveYes
Set mdl = Nothing
End Function

Private Sub loadAllNodes(objNode As Object)
Dim nod As Object
Dim atrib As Object

Select Case objNode.nodeType
Case 1
arrSDK(nz) = objNode.baseName
nz = nz + 1
Case 8
arrSDK(nz) = objNode.Text
nz = nz + 1
Case 3
arrSDK(nz) = objNode.Text
nz = nz + 1
Case Else
End Select

If objNode.childNodes.length > 0 Then
For Each nod In objNode.childNodes
loadAllNodes nod
Next
End If
End Sub

Private Function repl(strSign As String, lngCount As Long) As String
Dim i As Long
If lngCount > 100 Then lngCount = 100
For i = 1 To lngCount
repl = repl & strSign
Next i
End Function


Fehlen tut da natürlich noch sehr viel, z.b. die Fehlerbehandlung,
eine RollBack-Routiene im Fall dass nicht gefunden wird etc.

Aber es funktioniert zumindest mal so wie ich mir das vorgestellt
habe.
Ich denke dass ich sowas wie ein Testlauf einbaue, d.h. erst den
Modulcode nach allen Textstellen durchsuchen, und erst wenn alles
gefunden wird dann mit dem bearbeiten starten.

Was meint ihr dazu? Wie üblich Feedback erwünscht.

Gruß Andreas
 

Lesen sie die antworten

#1 Frank Müller
26/03/2009 - 06:46 | Warnen spam
Hallo Andreas,

hatte ja schon mal vor lànger Zeit die Idee entworfen sowas wie eine
SDK für VBA zu entwickeln.



Du weißt was die Abkürzung SDK bedeutet?

Hintergrund:
Bei einem Kunde gibts immer mal wieder größere aber auch kleinere
Codeànderungen.
Kein Problem an sich, aber der Kunde bearbeitet das Frontend nochmals
und macht dann 3-4 versch. Frontends daraus. Das ist natürlich schon
mühselig und viel Arbeit, und es àrgert mich tierisch wenn er das
machen müsste weil ich ein Fehler gemacht hàtte. (was natürlich nie
nie nie vorkommt)



Da du von einem Kunden sprichst, was für einen Vertrag
hast du denn mit dem Kunden? Also Wartungsvergrag,
Supportvertrag usw.

Warum kann dein Kunde überhaupt an deiner Arbeit etwas àndern?

Also hab ich mal ein bisschen gebastelt da die Zeit das auch zuließ.
Hier nun mein erster Ansatz dazu.



[Code gesnippt]

Fehlen tut da natürlich noch sehr viel, z.b. die Fehlerbehandlung,
eine RollBack-Routiene im Fall dass nicht gefunden wird etc.



Was da fehlt ist die Kreativitàt deines Kunden wenn er
denn deinen Code bzw. deine Arbeit bearbeiten / veràndern kann.

Aber es funktioniert zumindest mal so wie ich mir das vorgestellt
habe.



Ja wie du es dir vorgestellt hast. Aber auch nach den
Vorstellungen und der Kreativitàt deines Kunden?

Ich denke dass ich sowas wie ein Testlauf einbaue, d.h. erst den
Modulcode nach allen Textstellen durchsuchen, und erst wenn alles
gefunden wird dann mit dem bearbeiten starten.



Und wenn du was findest, was möchtest du dann machen?
Supportkosten berechnen usw. ist ja schön und gut, aber aufgrund
vorhersehbarer Fehler eines Kunden sollte man solche entweder
verhindern oder halt zuverlàssig bei Auftragsverteilung mit
entsprechendem Vertrag absichern. Das was du da so beshreibst
hört sich irgendwie danach an dass "Kunde" alles machen kann
wenn es schief geht hast du das Problem bzw. er kann dich
dafür verantwortlich machen. :-(

Was meint ihr dazu? Wie üblich Feedback erwünscht.



Siehe oben, Kontrollmechanismen sind zwar schön und gut,
die dienen im Ernstfall vor Gericht aber lediglich Kontrollzwecken.
Wenn da nicht ein entsprechender Vertrag dahinter steckt dass der
Kunde das nicht "durfte" was er gemacht hat usw. dann hast
du schlechte Karten.

Bei solch sensiblen Kunden würde ich die Anwendung so umbauen,
dass der Kunde da keine wesentlichen die Funktion betreffenden
Änderungen vornehmen kann.

Gruß,
Frank

Ähnliche fragen