1. Solución en ACCESS
Pensando que el rango debe ser variable, le preparé la siguiente función
FUNCIÓN EXTRAE_DATOS()
Public Function extrae_datos(filainicial As Long, cantidad As Long)
'Función para extraer registros a partir de una fila hasta otra
'y obtener entres éstas el sueldo mayor
'Elaborado Por:
' EDUARDO PÉREZ FERNÁNDEZ
'Fecha :18/02/2023
On Error GoTo hay_error
Dim strSQl As String
Dim intExtrae As Integer
Dim smaximo As Double
intExtrae = filainicial + cantidad - 1
'Requiere de la función: consecutivo()
'Verifico si existe la tabla
If DCount("[Name]", "MSysObjects", "[Name] = 'temgrupos'") = 1 Then
DoCmd.DeleteObject acTable, "temgrupos"
End If
'Verifico si existe la consulta
If DCount("[Name]", "MSysObjects", "[Name] = 'qryExtraeReg'") = 1 Then
DoCmd.DeleteObject acQuery, "qryExtraeReg"
End If
strSQl = "SELECT tblempleados.idempleado" & vbCrLf
strSQl = strSQl & " , tblempleados.empleado" & vbCrLf
strSQl = strSQl & " , tblempleados.sueldo" & vbCrLf
strSQl = strSQl & " , consecutivo([idempleado]) AS cons INTO temgrupos" & vbCrLf
strSQl = strSQl & " FROM tblempleados" & vbCrLf
strSQl = strSQl & " ORDER BY tblempleados.empleado;"
CurrentDb.Execute strSQl
strSQl = "SELECT temgrupos.idempleado" & vbCrLf
strSQl = strSQl & " , temgrupos.empleado" & vbCrLf
strSQl = strSQl & " , temgrupos.sueldo" & vbCrLf
strSQl = strSQl & " FROM temgrupos" & vbCrLf
strSQl = strSQl & " WHERE temgrupos.cons Between " & filainicial & " AND " & intExtrae & ";"
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = CurrentDb()
Set qdf = db.CreateQueryDef("qryExtraeReg", strSQl)
' Abre la consulta y muéstrala
DoCmd.OpenQuery qdf.Name, acViewNormal
' Libera la memoria
Set qdf = Nothing
Set db = Nothing
If Err.Number = 0 Then
MsgBox "Consulta creada satisfactoriamente", vbInformation, "Le informo"
smaximo = DMax("sueldo", "qryExtraeReg")
MsgBox "El sueldo mayor es " & Format(smaximo, "Currency"), vbInformation, "Sueldo mayor"
DoCmd.Close acQuery, "qryExtraeReg"
End If
hay_error_Exit:
Exit Function
hay_error:
MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
Resume hay_error_Exit
End Function
Utilizo la siguiente función para numerar las filas de la consulta
CÓDIGO FUNCIÓN CONSECUTIVO()
Public Function consecutivo(nDato) As Long
'Numera los registros de una consulta
Static nCONTADOR As Long
Static mcuenta As Integer
If IsNull(nDato) Then 'si nDato es nulo: Iniciamos valor
nCONTADOR = 0
Exit Function
End If
nCONTADOR = nCONTADOR + 1
consecutivo = nCONTADOR
mcuenta = mcuenta + 1
' Si están todos los registros reinicio las varaibles estaticas
If mcuenta >= DCount("*", "tblempleados") Then
nCONTADOR = 0
mcuenta = 0
End If
End Function
Puede llamar la función desde cualquier parte. Ejemplo ventana de inmediato
?extrae_datos(6,5)
Resultado
2. Solución en POSTGRESQL
Se puede hacer con 2 consultas.
Consulta selección de las filas
-- Selecciona los 5 registros que comienzan en la fila número 6
SELECT
Idempleado,
Empleado,
Sueldo
FROM
(
SELECT
Idempleado,
Empleado,
Sueldo,
ROW_NUMBER () OVER (ORDER BY empleado)
FROM
Tblempleados
) x
WHERE
ROW_NUMBER BETWEEN 6 AND 10;
Resultado:
Consulta para obtener el sueldo mayor de las filas elegidas
-- Selecciona los 5 registros que comienzan en la fila número 6 y obtiene el sueldo mayor de estos
SELECT MAX(sueldo) AS mas_alto FROM(SELECT
Idempleado,
Empleado,
Sueldo
FROM
(
SELECT
Idempleado,
Empleado,
Sueldo,
ROW_NUMBER () OVER (ORDER BY empleado)
FROM
Tblempleados
) x
WHERE
ROW_NUMBER BETWEEN 6 AND 10 ) AS elmayor;
Resultado:
En PostgreSQL si quiere pasar el rango de filas como parámetro puede crear 2 procedimientos almacenados, uno para las filas extraídas y otro para obtener el sueldo mayor.
Martha con lo expuesto demuestra una de las grandes ventajas de utilizar PostgreSQL con Access, toda vez que facilita la elaboración que en Access son complicadas.