Discussion:
Tabelle dynamisch erstellen und in Datenblatt anzeigen?
(zu alt für eine Antwort)
Magnus Warker
2014-07-04 08:26:49 UTC
Permalink
Hallo,

ich würde gerne eine Tabelle dynamisch erstellen und in einem Datenblatt
anzeigen.

Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.

Hintergrund:
Es handelt sich um eine Übersicht über gebuchte Räume, etwa in der Art:

Zeit Raum 1 Raum 2 Raum 3 ...
-----------------------------------------------------------------
8:00 frei belegt frei
9:00 frei frei belegt
10:00 belegt belegt belegt

Alle Daten werden aus den Einzelbuchungen berechnet, d. h. eine solche
Tabelle wie oben existiert so nicht und macht auch keinen Sinn.

Die Räume in den Spalten sind eine Untermenge aller Räume, d. h. alle
Räume des Typs "Besprechungsraum".

Die neue Tabelle müsste also dynamisch erstellt werden, insb. die
Spalten für die Räume, da sich die Typen der Räume ja ändern können.

Geht das?

Darüber hinaus: Kann man einzelne Zellen dieser Tabelle (Datenblatt)
einfärben, z. B. überall, wo "belegt" steht, den Zellhintergrund rot
einfärben?

Danke für Tipps
Magnus
Winfried Sonntag
2014-07-04 10:46:50 UTC
Permalink
Post by Magnus Warker
ich würde gerne eine Tabelle dynamisch erstellen und in einem Datenblatt
anzeigen.
Natürlich kannst Du eine Temporäre Tabelle erstellen:
http://office.microsoft.com/de-de/access-help/create-table-anweisung-HA001231441.aspx
Post by Magnus Warker
Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.
Sollte genauso funktionieren. Recordset erstellen, Daten einfügen und
an ein Formular oder Datenblatt Ansicht binden.
Post by Magnus Warker
Darüber hinaus: Kann man einzelne Zellen dieser Tabelle (Datenblatt)
einfärben, z. B. überall, wo "belegt" steht, den Zellhintergrund rot
einfärben?
In einem Formular über die bedingte Formatierung, ob man die über VBA
ansprechen kann, weiß ich nicht.

Servus
Winfried
--
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Access-Stammtisch: http://www.access-muenchen.de
NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
Magnus Warker
2014-07-04 10:59:25 UTC
Permalink
Post by Winfried Sonntag
Post by Magnus Warker
Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.
Sollte genauso funktionieren. Recordset erstellen, Daten einfügen und
an ein Formular oder Datenblatt Ansicht binden.
Ich habe Recordset-Objekte bisher immer nur auf bestehende Tabellen
angewendet ("currentdb.openrecordset ("SELECT ...")).

Wie macht man das denn ohne?
Post by Winfried Sonntag
Post by Magnus Warker
Darüber hinaus: Kann man einzelne Zellen dieser Tabelle (Datenblatt)
einfärben, z. B. überall, wo "belegt" steht, den Zellhintergrund rot
einfärben?
In einem Formular über die bedingte Formatierung, ob man die über VBA
ansprechen kann, weiß ich nicht.
Falls es nicht geht: Gäbe es Alternativen?

Danke
Magnus
Winfried Sonntag
2014-07-04 12:19:42 UTC
Permalink
Post by Magnus Warker
Post by Winfried Sonntag
Post by Magnus Warker
Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.
Sollte genauso funktionieren. Recordset erstellen, Daten einfügen und
an ein Formular oder Datenblatt Ansicht binden.
Ich habe Recordset-Objekte bisher immer nur auf bestehende Tabellen
angewendet ("currentdb.openrecordset ("SELECT ...")).
Wie macht man das denn ohne?
Mit ADO geht das. Hier ein kleines Beispiel:
http://www.ms-office-forum.net/forum/archive/index.php?t-161950.html
Post by Magnus Warker
Post by Winfried Sonntag
Post by Magnus Warker
Darüber hinaus: Kann man einzelne Zellen dieser Tabelle (Datenblatt)
einfärben, z. B. überall, wo "belegt" steht, den Zellhintergrund rot
einfärben?
In einem Formular über die bedingte Formatierung, ob man die über VBA
ansprechen kann, weiß ich nicht.
Falls es nicht geht: Gäbe es Alternativen?
Es geht, Karl hat die Stichworte genannt:
http://www.office-loesung.de/ftopic95187_0_0_asc.php
http://msdn.microsoft.com/en-us/library/office/ff821010%28v=office.14%29.aspx

Servus
Winfried
--
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Access-Stammtisch: http://www.access-muenchen.de
NNTP-Bridge für MS-Foren: http://communitybridge.codeplex.com/
Magnus Warker
2014-07-09 07:00:22 UTC
Permalink
Post by Winfried Sonntag
Post by Magnus Warker
Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.
http://www.ms-office-forum.net/forum/archive/index.php?t-161950.html
Ich habe es (nach Deinem Link) so versucht:

Ein ungebundenes Formular anlegen mit zwei Textfeldern, gebunden an
"Raum" und "Test".

Dann in Form_Open folgendes gemacht:

Dim con As ADODB.Connection
Dim rst As ADODB.Recordset

Set con = CurrentProject.AccessConnection

Set rst = New ADODB.Recordset

rst.Fields.Append "Raum", adBSTR
rst.Fields.Append "Test", adBSTR

rst.CursorLocation = adUseClient
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open , , adOpenDynamic

rst.AddNew
rst![Raum] = "R1"
rst![Test] = "T1"
rst.Update

rst.AddNew
rst![Raum] = "R2"
rst![Test] = "T2"
rst.Update

Me.RecordSource = rst

Bei der Zuweisung an RecordSource erhalte ich die Fehlermeldung "Typen
unverträglich".

Ich hatte zuvor einen Verweis auf "Microsoft ActiveX Data Objects 6.1
Library" gesetzt.

Magnus
Ulrich Möller
2014-07-09 07:49:16 UTC
Permalink
Post by Magnus Warker
Post by Winfried Sonntag
Post by Magnus Warker
Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.
http://www.ms-office-forum.net/forum/archive/index.php?t-161950.html
Ein ungebundenes Formular anlegen mit zwei Textfeldern, gebunden an
"Raum" und "Test".
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
Set con = CurrentProject.AccessConnection
Set rst = New ADODB.Recordset
rst.Fields.Append "Raum", adBSTR
rst.Fields.Append "Test", adBSTR
rst.CursorLocation = adUseClient
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open , , adOpenDynamic
rst.AddNew
rst![Raum] = "R1"
rst![Test] = "T1"
rst.Update
rst.AddNew
rst![Raum] = "R2"
rst![Test] = "T2"
rst.Update
Me.RecordSource = rst
Bei der Zuweisung an RecordSource erhalte ich die Fehlermeldung "Typen
unverträglich".
Ich hatte zuvor einen Verweis auf "Microsoft ActiveX Data Objects 6.1
Library" gesetzt.
Magnus
Das Recordset muß der Eigenschaft <Form>.Recordset zugewiesen werden.
Suche mal mit den Stichwörtern "disconnected recordset" im Internet für
weitere Informationen. Die Bindung der Felder an die Controls wird dann
über die jeweilige Eigenschaft Controlsource gemacht.

Eine andere Möglichkeit wäre, eine versteckte Tabelle mit den passenden
Feldern als Template anzulegen und dann dieses für das Erstellen eines
"disconnected recordset" zu nehmen. Dann spart man sich das dynamische
anlegen. Im Designer wird dann diese Tabelle einfach als Recordsource
verwendet. Ist alles fertig, löscht man die Recordsource Eingenschaft
wieder und weist mit der Routine, die das disconnected Recordset erzeugt
dieses stattdessen der Form zu. Fertig!

Man muß nur aufpassen, daß keine Datensätze in die Template-Tabelle
zurückgeschrieben werden. Habe ich schon öfter praktiziert und
funktioniert sehr gut. Der Vorteil dabei ist, daß keine "echte Tabellen"
verwendet werden, welche dann die DB aufblähen würden.

Ulrich
Magnus Warker
2014-07-09 08:08:26 UTC
Permalink
Post by Ulrich Möller
Post by Winfried Sonntag
Post by Magnus Warker
Am liebsten wäre mir, wenn man gar keine echte Access-Tabelle dafür
bräuchte, sondern alles im Speicher machen könnte, z. B. mit einem
Recordset oder so.
http://www.ms-office-forum.net/forum/archive/index.php?t-161950.html
Das Recordset muß der Eigenschaft <Form>.Recordset zugewiesen werden.
Danke! Jetzt geht es!
Post by Ulrich Möller
Suche mal mit den Stichwörtern "disconnected recordset" im Internet für
weitere Informationen. Die Bindung der Felder an die Controls wird dann
über die jeweilige Eigenschaft Controlsource gemacht.
Das war bei mir gar nicht nötig. Ich hatte die Feldnamen einfach in die
Textboxen als Datenherkunft eingetragen.

Magnus
--
This is Unix-Land. In quiet nights, you can hear the Windows machines
reboot.
Magnus Warker
2014-07-09 09:00:09 UTC
Permalink
Hallo,

ich habe mich wohl etwas zu früh gefreut: Es funktioniert perfekt und
macht auch genau das, was es soll. Aber es ist extrem langsam. Die
Berechung eines Datensatzes mit 15 Feldern dauert mehrere Sekunden, die
gesamte Datenblattansicht mir 8 Datensätzen bestimmt eine Minute.

Es werden die frei/gebucht-Zeiten von Besprechungsräumen berechnet,
anhand der Buchungen, die aus einer Abfrag ausgelesen werden.

Kann man da noch was optimieren (s. u.)?

Danke
Magnus




Option Compare Database

Private day As Date

Public Function setDate(dte As Date) As Boolean
day = dte
'Me.Requery
loadRecordset (day)
setDate = True
End Function

Private Sub Form_Open(Cancel As Integer)
'init
End Sub

Private Sub loadRecordset(day As Date)
Dim rst As ADODB.Recordset

Set rst = createRecordSet()
Set Me.Form.Recordset = rst
loadRecords rst, day

End Sub

Private Sub loadRecords(rst As ADODB.Recordset, day As Date)
Dim r As Recordset

Set r = CurrentDb.OpenRecordset("SELECT * FROM [q:Raum-S] ORDER BY
Nr;")

If (r.EOF) Then
Set r = Nothing
Exit Sub
End If

r.MoveFirst

Do While (Not r.EOF)
loadRoom rst, r![Nr]
r.MoveNext
Loop

Set r = Nothing
End Sub


Private Sub loadRoom(ByRef rst As ADODB.Recordset, Raum As String)

rst.AddNew
rst![Raum] = Raum
rst![tim_00] = getSpan(Raum, "00:00", "08:00")
rst![tim_08] = getSpan(Raum, "08:00", "09:00")
rst![tim_09] = getSpan(Raum, "09:00", "10:00")
rst![tim_10] = getSpan(Raum, "10:00", "11:00")
rst![tim_11] = getSpan(Raum, "11:00", "12:00")
rst![tim_12] = getSpan(Raum, "12:00", "13:00")
rst![tim_13] = getSpan(Raum, "13:00", "14:00")
rst![tim_14] = getSpan(Raum, "14:00", "15:00")
rst![tim_15] = getSpan(Raum, "15:00", "16:00")
rst![tim_16] = getSpan(Raum, "16:00", "17:00")
rst![tim_17] = getSpan(Raum, "17:00", "18:00")
rst![tim_18] = getSpan(Raum, "18:00", "19:00")
rst![tim_19] = getSpan(Raum, "19:00", "20:00")
rst![tim_20] = getSpan(Raum, "20:00", "23:59")
rst.Update

End Sub

Private Function getSpan(Raum As String, t0 As String, t1 As String) As
String
Dim c As String, r As Recordset, t As String, sql As String

c = getCondition(t0, t1)
sql = "SELECT * FROM [q:Buchung] WHERE (Raum='" & Raum & "' AND ("
& c & "));"

Set r = CurrentDb.OpenRecordset(sql)

If (r.EOF) Then
Set r = Nothing
getSpan = "frei"
Exit Function
End If

t = ""
r.MoveFirst

Do While (Not r.EOF)
If t <> "" Then t = t & ", "
t = t & r![Geschäftszeichen]
r.MoveNext
Loop

Set r = Nothing
getSpan = t

End Function

Private Function getCondition(t0 As String, t1 As String) As String
Dim d0 As Date, d1 As Date, s0 As String, s1 As String, c As String

d0 = day + t0
d1 = day + t1

s0 = getDateStr(d0)
s1 = getDateStr(d1)

c = "NOT (Ende < " & s0 & ")" & " AND " & "NOT (Beginn > " & s1 & ")"

getCondition = c
End Function

Private Function getDateStr(dte As Date) As String
getDateStr = "#" & Format(dte, "YYYY" & "-" & "MM" & "-" & "DD" & "
" & "hh" & ":" & "mm" & ":" & "ss") & "#"
End Function

Private Function createRecordSet() As ADODB.Recordset

Dim con As ADODB.Connection
Dim rst As ADODB.Recordset

Set con = CurrentProject.AccessConnection

Set rst = New ADODB.Recordset

rst.Fields.Append "Raum", adBSTR
rst.Fields.Append "tim_00", adBSTR
rst.Fields.Append "tim_08", adBSTR
rst.Fields.Append "tim_09", adBSTR
rst.Fields.Append "tim_10", adBSTR
rst.Fields.Append "tim_11", adBSTR
rst.Fields.Append "tim_12", adBSTR
rst.Fields.Append "tim_13", adBSTR
rst.Fields.Append "tim_14", adBSTR
rst.Fields.Append "tim_15", adBSTR
rst.Fields.Append "tim_16", adBSTR
rst.Fields.Append "tim_17", adBSTR
rst.Fields.Append "tim_18", adBSTR
rst.Fields.Append "tim_19", adBSTR
rst.Fields.Append "tim_20", adBSTR

rst.CursorLocation = adUseClient
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open , , adOpenDynamic

Set createRecordSet = rst

End Function

Karl Donaubauer
2014-07-04 11:02:24 UTC
Permalink
Hallo, Winfried!
Post by Winfried Sonntag
...
die bedingte Formatierung, ob man die über VBA
ansprechen kann, weiß ich nicht.
...
Klar. Stichwort "FormatConditions". Mit diesem Suchbegriff
(und evtl. meinem Namen) gibt's im Web jede Menge Beispiele.
--
Servus
Karl
*********
Access-FAQ: http://www.donkarl.com
Access-Lobby: http://www.AccessDevelopers.org
Loading...