PDA

Vollständige Version anzeigen : Denkfehler?


Business
25.03.2006, 08:39
Hallo,

Ich weiß nicht genau wie ich an dieses Problem herangehen soll.

Ich hab in einer Datenbank 20 "Ja/Nein" Wert-Felder.

Jetzt möchte ich die Datenbank mit einer Schleife(!) befüllen, nämlich so, dass jede nur mögliche Kombination !nur einmal! vorhanden ist.

Vl. kann mir da jemand mit einem Lösungsweg helfen.

Danke

Gruß

jernst
26.03.2006, 14:40
Hallo,

hast Du eine bestimmte Vorstellung für ein Muster, oder sollen wirklich alle Möglichkeiten durchgegangen wrden?

In dem Falle würden 2^20 DS erzeugt und das würde, denke ich einige Zeit dauern.

Gruß Jörn

kama
26.03.2006, 17:02
Hallo

Zunächst braucht man eine Function die die Möglichkiten von Dezimal nach Binär ausgibt und zwar 20 Stellig

Function Dec2Bin(ByVal Dec As Long) As String
'Dieser Source stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.
' Von Dezimal in Binaer

Dim Rest As Long
Do
Rest = Dec Mod 2 ' Den Rest bei einer Division
' durch 2 errechnen
Dec2Bin = Rest & Dec2Bin ' Rest und bishereige Binaer Zahl
' zusammentun
Dec = Dec \ 2 ' Dezimal Zahl durch 2 Teilen
Loop Until Dec = 0 ' Solange bis Dezimal-Zahl = 0 ist
' Auf Ausgabe immer 20 stellig geändert von k.maraun
Dec2Bin = IIf(Len(Dec2Bin) < 20, String(20 - Len(Dec2Bin), "0") & Dec2Bin, Dec2Bin)
End Function

Dann noch etwas was die Tabelle mit den daten füllt
Private Sub Befehl44_Click()
Dim x As Long
For x = 0 To 1048575
Me.Dezimal = x
Me.Binär = Dec2Bin(x)
Me.Bol1 = Val(Mid(Me.Binär, 1, 1)) * -1
Me.Bol2 = Val(Mid(Me.Binär, 2, 1)) * -1
Me.Bol3 = Val(Mid(Me.Binär, 3, 1)) * -1
Me.Bol4 = Val(Mid(Me.Binär, 4, 1)) * -1
Me.Bol5 = Val(Mid(Me.Binär, 5, 1)) * -1
Me.Bol6 = Val(Mid(Me.Binär, 6, 1)) * -1
Me.Bol7 = Val(Mid(Me.Binär, 7, 1)) * -1
Me.Bol8 = Val(Mid(Me.Binär, 8, 1)) * -1
Me.Bol9 = Val(Mid(Me.Binär, 9, 1)) * -1
Me.Bol10 = Val(Mid(Me.Binär, 10, 1)) * -1
Me.Bol11 = Val(Mid(Me.Binär, 11, 1)) * -1
Me.Bol12 = Val(Mid(Me.Binär, 12, 1)) * -1
Me.Bol13 = Val(Mid(Me.Binär, 13, 1)) * -1
Me.Bol14 = Val(Mid(Me.Binär, 14, 1)) * -1
Me.Bol15 = Val(Mid(Me.Binär, 15, 1)) * -1
Me.Bol16 = Val(Mid(Me.Binär, 16, 1)) * -1
Me.Bol17 = Val(Mid(Me.Binär, 17, 1)) * -1
Me.Bol18 = Val(Mid(Me.Binär, 18, 1)) * -1
Me.Bol19 = Val(Mid(Me.Binär, 19, 1)) * -1
Me.Bol20 = Val(Mid(Me.Binär, 20, 1)) * -1
DoCmd.GoToRecord , , acNewRec
Next x
End Sub

Das füllt die ja/nein Felder (bol1 bis 20) mit 0 bzw -1 entsprchend der besetzung an den Binärstellen.

Die beispiel DB füllt nur die letzten 2000
Der Zeitaufwand für das füllen ist IMHO auch bei allen datensätzen erträglich.
Ausserdem könnten die SQL Freaks meinen Denkansatz (wenn er korrekt ist )entsprechend umsetzen.

df6gl
26.03.2006, 19:28
Hallo,

mein Vorschlag:


Dim db As Database
Set db = CurrentDb
Dim i As Long
Dim rs As DAO.Recordset
Dim ii As Long
Set rs = db.OpenRecordset("janein")


For i = 0 To 2 ^ 20 - 1

rs.AddNew

For ii = 0 To 19
rs("F" & ii + 1) = (i \ 2 ^ ii) Mod 2
Next

rs.Update


' Alternativ mit Anfügeabfrage
'db.Execute "INSERT INTO janein ( F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20) SELECT " & _
'(i \ 2 ^ 0) Mod 2 & " , " & _
'(i \ 2 ^ 1) Mod 2 & " , " & _
'(i \ 2 ^ 2) Mod 2 & " , " & _
'(i \ 2 ^ 3) Mod 2 & " , " & _
'(i \ 2 ^ 4) Mod 2 & " , " & _
'(i \ 2 ^ 5) Mod 2 & " , " & _
'(i \ 2 ^ 6) Mod 2 & " , " & _
'(i \ 2 ^ 7) Mod 2 & " , " & _
'(i \ 2 ^ 8) Mod 2 & " , " & _
'(i \ 2 ^ 9) Mod 2 & " , " & _
'(i \ 2 ^ 10) Mod 2 & " , " & _
'(i \ 2 ^ 11) Mod 2 & " , " & _
'(i \ 2 ^ 12) Mod 2 & " , " & _
'(i \ 2 ^ 13) Mod 2 & " , " & _
'(i \ 2 ^ 14) Mod 2 & " , " & _
'(i \ 2 ^ 15) Mod 2 & " , " & _
'(i \ 2 ^ 16) Mod 2 & " , " & _
'(i \ 2 ^ 17) Mod 2 & " , " & _
'(i \ 2 ^ 18) Mod 2 & " , " & _
'(i \ 2 ^ 19) Mod 2


Next
rs.Close
Set rs = Nothing




Allerdings könnte man sich die Speicherung der Formfelderwerte auch als Bit-Muster in einem einzigen Long-Tabellenfeld anstelle der 20 Boolschen Felder vorstellen, wenn es wirklich nötig ist, alles in einem DS zu hinterlegen.

Business
27.03.2006, 22:24
Hey danke, das ist genau das, wonach ich gesucht hab =)

Fettes Lob ++