DataReport - Abfrage aus mehreren Tabellen

Chandini

Mitglied
Hi ihr,

folgendes Problem: Ich habe ein VB-Programm, das auf eine Access DB (Access 2000) zugreift.
In der Datenbank habe ich drei Tabellen: tblKunden, tblBerechnung, tblZusatztext.
Im Programm sucht man einen Kunden aus und gibt dazu ein paar Werte zur Berechnung und Zusatztext ein.

Jetzt möchte ich das alles mit einem DataReport ausgeben. Ich habe dazu ein DataEnvironment erstellt mit dem übergeordneten Befehl "Kunde", der den jeweiligen Kunden ausliest. Außerdem zwei untergeordnete Befehle "Berechnung" und "Zusatztext".

Allerdings schaffe ich es nicht, die auslesen zu lassen.

Momentan kommen die Kundendaten in den Gruppenkopf des DataReports. Der Rest sollte in den Detailbereich. Wenn ich jetzt "Kunden" als übergeordneten Befehl habe und beide andere als untergeordnete zu diesem Befehl, dann geht es gar nicht. Da kann ich keine Felder hinzufügen.

Und wenn ich die Befehle alle unterordne, dann ist es ja falsch. Die Berechnung und der Zusatztext sind ja nicht voneinander abhängig.

Wie krieg ich das am besten hin? Probier schon seit Tagen alle möglichen Sachen aus, aber es klappt einfach nicht.

Wär super, wenn mir wer helfen könnte.

Danke schon mal im Voraus...

Viele Grüße,
Ines
 
Hallo Chandini,

vergiss das DataEnviroment. Du fährst besser wenn du das ganze selber schreibst.
Um in einem DataReport mehrere Tabellen einzubinden braucht du als Provider
das "MSDataShape".

Bsp. Connection aufbauen

Code:
With cnShape
         .Cursorlocation = adUseClient
         .Provider = "MSDataShape"
         .Properties("Data Provider") = "Microsoft.Jet.OLEDB.4.0"
         .Properties("Data Source") = DBFile
         .Properties("Extended Properties").value = "Jet OLEDB:Database Password = " & cstrPWD
          .Open
End With

Das Recordset erstellst du jetzt selber.

Bsp.

Code:
With rsGroup
         .ActiveConnection = cnShape
         .Source = "Shape {Select * from Tabelle1 where Spalte1 = '...' order by .... } as CMD1 APPEND ({Select * from Tabelle2} as CMD2 Relate Tabelle1.Spalte1 to Tabelle2.Spalte1)"
          .Cursorlocation = adUseClient
          .CursorType = adOpenStatic
          .LockType = adLockOptimistic
          .Open
End With

Beim googlen findest du da auch genug.

Hinweis

'So wird ein Field des Recordsets rsGroup!Chapter1 übergeben
'rsGroup!Chapter1 ist eben kein Field sondern ein Recordset
'rsGroup!Chapter1!meinFeld

So wird das ganze dem DataReport übergeben.

Code:
With .Sections("Bereich1")
        .Controls("txtTextBox1").DataMember = "CMD2"
        .Controls("txtTextBox1").DataField = "Spalte1"
End With


Hoffe das hilft dir ein wenig.

Jens
 
Hi Jens,

danke für die Antwort.

Hab auch im Internet was drüber gefunden und so könnte es wirklich gehen. Das Problem ist nur, dass ich keine Ahnung hab, wie ich das da reinbring.
Dazu hab ich im Internet nix gefunden.

Ich hab den Verbindungsaufbau mal ins FormLoad geschrieben.
Da krieg ich dann folgende Fehlermeldung:

Laufzeitfehler 91
Objektvariable oder With-Blockvariable nicht festgelegt.

Muss ich irgendeine Komponente oder einen Verweis hinzufügen? Ich hab keinen gefunden, der MSDataShape heißt. Die VB Hilfe kann man da auch vergessen.

Wär super, wenn du mir da noch weiterhelfen könntest.

Viele Grüße,
Ines
 
Hallo Ines,

zeig uns doch mal ein paar relevante Codeschnipsel dann werden wir sicher
helfen können.
Und noch was, ich weiß nicht genau ab welcher ADO Version das MSDataShape
integriert ist aber du solltest die aktuelle MDAC 2.8 (ADO) sowie die aktuelle Jet Engine
SP7 oder SP8 installiert haben.

Das MSDataShape muss nicht als Komponente oder Verweis eingebunden sein es reicht der ADO Verweis Microsoft ActiveX Data Objects 2.8 Library.

Für den DataReport ist der Verweis auf Microsoft Data Report Designer 6.0 (SP4)
notwendig.

Gruß
Jens
 
Hi ihr zwei,

also mittlerweile bin ich doch etwas weitergekommen. Mein Problem liegt jetzt im Shape-Befehl. Irgendwas mag da noch nicht so ganz wie ich.

Hier mal mein Code:
Code:
Private Sub cmdAusdruck_Click()
    With rsAusdruck
        .ActiveConnection = mdiVölkel.cnShape
        .Source = "SHAPE {SELECT * FROM tblSpk16 WHERE IDMonat = " & IDGesamt & " ORDER BY ID} AS Spk16CMD APPEND ({SELECT * FROM tblRaiba16} AS Raiba16CMD RELATE tblSpk16.IDMonat TO tblRaiba16.IDMonat)"
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .Open
    End With

    DataReport1.Sections("Bereich1").Controls("txt1").DataMember = "Raiba16CMD"
    DataReport1.Sections("Bereich1").Controls("txt1").DataField = "IDMonat"

    DataReport1.Show
End Sub

Da erhalte ich folgende Fehlermeldung:
Laufzeitfehler '-2147217900 (80040e14)':
Der Datenstrukturierungsbefehl enthält einen Syntaxfehler bei oder in der Nähe der Position 139 im Befehl. Der Befehlstext in der Nähe des Fehlers ist: " RELATE tblSpk16.IDMonat TO tblRaiba16.IDMonat)".

Position 139 ist in tblRaiba16 im zweiten SELECT-Befehl.
Wo steckt da der Fehler drin?

Die beiden Verweise Microsoft ActiveX Data Objects 2.8 Library und Microsoft Data Report Designer 6.0 (SP4) waren schon gesetzt.

Viele Grüße,
Ines
 
Hallo Ines,

sorry das ist mein Fehler im Beispiel.

Es muss heißen:

Code:
.Source = "SHAPE {SELECT * FROM tblSpk16 WHERE IDMonat = " & IDGesamt & " ORDER BY ID} AS Spk16CMD APPEND ({SELECT * FROM tblRaiba16} AS Raiba16CMD RELATE IDMonat TO IDMonat)"

Die Tabellennamen bei RELATE müssen weg :)

Jens
 
Hi Jens,

kann ja mal passieren ;-)

Aber dafür hab ich noch ein Problem... Wär ja sonst auch zu einfach.

Jetzt krieg ich folgenden Fehler:
DataField '(Leer)' nicht gefunden.
Code:
DataReport1.Sections("Bereich1").Controls("txt1").DataField = "IDMonat"

Wie krieg ich das weg?

Viele Grüße,
Ines
 
Hallo Ines,

den DataReport Designer brauchst du trotzdem. Ich hatte ja geschrieben vergiss das DataEnvironment :)

D.h. du musst bei dir im Detailsbereich Sektion1("Bereich1") auch tatsächlich eine
rptTextBox mit dem Namen txt1 haben. Hast du diese ?

Ach so ich hatte vergessen zu sagen das du dem DataReport noch die Source mitteilen musst.

Code:
With DataReport1
     Set .DataSource = rsAusdruck
     If Printers.Count > 0 Then
           .Show
           .Left = 0
           .Top = 0
           .Caption = "Dein DataReport"
     Else
            MsgBox "Bitte installieren Sie einen Drucker."
     End If


End With

VG aus Thüringen
Jens
 
Hi Jens,

mittlerweile bin ich so weit, dass etwas angezeigt wird. Hatte nen kleinen Tippfehler drin *g*

Aber ich hab keine Ahnung, was da angezeigt wird.
Eingegeben hab ich in der tblSpk16 die Werte 12,23 und 34 und in tblRaiba16 98, 87 und 76.

Im Ausdruck stehen folgende Werte:
23, 34, 45, 56, 67, 5, 6, 7 und 56.

Ich habe keine Ahnung, woher diese Zahlen kommen. Es sollten ja eigentlich die rauskommen, bei denen IDMonat = IDGesamt. Und in der Tabelle sind das auch nur die eingegebenen Zahlen.

Hier nochmal mein aktueller Code:
Code:
Private Sub cmdAusdruck_Click()
    With rsAusdruck
        .ActiveConnection = mdiVölkel.cnShape
        .Source = "SHAPE {SELECT * FROM tblSpk16 WHERE IDMonat = " & IDGesamt & " ORDER BY ID} AS Spk16CMD APPEND ({SELECT * FROM tblRaiba16} AS Raiba16CMD RELATE IDMonat TO IDMonat)"
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .Open
    End With
    
    With DataReport1
        Set .DataSource = rsAusdruck
    End With

    DataReport1.Sections("Bereich1").Controls("txt1").DataMember = "Raiba16CMD"
    DataReport1.Sections("Bereich1").Controls("txt1").DataField = "Betrag"

    DataReport1.Show
End Sub

Viele Grüße,
Ines
 
Zurück