-

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:17, 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:17, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag von F3K Total »

Puuuuh! Schwere Geburt.
Tipp: lerne XRAY oder MRI
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:17, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag von F3K Total »

Hi,
lösche im Hauptprogramm zunächst mal:

Code: Alles auswählen

Dim Constraint_1 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_2 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_3 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_4 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_5 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_6 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_7 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_8 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_9 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_10 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_11 as New com.sun.star.sheet.SolverConstraint
    Dim Constraint_12 as New com.sun.star.sheet.SolverConstraint
    Dim Constraints(12) as Object
Also die Definition der nullten Bedingung stehen lassen, und setze unten:

Code: Alles auswählen

    'Nun die Nebenbedingungen
    Constraints() = F_get_solver_constraints_from_named_Range("Mengen")
    'nachträglich die Sonderlösung für die nullte Bedingung
    Constraints(0).Left = Sheet.getCellByPosition(1,64).CellAddress
    Constraints(0).Operator = kleinergleich
    Constraints(0).Right = Sheet.getCellByPosition(2,64).CellAddress
  
    solv.Constraints = Constraints()
die function sollte dann so aussehen, achte auch auf die Kommentare:

Code: Alles auswählen

  Function F_get_solver_constraints_from_named_Range(S_named_Range)as Object
    dim Constraints(12) as New com.sun.star.sheet.SolverConstraint 'gleich als SolverConstraint Array definieren
    oDoc = ThisComponent
    oNamedRanges = thiscomponent.NamedRanges
    oRangeMengen = oNamedRanges.getbyname(S_named_Range)
    oCellRangeMengen = oRangeMengen.ReferredCells
    oCellRangeMengenRangeAddress = oCellRangeMengen.RangeAddress
    nsheet = oCellRangeMengenRangeAddress.Sheet
    oSheet = oDoc.Sheets(nsheet)'Tabelle auf der der Bereich benamst wurde
    nSC = oCellRangeMengenRangeAddress.StartColumn
    nSR = oCellRangeMengenRangeAddress.StartRow
    nEC = oCellRangeMengenRangeAddress.EndColumn
    nER = oCellRangeMengenRangeAddress.EndRow
    counter = 1 'Zaehlung beginnt wie gesagt erst bei 1, da 0 bereits fix definiert wurde[/b]
    for i = nSC to nEC
        for k = nSR+1 to nER 'beginnt auch hier eine Zeile tiefer?
            ocell = oSheet.getcellbyposition(i,k)
            ocell2 = oSheet.getcellbyposition(i-1,k)'Zelle links neben oCell, geht das so?[/b]
            'dim Constraint_counter as New com.sun.star.sheet.SolverConstraint 'Schnickschnack -> geht nicht durch Anhängen von _counter
            'Redim preserve Constraints(counter) 'nicht nötig, da du mit dim Constraints(12) die Grösse schon auf 12 festgelegt hast
               Constraints(counter).Left = ocell.celladdress
               Constraints(counter).Operator = kleinergleich
               Constraints(counter).Right = ocell2.celladdress
               'Constraints(counter) = Constraint_counter 'Schnickschnack, in den drei Zeilen oberhalb zugewiesen
            counter = counter + 1
        next k
    next i
    F_get_solver_constraints_from_named_Range = Constraints
End Function
Gruß R
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: getDataArray -> not assignable by given value?

Beitrag von balu »

Hallo Leute,

ich kann nicht helfen, möchte euch aber auf eine winzige kleinigkeit hinweisen.
Ersetzt doch mal bitte schön das hier

Code: Alles auswählen

    oDoc = ThisComponent
    oNamedRanges = thiscomponent.NamedRanges
durch das hier.

Code: Alles auswählen

    oDoc = ThisComponent
    oNamedRanges = oDoc.NamedRanges
Das wars schon.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag von F3K Total »

Hallo,
deine Fragen sind im luftleeren Raum kaum zu beantworten.
Ohne Beispieldokument, an dem man den Code laufen lassen kann, wird das nix.
Miamit vom iPad hat geschrieben:Meinst du das geht so? Schließlich hieß es im original ...
Das ist doch gerade der Vorteil! Du hast ein Feld (Array) von 0-12 Constraints, definiert als com.sun.star.sheet.SolverConstraint.
D.h. jedes dieser 13 Constraints hat wiederum drei Werte:

Code: Alles auswählen

.Left
.Operator
.Right
Miamit vom iPad hat geschrieben: Daher wäre redim preserve doch nötig?
Genau. Deswegen hatte ich es in der ersten function so gemacht.
Wenn Du genau hin schaust, wirst Du sehen, dass das Feld Variables() anfangs bei der Dimensionierung nur ein Feld umfasst, das nullte.
Gibt es eine weitere Zelle, wird das Array, bei Beibehaltung der bisher geschriebenen Inhalte, um eins erweitert (redim preserve).
Gruß R
EDIT: Du solltest den Titel des Threads mal anpassen, z.B. "Automatisches Befüllen des Calc-Solvers", mit dem augenblicklichen Titel kann die Nachwelt kaum etwas anfangen.
Benutzer 48566 gelöscht

-

Beitrag von Benutzer 48566 gelöscht »

----------
Zuletzt geändert von Benutzer 48566 gelöscht am Mi, 26.06.2024 15:17, 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:17, 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 »

Hallo Miamit,
langsam läuft's rund :)
Da hast Du Dir mit absoluter Treffsicherheit gleich die allereinfachste Aufgabe gestellt ;)
Viel Erfolg weiterhin.
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:17, 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:17, 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 »

Hallo miamit,
neue Frage, neuer Thread.
Die Fragen zum Solver sind sicherlich im Calc-Forum besser aufgehoben, ich kann da auch nur googeln.
Die Frage zu Mengen/Mengen2:
Die function ermittelt das Tabellenblatt auf dem Du einen Namen vergeben hast selbst:

Code: Alles auswählen

    nsheet = oCellRangeMengenRangeAddress.Sheet
    oSheet = oDoc.Sheets(nsheet)'Tabelle auf der der Bereich benamst wurde
Wenn Du

Code: Alles auswählen

F_get_solver_variables_from_named_Range("Mengen2")
irgendwo aufrufst, kommen die Daten aus "Mengen2" zurück
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:17, 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 »

Hi,
wenn Du die functions in deiner Sub 2x aufrufen willst und der Counter "durchlaufen" soll, dann vielleicht prinzipiell so:

Code: Alles auswählen

Dim Counter as integer' Über der Sub dimensioniert -> im ganzen Modul verfügbar

Sub AutomatischerSolver
.
.
.
   Counter = 0' Nullsetzen des Counter aus der function herausgenommen
   Variables() = F_get_solver_variables_from_named_Range("Mengen")
   Variables() = F_get_solver_variables_from_named_Range("Mengen2")
   solv.Variables = Variables() 
.
.
   Counter = 0' Nullsetzen des Couter aus der function herausgenommen
   Constraints() = F_get_solver_constraints_from_named_Range("Mengen")
   Constraints() = F_get_solver_constraints_from_named_Range("Mengen2")
   solv.Constraints = Constraints()
.
.
    End Sub
Gruß R
Zuletzt geändert von F3K Total am So, 30.12.2012 19:55, insgesamt 1-mal geändert.
Antworten