Cuestión : ¡rst.MoveLast que toma por siempre!

Hola todo,

I era bajo impresión que los recordsets fueron supuestos para ser una manera rápida de moverse alrededor dentro de datos. La función atada está llevando por siempre el funcionamiento. Se ha pegado en rst.MoveLast. La tabla Demand_Check_C tiene varios millón de expedientes pero está tardando una hora para conseguir al expediente 2Mth. ¿Es este normal?
class= > " claro " del
> del " codeSnippet " del class= del
class= " lineNumbers " del
class= del
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= " del
 ' velocidad encima de qry10002 con literales
Función pública GetDemand ()
    Dbs déviles como base de datos
    Qdf dévil como DAO.QueryDef
    Rst dévil como DAO.Recordset
    sInsert dévil como secuencia, sSelect como secuencia, sFrom como secuencia, sWhere como secuencia, sSQL como secuencia
    lRecordCount dévil como de largo: lRecordCount = 0
    lCounter dévil como de largo
    
    DoCmd.SetWarnings falso
    
    DoCmd.RunSQL “CANCELACIÓN * del tblDemand”

    'sInsert = “PARTE MOVIBLE EN tblDemand”
    sSelect = “LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR SELECTO, LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR, CASO CUANDO EXTREMO OTRO SEN_END_WK_NBR-SEN_BGN_WK_NBR+1 52-SEN_BGN_WK_NBR+SEN_END_WK_NBR+1 de SEN_BGN_WK_NBR<=SEN_END_WK_NBR ENTONCES COMO "" que vende el "" de las semanas,” y el _
    “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 suma del "" Q1 de "" del BIs,” y de _
    “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 suma del "" Q2 de "" del BIs,” y de _
    “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 suma del "" Q3 de "" del BIs,” y de _
    “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 suma del "" Q4 de """ del BIs
    el sFrom = “(LOWES.T2354_ITM_LCT_PRL INTERNOS ENSAMBLAN LOWES.T2355_SEN_PRL EN LOWES.T2354_ITM_LCT_PRL.T2355_PRL_TAG_ID = LOWES.T2355_SEN_PRL.T2355_PRL_TAG_ID) DE INTERNO ENSAMBLA LOWES.T2398_IFM_FRC_VAL ENCENDIDO (LOWES.T2354_ITM_LCT_PRL.T063_LCT_NBR = LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR) Y (LOWES.T2354_ITM_LCT_PRL.T024_ITM_NBR = LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR)”
    sWhere = “DONDE (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR = -1 Y LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = -1)”

    Fijar los dbs = CurrentDb ()
    Fijar el rst = dbs.OpenRecordset (“T024_ITM_NBR SELECTO, T063_LCT_NBR de Demand_Check_C; ")

    Si rst.EOF entonces
        lRecordCount = 0
    
        rst.MoveLast
        lRecordCount = rst.RecordCount
    Terminar si

    rst.MoveFirst

    Hacer mientras que no rst.EOF

        lCounter = lCounter + 1
        sWhere = sWhere y “O (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR =” y rst (“T024_ITM_NBR”) y” Y LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = “y rst (“T063_LCT_NBR”) y ") “

        Si lCounter > 60 o rst.AbsolutePosition = lRecordCount - 1 entonces
            sSQL = sInsert y sSelect y sFrom y sWhere 'y “CON UR”
            Fijar el qdf = CurrentDb () .QueryDefs (el “qryPassThrough”)
            qdf.SQL = sSQL

            DoCmd.OpenQuery “qryDemand”

            'sSQL de DoCmd.RunSQL
            lCounter = 0
            sWhere = “DONDE (LOWES.T2398_IFM_FRC_VAL.T024_ITM_NBR = -1 Y LOWES.T2398_IFM_FRC_VAL.T063_LCT_NBR = -1)” '- 1 = maniquí # tratar de 1r O
        Terminar si

        rst.MoveNext

    Lazo
    
    DoCmd.SetWarnings verdad
    
    rst. Cierre

Función del final
class= del

Respuesta : ¡rst.MoveLast que toma por siempre!

Sí, esto parece normal.

No se está moviendo al expediente pasado, él está poblando todos los expedientes a dura, en un recordset dinámico (usted puede potencialmente corregir cualquier expediente y debe reflejar corregir ocurrir dinámicamente!). No es simple, sino que es inútil.

Si Demand_Check_C es una tabla del acceso, usted puede abrirla en modo de la tabla y usted puede leer el expediente pasado inmediatamente (solamente una tabla no tiene un cont de registro). Si no es, usted puede utilizar dbForwardOnly para acelerar cosas, pero, como el nombre implica, usted no puede mover hacia atrás.

Básicamente, su función pudo funcionar muy bien para las docena horas, él no está clara qué hace, pero si usted está en curso de normalización de una estructura de la tabla, algunas operaciones pueden tomar esa clase de tiempo. Pero usted no necesita la cuenta de registro.

Utilizar un tabla-tipo o solamente un recordset delantero, utilizar los 60 pedazos de los expedientes (todavía que rinden en la orden de 100 ' 000 preguntas no triviales del parte movible para analizar, optimizar, y funcionamiento), y copiar la sección interna fuera del lazo para conseguir los expedientes less-than-60 del extremo.

No utilizar la cuenta de registro total o las posiciones absolutas.

(°v°)
Otras soluciones  
 
programming4us programming4us