¿Cómo obtener registros por intervalos?

Cómo se pueden obtener registros ordenados por algún campo con inicio variable y final variable, explico:

Inicio=1 ---> desde la primera fila, pero puede ser 2 o 3 etc.

Final=14 ---> hasta la fila 14 u otra no mayor a la cantidad de registros de la tabla

Para más claridad les dejo estas imágenes

Tabla ordenada por empleado

Necesito hacer una consulta que me devuelva únicamente los registros resaltados en amarillo, es decir,

Nuevamente estoy muy agradecida por la solución que me puedan dar.

2 respuestas

Respuesta
1

Se puede hacer de 2 formas

1. Forma con una consulta desde la cuadricula de Access

A - Seleccione de la cinta, Crear-->Diseño de consulta

Le aparece un formulario "Mostrar Tabla", haga clic en "Cerrar"

B - Haga clic con el botón derecho del mouse y clic en "Vista SQL"

c- Pegue el siguiente script

SELECT subquery.idempleado, subquery.empleado, subquery.sueldo
FROM (SELECT (SELECT COUNT(*) FROM  tblempleados AS t2 WHERE t2.empleado <= tblempleados.empleado) AS fila_num, * FROM tblempleados)  AS subquery
WHERE (((([fila_num]-1) Mod 2)=0) AND ((subquery.fila_num)>=1 And (subquery.fila_num)<=14))
ORDER BY subquery. Empleado;

Haga clic en la parte superior izquierda y clic en "Vista diseño". Obtendrá algo como.

RESULTADO DE LA CONSULTA

Puede cambiar el número de filas en la columna fila_num pero UNICAMENTE el segundo condicional, es decir <=14 puede cambiar a 10, 12 etc. La consulta tiene una pega, si cambia el primer condicional >=1 a 2 o 3 inicia es desde la fila siguiente. Si alguien lo puede solucionar le agradezco hacerlo saber.

2. Forma con código VBA y SQL

Observe el siguiente formulario

Ahora cambio fila final por 10 y hago clic en el botón Consultar. Obtengo:

CÓDIGO DEL BOTÓN CONSULTAR

Private Sub btnConsultar_Click()
   Dim strSQL As String
   Dim cantreg As Long
   cantreg = DCount("*", "tblempleados")
  If Me.cboIntervalo > 0 Then
   If IsNumeric(Me.ctlInicio) And IsNumeric(Me.ctlFinal) And Not IsNull(Me.cboIntervalo) Then
    'Vefico que el final no supere la cantidad de registros
     If cantreg < Me.ctlFinal Then
        MsgBox "El final supera los " & cantreg & " registros de la tabla", vbInformation, "Error.."
        Me.ctlFinal.SetFocus
        Exit Sub
     End If
    strSQL = "SELECT subquery.idempleado" & vbCrLf
    strSQL = strSQL & "           , subquery.empleado" & vbCrLf
    strSQL = strSQL & "           , subquery.sueldo" & vbCrLf
    strSQL = strSQL & "        FROM (SELECT (SELECT COUNT(*) " & vbCrLf
    strSQL = strSQL & "        FROM  tblempleados AS t2 " & vbCrLf
    strSQL = strSQL & "       WHERE t2.empleado <= tblempleados.empleado) AS fila_num" & vbCrLf
    strSQL = strSQL & "           , * " & vbCrLf
    strSQL = strSQL & "        FROM tblempleados)  AS subquery" & vbCrLf
    strSQL = strSQL & "       WHERE (((([fila_num]-1) Mod " & Me.cboIntervalo & ")=0) " & vbCrLf
    strSQL = strSQL & "         AND ((subquery.fila_num)>=" & Me.ctlInicio & vbCrLf
    strSQL = strSQL & "         AND (subquery.fila_num)<=" & Me.ctlFinal & "))" & vbCrLf
    strSQL = strSQL & "    ORDER BY subquery.empleado;"
   End If
  Else
    Me.ctlInicio = Null
    Me.ctlFinal = Null
    strSQL = "SELECT idempleado,empleado,sueldo FROM tblempleados ORDER BY empleado;"
  End If
    Me.lstEmpleados.RowSource = strSQL
End Sub

Martha, si quiere el ejemplo lo puede solicitar a [email protected] Cómo usted utiliza en algunos casos PostgreSQL, le dejo el script

SELECT idempleado,empleado,sueldo
FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY empleado) as row_num
  FROM tblempleados
) as subquery
WHERE MOD(row_num, 2) = 1 AND row_num >= 1  AND row_num <= 14
ORDER BY row_num;

¡Gracias! por tu colaboración es lo que necesitaba, no tenía idea cómo se hacía la consulta, toda vez que no es fácil. Llama la atención lo sencillo que es en PostgreSQL, pero por ahora no lo necesito. Gracias nuevamente.

Respuesta

No sé si en las consultas se puede. A mi, personalmente no me gustan. Las veo muy limitadas.

Si tengo el formulario Empleados que mostrabas en la otra pregunta y creo una tabla Aux con los mismo campos( el IdEmpleado no lo pongo como clave)

Cuando pulso el botón me deja la tabla Aux como

El código del botón es

Private Sub Comando9_Click()
DoCmd.SetWarnings False
DoCmd.GoToRecord , , acFirst
Dim i As Integer
For i = 0 To Form.Recordset.RecordCount Step 2
DoCmd. RunSQL "insert into aux(idseccion, idempleado, empleado, sueldo)values(idseccion, idempleado, empleado, sueldo)"
DoCmd.GoToRecord , , , 2
If IsNull([Empleado]) Then
Exit Sub
End If
Next
End Sub

¡Gracias! Julián, pero tu ejemplo no cumple con el objetivo, porque siempre va a tomar todos los registros y lo que necesito que inicie desde determinado registro o fila hasta determinada fila, es decir, por ejemplo, tomar desde el registro HERNA MARIN hasta el registro OLGA MARIN y puede ser en intervalo de 2 o 3 registros. Espero me entienda 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas