Variable Recordset-Definition

Antwort erstellen

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :razz: :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :badgrin: :doubt:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Variable Recordset-Definition

Re: OT: Array und Datenfeld

Beitrag von mmarkus » 21. Sep 2021, 06:26

knobbi38 hat geschrieben:Da habe ich starke Zweifel. Datenfeld ist m.M. nach die dt. Übersetzung für "Array".


Hallo Ulrich,
habs mir jetzt im Speicher angesehen.
VBA verwendet tatsächlich in beiden Fällen, das selbe Konstrukt.
Da hab ich mich offensichtlich in der Sprache vertan.

Danke für den Hinweis.

Re: Variable Recordset-Definition

Beitrag von Bitsqueezer » 20. Sep 2021, 15:25

Hallo Frank,

Warum soll kein SQL-Server im Einsatz sein?
Ist er doch! Oder stehe ich auch da auf dem Schlauch!?


Dann ist es doch gut... :lol:

Es war lediglich eine Annahme, da Du nichts zum Backend oder der Datenbank an sich gesagt hast und sehr oft hier Access Backend verwendet wird. Darüber hinaus Deine Recordset-Vorgehensweise nicht gerade an einen versierten SQL-Server-Programmierer denken läßt. Hier kannst Du doch das volle Potential des Servers ausschöpfen, und sei es auch nur durch Verwendung einer Schleife in einer Stored Procedure (was die denkbar schlechteste Lösung wäre, aber immer noch besser als Recordsets!).

Er erleichtert mir einfach die Suche, da die Datebnank aus ca. 200 Tabellen besteht, wobei die Kalkulation auf ca. 30 verschiedene Tabellen zugrreift.
Daher die Kennung Kalk vor den jeweiligen Bezeichnungen.


Kann ich nachvollziehen, ich halte meine Tabellenbezeichnungen aus dem gleichen Grund auch in sortierbare Bezeichnungen gruppiert.

Nur beim Thema "sprechende Namen" sehe ich bei Dir dann "tblKalkKalkulationErstSub" und "tblKalkKalkulationErstHaupt" - und da sehe ich keine sprechenden Namen mehr. Als Obergruppe "Kalk" - OK. Dann ist der eigentliche Tabellenname quasi "KalkulationErstSub" bzw. "KalkulationErstHaupt". Was sollen mir diese Namen nun sagen? Ein sprechender Name ist gegeben, wenn ich als Außenstehender bereits am Namen ablesen kann, was wohl der Inhalt der Tabelle sein wird oder sein könnte. Diese Namen jedoch sagen gar nichts aus. Was ist "erst"? "Zuerst"? "Erstellung"? "Enzyklopädie rabiater Satire-Themen"? Und warum "Haupt" und "Sub"? Warum nicht "Main" und "Sub" oder "Haupt" und "Unter"? Und was ist hier Haupt und was Sub? Boss und Mitarbeiter? Baugruppe und Unterbaugruppe? Und was wird hier kalkuliert - und warum brauche ich dazu zwei Tabellen?

Ich meine, ich will das jetzt gar nicht alles im Detail wissen, aber von sprechenden Namen ist so eine Namensgebung weit entfernt und man fragt sich als außenstehender Leser, ob da wohl das Datenmodell wirklich durchdacht ist.

Gruß

Christian

PS: Wenn Du Dich am Forum anmeldest, schickt Dir das Forum automatisch Benachrichtigungen zu Antworten auf Deine Beiträge..

Re: Variable Recordset-Definition

Beitrag von Frank82 » 20. Sep 2021, 15:16

Hallo Gast,

Gast hat geschrieben: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.


Was meinst Du?
Ich weiß, dass der Code mit Sicherheit besser und sauberer zu erstellen ist, dafür lerne ich auch gerne dazu!
Aber irgendwo muss ich anfangen! (Denke ich jedenfalls)

Außerdem ist ein "funktionieren" relativ, sofern man den kompletten Background eines Projektes nicht kennt.
Wenn immer alle Ausgangssituationen bekannt wären und Gedanken zu einem Projekt nicht stückchenweise ankämen, wäre auch für mich die Situation, Planung und Erstellung um einiges einfacher.
Aber es gibt Dinge, die kann ich nicht ändern.

Und warum selbstbewusst? ("Als Fragesteller") - Eher hilfesuchend und dankbar.

Gruß Frank

Re: Variable Recordset-Definition

Beitrag von Frank82 » 20. Sep 2021, 15:06

Hallo Bitsqueezer,

sorry für die späte Meldung.
Einige Tabellennamen musste ich leider aus einem bestehenden System übernehmen.

Die tblKalk resultieren aus verschiedenen Ebenen einer Kalkulation. (daher die entsprechende Bezeichnung)
Er erleichtert mir einfach die Suche, da die Datebnank aus ca. 200 Tabellen besteht, wobei die Kalkulation auf ca. 30 verschiedene Tabellen zugrreift.
Daher die Kennung Kalk vor den jeweiligen Bezeichnungen.

Warum soll kein SQL-Server im Einsatz sein?
Ist er doch! Oder stehe ich auch da auf dem Schlauch!?

Gruß Frank

Re: OT: Array und Datenfeld

Beitrag von knobbi38 » 20. Sep 2021, 11:41

@mmarkus:
mmarkus hat geschrieben:Bei einem Datenfeld sind die Daten am Stack.
Es gibt keinen Pointer.

Da habe ich starke Zweifel. Datenfeld ist m.M. nach die dt. Übersetzung für "Array". Ich wüßte auch nicht, wie man ein explizit ein "Datenfeld" in VBA definieren könnte.
Joshua hat das mal in diesem Artikel recherchiert und die Internas veröffentlicht:
https://bytecomb.com/vba-internals-array-variables-and-pointers-in-depth/
Meines Wissen werden Arrays in VB6/VBA ausschließlich und immer als SAFEARRAYS angelegt und verwaltet. Kann man auch sehr gut bei Dan Appleman* nachlesen.

Gruß Ulrich

*Dan Appleman's Win32 Api Puzzle Book and Tutorial For Visual Basic Programmers

Re: Variable Recordset-Definition

Beitrag von Gast » 17. Sep 2021, 21:59

Nebenbei: Statt 127 geöffneter Recordsets würde ich eines mit wechselnden Inhalten verwenden. Das Thema Array würde sich in ein Nichts auflösen, Wissenschaft dazu ist eine hübsche Selbstbeschäftigung, hier aber nutzlos. Vorhalten müsste man bei einfacher Überlegung die jeweilige SQL-Anweisung, ggf.nur den Unterschied daraus.
Sowie wie schon angesprochen: Statt Schleifen durch ein oder gar mehrere Recordsets würden sich sehr wahrscheinlich richtige Abfragen oder gar EINE richtige Abfrage anbieten.

Re: Variable Recordset-Definition

Beitrag von 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.

Re: Variable Recordset-Definition

Beitrag von 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

Re: OT: Array und Datenfeld

Beitrag von 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.

Re: Variable Recordset-Definition

Beitrag von dera1 » 17. Sep 2021, 12:01

Hallo,

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

schönes Wochenende

OT: Array und Datenfeld

Beitrag von 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

Re: Variable Recordset-Definition

Beitrag von 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

Re: Variable Recordset-Definition

Beitrag von 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

Re: Variable Recordset-Definition

Beitrag von 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

Re: Variable Recordset-Definition

Beitrag von 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





Nach oben

cron