expertenaustausch > microsoft.* > microsoft.vb.datenbank

Lothar Geyer (08.07.2008, 22:19)
Zu diesem Thema bin ich vollkommener Laie. Ich verwende sie zwar beim
Report-Designer - aber das ist eher abgekupfert als verstanden und
selbst erstellt. Nun habe ich aber ein Problem und bitte um Eure Hilfe.

Ich habe einen hierarchischen Recordset, den ich in einen
verbindungslosen RS nach entsprechenden Kriterien umkopieren will. Dabei
können zunächst Records des untergeordneten RS wegfallen. Fallen alle
Unter-Records eines übergeordneten weg, soll auch der übergeordnete
wegfallen.

Könntet Ihr mir bitte eine kleines Kode-Fragment entwerfen, das ich dann
ausfüllen kann?

Vielen Dank im voraus.

Lothar Geyer
Ralf Schrader (08.07.2008, 23:12)
Lothar Geyer schrieb

> Ich habe einen hierarchischen Recordset, den ich in einen verbindungslosen
> RS nach entsprechenden Kriterien umkopieren will. Dabei können zunächst
> Records des untergeordneten RS wegfallen. Fallen alle Unter-Records eines
> übergeordneten weg, soll auch der übergeordnete wegfallen.


Dann fallen doch alle weg, oder?

Ralf
Lothar Geyer (09.07.2008, 01:47)
Hallo Ralf,

Ralf Schrader schrieb:
> Lothar Geyer schrieb
>> Ich habe einen hierarchischen Recordset, den ich in einen verbindungslosen
>> RS nach entsprechenden Kriterien umkopieren will. Dabei können zunächst ^^^^^^
>> Records des untergeordneten RS wegfallen. Fallen alle Unter-Records eines
>> übergeordneten weg, soll auch der übergeordnete wegfallen.

> Dann fallen doch alle weg, oder?


Auf das "können" kommt es an ;-)
Es fallen nicht alle Records der untergeordneten Recordsets weg. Wenn
aber alle Records eines untergeordneten wegfallen, dann soll auch der
entsprechende Record des übergeordnete Recordsets wegfallen.

Lothar Geyer
Ralf Schrader (09.07.2008, 06:26)
Guten Morgen Lothar

> Auf das "können" kommt es an ;-)
> Es fallen nicht alle Records der untergeordneten Recordsets weg. Wenn aber
> alle Records eines untergeordneten wegfallen, dann soll auch der
> entsprechende Record des übergeordnete Recordsets wegfallen.


Die Verweise auf Chapter stehen im/ in den letzten Feldern der RecordSez-
Fields- Auflistung: Ungetetstet:

Private Function CopyMe(ByRef rsMaster as ADODB.RecorSet) As Boolean
Dim rsChapter As rsMaster as ADODB.RecorSet
Dim lCount As Long
Dim tmp As Boolean

tmp=False

For lCount = rsMaster.Fields.Count -1 To 0
if rsMaster.Fields(lCount).Type = adChapter Then
Set rsChapter = rsMaster.Fields(lCount).Value
if rsChapter.RecordCount > 0 Then
tmp = True
Exit For
EndIf
Else
Exit For
EndIf
Next

CopyMe = tmp
End Sub

Ralf
Lothar Geyer (09.07.2008, 07:57)
Guten Morgen Ralf,

Danke für den Kode. Ich glaube ich habe das verstanden. Der Tests wird
es weisen ...

Aber noch eine andere Frage zu verbindungslosen Recordsets:
Kann ich einen "normalen" (hierarchischen) Recordset in einen
verbindungslosen überführen?

Dann könnte ich nämlich meine Daten aus der Datenbank holen, den
Recordset verbindungslos machen, alle unerwünschten Records rauslöschen
(ohne dass Daten in der Datenbank verschwinden) und diesen Recordset
dann dem Report-Designer übergeben.

Lothar Geyer

PS:
Leider habe ich mir da mal wieder was überlegt, was ich in einer
SQL-Abfrage nicht unterbringe (zumindest habe ich es nicht geschafft,
deshalb das mit dem Umkopieren).
In einer Tabelle sind Kontaktdaten enthalten. Davon will ich alle, die
in einem Feld X einen Eintrag haben sowie die neuesten 5, die keinen
Eintrag, also NULL, enthalten. Das ließe sich ja noch mit einem Union
machen. Aber für den Report Generator brauche ich das dann noch nach
Datum gruppiert in einem hierarchischen Recordset.
Ralf Schrader (09.07.2008, 09:48)
Hallo Lothar

> Dann könnte ich nämlich meine Daten aus der Datenbank holen, den Recordset
> verbindungslos machen, alle unerwünschten Records rauslöschen (ohne dass
> Daten in der Datenbank verschwinden) und diesen Recordset dann dem
> Report-Designer übergeben.


Variante 1: Disconnected Recordset
Set rs.ActiveConnection = Nothing

Variante 2: (Lokal) persistieren und wieder einlesen
dim fileName as String
rs.Save fileName, adPersistXML
...
rs.Open fileName, , adOpenStatic, adLockBatchOptimistic, adCmdFile

> Leider habe ich mir da mal wieder was überlegt, was ich in einer
> SQL-Abfrage nicht unterbringe (zumindest habe ich es nicht geschafft,
> deshalb das mit dem Umkopieren).
> In einer Tabelle sind Kontaktdaten enthalten. Davon will ich alle, die in
> einem Feld X einen Eintrag haben sowie die neuesten 5, die keinen Eintrag,
> also NULL, enthalten. Das ließe sich ja noch mit einem Union machen. Aber
> für den Report Generator brauche ich das dann noch nach Datum gruppiert in
> einem hierarchischen Recordset.


Richtig verstehe ich die Frage wieder nicht, nur ganz allgemein: Man kann
eine Tabelle per hierarchischem Recordset auch mit sich selbst 'shapen'.
Damit bekommt man originelle Abfragen hin, welche fast alle UNION- und
selbstverständlich auch alle JOIN-Konstrukte zu ersetzen in der Lage sind.

Ralf
Lothar Geyer (09.07.2008, 12:12)
Hallo Ralf,

Ralf Schrader schrieb:
> Variante 1: Disconnected Recordset
> Set rs.ActiveConnection = Nothing
> Variante 2: (Lokal) persistieren und wieder einlesen
> dim fileName as String
> rs.Save fileName, adPersistXML
> ...
> rs.Open fileName, , adOpenStatic, adLockBatchOptimistic, adCmdFile


Was ist letztlich der Unterschied? Oder vielleicht besser: wann sollte
man welche Variante wählen?

> Richtig verstehe ich die Frage wieder nicht, nur ganz allgemein: Man kann
> eine Tabelle per hierarchischem Recordset auch mit sich selbst 'shapen'.
> Damit bekommt man originelle Abfragen hin, welche fast alle UNION- und
> selbstverständlich auch alle JOIN-Konstrukte zu ersetzen in der Lage sind.


Ich sehe schon, ich muss mir das mal genauer ansehen.

Aber doch noch eine Frage - zum schnelleren Eingewöhnen:

Wenn ich z.B. nach der obigen Variante einen verbindungslosen RS habe,
kann ich dann z.B. zu dem Recordset neue Felder hinzufügen, die Felder
mit beliebigen Daten füllen, Records löschen und andere hinzufügen, ohne
dass die Datenbank was davon mitbekommt?

Auf welche Fallstricke muss ich achten, um keine Daten zu verlieren oder
die Struktur der Datenbank zu verändern?

Lothar Geyer
Peter Götz (09.07.2008, 12:56)
Hallo Lothar,

> Wenn ich z.B. nach der obigen Variante einen verbindungslosen
> RS habe,


Also ein Recordset mit clientseitigem Cursor, dessen
..ActiveConnecion-Eigenschaft auf Nothing gesetzt ist.

> kann ich dann z.B. zu dem Recordset neue Felder
> hinzufügen,


Nein, weil die Fields-Auflistung eines bereits geöffneten
ADODB.Recordsets ReadOnly ist.
Zum Hinzufügen neuer Felder müsste das RS geschlossen
werden und damit wären dann die Daten im RS weg.
Du müsstest ein neues DB-unabhängiges RS mit den
gewünschten Feldern erzeugen und die Daten aus
Deinem ursprünglichen RS dort hinein kopieren.

> die Felder mit beliebigen Daten füllen,


s.oben: diese Felder kannst Du einem geöffneten
RS gar nicht hinzufügen.

> Records löschen und andere hinzufügen, ohne
> dass die Datenbank was davon mitbekommt?


s.oben: ein zweites RS mit den gewünschten Feldern
erzeugen, die Daten dort hineinkopieren und dann kannst
Du mit diesem zweiten RS nach Belieben verfahren, ohne
dass die DB davon irgendwas mitbekommt.

> Auf welche Fallstricke muss ich achten, um keine
> Daten zu verlieren


s.oben: schon beim Schliessen des RS, was zum Hinzufügen
neuer Felder erforderlich wäre, gehen die Daten verloren.

> oder die Struktur der Datenbank zu verändern?


Ein eigenständiges, von der DB unabhängiges RS
erzeugen und nach Belieben schalten und walten .

Gruß aus St.Georgen
Peter Götz
(mit VB-Tipps u. Beispielprogrammen)
Lothar Geyer (09.07.2008, 15:47)
Hallo Peter,

Peter Götz schrieb:
> s.oben: ein zweites RS mit den gewünschten Feldern
> erzeugen, die Daten dort hineinkopieren und dann kannst
> Du mit diesem zweiten RS nach Belieben verfahren, ohne
> dass die DB davon irgendwas mitbekommt.


Schade, dass das nicht geht. Denn das Ziel wäre eben gewesen, sich genau
dieses Umkopieren zu ersparen.

Lothar Geyer
Ähnliche Themen