[gelöst] sortieren funktioniert nicht

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

Moderator: Moderatoren

der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

[gelöst] sortieren funktioniert nicht

Beitrag von der_Zerstreute »

hey leute ,

ich hab da nen kleines makro geschrieben welches eigentlich die zeilen eines ausgewählten Bereiches sortieren soll.
Leider muß ich feststellen das es nicht funktionert so wie ich es will. Genau genommen passiert gar nix .

wo liegt mein Gedankenfehler ...

Code: Alles auswählen

sub main
dim count as integer
dim zero as integer
Dim SortierKrit(3) As new com.sun.star.beans.PropertyValue
Dim SortierFeld(0) As new com.sun.star.table.TableSortField
dim check as double
dim colour as long
dim fil as object

count = 1 
check = 1
colour = 16777062

do while check >0
count = count + 1
check = thisComponent.sheets(0).getCellByPosition(0,count).value
loop

SortierFeld(0).field = 5
SortierFeld(0).IsAscending = false
SortierFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC

SortierKrit(0).Name = "SortFields"
SortierKrit(0).Value = SortierFeld()
SortierKrit(1).Name = "SortColumns"
SortierKrit(1).Value = true
SortierKrit(2).Name = "ContainsHeader"
SortierKrit(2).Value = false
SortierKrit(3).Name = "IsCaseSensitive"
SortierKrit(3).Value = false

fil = thiscomponent.sheets(0).getcellrangebyposition(0,1,9,count).sort(SortierKrit())
end sub
danke wie immer schonmal im vorraus
Zuletzt geändert von der_Zerstreute am Fr, 21.02.2014 09:14, insgesamt 1-mal geändert.
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo!

der_Zerstreute hat geschrieben: ich hab da nen kleines makro geschrieben welches eigentlich die zeilen eines ausgewählten Bereiches sortieren soll
.
.
SortierKrit(1).Name = "SortColumns"
SortierKrit(1).Value = true
Du willst nach Zeilen sortieren, schreibst aber in deinem Makro, dass es nach Spalten sortieren soll. Schreibe mal:

Code: Alles auswählen

SortierKrit(1).Name = "SortColumns"
SortierKrit(1).Value = false
Gruß
Charly
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: sortieren funktioniert nicht

Beitrag von der_Zerstreute »

ich habe die Zeile noch angepasst aber es funktioniert trotzdem nicht ..

vieleicht könnt ihr mir besser helfen wenn ihr die Tabelle kennt die er sortieren soll.
Ich pack also mal anbei ein Bildschirmausschnitt von der Tabelle.

Ziel des Makros soll es sein die Spalte "aktuell" (F) von groß nach klein zu sortieren .
Am Anfang des Makros ist eine Schleife die erkennen soll von wo sich der letzte Eintrag in der Tabelle befindet um den zu markierenden Bereich zu definieren.

Hoffe ihr könnt mir helfen..
Dateianhänge
tabelle.jpg
tabelle.jpg (58.44 KiB) 1521 mal betrachtet
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo Zerstreuter!

Eines vorweg. Du wirst schneller und mehr Antworten bekommen, wenn du die Calc-Datei als Datei und nicht als Bild anhängst.
Es ist nämlich eine ganz schöne Tiparbeit, um eine Testdatei zu erzeugen, was wohl nicht jedermanns Sache ist.

Ich habe deinen Code berichtigt. Hier das Ergebnis.

Code: Alles auswählen

    sub main
    dim count as integer
    dim zero as integer
    Dim SortierKrit(3) As new com.sun.star.beans.PropertyValue
    Dim SortierFeld(0) As new com.sun.star.table.TableSortField
    dim check as double
    dim colour as long
    dim fil as object

    count = 1
    check = 1
    colour = 16777062

    do while check >0
    count = count + 1
    check = thisComponent.sheets(0).getCellByPosition(0,count).value
    loop

    SortierFeld(0).field = 5
    SortierFeld(0).IsAscending = false
    SortierFeld(0).FieldType = com.sun.star.util.SortFieldType.AUTOMATIC

    SortierKrit(0).Name = "SortFields"
    SortierKrit(0).Value = SortierFeld()
    SortierKrit(1).Name = "SortColumns"
    SortierKrit(1).Value = false
    SortierKrit(2).Name = "ContainsHeader"
    SortierKrit(2).Value = false
    SortierKrit(3).Name = "IsCaseSensitive"
    SortierKrit(3).Value = false

    thiscomponent.sheets(0).getcellrangebyposition(0,2,9,count).sort(SortierKrit())
    end sub
Gruß
Charly
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: sortieren funktioniert nicht

Beitrag von der_Zerstreute »

Hallo Charly ,

Dickes Danke für deine Mühe , nächstes Mal häng ich es als Tabelle an !

Deine Korrektur hat geholfen !

Jetzt kann ich das Makro endlich fertig stellen :D

Gruß
Daniel
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: sortieren funktioniert nicht

Beitrag von der_Zerstreute »

mhm .. also eine Kleinigkeit gibt da noch ..

anscheinend sortiert der die Formatierung mit, das will ich aber nicht , wie bekomme ich hin das er die Formatierung links liegen läßt ?

ich habe das Makro jetzt mal um die fehlenden Funktionen ergänzt und mal die ganze Datei angehängt, vieleicht kann mir jemand weiterhelfen.

Danke schonmal im Vorraus
Z.
Dateianhänge
Eismannliste.ods
(24.95 KiB) 66-mal heruntergeladen
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo!

Welche Formatierung meinst du? Vielleicht kannst du deine Wünsche noch etwas erläutern.

Wenn du die gelbe Markierung für die Null-Restbestände meinst, würde ich dazu kein Makro verwenden, sondern eine Bedingte Formatierung. Bedingung: Die Zeile soll gelb sein, wenn Restbestand = 0.



Gruß
Charly
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: sortieren funktioniert nicht

Beitrag von der_Zerstreute »

hallo Charly ,

ich meine den Rahmen, wenn das Makro fertig ist habe ich plötzlich den Dicken Rand-Rahmen von der letzten Zeile mitten in der Tabelle :/
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo!

Das mit dem Rahmen habe ich gar nicht bemerkt.

Beim Sortierungsvorgang gibt es meines Wissens keine Möglichkeit, das Mitsortieren der Formatierung zu unterbinden. Das ist auch nicht sinnvoll, da sich Formatierungen ja nicht nur auf Rahmen beschränken, sondern z.B auch auf Datums und Zahlenformate.

Im Makro kann man allerdings zunächst den Rahmen auf "dünn" setzen um ihn am Ende wieder auf den Ursprung zurückzusetzen.
Ich habe das mal in dein Makro eingebaut. Die Rahmenstärke musst du dabei noch überprüfen. Diese habe ich nur geschätzt.

Gruß
Charly
Dateianhänge
Eismannliste.ods
(17.56 KiB) 61-mal heruntergeladen
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo!
Charly hat geschrieben: Die Rahmenstärke musst du dabei noch überprüfen. Diese habe ich nur geschätzt.
Ich habe die Rahmenstärke jetzt per Makro ausgelesen. Danach ist die von dir vorgegebene dünne Linie "18" und die dicke Linie "88" 100stel mm.

Gruß
Charly
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo!

Ich habe heute festgestellt, dass es beim Sortieren über das Menü eine Einstellung gibt, die das Sortieren von Formaten verhindert. Leider ist mir die entsprechende Einstellung in Starbasic nicht bekannt. Ich habe daher jetzt das Sortieren mit dem Makrorekorder aufgezeichnet und in dein Programm integriert.

Code: Alles auswählen

sub sortieren1()
dim count as integer
dim zero as integer
dim ende as integer
dim check as double
dim colour as long
Dim Dok as object
Dim Controller as Object
dim document   as object
dim dispatcher as object
Dim Blatt as object
Dim Bereich as object
dim args1(6) as new com.sun.star.beans.PropertyValue

Dok = ThisComponent
Controller = Dok.GetCurrentController
Blatt = dok.sheets(0)
document   = Controller.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

args1(0).Name = "ByRows"
args1(0).Value = true
args1(1).Name = "HasHeader"
args1(1).Value = false
args1(2).Name = "CaseSensitive"
args1(2).Value = false
args1(3).Name = "IncludeAttribs"
args1(3).Value = false
args1(4).Name = "UserDefIndex"
args1(4).Value = 0
args1(5).Name = "Col1"
args1(5).Value = 6
args1(6).Name = "Ascending1"
args1(6).Value = false

' ----------------------------------------------------------------------------------------
' Grundvariablen beschreiben
' ----------------------------------------------------------------------------------------

count = 1 
check = 1
colour = 16777062

' ----------------------------------------------------------------------------------------
' ermitteln der letzten Zeile
' ----------------------------------------------------------------------------------------

do while check >0
count = count + 1
check = Blatt.getCellByPosition(0,count).value
loop
ende = count - 1



' ----------------------------------------------------------------------------------------
' Tabelle nach vorhandener Menge sortieren
' ----------------------------------------------------------------------------------------
Bereich = Blatt.getcellrangebyposition(0,2,9,ende)
Controller.select(Bereich)

dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())


' ----------------------------------------------------------------------------------------
' Erste Zeile ohne Restbestand suchen
' ----------------------------------------------------------------------------------------
check = 1
count = 1
do while check >0
count = count + 1
check = thisComponent.sheets(0).getCellByPosition(5,count).value
loop
zero = count
' ----------------------------------------------------------------------------------------
' Vorhandene Lebensmittel nach Artikelnummer sortieren
' ----------------------------------------------------------------------------------------
Bereich= Blatt.getcellrangebyposition(0,2,9,zero)
Controller.select(Bereich)

args1(5).Value = 1

dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())



' ----------------------------------------------------------------------------------------
' nicht vorhandene Lebensmittel nach Artikelnummer sortieren und farblich hinterlegen
' ----------------------------------------------------------------------------------------


Bereich = Blatt.getcellrangebyposition(0,zero+1,9,ende)
Controller.select(Bereich)
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())

Bereich.cellbackcolor = colour

end sub
Gruß
Charly
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Re: sortieren funktioniert nicht

Beitrag von Charly »

Hallo!

Jetzt bin ich im Internet doch fündig geworden. Im Starbasic gibt es jetzt einen SortDesciptor. Dort kann man einstellen, dass ohne Formate sortiert werden soll. Name = BindFormatsToContent. Allerdings braucht beim SortDescriptor nicht mehr der Name mitgegeben zu werden. Die Daten müssen nur im richtigen Arrayfeld stehen. Ich habe daher die Namen zwar mitgeschrieben, ober durch Hochkomma auskommentiert.

Code: Alles auswählen

sub Sortieren2()
dim count as integer
dim zero as integer
dim ende as integer
Dim SortierKrit as object
Dim SortierFeld(0) As new com.sun.star.table.TableSortField
dim check as double
dim colour as long
Dim Dok as Object
Dim Blatt as Object
Dim Bereich as Object

Dok = ThisComponent
Blatt = Dok.Sheets(0)
SortierKrit = Blatt.createSortDescriptor()


' ----------------------------------------------------------------------------------------
' Grundvariablen beschreiben
' ----------------------------------------------------------------------------------------

count = 1 
check = 1
colour = 16777062

' ----------------------------------------------------------------------------------------
' ermitteln der letzten Zeile
' ----------------------------------------------------------------------------------------

do while check >0
count = count + 1
check = Blatt.getCellByPosition(0,count).value
loop
ende = count - 1



' ----------------------------------------------------------------------------------------
' Tabelle nach vorhandener Menge sortieren
' ----------------------------------------------------------------------------------------

SortierFeld(0).field = 5
SortierFeld(0).IsAscending = false
SortierFeld(0).IsCaseSensitive = false
SortierFeld(0).FieldType = com.sun.star.util.SortFieldType.AUTOMATIC

Bereich = Blatt.getcellrangebyposition(0,2,9,ende)


'SortierKrit(0).Name = "IsSortColumns"
SortierKrit(0).Value = false
'SortierKrit(1).Name = "ContainsHeader"
SortierKrit(1).Value = false
'SortierKrit(3).Name = "SortFields"
SortierKrit(3).Value = SortierFeld
'SortierKrit(4).Name = "BindFormatsToContent"
SortierKrit(4).Value = false


Bereich.sort(SortierKrit())

' ----------------------------------------------------------------------------------------
' Erste Zeile ohne Restbestand suchen
' ----------------------------------------------------------------------------------------
check = 1
count = 1
do while check >0
count = count + 1
check = Blatt.getCellByPosition(5,count).value
loop
zero = count
' ----------------------------------------------------------------------------------------
' Vorhandene Lebensmittel nach Artikelnummer sortieren
' ----------------------------------------------------------------------------------------

SortierFeld(0).field = 0
SortierKrit(3).Value = SortierFeld()

Bereich = Blatt.getcellrangebyposition(0,2,9,zero)
Bereich.sort(SortierKrit())

' ----------------------------------------------------------------------------------------
' nicht vorhandene Lebensmittel nach Artikelnummer sortieren und farblich hinterlegen
' ----------------------------------------------------------------------------------------

SortierFeld(0).field = 0
SortierKrit(3).Value = SortierFeld()

Bereich = Blatt.getcellrangebyposition(0,zero+1,9,ende)
Bereich.sort(SortierKrit())

Blatt.getcellrangebyposition(0,zero+1,9,ende).cellbackcolor = colour


 
end sub
Ich hoffe unter den ganzen Varianten, findest du eine dir genehme.

Gruß
Charly
Antworten