Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Diagramm, einzelne Felder aus Abfrage zuweisen

27 views
Skip to first unread message

Karsten Müller

unread,
May 28, 2009, 6:38:02 AM5/28/09
to
Hallo,

ich habe ein Abfrage als Datenquelle für ein Endlosformular.
Nun möchte ich einzelne Felder aus dieser Abfrage in einem Diagramm
darstellen.
Die Abfrage enthält mehr als 10 Felder, im Diagramm möchte ich aber nur 3
Felder abbilden (für den Anfang).

Gibt es eine Möglichkeit der dem Diagramm zugrunde liegenden Tabelle die
einzelnen Spalten der Abfrage so zuzuweisen wie für ein Endlosformular
(controlSource)?

Irgendwie haben mich da Range, Series und SeriesCollection nicht
weitergebracht.

Eine extra Abrfrage würde ich nur ungerne bauen, das verursacht nur wieder
Wartungesprobleme.

Es wäre schön, wenn jemand einen Ansatz für mich hätte, evtl. auch in der
Richtung Spalten löschen, Kurven nicht anzeigen o.ä. (aber wie die Richtigen
finden?).

Vielen Dank und viele Grüße
Karsten

Karl Donaubauer

unread,
May 28, 2009, 6:54:53 AM5/28/09
to

Ich bin nicht sicher, ob ich deine Einschränkung verstehe:

Ist dir klar, dass du in der Eigenschaft "Datensatzherkunft" des
Diagrammes ein SELECT nur mit den gewünschten Spalten
verwenden kannst? Fällt das dann auch unter "Wartungsproblem"?
Muss wirklich direkt die Tabelle in der Datensatzherkunft stehen?

Dann gäb's noch die Möglichkeit über die Eigenschaft "Spaltenanzahl"
nur die ersten x Spalten der Datensatzherkunft auszuwählen.

--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com

Karsten Müller

unread,
May 28, 2009, 8:22:03 AM5/28/09
to

"Karl Donaubauer" wrote:

Hallo Karl


>
> Ist dir klar, dass du in der Eigenschaft "Datensatzherkunft" des
> Diagrammes ein SELECT nur mit den gewünschten Spalten
> verwenden kannst? Fällt das dann auch unter "Wartungsproblem"?

Genau das mit dem neuen SELECT möchte ich ja vermeiden.
Der SQL-String für das Form ist an der WHERE und GROUP - Stelle nicht so
einfach und ich habe mehrere Formulare in denen noch Diagramme rein sollen.

Bei jeweils einem extra SELECT besteht halt die große Gefahr, dass Ändrungen
falsch oder garnicht in den entsprechenden Abfragen durchgeführt werden.

Und laut DB-Theorie sollen ja Redundanzen vermieden werden. ;-)

> Muss wirklich direkt die Tabelle in der Datensatzherkunft stehen?

Hm ich glaube, ich hab mich ein wenig unglücklich ausgedrückt. Ich meinte
keine Datenbanktabelle, sondern die Tabelle die sich beim Doppelclick auf das
Diagramm öffnet. Mit Range und Cells kann man darin arbeiten, wenn ich es
richtig verstanden habe.

> Dann gäb's noch die Möglichkeit über die Eigenschaft "Spaltenanzahl"
> nur die ersten x Spalten der Datensatzherkunft auszuwählen.

geht das nur über die Nummer oder kann Auch der Name verwendet werden?
Sonst muss wieder bei Änderungen der Abfrage soviel berücksichtigt werden.

Karl Donaubauer

unread,
May 28, 2009, 10:30:47 AM5/28/09
to
Karsten M�ller wrote:

> "Karl Donaubauer" wrote:
>>
>> Ist dir klar, dass du in der Eigenschaft "Datensatzherkunft" des
>> Diagrammes ein SELECT nur mit den gew�nschten Spalten
>> verwenden kannst? F�llt das dann auch unter "Wartungsproblem"?
>
> Genau das mit dem neuen SELECT m�chte ich ja vermeiden.
> Der SQL-String f�r das Form ist an der WHERE und GROUP - Stelle nicht

> so einfach und ich habe mehrere Formulare in denen noch Diagramme
> rein sollen.
>
> Bei jeweils einem extra SELECT besteht halt die gro�e Gefahr, dass
> �ndrungen falsch oder garnicht in den entsprechenden Abfragen
> durchgef�hrt werden.

>
> Und laut DB-Theorie sollen ja Redundanzen vermieden werden. ;-)
>
>> Muss wirklich direkt die Tabelle in der Datensatzherkunft stehen?
>
> Hm ich glaube, ich hab mich ein wenig ungl�cklich ausgedr�ckt. Ich

> meinte keine Datenbanktabelle, sondern die Tabelle die sich beim
> Doppelclick auf das Diagramm �ffnet. Mit Range und Cells kann man

> darin arbeiten, wenn ich es richtig verstanden habe.

Wo hast du das verstanden d.h. her?
Vermutlich meinst du sowas wie SetSourceData in Excel.
Derartiges gibt's meines Wissens in Graph nicht.

> ...
>> Dann g�b's noch die M�glichkeit �ber die Eigenschaft "Spaltenanzahl"
>> nur die ersten x Spalten der Datensatzherkunft auszuw�hlen.
>
> geht das nur �ber die Nummer oder kann Auch der Name verwendet werden?
> Sonst muss wieder bei �nderungen der Abfrage soviel ber�cksichtigt
> werden.

Es geht nicht um die Nummer sondern um die Position. Die Zahl
bezieht sich auf die Spalten der Datenherkunft von links nach rechts
oder oben nach unten, je nach Ansicht.

Ich verstehe allerdings noch immer dein Anliegen nicht.
Wenn du im Diagramm herumprogrammierst soll das weniger
Wartungsaufwand bei �nderungen an den Feldern sein, als die
Datenherkunft des Diagrammes anzupassen?

--
cu


Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com

3. SQL Server-Entwickler-Konferenz - N�rnberg im Mai


Karsten Müller

unread,
May 29, 2009, 9:28:02 AM5/29/09
to
Hallo Karl

"Karl Donaubauer" wrote:

> >

> Wo hast du das verstanden d.h. her?

Ich habe "Range" im Graph-Vortrag von der AEK06(?) gefunden und dann in
Access den Verweis auf die Graph.exe gesetzt und die Hilfe durchforstet.
Das hat mich aber nicht so richtig weitergebracht.

> Vermutlich meinst du sowas wie SetSourceData in Excel.
> Derartiges gibt's meines Wissens in Graph nicht.

Schade eigentlich, so was in der Art habe ich gesucht.

> > ...


> >> Dann gäb's noch die Möglichkeit über die Eigenschaft "Spaltenanzahl"
> >> nur die ersten x Spalten der Datensatzherkunft auszuwählen.
> >
> > geht das nur über die Nummer oder kann Auch der Name verwendet werden?
> > Sonst muss wieder bei Änderungen der Abfrage soviel berücksichtigt

> > werden.
>
> Es geht nicht um die Nummer sondern um die Position. Die Zahl
> bezieht sich auf die Spalten der Datenherkunft von links nach rechts
> oder oben nach unten, je nach Ansicht.

Kann man die dann auch löschen?
Der Objectkatalog bietet ja ein delete für Series bzw. SeriesCollection an.
Aber dann muss ich ja wissen an welcher Stelle welche Spalten stehn.
Also entweder ein Recordset bilden oder den SQL-String durchprüfen.
Das ist aber irgendwie beides blöd.

>
> Ich verstehe allerdings noch immer dein Anliegen nicht.
> Wenn du im Diagramm herumprogrammierst soll das weniger

> Wartungsaufwand bei Änderungen an den Feldern sein, als die
> Datenherkunft des Diagrammes anzupassen?
Meine Befürchtung ist einfach, dass Änderungen in der Datenherkunft für das
Fom nicht in der Datenherkunft für das Diagramm durchgeführt werden.
In der Abfrage sind Berechnungen enthalten. Wenn diese geändert werden kann
der Alias der Spalte gleich bleiben und das Dieagramm würde mit der neuen
Berechnung ohne Probleme weiterlaufen.
Wenn es das nicht tut, fällt der Fehler sofort auf.
Schlimm ist es, wenn das Form Daten nach der neuen Berechnung anzeigt, das
Diagramm aber die alte Berechnung darstellt. Und das fällt u.U. erst den
"falschen" Leuten auf.

Ich werde wohl nich um eine Extra Abfrage für das Diagramm rumkommen.
Obwohl ich es zimlich blöd finde und wahrscheinlich wird es nicht bei zwei
Abfragen bleiben...

Karl Donaubauer

unread,
May 29, 2009, 11:33:33 AM5/29/09
to
Karsten M�ller wrote:
> ...

> Ich habe "Range" im Graph-Vortrag von der AEK06(?) gefunden und
> dann in Access den Verweis auf die Graph.exe gesetzt und die Hilfe
> durchforstet. Das hat mich aber nicht so richtig weitergebracht.

Hmm, der Diagramm-Experte G�nther Ritter schrieb im verwichenen
Jahrtausend mal, dass man Werte in die Datentabelle des
Graph-Objektes schreiben k�nne:

http://groups.google.com/group/microsoft.public.de.access/msg/b1e504f483ec7bde

Gelang mir bei einem kurzen Test vorhin nicht.
Ich zweifle auch, dass dir das weiterhelfen w�rde.

>> ...
> Meine Bef�rchtung ist einfach, dass �nderungen in der Datenherkunft
> f�r das Fom nicht in der Datenherkunft f�r das Diagramm durchgef�hrt
> werden.
> In der Abfrage sind Berechnungen enthalten. Wenn diese ge�ndert


> werden kann der Alias der Spalte gleich bleiben und das Dieagramm

> w�rde mit der neuen Berechnung ohne Probleme weiterlaufen.
> Wenn es das nicht tut, f�llt der Fehler sofort auf.


> Schlimm ist es, wenn das Form Daten nach der neuen Berechnung
> anzeigt, das Diagramm aber die alte Berechnung darstellt. Und das

> f�llt u.U. erst den "falschen" Leuten auf.
> ...

Ich verstehe noch immer nicht ganz, wie du �ber die Programmierung
im Graph-Objekt solche Probleme verhindern willst.

Wenn es dir nur darum geht, dass die verwendeten Aliase auch im
Diagramm immer die aktuellen Berechnungen beinhalten, dann
k�nntest du dich in der Datensatzherkunft des Diagrammes auf
die Datenherkunft des Formulares beziehen. Also beim �ffnen
des Formulares oder einem anderen passenden Ereignis ca.

Me!MeinDiagramm.RowSource = _
"SELECT Feld1, Feld3, Feld7 FROM (" & Me.RecordSource & ")"

--
HTH

Raimo Becker

unread,
May 29, 2009, 2:37:01 PM5/29/09
to
Hallo Karsten,

ich habe mit folgendem Link einiges hinbekommen:

http://www.groupacg.com/ATip.htm#MSG

ich habe tolle Balken und Liniendiagramme am zaubern :-)
Leider kriege ich diese(s) Diagramm(e) nicht seperat ausgedruckt.
[Das wäre aber ein neuer Thread]

Schönste Pfingsten

Raimo


Karl Donaubauer

unread,
May 29, 2009, 3:37:51 PM5/29/09
to
Raimo Becker wrote:
> ich habe mit folgendem Link einiges hinbekommen:
>
> http://www.groupacg.com/ATip.htm#MSG
>
> ich habe tolle Balken und Liniendiagramme am zaubern :-)

Danke. Lehrreiches Beispiel.
Kann man vielleicht mal brauchen.

Nur die Zuweisung von Spalten und Zeilen ist IMO im Beispiel
verkehrt herum, also

arrData = rsData.GetRows(200)
intRowMax = UBound(arrData, 1)
intColMax = UBound(arrData, 2)

sollte

intColMax = UBound(arrData, 1)
intRowMax = UBound(arrData, 2)

sein, da die erste Dimension von GetRows die Spalten liefert und
die zweite die Datensätze.

> Leider kriege ich diese(s) Diagramm(e) nicht seperat ausgedruckt.
> [Das wäre aber ein neuer Thread]

--
cu

Karl Donaubauer

unread,
May 29, 2009, 4:08:39 PM5/29/09
to
Karl Donaubauer wrote:

> Karsten Mᅵller wrote:
>> ...
>> Ich habe "Range" im Graph-Vortrag von der AEK06(?) gefunden und
>> dann in Access den Verweis auf die Graph.exe gesetzt und die Hilfe
>> durchforstet. Das hat mich aber nicht so richtig weitergebracht.
>
> Hmm, der Diagramm-Experte Gᅵnther Ritter schrieb im verwichenen

> Jahrtausend mal, dass man Werte in die Datentabelle des
> Graph-Objektes schreiben kᅵnne:

>
> http://groups.google.com/group/microsoft.public.de.access/msg/b1e504f483ec7bde
>
> Gelang mir bei einem kurzen Test vorhin nicht.
> ...

Kleine Ergᅵnzung, falls das noch jemand probiert:

Gᅵnther schrieb damals, man solle den SQL-String in der Datensatzherkunft
lᅵschen und dann das Diagramm wieder ᅵber das Datasheet fᅵllen.
An ersterem scheiterte es bei meinem Test in A03, denn das Lᅵschen liefert
dort zum einen eine Meldung und betᅵubt zum anderen das Diagramm.
Man darf also in neueren Versionen nicht die Datensatzherkunft lᅵschen.

In A97 hingegen ging das noch, wie ich gerade probiert habe.

--

Klaus Oberdalhoff

unread,
May 31, 2009, 8:21:39 PM5/31/09
to
Hi,

> Gelang mir bei einem kurzen Test vorhin nicht.
> Ich zweifle auch, dass dir das weiterhelfen w�rde.

Hi,

vieleicht hilft das ja weiter ...

da hab' ich mir mal eine uralte L�sung vom Jennerwein aufgehoben:

''Habt ihr auch schon ge�rgert das die Grafiken so langsam aufbauen.
''Habe im Usenet eine tolle L�sung gefunden und diese noch verbessert. Alle
''Grafiken bauen jetzt wesentlich schneller (Faktor 5 sicher) auf.
''Einfach statt dem Graph die Abfrage oder den SQL-String als Rowsource mit
''dem selben einen Recordset f�llen und der Funktion den Recordset �bergeben
''und das WICHTIG Diagramm als Objekt. Notwendig noch die Clipboardfunktion
''die auch aus dem Web habe. Die Datensatzherkunft des Diagramms muss leer
''sein !! (Tabelle/Abfrage und Select....)
''Vielleicht habt ihr noch Verbesserungen.
''
''Gruss Thomas Jennerwein <t.jenn...@cmc-solutions.com>
'
''___________________________________________________________________________
''
'' Beschreibung Diagramm-Funktionen
'' Version 1.00
'' Zust�ndigkeit TJ
'' Anlagedatum 14.11.03 11:32
'' Verweise
'' Komponente sysMdiagramm, sysMclipBoard
''___________________________________________________________________________
''
''
'Public Sub SetDiagramm(ByVal pGraphObject As Object, ByVal pRs As
ADODB.Recordset)
''___________________________________________________________________________
''
''Beschreibung F�llt das �bergebene Graph-Objekt mit dem �bergebenen
Recordset
''Verwendung Anstatt me!grafik.rowsource "SQL" => vRs.open "SQL"
'' sysmDiagramm me!grafik.object, vRs
''WICHTIG !! Grafik Eigenschaften Herkunftstyp und Datensatzherkunft
muss leer sein
''Zust�ndigkeit TJ
''Anlagedatum 14.11.03
''___________________________________________________________________________
''
'
'Dim vSheet As Object
'Dim vRows As Integer
'Dim vColumns As Integer
'Dim vString As String
'
'Set vSheet = pGraphObject.Application.DataSheet
'
''alte Daten l�schen
'vSheet.Cells.ClearContents
'
'For vColumns = 0 To pRs.Fields.Count - 1
' vString = vString & RTrim(pRs(vColumns).Name) & Chr(9)
'Next
'vString = Left(vString, Len(vString) - 1) + vbCrLf
'
'While Not pRs.EOF
' For vColumns = 0 To pRs.Fields.Count - 1
' vString = vString & RTrim(CStr(pRs(vColumns).Value)) & Chr(9)
' 'Debug.Print vString
' Next
' vString = Left(vString, Len(vString) - 1) + vbCrLf
' vRows = vRows + 1
' pRs.MoveNext
'Wend
'Debug.Print vString
''in die Zwischenablage kopieren
'SetClipboard vString
'
''Zwischenablage in die Zellen kopieren
'vSheet.Cells.Paste
'
'Set vSheet = Nothing
'
'
'End Sub
'
'
''-----------------------------------------------------------
''___________________________________________________________________________
''
'' Beschreibung Aus dem Internet: Steuerung der Zwischenablage per
API -Calls
'' Version 1.00
'' Zust�ndigkeit TJ
'' Anlagedatum 14.11.03 11:33
'' Verweise
'' Komponente sysMclipBoard
''___________________________________________________________________________
''
''
''
'Option Compare Database
'Option Explicit
'
'
'Declare Function pas_lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal _
'lpString1 As Any, ByVal lpString2 As Any) As Long
'Declare Function pas_GlobalLock Lib "kernel32" Alias "GlobalLock" (ByVal _
'hMem As Long) As Long
'Declare Function pas_GlobalUnlock Lib "kernel32" Alias "GlobalUnlock"
(ByVal _
'hMem As Long) As Long
'Declare Function pas_GlobalAlloc Lib "kernel32" Alias "GlobalAlloc" (ByVal
_
'wFlags As Long, ByVal dwBytes As Long) As Long
'Declare Function pas_OpenClipboard Lib "user32" Alias "OpenClipboard"
(ByVal _
'hWnd As Long) As Long
'Declare Function SetClipboardData Lib "User32.dll" (ByVal wFormat As Long,
_
'ByVal hMem As Long) As Long
'Declare Function pas_CloseClipboard Lib "user32" Alias "CloseClipboard" ()
As Long
'Declare Function pas_EmptyClipboard Lib "user32" Alias "EmptyClipboard" ()
As Long
'Declare Function pas_GetClipboardData Lib "user32" Alias "GetClipboardData"
_
'(ByVal wFormat As Long) As Long
'Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As
Long
'Private Declare Function CloseClipboard Lib "user32" () As Long
'Private Declare Function EmptyClipboard Lib "user32" () As Long
'
'
'Public Const pas_CF_TEXT = 1
'Public Const pas_GMEM_MOVEABLE = &H2
'Public Const pas_GMEM_ZEROINIT = &H40
'Public Const pas_GHND = (pas_GMEM_MOVEABLE Or pas_GMEM_ZEROINIT)
'Public Const pas_MAXSIZE = 4096
'
'Public Function SetClipboard(MyString As String)
'
''==========================================================================
' 'Description : Sets the clipboard contents
' 'Called By : GatherData()
' 'Calls : Several API calls
' 'Parameters : MyString as string - this is what goes into clipboard
' 'Returns : nothing
' 'Author : Peter Strong
' 'Date Created : 29/04/98 11:54:42
' 'Comments : restructured from MS KB article Q138909
'
''==========================================================================
' On Error GoTo ProcError
'
' Dim strActiveObjectName As String
' strActiveObjectName = Application.CurrentObjectName & "SetClipboard"
'
' Dim lngGlobalMemory As Long
' Dim lngGlobalMemoryFP As Long
' Dim lngClipMemory As Long
' Dim lngRetVal As Long
'
' 'Allocate moveable global memory
' lngGlobalMemory = pas_GlobalAlloc(pas_GHND, Len(MyString) + 1)
'
' ' Lock the block to get a far pointer to this memory
' lngGlobalMemoryFP = pas_GlobalLock(lngGlobalMemory)
'
' ' Copy the string to this global memory
' lngGlobalMemoryFP = pas_lstrcpy(lngGlobalMemoryFP, MyString)
'
' ' Unlock the memory
' If pas_GlobalUnlock(lngGlobalMemory) = 0 Then
'
' ' Open the Clipboard to copy data to
' If pas_OpenClipboard(0&) <> 0 Then
'
' ' Clear the Clipboard
' lngRetVal = pas_EmptyClipboard()
'
' ' Copy the data to the Clipboard
' lngClipMemory = SetClipboardData(pas_CF_TEXT, lngGlobalMemory)
' Else
' MsgBox "Could not open the Clipboard. Copy aborted.", vbCritical,
"Clipboard Paste"
' End If
'
' Else
' MsgBox "Could not unlock memory location. Copy aborted.", vbCritical,
"Clipboard Paste"
' End If
'
'Exit_SetClipboard:
' If pas_CloseClipboard() = 0 Then
' MsgBox "Could not close Clipboard.", vbCritical, "Clipboard Paste"
' End If
' Exit Function
'
'ProcError:
' 'Error Handler Goes Here
' MsgBox "Unexpected error in routine: " & strActiveObjectName & "
.Errorcode: " & Err & ", " & Error$, 16
' Resume Exit_SetClipboard
'
'
'End Function

Karsten Müller

unread,
Jun 3, 2009, 6:03:07 AM6/3/09
to
Oh,

viele neue Ideen.
Ich werde sie gleich mal testen, aber ich denke da was gut passendes bei sein.

Vielen Dank
Viele Grüße
Karsten

Karsten Müller

unread,
Jun 3, 2009, 6:27:02 AM6/3/09
to
Hallo Karl

>
> Me!MeinDiagramm.RowSource = _
> "SELECT Feld1, Feld3, Feld7 FROM (" & Me.RecordSource & ")"

das ist so zimlich genau was ich gesucht habe.
Ich bin mir nicht sicher ob du das schon in deiner 1. Antwort so gemeint
hast, aber da hatte ich wohl ein Brett vorm Kopf. ;-)

Vielen Dank
Karsten

0 new messages