Crear consulta de Paso a Través al servidor de datos PostgreSQL, para numerar los empleados por cada sección y los grupos

Espero me puedan ayudar y voy al grano:

Tengo la siguiente tabla:

La consulta debe arrojar el siguiente resultado:

También quisiera conocer cómo se puede hacer la consulta en Access.

Agradezco la solución o idea que me puedan brindar.

2 respuestas

Respuesta
1

En Access se resuelve con un informe, no es necesario programar nada (a lo sumo crear los marcos y darles color).

En los informes se pueden crear grupos y numerar los grupos (tanto en conjunto como individualmente).

Eduardo:

Lo único que vale la pena de tu respuesta es:

... El archivo en formato CVS ...

Que pereza tener que crear una tabla para generar un conjunto de datos para responder ... cuando el que está interesado (y no domina ninguno de los dos entornos) puede facilitar los medios y posiblemente obtener más de una respuesta creativa para presentar ese conjunto de datos estáticos.

Inestimable Eduardo:

En mi opinión este es un foro de ACCESS, no de 'bordar punto de cuz', para entornos específicos hay foros específicos y las preguntas y respuestas deberían de ir en el adecuado (al Cesar lo ...).

Si tan formado estas en ese entorno tan 'nuboso' y deseas ser alabado como el más sabio, practícalo en los foros dedicados (en los cuales no figuras y además ... parecen abandonados).

Tengo una gran duda al respecto de los hilos en los que con los mismos datos solicitan respuestas en varios entornos, la duda es: ¿Qué se busca? ... Si es por compararlos será porque no le convence lo que tiene y esa es una duda a resolver si se desea avanzar.


Te aclaro que lo que si IGNORO es el camino a NINGUNA PARTE, pero no te preocupes, si llega 'la necesidad' te lo preguntare pues parece que lo recorres de forma continua.

Eduardo, como siempre ... utilizando recursos ajenos.
Una SQL en la que se utiliza una función personalizada no es una verdadera SQL (sin 'la función' no funciona)

Lo mismo y en forma de array dinámico (si sabes lo que es y cómo funciona) y en DAO, lo más natural en Access.

Option Compare Database
Option Explicit
Public Resultado()
Public Function orden()
Dim M_Tabla As DAO.Recordset, grupo&, Fila&, T_seccion&, Bucle&, XX&
Set M_Tabla = CurrentDb.OpenRecordset("SELECT * FROM Tabla5 ORDER BY IdSeccion, IDEmpleado", , dbReadOnly)
With M_Tabla
.MoveLast: .MoveFirst
ReDim Resultado(1 To .RecordCount, 1 To .Fields.Count + 2)
Do Until .EOF
    If !IDseccion <> T_seccion Then T_seccion = !IDseccion:  grupo = grupo + 1: Fila = 0
    Fila = Fila + 1: Bucle = Bucle + 1
    For XX = 0 To .Fields.Count - 1
    Resultado(Bucle, XX + 1) = .Fields(XX)
    Next XX
    Resultado(Bucle, XX + 1) = Fila: Resultado(Bucle, XX + 2) = grupo
    .MoveNext
    Loop
End With
End Function
Respuesta
1

Envíeme el archivo en formato CVS y le preparo la consulta de tal forma que se ajuste con la pregunta. Puede enviarlo a [email protected]. No obstante, su pregunta se refiere es presentarlo como consulta no como informe de Access.

Enrique observe y aprenda. Hernán, como le expliqué en su pregunta anterior sobre consulta paso a través debe existir un DSN del sistema en su PC, con base en este creamos la consulta, siguiendo el ejemplo de Microsoft, así digan FUSILAR algunos ignorantes.

Consulta en PostgreSQL

Explicación de la consulta en PostgreSQL:

ROW_NUMBER es una función de ventana que asigna un entero secuencial a cada fila de un conjunto de resultados.

OVER determina exactamente cómo se dividen las filas de la consulta para que las procese la función de ventana.

PARTITION BY pertenece a la categoría Funciones de ventana. Las funciones de ventana de PostgreSQL son las que son capaces de realizar cálculos que abarcan varias filas de una columna, pero no todas las filas.

DENSE_RANK() se utiliza para asignar un rango a cada fila dentro de una partición de un conjunto de resultados, sin brechas en los valores de clasificación. El DENSE_RANK() asigna un rango a cada fila de cada partición de un conjunto de resultados. A diferencia de la función RANK(), la función DENSE_RANK() siempre devuelve valores de rango consecutivos. Para cada partición, la función DENSE_RANK() devuelve el mismo rango para las filas que tienen los mismos valores

ORDER BY permite ordenar por el año, igualmente se debe convertir el campo fecha. Se había podido crear una función en PostgreSQL para pasar la fecha como parámetro y obtener el año.

Resultado de la consulta desde Access

Código de la función

Public Function CreaQueryNumeraFilaGrupoParticion(SPTQueryName As String)
 'Numera filas por partición de grupo y el grupo
'                       Microsfot ActiveX Data Objectc 6.1 Library
'                       Microsfot ADO Ext. 6.0 for DLL and Security
'Fuente:
'    Microsoft
'Adpatación para PostgreSQL
'Eduardo Pérez Fernández
'Fecha: 12/09/2022
'Parametros:
'               SPTQueryName  --> Nombre de la consulta a crear
 On Error GoTo hay_Error
Dim cat As ADOX.Catalog
Dim cmd As ADODB.Command
Dim strSQl As String
Dim tB As DAO.TableDef
Dim MyQueryDef As QueryDef
With CurrentDb
  For Each MyQueryDef In CurrentDb.QueryDefs
   If MyQueryDef.Name = SPTQueryName Then
   .QueryDefs.Delete (SPTQueryName)
   .QueryDefs.Refresh
   Exit For
   End If
  Next
End With
Set cat = New ADOX.Catalog
Set cmd = New ADODB.Command
cat.ActiveConnection = CurrentProject.Connection
Set cmd.ActiveConnection = cat.ActiveConnection
  strSQl = "select idempleado,nombres,apellidos" & vbCrLf
  strSQl = strSQl & "           , idseccion, row_number() over (partition" & vbCrLf
  strSQl = strSQl & "          by idseccion" & vbCrLf
  strSQl = strSQl & "    ORDER BY idseccion) as fila_grupo, dense_rank() over (" & vbCrLf
  strSQl = strSQl & "    ORDER BY idseccion) as grupo" & vbCrLf
  strSQl = strSQl & "        FROM tblempleados;"
  cmd.CommandText = strSQl
  cmd.Properties("Jet OLEDB:ODBC Pass-Through Statement") = True
cmd.Properties _
     ("Jet OLEDB:Pass Through Query Connect String") = _
       "ODBC;DSN=dbconta;"
  cat.Procedures.Append SPTQueryName, cmd
  Set cat = Nothing
  Set cmd = Nothing
hay_Error_Exit:
   Exit Function
hay_Error:
    MsgBox "Ocurrió el error " & Err.Number & vbCrLf & vbCrLf & Err.Description, vbCritical, "Error..."
    Resume hay_Error_Exit
End Function

La gran ventaja de la consulta paso a través es que no tiene que vincular tablas con el servidor y puede hacer una consulta a su base de datos PostgreSQL alojada en la nube, por ejemplo, pruebo las funciones con el servidor de CLOUD CLUSTER. Espero que Enrique haya entendido algo.

Esto es algo que no es fácil y practico hacerlo con SQL en Access y todavía existen personas que atacan todas mis respuestas donde hago referencia a PostgreSQL con Access.

Ignorante Enrique respondo porque la pregunta encaja en el foro, toda vez, que es de Access y más precisamente sobre CONSULTAS DE PASO A TRAVÉS, pero para que discutir si usted no tiene idea del uso de servidores de daos con Access.

Ahora complemento la respuesta elaborando la consulta, pero solo para Access.

CONSULTA

SELECT tblempleados.idempleado, tblempleados.nombres, tblempleados.apellidos,
 tblempleados.fechanacio, tblempleados.idseccion, tblempleados.genero,
 RT_NumerarParcialSQL(idseccion) AS OrdenParcial, RT_Tab1([idseccion],[idseccion]) AS ngrupo
FROM tblempleados
ORDER BY tblempleados. Idseccion;

Para esta consulta utilicé y adapté las funciones del maestro JESUS MANSILLA CASTELLS, estas permiten numerar filas y grupos sin necesidad de hacer subconsultas.

FUNCIONES

'---------------------------------------------------------------------------------------------
' Autor : JESUS MANSILLA CASTELLS -Mihura-
'---------------------------------------------------------------------------------------------
Public Function RT_NumerarParcialSQL(nDato) As Long
'variable que no se pierde entre las distintas llamadas
Static nCONTADOR As Long, nANTERIOR As String
     If IsNull(nDato) Then 'si nDato es nulo: Iniciamos valor
         nCONTADOR = 0
         nANTERIOR = ""
         Exit Function
     End If
     '- si nDato es igual al valor memorizado sumamos 1 al contador
     If nDato = nANTERIOR Then
         nCONTADOR = nCONTADOR + 1
       Else '- iniciamos valor y memorizamos el anterior
         nCONTADOR = 1
         nANTERIOR = nDato
     End If
     RT_NumerarParcialSQL = nCONTADOR
End Function
'---------------------------------------------------------------------------------------------
' Autor : JESUS MANSILLA CASTELLS -Mihura-
'---------------------------------------------------------------------------------------------
Function RT_Tab1(id As Long, seccion As Long) As Long
Static NumeroGrupo As Long
Static IdOld As Long
   'Adaptada para respuesta TodoExpertos
   'Eduardo Pérez Fernánez
   '22/09/2022
     'controlamos si pertenece al mismo grupo que el anterior
     If id <> IdOld Or _
          seccion <> seccion Then
             NumeroGrupo = NumeroGrupo + 1
     End If
     IdOld = id
     RT_Tab1 = NumeroGrupo
End Function

La diferencia con el código de PostgreSQL es que ésa no aplica para aplicaciones cliente servidor con tablas NO vinculadas.

Ahí la tiene intolerante Enrique Feijóo.

Hernán lamentablemente DAO no es indicado para bases de datos que utilizan ODBC para la conexión, el indicado es ADODB. El código dao que le indican tómelo como alternativa de tontos.

Esto para Enrique, como se le ocurre comparar una consulta SQL con recorrer un recordset, que poco sabe de SQL. Ahora, si miramos el origen de la pregunta y así no le guste PostgreSQL puede apreciar la instrucción SQL es lo más práctico, esto es para pensar que no necesariamente se debe utilizar para bases de datos de gran tamaño, porque si se aprovecha su potencia se pueden elaborar consultas que con Access implicarían más código y lo grave, seguro que serán más lentas su ejecución.

Ahora no me respete, pero si respete al maestro JESUS MANSILLA CASTELLS, publicó la función para que los usuarios las utilicen, en estas demuestra como en una consulta de 30.000 registros el uso de subconsultas es más lentos. Ahora, en parte tiene razón en utilizar DAO, ya que usted no sabe ADO y ADOB, menos ha elaborado aplicaciones cliente servidor.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas