Seite 1 von 2

alle möglichen Datensätze automatisch erzeugen

Verfasst: Mi, 30.05.2007 14:47
von Ontario
Hallo,

wie generiere ich automatisch eine Tabelle, in der aus vorgegeben Werten (z.B.

Audi, BMW, Opel - rot, blau - 100PS, 200PS, 150PS)

alle möglichen Kombinationen dargestellt werden sollen:

Marke|Farbe|Leistung
-------------------------
Audi|rot|200PS
Audi|blau|100PS
Audi|rot|150PS
Opel|blau|200PS
usw.

Es geht darum, alle möglichen Produktkombinationen darzustellen.


Danke

Verfasst: Mi, 30.05.2007 19:21
von Gert Seler
hallo Ontario,
möchtest Du ernsthaft eine solche "Datenbank" erstellen, dann
verwende dazu auch eine "Ooo_Datenbank".
Die Variationen der einzelnen "ZubehörGruppen" (Farbe;Motor;Sitzbezüge)
und der Kfz-Varianten (Pkw=2türig;3türig;4türig;5türig;Kombi; Cabriolet)
Variante=Standard;Export;Luxus;OberLuxus) plus das Zubhör sind so
vielfältig, das eine "Tabellenkalkulation" dafür nicht geeignet ist.

mfg
Gert

Verfasst: Do, 31.05.2007 17:42
von Ontario
Hallo,

ja, ich möchte eine derartige Tabelle erstellen. Das mit den Autos war nur ein Beispiel, um das Problem zu verdeutlichen.

Es geht letzendlich um eine Conjoint-Analyse, was hier aber keine Rolle spielt. Der Nutzen aller Möglichkeiten wird durch diese Analyse bestimmbar: So dass dann herauskommt, dass ein Audi,rot,200PS einen höheren Nutzen als ein Audi,rot,100PS hat. Aber das ist hier völlig egal. Ich brauche eine Möglichkeit, erstmal eine Tabelle mit allen Möglichkeiten zu erzeugen.

Angenommen es stehen die möglichen
Marken in Spalte 1: Audi|Opel|BMW
Farben in Spalte 2: rot|blau
Leistung in Spalte 3: 100PS|150PS|200PS

Wie kann ich nun eine o.g. Tabelle erzeugen?

Nur aus diesen Werten (Audi, BMW, Opel - rot, blau - 100PS, 200PS, 150PS) soll eine derartige Tabelle erstellt werden.

Verfasst: Fr, 01.06.2007 05:29
von Karolus
Hallo

Lass mal folgendes Makro in einem neuen Calc-dokument laufen:

Code: Alles auswählen

Sub kombinationen
'Schreibt alle Kombinationsmöglichkeiten der folgenden Arrayeinträge
'in eine Tabelle 
M = array("Audi","BMW","Opel")
F = array("rot","blau")
L = array("100 PS","150 PS","200 PS")
'k = Anzahl der Kombinationen
k = (ubound(M())+1)*(ubound(F())+1)*(ubound(L())+1)

for n = 0 to k-1
' 1.Tabelle.A1:Ck
	thisComponent.sheets(0).getcellbyposition(0,n).setstring(M(a))
	thisComponent.sheets(0).getcellbyposition(1,n).setstring(F(b))
	thisComponent.sheets(0).getcellbyposition(2,n).setstring(L(c))
	c = c + 1
	if c > ubound(L()) then : b = b+1 : c = 0 : end if
	if b > ubound(F()) then : a = a + 1 : b = 0 : end if
next n
End Sub
Gruß Karo

Verfasst: Fr, 01.06.2007 10:15
von Gert Seler
Danke Karo,
hat mir auch sehr geholfen, da ich mit "Basic" noch sehr viel
üben muß.

mfg
Gert

Verfasst: Fr, 01.06.2007 11:47
von Ontario
Vielen Dank!
Das ist sensationell und funktioniert super.

Gibt es die Möglichkeit, die Werte (Audi, BMW, Opel - rot, blau - 100PS, 200PS, 150PS) aus einer Tabelle auslesen zu lassen?

Es geht mir darum, dass ich die Art und Anzahl der Werte ändern kann (z.B. für Drucker:
10Seiten/min|20Seiten/min - 2JahreGarantie|1JahrGarantie|3JahreGarantie|4JahreGarantie - Farbe|schwarzweiß - groß|klein|mittel)

dann läuft das Makro drüber und generiert die Tabelle.

Verfasst: Fr, 01.06.2007 15:53
von Karolus
Hallo

Für eine Quelltabelle (hier die erste Tabelle) die so aufgebaut ist:
von A1 bis C3:
Audi|rot|100 PS
BMW|blau|150 PS
Opel| |200 PS

...gibt folgendes Makro die Kombinationen in die zweite Tabelle aus:

Code: Alles auswählen

Sub kombinationen2
Do
	quellea = thisComponent.sheets(0).getcellbyposition(0,a).string
	quelleb = thisComponent.sheets(0).getcellbyposition(1,b).string
	quellec = thisComponent.sheets(0).getcellbyposition(2,c).string

	thisComponent.sheets(1).getcellbyposition(0,n).string = quellea
	thisComponent.sheets(1).getcellbyposition(1,n).string = quelleb
	thisComponent.sheets(1).getcellbyposition(2,n).string = quellec
	n = n +1
	c = c + 1
	if thisComponent.sheets(0).getcellbyposition(2,c).string  = "" then 
	b = b + 1 : c = 0 : end if
	if thisComponent.sheets(0).getcellbyposition(1,b).string = "" then 
	a = a + 1 : b = 0 : end if
loop until thisComponent.sheets(0).getcellbyposition(0,a).string  = ""
End Sub
Gruß Karo

Verfasst: Sa, 02.06.2007 16:08
von Ontario
Ich danke dir. Das war super.

Viele Grüße

Fortsetzung

Verfasst: Sa, 02.06.2007 22:07
von matlat
Hallo zusammen
ich möcht mich mal an dieses Makro dranhängen und habe es aufgemotzt, so dass ich sogar die Komabinationen von 8 Merkmalen erzeugen könnte, geht aber nicht, weil die Möglichkeiten von ca 17 Mio die maximal mögliche Anzahl der Zeilen von Calc sprengen.
Allerdings habe ich ein etwas anderes Problem:
Ich möchte die Kombinationen von 8 vorgegebenen Buchstaben haben, die durch unterschiedliche Anordnung jeweils neue Wörter ergeben.
Jeder Buchstabe darf also nur einmal auftauchen.
Dadurch kommen ca 40 000 Kombinationen zustande. Calc schafft das.
Wird das ein völlig neues Makro oder kann man das oben stehende etwas abändern?
Bin schon auf eine Antwort gespannt.
Wolfgang

Verfasst: Sa, 02.06.2007 23:01
von Karolus
Hallo
geht aber nicht, weil die Möglichkeiten von ca 17 Mio die maximal mögliche Anzahl der Zeilen von Calc sprengen.
schreib die Kombi in je eine Zelle, führe einen Platzhalter für den Spaltenindex ein, und erhöhe diesen um 1 bei n = 65000 und setze n wieder auf 0 - dann passts rein -notfalls kann du auch bis zu 256 Tabellenblätter vollschreiben-
:D
Jeder Buchstabe darf also nur einmal auftauchen.
Du meinst im Prinzip: (mit 3 Buchstaben)
abc , acb , bac , bca , cba , cab
Das bereitet mir etwas Kopfzerbrechen, da muss ich (mindestens)eine Nacht drüber schlafen.

Gruß Karo

Verfasst: Sa, 02.06.2007 23:39
von matlat
Hallo Karolus
der erste Teil meiner Frage mit den 17 Mio war auch nur Gedankenspiel, aber Danke für deine Antwort, werde sie vielleicht irgendwann mal brauchen.
Zum 2.Teil: Ja, genauso soll es aussehen. Die Anzahl der Möglichkeiten sind dann n! (n Fakultät), bei 8 Buchstaben 40320 Kombinationen.
Ich zwing dich zu nichts, nur wenn es Spass macht.
Wolfgang

Verfasst: So, 03.06.2007 23:51
von Ontario
ich möcht mich mal an dieses Makro dranhängen und habe es aufgemotzt, so dass ich sogar die Komabinationen von 8 Merkmalen erzeugen könnte
Kanst du gern mal posten. :)

Viele Grüße

Verfasst: Mo, 04.06.2007 00:35
von matlat
Hallo,
ich müsste ja eigentlich erst Karolus fragen ob ich sein Makro verändern und veröffentlichen darf, er dürfte aber nichts dagegen haben.
Ich habe es auf 6*6 gebracht, damit es auf ein Tabellenblatt passt, sind 46656 Zeilen.
Karolus' Tipp, alles auf mehrere Tabellenblätter zu verteilen, habe ich noch nicht ausprobiert und umgesetzt.

Code: Alles auswählen

Sub kombinationen2_6x6
Do 
   quellea = thisComponent.sheets(0).getcellbyposition(0,a).string 
   quelleb = thisComponent.sheets(0).getcellbyposition(1,b).string 
   quellec = thisComponent.sheets(0).getcellbyposition(2,c).string 
   quelled = thisComponent.sheets(0).getcellbyposition(3,d).string 
   quellee = thisComponent.sheets(0).getcellbyposition(4,e).string 
   quellef = thisComponent.sheets(0).getcellbyposition(5,f).string 

   thisComponent.sheets(1).getcellbyposition(0,n).string = quellea 
   thisComponent.sheets(1).getcellbyposition(1,n).string = quelleb 
   thisComponent.sheets(1).getcellbyposition(2,n).string = quellec 
   thisComponent.sheets(1).getcellbyposition(3,n).string = quelled 
   thisComponent.sheets(1).getcellbyposition(4,n).string = quellee 
   thisComponent.sheets(1).getcellbyposition(5,n).string = quellef 
   n = n + 1 
   f = f + 1 
   if thisComponent.sheets(0).getcellbyposition(5,f).string  = "" then 
   e = e + 1 : f = 0 : end if
   if thisComponent.sheets(0).getcellbyposition(4,e).string  = "" then 
   d = d + 1 : e = 0 : end if
   if thisComponent.sheets(0).getcellbyposition(3,d).string  = "" then 
   c = c + 1 : d = 0 : end if 
   if thisComponent.sheets(0).getcellbyposition(2,c).string  = "" then 
   b = b + 1 : c = 0 : end if 
   if thisComponent.sheets(0).getcellbyposition(1,b).string = "" then 
   a = a + 1 : b = 0 : end if 
loop until thisComponent.sheets(0).getcellbyposition(0,a).string  = "" 
End Sub
Viel Erfolg damit
Wolfgang

Hallo Karo, wie kann man das jetzt Filtern???

Verfasst: Mo, 04.06.2007 09:23
von Gert Seler
das wird die nächste Frage sein, nachdem die Tabelle mit über 46Tausend
Zeilen inklusive Werte gefüllt ist.
Hallo matlat & ontario
jetzt strengt Eueren Grips mal selber an und sucht bei "Wiki"
nach einem Lösungsweg.
Es ist sogar möglich, Literatur über "Star-Basic" käuflich zu erwerben,
wo doch das Programm "OOo" für "Null" EURO erworben werden kann.

Der Ansatz von Karo bietet ja jede Menge Möglichkeiten für
"learning by doing" .

Ich bleibe dabei, falls Ihr jemals solch eine Lösung dringend benötigt,
werdet Ihr nicht darum herumkommen ein "DB-Programm" zu kaufen
oder zu lernen, wie eine gewünschte Datenbank erstellt wird.

mfg
Gert

Verfasst: Mo, 04.06.2007 10:12
von Karolus
Hallo Wolfgang
ich müsste ja eigentlich erst Karolus fragen ob ich sein Makro verändern und veröffentlichen darf
Natürlich darfst du das, was meinst du wie ich ans Know How gekommen bin.

Ich halte nur den Titel deines Makros für irreführend, es liest zwar genau 6 Spalten aus, aber die Anzahl der Einträge in den einzelnen Spalten ist variabel.

Zu deiner Anschlussfrage : (Kombinationen innerhalb eines Arrays ohne Wiederholung) muss ich leider passen, es scheint keinen einfachen Algoritmus zum Vertauschen der "Buchstaben" zu geben.

Gruß Karo