Discussion:
Daten und ein Crystal Report
(zu alt für eine Antwort)
Fritz Meiners
2005-06-04 18:42:51 UTC
Permalink
Hallo, wie kann ich folgendes am besten mit Crystal lösen ?
Ich habe in einer Access Tabelle folgende Einträge.

Datum Wert WertID
z.B.
1.1.2005 300 1
1.1 2005 343 2
1.1 2005 121 3
1.1 2005 1244 4
2.1.2005 310 1
2.1.2005 500 2
...
ich habe immer 5 Datensätze die zusammen nebeneinander in einem Report
erscheinen sollen.
Der Report soll folgenden Aufbau haben.
Überschrift
Dtum Wert1 Wert2 Wert3 Wert4 Wert5
======================================
Als Beispiel.
1.1.2005 300 343 121 1244 ...
2.1.2005 310 500

Kann man sowas irgendwie hinbekommen ?
Gruss
Karsten Sosna
2005-06-05 04:49:01 UTC
Permalink
Post by Fritz Meiners
Hallo, wie kann ich folgendes am besten mit Crystal lösen ?
Ich habe in einer Access Tabelle folgende Einträge.
Datum Wert WertID
z.B.
1.1.2005 300 1
1.1 2005 343 2
1.1 2005 121 3
1.1 2005 1244 4
2.1.2005 310 1
2.1.2005 500 2
...
ich habe immer 5 Datensätze die zusammen nebeneinander in einem Report
erscheinen sollen.
Der Report soll folgenden Aufbau haben.
Überschrift
Dtum Wert1 Wert2 Wert3 Wert4 Wert5
======================================
Als Beispiel.
1.1.2005 300 343 121 1244 ...
2.1.2005 310 500
Kann man sowas irgendwie hinbekommen ?
Ich glaube Du bist in der falschen NG.
Aber versuch es mal mit einer Kreuztabellenabfrage, das Abfrageergebnis
weißt Du dann dem Report zu. Beispiele zur Abfrage gibt es u.a. in der
Access-Hilfe.
--
Gruß Scotty
be-cool
2005-06-05 07:51:17 UTC
Permalink
Post by Fritz Meiners
...
ich habe immer 5 Datensätze die zusammen nebeneinander in einem Report
erscheinen sollen.
Der Report soll folgenden Aufbau haben.
Überschrift
Dtum Wert1 Wert2 Wert3 Wert4 Wert5
======================================
Als Beispiel.
1.1.2005 300 343 121 1244 ...
2.1.2005 310 500
Hallo,
ich hatte das Problem, mehrere Datensätze in einer Zeile darzustellen,
auch schon. Das geht meines Wissens weder in Crystalreport noch in
einem Accessreport. Du mußt vorher eine neue Tabelle erstellen, wo das
Datum und die 5 Werte in getrennten Tabellenfeldern dargestellt werden.
Gruß Jürgen
Peter Fleischer
2005-06-05 09:16:41 UTC
Permalink
be-cool wrote:
...
Post by be-cool
ich hatte das Problem, mehrere Datensätze in einer Zeile darzustellen,
auch schon. Das geht meines Wissens weder in Crystalreport noch in
einem Accessreport. Du mußt vorher eine neue Tabelle erstellen, wo das
Datum und die 5 Werte in getrennten Tabellenfeldern dargestellt werden.
Wenn die Anzahl der zuzammenzufassenden Felder variabel ist, wird es wohl
besser sein, die Inhalte zu verketten und in ein Feld in ein lokales nur im
Client zu haltenden Dataset zu schreiben. Das DataSet kann dann dem Crystal
Report zur Anzeige/Druck übergeben werden.

Peter
Fritz Meiners
2005-06-05 09:46:48 UTC
Permalink
Hi Peter, kannst du ungefähr andeuten wie man sowas machen kann ?
Gruss
Post by Peter Fleischer
...
Post by be-cool
ich hatte das Problem, mehrere Datensätze in einer Zeile darzustellen,
auch schon. Das geht meines Wissens weder in Crystalreport noch in
einem Accessreport. Du mußt vorher eine neue Tabelle erstellen, wo das
Datum und die 5 Werte in getrennten Tabellenfeldern dargestellt werden.
Wenn die Anzahl der zuzammenzufassenden Felder variabel ist, wird es wohl
besser sein, die Inhalte zu verketten und in ein Feld in ein lokales nur im
Client zu haltenden Dataset zu schreiben. Das DataSet kann dann dem Crystal
Report zur Anzeige/Druck übergeben werden.
Peter
Peter Fleischer
2005-06-05 18:38:13 UTC
Permalink
Post by Fritz Meiners
Hi Peter, kannst du ungefähr andeuten wie man sowas machen kann ?
Fritz,
wenn du beispielweise als Ausgangsbasis ein DataSet (dset) mit der Tabelle
"Daten" hast, die die Spalten "Datum, Text und Nummer enthält, dann könnte
das ungetestet so aussehen:

Dim dt As New DataTable("Ausgabe")
dt.Coumns.Add(New DataColumn("Datum", GetType(Date)))
dt.Coumns.Add(New DataColumn("Text", GetType(String)))
dset.Tables.Add(dt)

Dim dv As DataView = dset.Tables("Daten")
dv.Sort = "Datum, Nummer"
Dim dat as Date = Date.MinValue
Dim drow As DataRow
For i As Integer = 0 To dv.Count - 1
If dat <> CType(dv.Item(i)("Datum"), Date) Then
If Not drow Is Nothing Then dt.Rows.Add(drow)
dat = CType(dv.Item(i)("Datum"), Date)
drow = dt.NewRow
drow!Datum = dat
End If
drow!Text = CType(drow!Text, String) & CType(dv.Item(i)("Text"), String)
& " "
Next
If Not drow Is Nothing Then dt.Rows.Add(drow)

Jetzt nur noch die Ausgabe der Tabelle "Ausgabe".

Peter
Fritz Meiners
2005-06-06 06:00:32 UTC
Permalink
Hallo Peter, vielen Dank. Ich tue mir mit den "Datenbank" losen Tabellen
noch ein bisschen schwer.
Das ist denn meine
Post by Peter Fleischer
Dim dt As New DataTable("Ausgabe")
Dummy Tabelle, oder ?
Post by Peter Fleischer
Dim dv As DataView = dset.Tables("Daten")
dv.Sort = "Datum, Nummer"
Das ist "MEINE" Tabelle wo die Daten herkommen, oder ?

Theoretisch als wenn ich mir wie bisher meine Daten hole, nur werden die
jetzt in die Dummy Tabelle geschrieben.
Post by Peter Fleischer
If Not drow Is Nothing Then dt.Rows.Add(drow)
Diese Dummy Tabelle weise ich denn meinen Report zu, oder ?
Anschliessend muss ich doch diese Tabelle denn noch löschen (Dispose ? )
Gruss und danke für den Tip.
Post by Peter Fleischer
Post by Fritz Meiners
Hi Peter, kannst du ungefähr andeuten wie man sowas machen kann ?
Fritz,
wenn du beispielweise als Ausgangsbasis ein DataSet (dset) mit der Tabelle
"Daten" hast, die die Spalten "Datum, Text und Nummer enthält, dann könnte
Dim dt As New DataTable("Ausgabe")
dt.Coumns.Add(New DataColumn("Datum", GetType(Date)))
dt.Coumns.Add(New DataColumn("Text", GetType(String)))
dset.Tables.Add(dt)
Dim dv As DataView = dset.Tables("Daten")
dv.Sort = "Datum, Nummer"
Dim dat as Date = Date.MinValue
Dim drow As DataRow
For i As Integer = 0 To dv.Count - 1
If dat <> CType(dv.Item(i)("Datum"), Date) Then
If Not drow Is Nothing Then dt.Rows.Add(drow)
dat = CType(dv.Item(i)("Datum"), Date)
drow = dt.NewRow
drow!Datum = dat
End If
drow!Text = CType(drow!Text, String) & CType(dv.Item(i)("Text"), String)
& " "
Next
If Not drow Is Nothing Then dt.Rows.Add(drow)
Jetzt nur noch die Ausgabe der Tabelle "Ausgabe".
Peter
Adrian Herrmann
2005-06-06 09:04:13 UTC
Permalink
Hallo Fritz

wenn Die Spaltenzahl fix ist und die Spalte wie ich es interpretiere eine
Nummer haben kannst Du auch einen entsprechenden SQL-Ausdruck einsetzen oder
eine Abfrage direkt in Access gestalten.

Im Folgenden liegt eine Tabelle aaT hat die Felder

Datum: Typ-Date
Text: Type-String
Nr: Type-String

Der SQL-Ausdruck liefert Das Datum mit nachfolgenden Werten. Der Nachteil
ist, daß die Geschichte ziemlich starr ist. Man kann zwar bei flexiblen
Feldern den String via Code generieren, was ich nur bei einer nach oben
begrenzten Spaltenzahl machen würde.

<SQL>
SELECT aaT.Datum,aaT.Text, Tab2.Text, Tab3.Text, Tab4.Text
FROM aaT, aaT as Tab2, aaT as Tab3, aaT as Tab4

where

aaT.Datum=Tab2.Datum and aaT.Datum=Tab3.Datum and aaT.Datum=Tab4.Datum and
aaT.Nr="1" and Tab2.Nr="2" and Tab3.Nr="3" and Tab4.Nr="4";
</SQL>

Verwendet für jede Spalte wird immer dieselbe Tabelle. Um das machen zu
können muß die Tabelle für jede Spalte jeweils umbenannt werden. Im
Kriterium muß das Datum aller Tabellenspalten miteinander übereinstimmen.

Falls Du alle Werte der Tabelle für den Bericht brauchst kannst Du Select *
From ... verwenden. Wenn die sonstigen Felder für jeden Eintrag gleich sind
ist es besser "Select aaT.*, Tab2.Text, ... zu verwenden.

Gruß
Adrian
Peter Fleischer
2005-06-06 09:36:42 UTC
Permalink
Post by Fritz Meiners
Hallo Peter, vielen Dank. Ich tue mir mit den "Datenbank" losen
Tabellen noch ein bisschen schwer.
Das ist denn meine
Post by Peter Fleischer
Dim dt As New DataTable("Ausgabe")
Dummy Tabelle, oder ?
Fritz,
das ist keine "Dummy Tabelle", sondern eine weitere DataTable im Client, die
dann die auszugebenden Daten enthält.
Post by Fritz Meiners
Post by Peter Fleischer
Dim dv As DataView = dset.Tables("Daten")
dv.Sort = "Datum, Nummer"
Das ist "MEINE" Tabelle wo die Daten herkommen, oder ?
Genau! Irgendwo müssen die Ausgangsdaten ja im Client verfügbar sein:-)
Post by Fritz Meiners
Theoretisch als wenn ich mir wie bisher meine Daten hole, nur werden
die jetzt in die Dummy Tabelle geschrieben.
Rüber kopiert und dabei "verdichtet", so wie du es wünschst.
Post by Fritz Meiners
Post by Peter Fleischer
If Not drow Is Nothing Then dt.Rows.Add(drow)
Diese Dummy Tabelle weise ich denn meinen Report zu, oder ?
Genau!
Post by Fritz Meiners
Anschliessend muss ich doch diese Tabelle denn noch löschen (Dispose ? )
Die DataTable ist ein Objekt, welches der Garbage Collector aus dem Speicher
(im Client) entfernt, wenn darauf kein Verweis mehr existiert. Wenn also der
Report beendet wurde und die DataTable aus dem DataSet entfernt wurde, dann
wird das Objekt (die "dummy table") automatisch entfernt (vorausgesetzt, es
gibt deinerseits keine weiteren Verweise). Ein Dispose ist da nicht
zusätzlich erforderlich.

Peter
Fritz Meiners
2005-06-06 19:26:04 UTC
Permalink
Hi Peter, vielen Dank hat alles geklappt. Wenn man es weiß geht es ja echt
easy. Nun habe ich aber ein anderes Problem.

Wie kann ich dies Dataset an einen Crystal Report binden ?
.SetDatasource klappt ja . Aber wie designe ich den Report ? Ich habe ja
keine Felder zu Auswahl .
Wie gehe ich denn hier vor ?

Gruss
Post by Peter Fleischer
Post by Fritz Meiners
Hallo Peter, vielen Dank. Ich tue mir mit den "Datenbank" losen
Tabellen noch ein bisschen schwer.
Das ist denn meine
Post by Peter Fleischer
Dim dt As New DataTable("Ausgabe")
Dummy Tabelle, oder ?
Fritz,
das ist keine "Dummy Tabelle", sondern eine weitere DataTable im Client, die
dann die auszugebenden Daten enthält.
Post by Fritz Meiners
Post by Peter Fleischer
Dim dv As DataView = dset.Tables("Daten")
dv.Sort = "Datum, Nummer"
Das ist "MEINE" Tabelle wo die Daten herkommen, oder ?
Genau! Irgendwo müssen die Ausgangsdaten ja im Client verfügbar sein:-)
Post by Fritz Meiners
Theoretisch als wenn ich mir wie bisher meine Daten hole, nur werden
die jetzt in die Dummy Tabelle geschrieben.
Rüber kopiert und dabei "verdichtet", so wie du es wünschst.
Post by Fritz Meiners
Post by Peter Fleischer
If Not drow Is Nothing Then dt.Rows.Add(drow)
Diese Dummy Tabelle weise ich denn meinen Report zu, oder ?
Genau!
Post by Fritz Meiners
Anschliessend muss ich doch diese Tabelle denn noch löschen (Dispose ? )
Die DataTable ist ein Objekt, welches der Garbage Collector aus dem Speicher
(im Client) entfernt, wenn darauf kein Verweis mehr existiert. Wenn also der
Report beendet wurde und die DataTable aus dem DataSet entfernt wurde, dann
wird das Objekt (die "dummy table") automatisch entfernt (vorausgesetzt, es
gibt deinerseits keine weiteren Verweise). Ein Dispose ist da nicht
zusätzlich erforderlich.
Peter
Peter Fleischer
2005-06-07 00:48:05 UTC
Permalink
Post by Fritz Meiners
Hi Peter, vielen Dank hat alles geklappt. Wenn man es weiß geht es ja
echt easy. Nun habe ich aber ein anderes Problem.
Wie kann ich dies Dataset an einen Crystal Report binden ?
.SetDatasource klappt ja . Aber wie designe ich den Report ? Ich habe
ja keine Felder zu Auswahl .
Wie gehe ich denn hier vor ?
Fritz,
erstelle im Projekt ein typisiertes DataSet. Dieses muss in allen Details
(Tabellennamen, Feldnamen und Feldtypen) dem späteren "realen" DataSet
entsprechen.

Peter
Fritz Meiners
2005-06-07 08:43:38 UTC
Permalink
Hallo Peter, das habe ich hinbekommen. Ich übergebe nun den Dataset als
Source. Da kommt aber immer die Fehlermeldung es darf nur ein Datareader
geöffnet sein ?

Gruss
Post by Peter Fleischer
Post by Fritz Meiners
Hi Peter, vielen Dank hat alles geklappt. Wenn man es weiß geht es ja
echt easy. Nun habe ich aber ein anderes Problem.
Wie kann ich dies Dataset an einen Crystal Report binden ?
.SetDatasource klappt ja . Aber wie designe ich den Report ? Ich habe
ja keine Felder zu Auswahl .
Wie gehe ich denn hier vor ?
Fritz,
erstelle im Projekt ein typisiertes DataSet. Dieses muss in allen Details
(Tabellennamen, Feldnamen und Feldtypen) dem späteren "realen" DataSet
entsprechen.
Peter
Peter Fleischer
2005-06-08 18:19:08 UTC
Permalink
Post by Fritz Meiners
Hallo Peter, das habe ich hinbekommen. Ich übergebe nun den Dataset
als Source. Da kommt aber immer die Fehlermeldung es darf nur ein
Datareader geöffnet sein ?
Fritz,
sind im Report noch Einträge, die einen Zugriff auf eine Datenbank
intiieren? Hast du DataReader geöffnet?

Peter

Loading...