Frage : rst.MoveLast, das für immer nimmt!

Hallo war alles,

I unter dem Eindruck, dass recordsets eine schnelle Weise sein sollten, innerhalb der Daten zu bewegen. Die angebrachte Funktion nimmt für immer zum Durchlauf. Sie gehaftet auf rst.MoveLast. Die Tabelle Demand_Check_C hat mehrere Million Aufzeichnungen, aber es dauert eine Stunde, um an die Aufzeichnung 2Mth zu gelangen. Ist dieser Normal?
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
6:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
 ' Geschwindigkeit herauf qry10002 mit Druckfehlern
Allgemeine Funktion GetDemand ()
    Schwache dbs als Datenbank
    Schwaches qdf als DAO.QueryDef
    Schwaches rst als DAO.Recordset
    Schwaches sInsert als Schnur, sSelect als Schnur, sFrom als Schnur, sWhere als Schnur, sSQL als Schnur
    Schwaches lRecordCount als lang: lRecordCount = 0
    Schwaches lCounter als lang
    
    DoCmd.SetWarnings falsch
    
    DoCmd.RunSQL „LÖSCHUNG * vom tblDemand“

    'sInsert = „EINSATZ IN tblDemand“
    sSelect = „AUSERWÄHLTES LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR, LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR, FALL, WENN SEN_BGN_WK_NBR<=SEN_END_WK_NBR DANN ENDE SEN_END_WK_NBR-SEN_BGN_WK_NBR+1 SONST 52-SEN_BGN_WK_NBR+SEN_END_WK_NBR+1 ALS "", das verkauft Wochen "",“ u. _
    „LOWES.T2355_SEN_PRL.WK1_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK2_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK3_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK4_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK5_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK6_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK7_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK8_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK9_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK10_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK11_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK12_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK13_BAS_IND_FCT ALS "" Q1 Summe BIS "",“ u. _
    „LOWES.T2355_SEN_PRL.WK14_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK15_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK16_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK17_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK18_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK19_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK20_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK21_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK22_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK23_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK24_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK25_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK26_BAS_IND_FCT ALS "" Q2 Summe BIS "",“ u. _
    „LOWES.T2355_SEN_PRL.WK27_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK28_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK29_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK30_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK31_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK32_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK33_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK34_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK35_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK36_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK37_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK38_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK39_BAS_IND_FCT ALS "" Q3 Summe BIS "",“ u. _
    „LOWES.T2355_SEN_PRL.WK40_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK41_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK42_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK43_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK44_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK45_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK46_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK47_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK48_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK49_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK50_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK51_BAS_IND_FCT+LOWES.T2355_SEN_PRL.WK52_BAS_IND_FCT ALS "" Q4 Summe BIS """
    sFrom = „VON (INNERE LOWES.T2354_ITM_LCT_PRL VERBINDEN LOWES.T2355_SEN_PRL AUF LOWES.T2354_ITM_LCT_PRL.T2355_PRL_TAG_ID = LOWES.T2355_SEN_PRL.T2355_PRL_TAG_ID), INNEREM VERBINDEN LOWES.T2398_IFM_FRC_VAL AN (LOWES.T2354_ITM_LCT_PRL.T063_LCT_NBR = LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR) UND (LOWES.T2354_ITM_LCT_PRL.T024_ITM_NBR = LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR)“
    sWhere = „, WO (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR = -1 UND LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = -1)“

    Dbs = CurrentDb einstellen ()
    Rst = dbs.OpenRecordset („AUSERWÄHLTES T024_ITM_NBR, T063_LCT_NBR einstellen VON Demand_Check_C; ")

    Wenn rst.EOF dann
        lRecordCount = 0
    Sonst
        rst.MoveLast
        lRecordCount = rst.RecordCount
    Beenden wenn

    rst.MoveFirst

    Tun während nicht rst.EOF

        lCounter = lCounter + 1
        sWhere = sWhere u. „ODER (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR =“ u. rst („T024_ITM_NBR“) u.“ UND LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = „u. rst („T063_LCT_NBR“) u. ") „

        Wenn lCounter > 60 oder rst.AbsolutePosition = lRecordCount - 1 dann
            sSQL = sInsert u. sSelect u. sFrom u. sWhere 'u. „MIT UR“
            Qdf = CurrentDb () .QueryDefs („qryPassThrough“) einstellen
            qdf.SQL = sSQL

            DoCmd.OpenQuery „qryDemand“

            'DoCmd.RunSQL sSQL
            lCounter = 0
            sWhere = „WO (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR = -1 UND LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = -1)“ '- 1 = Attrappe # 1. beschäftigen ODER
        Beenden wenn

        rst.MoveNext

    Schleife
    
    DoCmd.SetWarnings zutreffend
    
    rst. Abschluss

Enden-Funktion

Antwort : rst.MoveLast, das für immer nimmt!

Ja scheint dieses normal.

Es bewegt nicht auf die letzte Aufzeichnung, es bevölkert alle Aufzeichnungen zu dauert, in einem dynamischen recordset (Sie können jede mögliche Aufzeichnung möglicherweise redigieren und sie sollte dynamisch stattfinden irgendwie redigieren reflektieren!). Sie ist nicht einfach, aber es ist unbrauchbar.

Wenn Demand_Check_C eine Zugangstabelle ist, können Sie sie im Tabellenmodus öffnen und Sie können die letzte Aufzeichnung (aber eine Tabelle sofort lesen, hat nicht einen Rekordinh.). Wenn es nicht ist, können Sie dbForwardOnly pflegen, um Sachen zu beschleunigen, aber, da der Name andeutet, können Sie nicht zurück umziehen.

Im Allgemeinen konnte Ihre Funktion Dutzend Stunden lang, es sehr gut laufen ist nicht frei, was sie tut, aber, wenn Sie bei der Normalisierung einer Tabellenstruktur sind, können einige Betriebe diese Art der Zeit nehmen. Aber Sie benötigen nicht den Rekordzählimpuls.

Eine Tabelleart oder ein Vorwärtsnur recordset benutzen, die 60 Aufzeichnungsklumpen benutzen (noch erbringend im Auftrag von 100 ' 000 nicht trivialen Einsatzfragen, um zu analysieren, optimieren und Durchlauf), und den inneren Abschnitt außerhalb der Schleife kopieren, um die Aufzeichnungen less-than-60 vom Ende zu erhalten.

Den Gesamtrekordzählimpuls oder die absoluten Positionen nicht verwenden.

(°v°)
Weitere Lösungen  
 
programming4us programming4us