Dienstag, 16. April 2024, 10:59 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

Lieber Besucher, herzlich willkommen bei: INVESTOX-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

dubi

Profi

Registrierungsdatum: 1. September 2002

Beiträge: 331

1

Donnerstag, 4. September 2014, 16:01

Formelmaschine in DLL eine Periode zu spät?

Hallo zusammen

Nachdem ich das Entwicklerkit zum Laufen gebracht habe (yippeee), habe ich festgestellt, dass das Ergebnis der Formelmaschine eine Periode hinterherhinkt. Ich habe allerdings das Beispiel von VB6 in .Net übertragen und da VB6 bei Arrays mit 1 und .Net mit 0 beginnt ist das eventuell die Erklärung (?).

Der verwendete Code sieht so aus (Aufruf in Zeile 40):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Public Class SimpleGD
    <System.Runtime.InteropServices.ComVisible(True)> Public Function Calculate(ByRef cDaten As KSEImportExport7.KSEDataCollection, ByRef Parameter As Object, ByRef Ergebnis As Object) As Integer
        ' Dieser Indikator zeigt, wie auf die Formelmaschine von Investox zugegriffen
        ' werden kann. Der Indikator berechnet einfach einen gleitenden Durchschnitt,
        ' wobei die Berechnungsbasis als 1. und die Perioden als 2. Parameter übergeben
        ' werden.
        ' Ab Version 3.2 von Investox kann cDaten auch als "KSEDataCollection" deklariert werden

        On Error GoTo FehlerAllgemein

        '' Variablen-Deklarationen
        Dim i As Long
        Dim StartI As Long
        Dim EndI As Long
        Dim DatenKey As String
        Dim Perioden As Long
        Dim Formel As String

        On Error GoTo FehlerDaten
        '' hier nichts zu tun

        On Error GoTo FehlerParameter

        DatenKey = Parameter(1) ' Der Zeiger auf die zu glättenden Daten
        Perioden = Parameter(2)
        If Perioden < 1 Then ' <1 nicht zulässig!
            Perioden = 1
        End If

        On Error GoTo FehlerAllgemein

        ' Nun die Formel konstruieren: ein Standard-gleitender Durchschnitt
        ' der mit den angegebenen Perioden für die angebebenen Daten durchgeführt wird
        Formel = "GD(" & DatenKey & ", " & Perioden & ",S)"
        '' Die Formel von der Formelmaschine berechnen lassen:
        Dim ErgID$
        ErgID = "_@@TempErg" & Format$(Rnd() * 30000, "00000") & "@" & Format$(Rnd() * 30000, "00000") & "@_"
        Dim Formelmaschine As Object
        Formelmaschine = cDaten("#_InvFormelMaschine#")
        If Formelmaschine.BerechneInvestoxFormel(Formel, ErgID) = True Then
            Ergebnis = cDaten(ErgID)
            cDaten.Remove(ErgID)
            Calculate = True ' Berechnung OK
        Else
            Calculate = Formelmaschine.FehlerNr
        End If

Rücksprung:
        Exit Function

FehlerAllgemein:
        ' Hier gflls. Fehlerbehandlung
        Calculate = ErrExternIndiFehler
        Resume Rücksprung

FehlerDaten:
        ' Hier gflls. Fehlerbehandlung
        Calculate = ErrNoData
        Resume Rücksprung

FehlerParameter:
        ' Hier gflls. Fehlerbehandlung
        Calculate = ErrInvalidParameter
        Resume Rücksprung
    End Function

End Class


Wenn ich das Charte, sieht das wie im beigefügten Bild aus (direkter GD von Investox ist blau, obige Formel liefert die rote Linie).

Wie krieg ich das Ergebnis aus der DLL wieder auf die (korrekte) Vorperiode?
  • Muss ich alle Formeln in .Net mit Ref anpassen --> geht, wirkt mir aber nicht elegant...
  • Muss ich die Periode selbst in .Net zurücksetzen --> falls ja: weiss jemand wie das elegant geht, da ErgID und Ergebnis ja nicht in der Calculate Funktion als Array definiert wurden?
  • Gibt's irgendwas schlaueres?



Vielen Dank und viele Grüsse
-dubi

Bernd

Experte

Registrierungsdatum: 5. Juni 2005

Beiträge: 4 070

Wohnort: Iringsweg

2

Donnerstag, 4. September 2014, 19:29

Hi dubi

Ich befürchte, dass das schon die Erklärung ist ..
Ich habe allerdings das Beispiel von VB6 in .Net übertragen und da VB6 bei Arrays mit 1 und .Net mit 0 beginnt ist das eventuell die Erklärung (?).

... weil .Net keine OPTION BASE 1 mehr anbietet wie hier erklärt, wobei mir die Aussage als Schlussfolgerung des vorhergehenden Textes zumindest ambitioniert erscheint:
"Da Option Base {0|1} in Visual Basic .NET nicht mehr benötigt wird, entfällt es hier." (Unterstreichung von mir, um den fragwürdigen Text hervorzuheben).

Oder Du tröstest Dich mit dem Text vom Microsoft Support "In den meisten Fällen funktioniert der Code genauso wie zuvor. " :thumbsup:

Da die Investox Formelmaschine wohl bei LBound() mit der Datenübergabe beginnt, passt das so scheint's nicht mehr zu Deinem Coding. Entweder Du korrigierst das mit einem geeigneten Ref() in den Formeln, die Du nach Investox hochreichst oder Herr Knöpfel hat einen smarten Switch parat, der die Daten-Übergabe an .NET anpasst?
Gruss
Bernd

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Bernd« (4. September 2014, 19:36)


dubi

Profi

Registrierungsdatum: 1. September 2002

Beiträge: 331

3

Donnerstag, 4. September 2014, 22:42

Danke Bernd. Im Moment behelfe ich mir mit einem Ref. Ist aber eher unschön...
Evtl. kann Herr Knöpfel hier etwas machen :engel: