PDA

Vollständige Version anzeigen : Kreuztabelle als Tabelle speichern


87878787
27.10.2003, 11:17
Hallo Leute,

ich versuche die Werte aus einer Kreuztabelle in der Tabelle zu speichern,
mit der Auswahlabfrage klappt(Entwurfsansicht-->Tabellenerstellungsabfrage) es ganz gut, da werden alle
Spalten übernommen, wenn ich das gleiche mit der Kreuztabelle versuche,
dann werden nicht alle Spalten übernommen, kann mir jemand da einen Vorschlag machen?.

Vielen Dank
Gruss Netzwerk

jmc
27.10.2003, 11:43
Hi

wozu willst du eine Kreuztabelle in eine Tabelle speichern ???

Sie heisst zwar Kreuztabelle ist aber nichts anderes als eine Abfrage. Du speicherst ja auch nicht das Resultat einer Abfrage wieder in eine Tabelle ...
Eine Abfrage (auch Kreuztabelle) kann man jederzeit aufrufen und sie wird neu "erstellt"/berechnet.

Nouba
27.10.2003, 11:44
Hallo,

wenn Du fixierte Spaltenüberschriften in der Kreuztabellenabfrage verwendest, sollten auch alle Spalten aufgeführt werden.

Ich mach das gelegentlich so, dass ich eine Kreuztabellenabfrage per Kode erstelle. Darüber erstelle ich mir dann in VBA eine Abfrage mit Alias-Feldnamen F1, F2, ... Fx und schreibe die ursprünglichen Inhalte in ein Array, auf das in Formularen bzw. Berichten über eine Funktion Bezug genommen werden kann.

Hier wäre ein Beispielkode dazu
Public gastrXtbLabel(23) As String
Public galngRGB(23) As Long

Private Sub ErstelleKreuztabelle()

Dim qdf As DAO.QueryDef
Dim fld As DAO.Field
Dim dtTmp As Date
Dim strSQL As String
Dim strInBedingung As String
Dim strFeldliste As String
Dim intIdx As Integer
Dim i As Integer

On Error GoTo Fehlerbehandlung

' notwendig zur Anlage von fixierten Spaltenüberschriften
' txtArbeitstag und txtTage sind Textfeldsteuerelemente
' die ein Datum und eine Zahl enthalten
For dtTmp = Me!txtArbeitstag To Me!txtArbeitstag + Me!txtTage - 1
strInBedingung = strInBedingung & Format(dtTmp, "yyyymmdd") & ", "
Next dtTmp

strInBedingung = " In ( " & Left$(strInBedingung, Len(strInBedingung) - 2) & " );"

' Kreuztabellenabfrage zusammensetzen
' das Beispiel entstammt einer Schichtplanübersicht,
' die Schichtgruppen und Untergruppen beinhaltet.
strSQL = strSQL & "TRANSFORM First([Q].[KODE] & ';' & [Q].[SCHICHTART]) AS SCHICHTART" & vbCrLf
strSQL = strSQL & "SELECT" & vbCrLf
strSQL = strSQL & " Q.MITARBEITER" & vbCrLf
strSQL = strSQL & ", Q.GRUPPE" & vbCrLf
strSQL = strSQL & ", Q.UGRUPPE" & vbCrLf
strSQL = strSQL & "FROM qselMASchichtZeitraum AS Q" & vbCrLf
strSQL = strSQL & "GROUP BY" & vbCrLf
strSQL = strSQL & " Q.MITARBEITER" & vbCrLf
strSQL = strSQL & ", Q.GRUPPE" & vbCrLf
strSQL = strSQL & ", Q.UGRUPPE" & vbCrLf
strSQL = strSQL & "ORDER BY" & vbCrLf
strSQL = strSQL & " Q.GRUPPE" & vbCrLf
strSQL = strSQL & ", Q.UGRUPPE" & vbCrLf
strSQL = strSQL & ", Q.MITARBEITER" & vbCrLf
strSQL = strSQL & "PIVOT Format([Q].[ARBEITSTAG],'yyyymmdd')" & strInBedingung


' alte Abfrage löschen - falls nicht vorhanden Fehler Nr 3265 abarbeiten
gdb.QueryDefs.Delete "qxtbSchichtBereich"
' Abfrage erneut anlegen
Set qdf = gdb.CreateQueryDef("qxtbSchichtBereich", strSQL)

With qdf
' für alle Spalten
For Each fld In .Fields
' nur darstellbare Feldtypen zulassen
If fld.Type >= 1 And fld.Type <= 8 Or fld.Type = 10 Then
' hier fangen bei mir die Datumsfelder an
If intIdx > 2 Then
'strFeldliste = strFeldliste & "[X].[" & fld.Name & "] AS F" & intIdx & ", "
' vorher zusammengesetztes Feld wieder zerlegen (im zweiten Teil steht
' steht ein spezifischer Schichtkode, den ich an anderer Stelle zur Farbgestaltung
' verwende
strFeldliste = strFeldliste & "IIf(InStr(1,[X].[" & fld.Name & "],';')>0," _
& "Left([X].[" & fld.Name & "],InStr(1,[X].[" & fld.Name & "],';')-1)) AS F" & intIdx & vbCrLf & ", "

strFeldliste = strFeldliste & "Right([X].[" & fld.Name & "],1) AS FS" & intIdx & vbCrLf & ", "
dtTmp = DateSerial( _
Left$(fld.Name, 4), _
Mid$(fld.Name, 5, 2), _
Right$(fld.Name, 2))

' globales Arrays füllen
gastrXtbLabel(intIdx) = Format(dtTmp, "ddd") & vbCrLf _
& Right$(fld.Name, 2)
' Farbe je nach Datum in Array schreiben
If IstFeiertag(dtTmp) Then
galngRGB(intIdx) = RGB(&HCA, &HDF, &HD6)
ElseIf IsWeekend(dtTmp) Then
galngRGB(intIdx) = RGB(&HFF, &HD3, &H82)
Else
galngRGB(intIdx) = RGB(&HF0, &HFE, &HF0)
End If
Else
strFeldliste = strFeldliste & "[X].[" & fld.Name & "] as F" & intIdx & vbCrLf & ", "
gastrXtbLabel(intIdx) = vbCrLf & fld.Name
galngRGB(intIdx) = vbBlue
End If
End If

intIdx = intIdx + 1

If intIdx > 23 Then Exit For

Next fld
End With

' ggf. Array nachfüllen :-)
If intIdx <= 23 Then

For i = intIdx To 23
strFeldliste = strFeldliste & "Null As F" & i & vbCrLf & ", "
strFeldliste = strFeldliste & "Null As FS" & i & vbCrLf & ", "
Next i
End If

' Abfragetext zusammensetzen
strFeldliste = Left(strFeldliste, Len(strFeldliste) - Len(", "))
strSQL = "SELECT" & vbCrLf & strFeldliste & vbCrLf & "FROM qxtbSchichtBereich AS X"

' Abfrage löschen und neu anlegen
gdb.QueryDefs.Delete "qselXtbResult"
Set qdf = gdb.CreateQueryDef("qselXtbResult", strSQL)

RausHier:
On Error GoTo 0
Exit Sub

Fehlerbehandlung:
Select Case Err.number
Case 3265
Resume Next
Case Else
MsgBox "Fehler: " & Err.number & " (" & Err.Description & ") in Routine " _
& "ErstelleKreuztabelle in VBA Dokument " & mstrcModuleName
Resume RausHier
End Select

End Sub

' Funktion zum Auslesen der ursprünglichen Spaltenbezeichnung
' kann in einem Textfeldsteuerelement im Bericht oder Formular
' als Beschriftung verwendet werden.
Public Function GetXtbLabel(ByVal vIdx As Integer) As String
GetXtbLabel = gastrXtbLabel(vIdx)
End Function

87878787
27.10.2003, 12:08
Original geschrieben von jmc
Hi

wozu willst du eine Kreuztabelle in eine Tabelle speichern ???

Sie heisst zwar Kreuztabelle ist aber nichts anderes als eine Abfrage. Du speicherst ja auch nicht das Resultat einer Abfrage wieder in eine Tabelle ...
Eine Abfrage (auch Kreuztabelle) kann man jederzeit aufrufen und sie wird neu "erstellt"/berechnet.

Ja das ist richtig, normalerweise mach ich das auch nicht, aber ich
muss kurz ausholen,mein Bericht hat mehrere Unterberichte jeder
dieser Unterberichte hat als Datenherkunft eine Abfrage, diese
Abfragen sind aufwendig und es dauert immer viel zu lange, bis
die Abfragen berechnet und Bericht ausgeführt wird, ich arbeite oft
mit dem Bericht und jedesmal, wenn ich ihn öffnen muss, wird auch
jedesmal eine Abfrage ausgeführt und das
dauert dann, wenn ich die Daten in der Tabelle speichere, dann
geht
es viel schneller,hat auch alles wunderbar geklappt bis auf
diese Kreuztabellenabfrage.

Netwzerk

87878787
27.10.2003, 12:11
Many Thank's nouba,

ich versuche es umzusetzen.
Gibt's da villeicht trotzdem eine kurzere Lösung?

Netwzerk




Moderatorenanmerkung: Komplettes Quoting des vorherigen Beitrags wurde entfernt.

Nouba
27.10.2003, 12:32
das hängt von den Spaltenbezeichnern, die ich nicht kenne, ab. Wenn Du immer nur Daten von Montag - Sonntag darstellst, kannst Du die fixierten Spalten auch manuell in der Kreuztabelle ablegen.

Mir ist übrigens keine Methode bekannt, fixierte Spaltenüberschriften in einer gespeicherten Kreuztabellenabfrage nachträglich zu beeinflußen, ohne die Abfrage neu anzulegen.

Für weitere Tipps solltest Du mal kurz beschreiben, was Du mit welchem Ziel machst. Eventuell kannst Du ja auch ein Minimalbeispiel hochladen.

BTW: Wenn Du temporäre Tabellen verwendest, was aus Geschwindigkeitsgründen durchaus legitim ist, solltest Du am Besten eine temporäre DB dafür beim Starten der Anwendung anlegen und beim Beenden wieder löschen - sonst bläht sich Deine DB recht schnell auf.

jmc
27.10.2003, 17:14
Hi

irgendwie kommt mir das ganze bekannt vor, hast du zu dieser Thematik nicht schon mal gepostet ???

ich arbeite oft mit dem Bericht und jedesmal, wenn ich ihn öffnen muss, wird auch jedesmal eine Abfrage ausgeführt und das dauert dann, wenn ich die Daten in der Tabelle speichere, dann geht es viel schneller ...

Also wenn du jedes mal vor dem Bericht die Abfragen laufen lässt, welche die Daten in Tabellen speichern, dann möchte ich mal bezweifeln, dass es per Saldo (viel) schneller geht

Und wenn die Abfragen nicht laufen und die Daten neu in die Tabellen schreiben, dann sieht ja der Bericht immer gleich aus ...

87878787
27.10.2003, 20:08
Original geschrieben von jmc
Hi

irgendwie kommt mir das ganze bekannt vor, hast du zu dieser Thematik nicht schon mal gepostet ???



Also wenn du jedes mal vor dem Bericht die Abfragen laufen lässt, welche die Daten in Tabellen speichern, dann möchte ich mal bezweifeln, dass es per Saldo (viel) schneller geht

Und wenn die Abfragen nicht laufen und die Daten neu in die Tabellen schreiben, dann sieht ja der Bericht immer gleich aus ...

hmmmm nö ich glaube du verwechselst mich mit Jemanden, ich habe so ein
Thema hier nicht gepostet und ich habe auch die Suchfunktion benutzt,alles
mögliche ist dabei rausgekommen aber nicht das was ich wollte.
So nun ich verstehe dich leider nicht, wo liegt dein Problem?
Willst du es bezweifeln, das es mit Tabellen schneller geht ?
Stell dir mal vor du öffnest viele Abfragen auf einmal, wie lange dauert es?? oder du öffnest Tabellen, wie lange wird das wohl dauern.......
und noch was, ich verändere oft an den Bericht, und dabei wie du villeicht weisst muss man oft zwischen "Seitenansicht" und "Entwurfsansicht" schalten, jedesmal müssen die Abfragen ausgeführt werden.
so ich hoffe wir werden jetzt nicht zu persönlich.............

jmc
27.10.2003, 21:40
Hi

ich meinte diesen Beitrag (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=106704) wo du schon mal was von Abfragen in Tabellen speichern geschrieben hast ...

Nun, was deine Aussage betrifft, dass du viel zwischen Seiten - und Entwurfsansicht des Berichts wechselst - da kämen wir tatsächlich in eine philosophische Diskussion rein.

Wenn du in der Entwicklunsphase bist, dann ist das sicher eine kurze (oder auch längere) Zeit normal, es ist allerdings m.E. etwas übertrieben, mit einem so riesen Wust an Daten zu testen, dass du "unerträgliche" Laufzeiten hast.
Wenn das nur mit wenigen Daten schon passiert - umso schlimmer, dann würde m.E. etwas mit dem Tabellen-Design nicht stimmen ...

Wenn das aber bei der täglichen Arbeit ist, dann wäre hingegen die Frage WESHALB musst du da dauernd wechseln? Dann würde - natürlich wieder ganz nach meiner persönlichen Meinung - etwas mit dem Berichts-Design nicht stimmen ...

Aber lassen wir das - hauptsache du wirst glücklich dabei ;)

ääähm - persönlich werden: kann man das mit einer Nummer ??? (87878787 :confused: :( )