-

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von F3K Total »

miamit hat geschrieben:Ggf. sollte ich für den Counter in der Constraint-Funktion eine andere Bezeichnung wählen, sonst kommt das womöglich zu Missverständnissen.
... gute Idee
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von DPunch »

Servus

Kurze Anmerkung:
das gewünschte Verhalten von Counter ist quasi der Prototyp der Verwendung einer statischen Variablen.
Per Deklaration als

Code: Alles auswählen

Static Counter as Integer
innerhalb von "F_get_solver_variables_from_named_Range" hält man den Namensraum innerhalb des Moduls sauber.
Bis alle Makros durchgelaufen sind, wird die Variable ihren Wert behalten (zu beachten allerdings: wird mit 0 initialisiert).
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von F3K Total »

Hallo DPunch,
kurze Verständnisfrage:
Obwohl Counter innerhalb der function dimensioniert wird, kann die static-Variable innerhalb der aufrufenden Sub angesprochen werden?

Gruß Rik
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von DPunch »

Servus

Nein, die Variable ist lokal und somit nur innerhalb der aufgerufenen Prozedur/Funktion sichtbar.
Aber wie gesagt behält die Variable ihren Wert - mal am vorliegenden Fall erklärt:

Code: Alles auswählen

Function F_get_solver_variables_from_named_Range(S_named_Range)as Object
    Static Counter as Integer
    dim Variables(0) as new com.sun.star.table.CellAddress
(...)
Counter wird beim ersten Aufruf der Funktion als Integer mit Wert 0 initialisiert. Wird der Wert dann innerhalb der Funktion verändert, wird dieser Wert beibehalten, bis die Makros komplett durchgelaufen sind. Dadurch folgt dann:

Code: Alles auswählen

(...)
'Erster Aufruf: Counter wird mit Wert 0 initialisiert - innerhalb der Funktion wird z.B. bis auf 10 hochgezählt
   Variables() = F_get_solver_variables_from_named_Range("Mengen") 
'Zweiter Aufruf: Counter hat seinen Wert behalten und steht am Anfang auf 10
   Variables() = F_get_solver_variables_from_named_Range("Mengen2") 
(...)
Es spricht prinzipiell zwar nichts gegen die Verwendung einer modulweit sichtbaren Variable (also Deinen Vorschlag), allerdings müsstest Du dann z.B. beim Kopieren des Makros immer daran denken, die Variable mitzunehmen und hättest einen "verschmutzten" Namensraum innerhalb des Moduls.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von F3K Total »

Hallo DPunch,
Klasse, und Danke für die Erklärung!
Wieder eine Feinheit, die, richtig eingesetzt, hilft, besseren Code zu schreiben.
Habe es ausprobiert:

Code: Alles auswählen

Sub S_Test_Static_Variable
    msgbox "Nonstatic: "+F_count_plus_three
    msgbox "Static: "+F_count_plus_four
    msgbox "Nonstatic: "+F_count_plus_three
    msgbox "Static: "+F_count_plus_four
    msgbox "Nonstatic: "+F_count_plus_three
    msgbox "Static: "+F_count_plus_four
    msgbox "Nonstatic: "+F_count_plus_three
    msgbox "Static: "+F_count_plus_four
End Sub

function F_count_plus_three
    dim counter as integer
    for i = 0 to 2
        counter = counter + 1
    next i
    F_count_plus_three = counter
end function

function F_count_plus_four
    static counter as integer
    for i = 0 to 3
        counter = counter + 1
    next i
    F_count_plus_four = counter
end function
--> Eine "normal" per DIM dimensionierte Integer Variable wird bei jedem Start der function/sub neu initialisiert und startet dann bei 0.

beste Grüße von Rik
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von F3K Total »

Moin,
um z.B die Variables in einer msgbox auszugeben, geht dies:

Code: Alles auswählen

    dim asV(ubound(Variables)) as string
    for l = 0 to ubound(Variables)
    cVariable = Variables(l)
    asV(l) = "V" & l & " Spalte: " & cVariable.Column & " Zeile: " & cVariable.Row & " Blattindex: " & cVariable.Sheet
    next l
    msgbox join(asV, chr(13))
Bei den Constraints wirds schwieriger, da hast Du noch eine Ebene mehr.
1.) Constraints() ->
  • Constraints(0)
    • .left
      • .Column
      • .Row
    • .Operator
      • .Value
    • .right
      • .Column
      • .Row
  • Constraints(1)
  • Constraints(2) ... usw.
Viel Erfolg
Gruß R
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von F3K Total »

Ich vermute,
da ist ein Fehler an dieser Stelle:

Code: Alles auswählen

    'Die Adressen der Variablen Zellen an den Solver uebergeben:
    counterV = 0 'Nullsetzen des Variablenzaehlers
    Variables() = F_get_solver_variables_from_named_Range("Mengen_001") 'Variable Zellen aus Berechnungen_001 ermitteln
    Variables() = F_get_solver_variables_from_named_Range("Mengen_002") 'Variable Zellen aus Berechnungen_002 ermitteln
    solv.Variables = Variables()
Denn in der function werden ja, analog zur o.a. Diskussion bzgl. "Static", alle Variablen beim erneuten Aufruf genullt, wenn sie herkömmlich dimensioniert sind. Also auch Variables().

Sprich, du musst vermutlich dafür sorgen, dass die im ersten Lauf der function ermittelten Variables erhalten bleiben, und die des zweiten Laufes angehängt werden.
Entweder durch eine übergeordnete Variable, wie Counter... oder durch eine Static in der function.
Dabei aber nicht mit den Namen durcheinander kommen.
Ich kann es nicht ausprobieren, da mir das Dokument fehlt, und ich nicht im Nebel irgendwelche "Zielzelle","Wert","Limit" Zellen definieren kann
Gruß R
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von F3K Total »

Ich kann mich nur wiederholen ...
F3K Total hat geschrieben:da mir das Dokument fehlt, und ich nicht im Nebel irgendwelche "Zielzelle","Wert","Limit" Zellen definieren kann
mit Beispieldokument (ggf. verfremdet) vermutlich eine Sache von ein paar Minuten.
R
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 1-mal geändert.
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 1-mal geändert.
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:18, insgesamt 2-mal geändert.
Antworten