[gelöst] Calc Tabelle Zeilen duplizieren

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

Moderator: Moderatoren

Saigo
Beiträge: 9
Registriert: Di, 27.12.2011 11:57

[gelöst] Calc Tabelle Zeilen duplizieren

Beitrag von Saigo »

Hallo,
(hab den Beitrag schon unter Calc stehen gehabt denke hier ist er aber passender, sorry fürs ändern)

ich stehe hier vor einem Problem bei dem mein Wissen nicht ausreicht.
Ich habe hier eine Tabelle mit 60.000+ Zeilen. Immer ein Teil der Zeilen gehört zusammen und soll jetzt quasi als "Vater" eine darüber liegende Zeile bekommen, die Kinder sollen alle die ID des Vaters haben. Ich versuche das mal über ein Beispiel zu erklären.

Code: Alles auswählen

Tabelle (ist Zustand):
      X1   |   X2   |   X3   |   X4   |    X5   |   X6   |   X7   | ....
Y1|        |          |   1     | xx     |    xx    |   xx   |   xx    |
Y2|        |          |   2     | xx     |    xx    |   xx   |   xx    |
Y3|        |          |   2     | xx     |    xx    |   xx   |   xx    |
Y4|        |          |   2     | xx     |    xx    |   xx   |   xx    |
...
(xx soll einfach nur inhalt sein)
In der Spalte X3 steht eine ID die für Y2,Y3,Y4 gleich ist. Diese Zeilen sollen als "Kinder" eine zusätzliche Zeile als Vater bekommen. Hierzu dupliziere ich Y2 (bis auf 8 Zellen die dürfen nicht bei der "Vater"-Zeile vorhanden sein). [Ich nenne die Zeile jetzt Y2-a]
Dann soll in Y2-a in X1eine neue ID ab 1000 stehen. Die "Kinder" also Y2,Y3,Y4 sollen in X1 ID-1,ID-2 etc. stehen haben. In X2 soll nun nur bei den "Kindern" die ID des Vaters als Zuordnung stehen.
Ich hoffe das konnte man nachvollziehen.Ziel wäre also dann folgende Tabelle

Code: Alles auswählen

Tabelle (soll Zustand):
          X1       |   X2   |   X3   |   X4   |    X5   |   X6   |   X7   | ....
...
Y1    | 1000-2 |          |   1     | xx     |    xx    |   xx   |   xx    |
Y2-a |   1001  |          |   2     | xx     |    xx    |         |           |
Y2    | 1001-1 |  ID    |   2     | xx     |    xx    |   xx   |   xx    |
Y3    | 1001-2 |  ID    |   2     | xx     |    xx    |   xx   |   xx    |
Y4    | 1001-3 |  ID    |   2     | xx     |    xx    |   xx   |   xx    |
Y5-a |   1002  |          |   3     | xx     |    xx    |         |           |
...
(xx soll einfach nur inhalt sein)
Soweit mein Ziel, das Problem ist das ich das nur von Hand lösen könnte und das bei über 60.000 Zeilen ewig dauert.
Kann mir da jemand weiterhelfen wie man das automatisieren kann?

Auch einzelne Schritte wären eine Erleichterung, z.B. nur die entsprechenden Zeilen duplizieren und vor der orginalen einzufügen ohne die Zellen die ich nicht brauche.

vielen Danke schonmal für die Hilfe im voraus
Zuletzt geändert von Saigo am Sa, 31.12.2011 10:38, insgesamt 2-mal geändert.
CamuelSpenser
**
Beiträge: 32
Registriert: Mo, 19.12.2011 11:52

Re: Calc Tabelle Zeilen duplizieren

Beitrag von CamuelSpenser »

Hallo Saigo,

Im Grunde versteh ich so in etwa vorauf du hinauswillst..
Hättest du vielleicht ne Beispiel Datei die du anhängen könntest zu Testzwecken?

Ansonsten n bissle was in der Richtung :

Code: Alles auswählen

Sub Test
REM Definition der Variablen :
dim oDocument, oSheet, oDraw, oController as Object
dim sText1, sText2                                     as String
REM Kontrolle übers Blatt erhalten :
	oDocument   = StarDesktop.CurrentComponent
	oSheet      = oDocument.Sheets.GetByName("Test")
	oDraw       = oSheet.DrawPage
	oControler  = oDocument.GetCurrentController
REM Text aus Zellen auslesen :
sText1 = oSheet.GetCellByPosition(3,1).String ''' Inhalt der Zelle Y1 / X3 in diesem Beispiel
sText2 = oSheet.GetCellByPosition(3,2).String ''' Inhalt der Zelle Y2 / X3 in diesem Beispiel 
Nun fehlt noch der Vergleich nur da hackts, grad bissle bei meinen bescheidenen Kenntnissen...
Zum einen müsstest du glaub ich n paar mehr Variablen benutzen in ner For-Schleife, wo du immer wieder Verschiedene Dinge Vergleichen musst, nur seh ich grad den Wald vor lauter Bäumen nicht.

Zum Duplizieren musst du ja im Grunde erst ma ne Zeile einfügen und dann die Werte aus der Zeile darunter in diese Kopieren... wär glaub ich am Einfachsten ..

Code: Alles auswählen

oSheet.GetRows().GetByIndex(AktuelleZeile)..... 
REM hab ka ob es nen InsertRow befehl oder so gibt grad und auch kein OOo bei Hand zum überprüfen
REM kann auch eventuell AktuelleZeile-1 sein und dann iwie nen InsertRow
Jedenfalls wenn du ne Beispiel Datei dazu hättest würde mir das sehr entgegenkommen '^^

Bis dahin Viel Spaß
Lg Camuel
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc Tabelle Zeilen duplizieren

Beitrag von balu »

Hallo Leute,

verzeiht wenn ich mich hier ohne wirklich helfen zu können so einfach einmische, aber aus gegebenen Anlass möchte ich Camuel auf etwas hinweisen.

@Camuel

Code: Alles auswählen

dim oDocument, oSheet, oDraw, oController as Object
dim sText1, sText2                                     as String
Das war mir schon an anderer Stelle bei dir negativ aufgefallen. Und deshalb solltest Du dich unbedingt bei Dannenhoefer noch mal schlau machen. Insbesondere:
Warum haben manche Variablen anscheinend nicht den richtigen Wert?
Oder auch:
Wie werden Variablen deklariert?

Code: Alles auswählen

   oDocument   = StarDesktop.CurrentComponent
   oSheet      = oDocument.Sheets.GetByName("Test")
   oDraw       = oSheet.DrawPage
   oControler  = oDocument.GetCurrentController
Warum sprichst Du die Drawpage an, obwohl sie hier nicht gebraucht wird? Das führt schnell zu Irritationen.
Dein Vorschlag modifiziert:

Code: Alles auswählen

Dim oDoc as Object, oSheet as Object
Dim sText1 as String, sText2 as String
	oDoc = thisComponent
	oSheet = oDoc.Sheets().getByName("Tabelle1")
	sText1 = oSheet.getCellByPosition(3,1).String
	sText2 = oSheet.getCellByPosition(3,2).String


@Saigo
Auch einzelne Schritte wären eine Erleichterung, z.B. nur die entsprechenden Zeilen duplizieren und vor der orginalen einzufügen ohne die Zellen die ich nicht brauche.
Ich weiß nicht ob es dir vielleicht schon etwas hilft, aber auch für dich der Tipp mit Dannenhoefer und dort: Wie kann man Zellbereiche kopieren?
Und ansonsten wäre eine Beispieldatei wirklich von Vorteil, da deine Beschreibung doch etwas zu Abstrakt ist.



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
CamuelSpenser
**
Beiträge: 32
Registriert: Mo, 19.12.2011 11:52

Re: Calc Tabelle Zeilen duplizieren

Beitrag von CamuelSpenser »

Huhu balu

aye da Danke ich dir abermals... deshalb hatte ich auch Öfters Probleme mit meinen Variabeln ^^

bin gewohnt von Turbo Pascal, Delphi, VBA,... dass wenn ich schreib dim x,y,z as Ding, dass alle genannten variabeln dann als Typ ding haben ^^
Dies ist hier dann aber nicht der Fall wie es aussieht >.<

Deshalb vielen Dank ^^
Saigo
Beiträge: 9
Registriert: Di, 27.12.2011 11:57

Re: Calc Tabelle Zeilen duplizieren

Beitrag von Saigo »

Hallo und Danke für die Antworten :)
in meiner Verzweiflung das man mein Geschreibsel garnicht verstanden hat hab ich schon begonnen das ganze Manuell zu machen, daher hab ich auch grade erst wieder reingeschaut ... nach 10.000 Zeilen könnt ich nun ..

Also ich habs Versucht in ner Beispieldatei deutlich zu machen. Die roten Variablen sind neue Werte und gelb hinterlegte Zeilen müssen aus der nachfolgenden erst erstellt werden. Hoffe so ist es deutlicher.

Leider bin ich auf dem Gebiet in OpenOffice völlig neu so das ich da 0 Durchblick habe :( Ihr müsstet mir das also quasi für doofe erklären :)
(muss ich sobald ich Zeit hab mal ändern :/ )

Vielen Dank nochmal/schonmal :)
Dateianhänge
bsp.ods
(10.38 KiB) 50-mal heruntergeladen
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc Tabelle Zeilen duplizieren

Beitrag von DPunch »

Aloha

Es wäre sinnvoller gewesen, wenn Du mal gezeigt hättest, wie die Daten im "Originalzustand" aussehen - Deine Beispieldatei weicht ziemlich ziemlich stark von Deinem vorher geschilderten "Ist-Zustand" ab, daher ist das etwas verwirrend (zumindest für mich).
Saigo
Beiträge: 9
Registriert: Di, 27.12.2011 11:57

Re: Calc Tabelle Zeilen duplizieren

Beitrag von Saigo »

Ehrlich gesagt befürchte ich das bringt durch den Datenwulst noch mehr Chaos :)
Aber ok ich hab mal 2 Tabellen gemacht die eine der "ist" die andere der "soll"-Zustand. (Die Zellen AA-AF und AH sind die die beim kopieren leer bleiben müssen)

greetz Saigo
Dateianhänge
bsp_soll.ods
(15.39 KiB) 71-mal heruntergeladen
bsp_ist.ods
(14.04 KiB) 73-mal heruntergeladen
Saigo
Beiträge: 9
Registriert: Di, 27.12.2011 11:57

Re: Calc Tabelle Zeilen duplizieren

Beitrag von Saigo »

So nach viel hin und her arbeite ich jetzt mit folgendem Makro:

Code: Alles auswählen

REM  *****  BASIC  *****

sub Vater
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertRows", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Sel"
args4(0).Value = false

dispatcher.executeDispatch(document, ".uno:GoToStartOfRow", "", 0, args4())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args6(1) as new com.sun.star.beans.PropertyValue
args6(0).Name = "By"
args6(0).Value = 1
args6(1).Name = "Sel"
args6(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args6())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoRightSel", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoDownSel", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())


end sub
Im Moment gehe ich nach dem Ausführen des Makros hin ändere Manuell die erste Spalte die beiden Werte auf ID-1 und ID-2 danach fülle ich durch ziehen mit der Maus die folgenden Zeilen. Wenn jemand eine Idee hat wie man das Manuelle ändern noch automatisieren kann wäre des hilfreich.

Das Löschen der Zellen in den "Vater"-Zeilen werde ich am Ende über einen Filter lösen.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc Tabelle Zeilen duplizieren

Beitrag von DPunch »

Aloha

Siehe Datei im Anhang.
Der Makrocode an sich dürfte wohl noch etwas Deinen Horizont übersteigen, aber die wichtigsten Dinge kannst Du in den ersten Zeilen des Quellcodes anpassen.
Viel Spass.
Dateianhänge
bsp_ist.ods
(16.25 KiB) 74-mal heruntergeladen
Zuletzt geändert von DPunch am Fr, 30.12.2011 18:54, insgesamt 1-mal geändert.
Saigo
Beiträge: 9
Registriert: Di, 27.12.2011 11:57

Re: Calc Tabelle Zeilen duplizieren

Beitrag von Saigo »

Hallo,
WUNDERBAR :)
Vielen herzlichen Dank, das funktioniert genau so wie ich es mir vorgestellt hatte :) mein Rechner hat ne ganze Weile gerechnet :)
Das der Code mein Können weit überschreitet ist wohl richtig, ich kanns zwar logisch nachvollziehen aber kenne halt die ganze Mechanik dabei/dahinter nicht :) aber ich gelobe Besserung vielleicht kann ich irgendwann dann auch mal wem so helfen.

Viele Grüße und einen guten Rutsch ins neue Jahr schonmal,
Saigo
Antworten