Variable Recordset-Definition

Moderator: ModerationP

Variable Recordset-Definition

Beitragvon Frank82 » 17. Sep 2021, 06:15

Guten Morgen zusammen,

ich habe eine Funktion, die insgesamt acht Abfragen ausführt.

Nach jeder Abfrage wird die selbe Funktion mit Zugriff auf das Ergebnis der Abfrage ausgeführt.

Code: Alles auswählen
Dim rst1 As ADODB.Recordset     
Dim rst2 As ADODB.Recordset     
Set rst1 = New ADODB.Recordset
Set rst2 = New ADODB.Recordset

rst1.Open "SELECT * from Tbl1 where..."
rst2.Open "SELECT * from Tbl2 where..."

'An dieser Stelle würde ich gerne eine Schleife ausführen

 For i = 1 To 8
   
   
        If Not rst(i).BOF Then             'WIE KANN ICH MICH HIER auf meine Recordset Definition beziehen?
                                                     '(Normalerweise rst1.BOF, rst2.BOF)
                                                      'und jedes mal muss die Funktion wiederholt werden.
            rst(i).MoveFirst             
            Do Until rst.EOF
                   'HIER KOMMT DIE FUNKTION REIN
            Loop
        End If
Next i




Danke Euch

Gruß Frank
Frank82
 

Re: Variable Recordset-Definition

Beitragvon mmarkus » 17. Sep 2021, 07:03

Erstelle ein Array mit Recordsets, dann kannst du mit der Array Position arbeiten.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2141
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Variable Recordset-Definition

Beitragvon Frank82 » 17. Sep 2021, 07:17

Hallo mmarkus.

Hast Du mal einen Tip für mich?

Habe zwar schon mit arrays gearbeitet, aber wie erstelle ich ein Array mit recordsets. Stehe etwas auf dem Schlauch.

Gruß Björn
Frank82
 

Re: Variable Recordset-Definition

Beitragvon mmarkus » 17. Sep 2021, 08:33

Frank82 hat geschrieben:Habe zwar schon mit arrays gearbeitet, aber wie erstelle ich ein Array mit recordsets. Stehe etwas auf dem Schlauch.


Es spielt doch keine Rolle was im Array ist, das Prinzip ändert sich nicht.

dim rst(1 to 8) as ADODB.Recordset

oder 0 basiertes Array:

dim rst(7) as ADODB.Recordset

Das ist in Wirklichkeit kein Array, sondern ein Datenfeld. Ist jetzt aber nicht relevant.
Datenfeld ist nur weit schneller wie ein Array.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2141
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Variable Recordset-Definition

Beitragvon Bitsqueezer » 17. Sep 2021, 08:57

Hallo,

oder man könnte sich fragen, ob die Geschichte nicht gleich durch SQL lösbar wäre.

Wenn es immer um die gleichen Dinge geht, wäre etwa eine UNION ALL Abfrage denkbar, so daß Du am Ende nur noch eine Abfrage hast statt 8.

Oder man könnte per Dynamic SQL den Namen der Tabelle austauschen...

Oder das, was in der Schleife geschieht, gleich ganz nach SQL verlagern.

Aber da Du keine Details verrätst, kann das nur Professorin Trelawney beantworten, fürchte ich...

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8462
Registriert: 21. Jun 2007, 12:17

Re: Variable Recordset-Definition

Beitragvon Gast » 17. Sep 2021, 09:34

Wie nehme ich denn Zugriff auf den RS?

Code: Alles auswählen
For i = 1 To 8
    rstAuslPosSSNr.Open "Select * from tblKalkAuftPosSSNr", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    If Not rst(i).BOF Then                            'Hier kommt, Objektvariable oder With-Blockvariable nicht festgelegt!
                                                                (Würde ich es mit (1); (2) usw deklarieren, funktioniert es, aber das möchte ich ja nicht, hätte dann nichts gewonnen
        rst(i).MoveFirst
        Do Until rst(i).EOF
                With rstAuslPosSSNr
                .AddNew
                ![Erfassungswert] = "GesZeit"
                ![Geswert] = Nz(rst(i)!GesZeit, 0)
                ![SSNR] = rst(i)!SchaltschrankNr
                .Update
                End With
            rst(i).MoveNext
        Loop
    End If
Next i

Gast
 

Re: Variable Recordset-Definition

Beitragvon Frank82 » 17. Sep 2021, 09:38

Hallo Bitsqueezer,

so sieht der Ausschnitt meines Codes aus!

Code: Alles auswählen
    Dim rst(1 To 8) As ADODB.Recordset

   'Zeitaufwand
    'Set rst = New ADODB.Recordset
    Set rst1 = New ADODB.Recordset
    Set rst2 = New ADODB.Recordset
    Set rst3 = New ADODB.Recordset
    Set rst4 = New ADODB.Recordset
    Set rst5 = New ADODB.Recordset
    Set rst6 = New ADODB.Recordset
    Set rst7 = New ADODB.Recordset
    Set rst8 = New ADODB.Recordset

    Set rstAuslPosSSNr = New ADODB.Recordset
     
    rst1.Open "SELECT nz(Sum([tblKalkKalkulationErstSub]![Menge]*nz([Zeitaufwand],0)),0) AS GesZeit, tblKalkKalkulationErstSub.SchaltschrankNr FROM tblKalkKalkulationErstSub INNER JOIN tblArtikelDaten ON tblKalkKalkulationErstSub.ArtikelNr = tblArtikelDaten.ArtikelNr GROUP BY tblKalkKalkulationErstSub.PosAkt, tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.Stat, tblKalkKalkulationErstSub.SchaltschrankNr HAVING (((tblKalkKalkulationErstSub.PosAkt)=0) AND ((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.Stat)=0));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rst2.Open "SELECT nz(Sum(([tblKalkMakroSub]![Menge]*[Zeitaufwand])*[tblKalkKalkulationErstSub]![menge]),0) AS GesZeit, tblKalkKalkulationErstSub.Stat, tblKalkKalkulationErstSub.SchaltschrankNr  FROM tblKalkKalkulationErstSub INNER JOIN ((tblKalkMakroSub INNER JOIN tblArtikelDaten ON tblKalkMakroSub.ArtikelNr = tblArtikelDaten.ArtikelNr) INNER JOIN tblKalkMakroHaupt ON tblKalkMakroSub.MIdNr = tblKalkMakroHaupt.id) ON tblKalkKalkulationErstSub.Mnemonic = tblKalkMakroHaupt.MKurztext GROUP BY tblKalkKalkulationErstSub.Stat, tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt, tblKalkKalkulationErstSub.SchaltschrankNr HAVING (((tblKalkKalkulationErstSub.Stat)=1) AND ((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rst3.Open "SELECT nz(Sum((([tblKalkMakroSub]![Menge]*[Zeitaufwand])*[tblKalkBaugruppeSub]![menge])*[tblKalkKalkulationErstSub]![Menge]),0) AS GesZeit FROM ((((tblKalkMakroSub INNER JOIN tblArtikelDaten ON tblKalkMakroSub.ArtikelNr = tblArtikelDaten.ArtikelNr) INNER JOIN tblKalkMakroHaupt ON tblKalkMakroSub.MIdNr = tblKalkMakroHaupt.id) INNER JOIN tblKalkBaugruppeSub ON tblKalkMakroHaupt.MKurztext = tblKalkBaugruppeSub.Mnemonic) INNER JOIN tblKalkBaugruppeHaupt ON tblKalkBaugruppeSub.BIdNr = tblKalkBaugruppeHaupt.id) INNER JOIN tblKalkKalkulationErstSub ON tblKalkBaugruppeHaupt.BKurztext = tblKalkKalkulationErstSub.Mnemonic GROUP BY tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt HAVING (((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0)); ", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rst4.Open "SELECT nz(Sum(([Zeitaufwand]*[tblKalkBaugruppeSub]![Menge])*[tblKalkKalkulationErstSub]![Menge]),0) AS GesZeit FROM tblKalkKalkulationErstSub INNER JOIN ((tblKalkBaugruppeSub INNER JOIN tblKalkBaugruppeHaupt ON tblKalkBaugruppeSub.BIdNr = tblKalkBaugruppeHaupt.id) INNER JOIN tblArtikelDaten ON tblKalkBaugruppeSub.ArtikelNr = tblArtikelDaten.ArtikelNr) ON tblKalkKalkulationErstSub.Mnemonic = tblKalkBaugruppeHaupt.BKurztext GROUP BY tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt, tblKalkKalkulationErstSub.SchaltschrankNr HAVING (((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
     
    rst5.Open "SELECT nz(Sum(((([tblKalkMakroSub]![Menge]*[Zeitaufwand])*[tblKalkBaugruppeSub]![menge])*[tblKalkFunktionseinheitSub]![menge])*[tblKalkKalkulationErstSub]![Menge]),0) AS GesZeit FROM (tblKalkKalkulationErstSub INNER JOIN (tblKalkFunktionseinheitSub INNER JOIN tblKalkFunktionseinheitHaupt ON tblKalkFunktionseinheitSub.FIdNr = tblKalkFunktionseinheitHaupt.id) ON tblKalkKalkulationErstSub.Mnemonic = tblKalkFunktionseinheitHaupt.FKurztext) INNER JOIN ((((tblKalkMakroSub INNER JOIN tblArtikelDaten ON tblKalkMakroSub.ArtikelNr = tblArtikelDaten.ArtikelNr) INNER JOIN tblKalkMakroHaupt ON tblKalkMakroSub.MIdNr = tblKalkMakroHaupt.id) INNER JOIN tblKalkBaugruppeSub ON tblKalkMakroHaupt.MKurztext = tblKalkBaugruppeSub.Mnemonic) INNER JOIN tblKalkBaugruppeHaupt ON tblKalkBaugruppeSub.BIdNr = tblKalkBaugruppeHaupt.id) ON tblKalkFunktionseinheitSub.Mnemonic = tblKalkBaugruppeHaupt.BKurztext GROUP BY tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt " _
            & ", tblKalkKalkulationErstSub.SchaltschrankNr HAVING (((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    rst6.Open "SELECT nz(Sum(((([Zeitaufwand])*[tblKalkBaugruppeSub]![menge])*[tblKalkFunktionseinheitSub]![menge])*[tblKalkKalkulationErstSub]![Menge]),0) AS GesZeit FROM ((tblKalkKalkulationErstSub INNER JOIN (tblKalkFunktionseinheitSub INNER JOIN tblKalkFunktionseinheitHaupt ON tblKalkFunktionseinheitSub.FIdNr = tblKalkFunktionseinheitHaupt.id) ON tblKalkKalkulationErstSub.Mnemonic = tblKalkFunktionseinheitHaupt.FKurztext) INNER JOIN (tblKalkBaugruppeSub INNER JOIN tblKalkBaugruppeHaupt ON tblKalkBaugruppeSub.BIdNr = tblKalkBaugruppeHaupt.id) ON tblKalkFunktionseinheitSub.Mnemonic = tblKalkBaugruppeHaupt.BKurztext) INNER JOIN tblArtikelDaten ON tblKalkBaugruppeSub.ArtikelNr = tblArtikelDaten.ArtikelNr GROUP BY tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt, tblKalkKalkulationErstSub.SchaltschrankNr " _
            & "HAVING (((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
   
    rst7.Open "SELECT nz(Sum((([tblKalkMakroSub]![Menge]*[Zeitaufwand]))*[tblKalkFunktionseinheitSub]![menge]*[tblKalkKalkulationErstSub]![Menge]),0) AS GesZeit FROM (tblKalkKalkulationErstSub INNER JOIN (tblKalkFunktionseinheitSub INNER JOIN tblKalkFunktionseinheitHaupt ON tblKalkFunktionseinheitSub.FIdNr = tblKalkFunktionseinheitHaupt.id) ON tblKalkKalkulationErstSub.Mnemonic = tblKalkFunktionseinheitHaupt.FKurztext) INNER JOIN ((tblKalkMakroSub INNER JOIN tblArtikelDaten ON tblKalkMakroSub.ArtikelNr = tblArtikelDaten.ArtikelNr) INNER JOIN tblKalkMakroHaupt ON tblKalkMakroSub.MIdNr = tblKalkMakroHaupt.id) ON tblKalkFunktionseinheitSub.Mnemonic = tblKalkMakroHaupt.MKurztext GROUP BY tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt, tblKalkKalkulationErstSub.SchaltschrankNr HAVING (((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0)); ", CurrentProject.Connection, adOpenKeyset, adLockOptimistic

    rst8.Open "SELECT nz(Sum(([Zeitaufwand]*[tblKalkFunktionseinheitSub]![menge])*[tblKalkKalkulationErstSub]![Menge]),0) AS GesZeit FROM (tblKalkKalkulationErstSub INNER JOIN (tblKalkFunktionseinheitSub INNER JOIN tblKalkFunktionseinheitHaupt ON tblKalkFunktionseinheitSub.FIdNr = tblKalkFunktionseinheitHaupt.id) ON tblKalkKalkulationErstSub.Mnemonic = tblKalkFunktionseinheitHaupt.FKurztext) INNER JOIN tblArtikelDaten ON tblKalkFunktionseinheitSub.ArtikelNr = tblArtikelDaten.ArtikelNr GROUP BY tblKalkKalkulationErstSub.KIdNr, tblKalkKalkulationErstSub.PosAkt, tblKalkKalkulationErstSub.SchaltschrankNr HAVING (((tblKalkKalkulationErstSub.KIdNr)=" & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ") AND ((tblKalkKalkulationErstSub.PosAkt)=0));", CurrentProject.Connection, adOpenKeyset, adLockOptimistic

   
For i = 1 To 8
    rstAuslPosSSNr.Open "Select * from tblKalkAuftPosSSNr", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    If Not rst(i).BOF Then
        rst(i).MoveFirst
        Do Until rst(i).EOF
                With rstAuslPosSSNr
                .AddNew
                ![Erfassungswert] = "GesZeit"
                ![Geswert] = Nz(rst(i)!GesZeit, 0)
                ![SSNR] = rst(i)!SchaltschrankNr
                .Update
                End With
            rst(i).MoveNext
        Loop
    End If
Next i
   
rstAuslPosSSNr.Close




Frank82
 

Re: Variable Recordset-Definition

Beitragvon Frank82 » 17. Sep 2021, 09:53

Vielen Dank für Eure Hilfe.

Habe den Fehler gefunden.
Die Lösung von MMarkus habe ich umgesetzt, danke nochmal.

Gruß Frank
Frank82
 

Re: Variable Recordset-Definition

Beitragvon Bitsqueezer » 17. Sep 2021, 10:17

Hallo Frank,

Du liebst es, völlig unwartbaren Code zu schreiben, oder? Ein Bandwurm-SELECT, noch dazu in nur EINER Zeile, ohne Zeilenfortführung? Ich vermute, Du hast einen 37:9-Curved-180°-Monitor .....?

An diesem Ausschnitt mangelt es bereits an einigen Grundlagen...

Fangen wir mal mit dem ersten SELECT an.

In eine lesbare Form gebracht, sähe das so aus:
Code: Alles auswählen
SELECT nz(Sum([tblKalkKalkulationErstSub] ! [Menge] * nz([Zeitaufwand], 0)), 0) AS GesZeit
   ,tblKalkKalkulationErstSub.SchaltschrankNr
FROM tblKalkKalkulationErstSub
INNER JOIN tblArtikelDaten ON tblKalkKalkulationErstSub.ArtikelNr = tblArtikelDaten.ArtikelNr
GROUP BY tblKalkKalkulationErstSub.PosAkt
   ,tblKalkKalkulationErstSub.KIdNr
   ,tblKalkKalkulationErstSub.Stat
   ,tblKalkKalkulationErstSub.SchaltschrankNr
HAVING (
      ((tblKalkKalkulationErstSub.PosAkt) = 0)
      AND ((tblKalkKalkulationErstSub.KIdNr) = " & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ")
      AND ((tblKalkKalkulationErstSub.Stat) = 0)
      );

Wobei ich hier den ID-Teil, der nicht zu SQL gehört, noch dringelassen habe.

1.: Keine Aliase verwendet

Einfach mal nachschlagen, was Tabellenaliase sind, schon verkürzt sich der Monsterstring auf:

Code: Alles auswählen
SELECT nz(Sum([KKES] ! [Menge] * nz([Zeitaufwand], 0)), 0) AS GesZeit
   ,KKES.SchaltschrankNr
FROM tblKalkKalkulationErstSub AS KKES
INNER JOIN tblArtikelDaten AS AD
ON KKES.ArtikelNr = AD.ArtikelNr
GROUP BY KKES.PosAkt
   ,KKES.KIdNr
   ,KKES.Stat
   ,KKES.SchaltschrankNr
HAVING (
      ((KKES.PosAkt) = 0)
      AND ((KKES.KIdNr) = " & [Forms]![FrmKalkKalkulationErstHaupt]![ID] & ")
      AND ((KKES.Stat) = 0)
      );


2. Felder ohne Qualifikation
Auch wieder Alias-Thema, nur diesmal für Felder.
Was ist "Zeitaufwand"? Ohne Tabellenanalyse kann man das nicht herausfinden. Hier gehört entweder "KKES." oder "AD." rein.

3. WHERE statt HAVING
HAVING wird ausschließlich eingesetzt, um Ergebnisse von Aggregaten zu filtern. Also etwa "HAVING SUM(x) = 100".
Alles andere gehört in WHERE.
HAVING kann keine Indizes verwenden.

Wenn man jetzt mal konsequent die SELECTs anschaut, und was Du davon brauchst, geht es am Ende um:
GesZeit/SchaltschrankNr

Wenn Du also jetzt alle SELECTs auf diese beiden Felder reduzierst (denn das GROUP BY funktioniert genauso, auch wenn die gruppierten Felder nicht im SELECT-Teil aufgeführt sind), kannst Du alle SELECTs in EINE UNION ALL-Abfrage schreiben.

Code: Alles auswählen
SELECT ... AS GesZeit, KKES.SchaltschrankNr
FROM ...
...

UNION ALL

SELECT ... AS GesZeit, KKES.SchaltschrankNr
FROM ...
...

usw.


Den Teil "[Forms]![FrmKalkKalkulationErstHaupt]![ID]" ersetzt Du einfach mit einem Parameter in einer gespeicherten Abfrage, die Du per QueryDefs ausführen kannst (und dann auch kein ADO dazu brauchst).

Dann kannst Du den ganzen Monstercode in eine gespeicherte Abfrage überführen, dann die QueryDef dazu holen, den Parameter befüllen und ausführen. Im Ergebnis hast Du EIN Lese-Recordset, das Du dann zum Schreiben des zweiten verwenden könntest.

Oder man denkt konsequent in SQL und erstellt auch gleich eine UPDATE-Abfrage mit Parameter, die als Quelle diese Abfrage verwendet. Theoretisch geht es auch in einer Abfrage, ist aber in Access SQL dann etwas unübersichtlich.

Wenn Du dann die UPDATE-Abfrage per QueryDef/Parameter aufrufst, beschränkt sich das ganze auf wenige Codezeilen und ist außerdem auch noch performant.

Ich möchte lieber gar nicht wissen, wie es zu "tblKalkKalkulationErstSub" gekommen ist, sowie den anderen Namen...das sieht wieder nach Temporärtabellen aus, oder nach einer schrägen Namensgebung.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8462
Registriert: 21. Jun 2007, 12:17

Re: Variable Recordset-Definition

Beitragvon Frank82 » 17. Sep 2021, 10:56

Hallo Bitsqueezer,

danke Dir.
Ich freue mich, wenn ich durch solche Sachen jedes mal dazu lernen kann, um es das nächste Mal besser zu machen.

Ich muss zugeben, zur Select Anweisung ohne Zeilenfortführung - hier war ich etwas sehr faul,
weil ich das nur schnell testen wollte. (der Curved fehlt mir, aber die vier Monitore gleichen es aus)

Werde mir die Alias-Definitionen mal ansehen und versuche es dann, sie umzusetzen.

Zur Namensgebung:
Es sind keine temporären Tabellen.
Ich arbeite lieber mit etwas aussagekräftigeren Tabellennamen als mit Abkürzungen.

Es macht den Code recht umfangreich, ist aber, so finde ich, leichter nachvollziehbar.

Danke Dir.
Gruß Frank
Frank82
 

OT: Array und Datenfeld

Beitragvon knobbi38 » 17. Sep 2021, 11:53

@mmarkus:
dim rst(7) as ADODB.Recordset

Das ist in Wirklichkeit kein Array, sondern ein Datenfeld. Ist jetzt aber nicht relevant.
Datenfeld ist nur weit schneller wie ein Array.

Wo ist denn deiner Meinung nach ein Unterschied zwischen einem Array und einem Datenfeld?
Bis jetzt bin ich immer davon ausgegangen, daß ich mit Dim a(5) as .... ein eindimensionales Array definiere, analog
https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/declaring-arrays

Täte mich jetzt mal wirklich interessieren.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 3444
Registriert: 02. Jul 2015, 14:23

Re: Variable Recordset-Definition

Beitragvon dera1 » 17. Sep 2021, 12:01

Hallo,

das ein Array ein Datenfeld ist, darf aber nicht öffentlich Public werden :D

schönes Wochenende
dera1
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 422
Registriert: 07. Jul 2014, 10:58

Re: OT: Array und Datenfeld

Beitragvon mmarkus » 17. Sep 2021, 12:40

knobbi38 hat geschrieben:Wo ist denn deiner Meinung nach ein Unterschied zwischen einem Array und einem Datenfeld?


Bei einem Datenfeld sind die Daten am Stack.
Es gibt keinen Pointer.

Bei einem Array hast du am Stack nur einen Pointer der dann erstmal auf die SafeArray Struktur zeigt.
Die Struktur zeigt dann auf die Daten die sich im Heap befinden.

Daher der "imense" Laufzeitunterschied beim Zugreifen auf die Daten.
Übrigens obwohl vba vergleichsweise langsam ist, kann man via Adresse viel schneller auf die Daten eines Arrays zugreifen,
wie über die Array Methoden.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2141
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: Variable Recordset-Definition

Beitragvon Bitsqueezer » 17. Sep 2021, 12:58

Hallo Frank,

Ich arbeite lieber mit etwas aussagekräftigeren Tabellennamen als mit Abkürzungen.


Da bin ich voll bei Dir, allerdings was sagt "tblKalkKalkulationErstSub" über dessen Inhalt aus? "tblArtikelDaten" ist eine deutliche Namensgebung, wobei "Daten" schon überflüssig ist, denn in allen Tabellen liegen Daten.. das verlängert den Namen nur unnötig und ergibt keine Informationen.

Aber auch Namen wie "tblKalkMakroHaupt", "tblKalkBaugruppeHaupt" oder "FrmKalkKalkulationErstHaupt" - es sei denn, Du verwaltest eine Datenbank über Kalkablagerungen...:)

Ich würde hier anhand der Namensgebung vermuten, daß es bereits grundsätzliche DB-Designprobleme gibt, von der Namensgebung abgesehen.

Beim Stichwort "Baugruppe" denke ich an hierarchische Daten und da wäre auf jeden Fall ein DB-Server zu empfehlen, denn etwa SQL Server kann mit rekursiven Abfragen Hierarchien von Baugruppen in einer einzigen Abfrage problemlos darstellen. Access kann das nicht.

Aber wer heute immer noch Access als Backend für geschäftliche Zwecke einsetzt, der hat irgendwie die Zeit verpaßt...und so einiges andere.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 8462
Registriert: 21. Jun 2007, 12:17

Re: Variable Recordset-Definition

Beitragvon Gast » 17. Sep 2021, 21:47

Wenn ich mir die Beiträge vom 7. Sep 2021, 09:34 und 9:38 anschaue, dann bin ich meilenweit entfernt von Übersicht - unabhängig von der Berechtigung eines SQL Servers als Backend.

Ich persönlich empfinde es als Zeitverschwendung, wenn ich mir den Sinn des Tuns aus Codes und Abläufen, die nicht oder ggf . irgendwie irgendwann "funktionieren", herauslesen soll. Warum ist ein Fragesteller selbstbewusst der Meinung, sein eingeschrittener Weg sei der einzig mögliche und zielführende? Von Effizienz mal ganz zu schweigen.

Ein "Auskenner" wird bekannte(!) Ausgangssituation und Zielvorstellung anschauen und ggf. aus der Erfahrungssituation ganz andere Wege einschagen wie "vorgedacht", mit der Folge, dass sich manche Probleme gar nicht erst einstellen.
Gast
 

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste