Pergunta : rst.MoveLast que toma para sempre!

Olá! tudo,

I era sob a impressão que os recordsets estiveram supor para ser uma maneira rápida de se mover ao redor dentro dos dados. A função unida está tomando para sempre ao funcionamento. Furou em rst.MoveLast. A tabela Demand_Check_C tem diversos milhão registros mas está tomando uma hora para começ ao registro 2Mth. É este normal?
class= > " desobstruído " do
> do " codeSnippet " do class= do
class= " lineNumbers " do
class= do
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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
id= " codeSnippet767453 " class= " do
 ' velocidade acima de qry10002 com literals
Função pública GetDemand ()
    Dbs não ofuscantes como a base de dados
    Qdf não ofuscante como DAO.QueryDef
    Rst não ofuscante como DAO.Recordset
    sInsert não ofuscante como a corda, sSelect como a corda, sFrom como a corda, sWhere como a corda, sSQL como a corda
    lRecordCount não ofuscante como por muito tempo: lRecordCount = 0
    lCounter não ofuscante como por muito tempo
    
    DoCmd.SetWarnings falso
    
    DoCmd.RunSQL “SUPRESSÃO * do tblDemand”

    'sInsert = “INSERÇÃO no tblDemand”
    sSelect = “LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR SELETO, LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR, CASO QUANDO EXTREMIDADE SEN_END_WK_NBR-SEN_BGN_WK_NBR+1 52-SEN_BGN_WK_NBR+SEN_END_WK_NBR+1 OUTRA de SEN_BGN_WK_NBR<=SEN_END_WK_NBR ENTÃO COMO o "" que vende o "" das semanas,” & o _
    “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 COMO a soma do "" Q1 do "" do BIs,” & do _
    “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 COMO a soma do "" Q2 do "" do BIs,” & do _
    “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 COMO a soma do "" Q3 do "" do BIs,” & do _
    “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 COMO a soma do "" Q4 do """ do BIs
    o sFrom = “(LOWES.T2354_ITM_LCT_PRL INTERNOS SE JUNTAM A LOWES.T2355_SEN_PRL EM LOWES.T2354_ITM_LCT_PRL.T2355_PRL_TAG_ID = LOWES.T2355_SEN_PRL.T2355_PRL_TAG_ID) DE INTERNO JUNTA-SE A LOWES.T2398_IFM_FRC_VAL SOBRE (LOWES.T2354_ITM_LCT_PRL.T063_LCT_NBR = LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR) E (LOWES.T2354_ITM_LCT_PRL.T024_ITM_NBR = LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR)”
    sWhere = “ONDE (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR = -1 E LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = -1)”

    Ajustar dbs = CurrentDb ()
    Ajustar o rst = o dbs.OpenRecordset (“T024_ITM_NBR SELETO, T063_LCT_NBR de Demand_Check_C; ")

    Se rst.EOF então
        lRecordCount = 0
    Mais
        rst.MoveLast
        lRecordCount = rst.RecordCount
    Terminar se

    rst.MoveFirst

    Fazer quando não rst.EOF

        lCounter = lCounter + 1
        sWhere = sWhere & “OU (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR =” & rst (“T024_ITM_NBR”) &” E LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = “& rst (“T063_LCT_NBR”) & ") “

        Se lCounter > 60 ou rst.AbsolutePosition = lRecordCount - 1 então
            sSQL = sInsert & sSelect & sFrom & sWhere '& “COM UR”
            Ajustar o qdf = o CurrentDb () .QueryDefs (o “qryPassThrough”)
            qdf.SQL = sSQL

            DoCmd.OpenQuery “qryDemand”

            'sSQL de DoCmd.RunSQL
            lCounter = 0
            sWhere = “ONDE (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR = -1 E LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = -1)” '- 1 = manequim # para tratar o ø OU
        Terminar se

        rst.MoveNext

    Laço
    
    DoCmd.SetWarnings verdadeiro
    
    rst. Fim

Função do fim
class= do

Resposta : rst.MoveLast que toma para sempre!

Sim, isto parece normal.

Não se está movendo para o último registro, ele está povoando todos os registros ao dura, em um recordset dinâmico (você pode potencial editar todo o registro e deve refletir a edição da ocorrência dinâmicamente!). Não é simples, mas é inútil.

Se Demand_Check_C é uma tabela do acesso, você pode abri-la na modalidade da tabela e você pode ler o último registro imediatamente (mas uma tabela não tem um cont record). Se não é, você pode usar-se dbForwardOnly para apressar acima coisas, mas, como o nome implica, você não pode mover.

Basicamente, sua função pôde muito jorrar funcionamento para umas dúzia horas, ele não é desobstruída o que faz, mas se você está no processo de normalizar uma estrutura da tabela, algumas operações podem tomar essa sorte do tempo. Mas você não precisa a contagem record.

Usar um tabela-tipo ou somente um recordset para diante, usar os 60 pedaços dos registros (ainda que rendem na ordem de 100 ' 000 perguntas non-trivial da inserção para analisar, aperfeiçoar, e funcionamento), e copiar a seção interna fora do laço para começ os registros less-than-60 da extremidade.

Não usar a contagem record total ou as posições absolutas.

(°v°)
Outras soluções  
 
programming4us programming4us