Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Consulta SELECT generando columnas

Estas en el tema de Consulta SELECT generando columnas en el foro de Bases de Datos General en Foros del Web. Buenas tardes a todos, antes de nada agredecer de antemano el tiempo dedicado a leer el post y más aun en contestarlo. Trataré de explicarme ...
  #1 (permalink)  
Antiguo 09/01/2012, 09:48
 
Fecha de Ingreso: enero-2012
Mensajes: 49
Antigüedad: 12 años, 11 meses
Puntos: 4
Consulta SELECT generando columnas

Buenas tardes a todos,


antes de nada agredecer de antemano el tiempo dedicado a leer el post y más aun en contestarlo.

Trataré de explicarme lo mejor posible, pero quiero dejar claro de antemano que soy un completo inexperto en aquello que por circunstancias de la vida hoy en día me toca trabajar, y disculparme si me he equivocado en la ubicación del post o en alguna otra cosa.

Para tratar de explicar lo que necesito voy a empezar por el resultado que me gustaría obtener:

- Dadas dos tablas (relacionadas por medio de otras 3 - imagen de abajo- ) aparezca un listado, ya sea creando una tabla intermedia o como sea, con los datos con columnas nuevas. Hasta aquí se que suena muy confuso, pero espero que con la imagen se vea mejor:



Quisiera que para cada persona (sin repetir registros) me aparezca el nombre, apellidos, email y nombres de los soportes asociados a dichas personas que en la tabla GestionTarifas tengan el Recibidas con valor 0 (No).

El motivo es porque una vez que tenga la consulta o la tabla realizada, generaré un archivo de correspondencia por Word para solicitar dichas tarifas y ahorrar muchísimo tiempo a mis compañeros (hablamos de miles de registros y soportes).

Ejemplo de resultado:

Alvaro, Sanchez, [email protected], soporte1, soporte2 , soporteN

A partir de INNER JOINs lo que consigo es lo siguiente:

Alvaro, Sanchez, [email protected], soporte1
Alvaro, Sanchez, [email protected], soporte2
...
Alvaro, Sanchez, [email protected], soporteN

Espero que ahora esté un poco más claro, no se si lo que pido es una tontería de 2 minutos, algo muy difícil o sencillamente no es posible.

De nuevo muchas gracias a aquellos que se aventuren a ayudarme.


Un saludo y feliz año.

Última edición por Uran; 10/01/2012 a las 07:05 Razón: Cambiar título a uno más adecuado
  #2 (permalink)  
Antiguo 12/01/2012, 14:48
 
Fecha de Ingreso: enero-2012
Mensajes: 49
Antigüedad: 12 años, 11 meses
Puntos: 4
Respuesta: Consulta SELECT generando columnas

Al final me he creado un código muy sencillito (dada mi inexperiencia) en VBA que me ha hecho el trabajo.

He creado una tabla intermedia, y sacando los datos de la consulta que mostré arriba (con un par de columnas añadidas por especificaciones del cliente), los he ido añadiendo y alterando la tabla según fuese necesario.

Dejó aquí el código por si puede ser de utilidad para alguien:

Código:
Public Function ActualizarGestionTarifasNoRecibidas()

DoCmd.SetWarnings False 'Quitar Warnings para que no nos avise de las anexiones ni los cambios
On Error GoTo Err_ActualizarGestionTarifasNoRecibidas

    Dim db As Database
    Dim SQLText As String
    Dim rst1 As DAO.Recordset
    Dim rst2 As DAO.Recordset
    Dim i As Integer 'Contador del blucle
    Dim NCabecera As String 'Contenedor de la cabecera actual
    Dim rst2Cabecera As String 'Valor real de la cabecera actual
    
    Set db = CurrentDb()
    Set rst1 = db.OpenRecordset("_GestionTarifasNoRecibidas", dbReadOnly)
            
    If Not (rst1.BOF And rst1.EOF) Then 'Comprobar que hay registros en el rst (no estamos ni en el BOF ni en el EOF)
        Do While Not rst1.EOF 'Mientras no lleguemos al final
        
            SQLText = " SELECT * FROM GestionTarifasNoRecibidas " _
                    & " WHERE IdPersonas = " & rst1![IdPersonas] & " ORDER BY IdPersonas"
            Set rst2 = db.OpenRecordset(SQLText)
                    
            If Not (rst2.BOF And rst2.EOF) Then 'True significa que la persona ya existe en la tabla
            
                For i = 1 To ((rst2.Fields.Count) - 5) 'Máximo de cabeceras hasta el momento
                    NCabecera = "Cabecera" & i 'Valor de la cabecera actual -> Cabecera1, Cabecera2 ... CabeceraN
                    If Not IsNull(rst2.Fields(NCabecera)) Then
                        rst2Cabecera = rst2.Fields(NCabecera) 'Valor real de la cabecera actual
                        If (rst2Cabecera = rst1![Cabecera]) Then
                            Exit For 'Salir del bucle si la cabecera está dada de alta
                        End If
                        
                        If (rst2Cabecera = "") Then 'Primera cabecera vacía (porque se haya borrado alguna previa o algo parecido
                            DoCmd.RunSQL "UPDATE GestionTarifasNoRecibidas SET " & NCabecera & " = '- ' + '" & Replace(rst1![Cabecera], "'", "''") & "' WHERE IdPersonas = " & rst1![IdPersonas] & " " ' Asignamos la Cabecera a la Persona
                            Exit For 'Salimos del bucle una vez añadida la cabecera
                        End If
                    Else 'Si el valor de la cabecera es nulo es que está vacío, y por tanto estamos ante una libre
                        DoCmd.RunSQL "UPDATE GestionTarifasNoRecibidas SET " & NCabecera & " = '- ' + '" & Replace(rst1![Cabecera], "'", "''") & "' WHERE IdPersonas = " & rst1![IdPersonas] & " " ' Asignamos la Cabecera a la Persona
                        Exit For 'Salimos del bucle una vez añadida la cabecera
                    End If
                Next i
                
                If i = ((rst2.Fields.Count) - 4) Then 'Si i es igual que ((rst1.Fields.Count) - 5 + 1 ) significa que ha recorrido el for anterior entero
                    rst2.Close 'Cierro el Recordset para evitar problemas de exclusividad
                    NCabecera = "Cabecera" & i
                    DoCmd.RunSQL "ALTER TABLE GestionTarifasNoRecibidas ADD " & NCabecera & " Text "
                    DoCmd.RunSQL "UPDATE GestionTarifasNoRecibidas SET " & NCabecera & " = '- ' + '" & Replace(rst1![Cabecera], "'", "''") & "' WHERE IdPersonas = " & rst1![IdPersonas] & " " ' Asignamos la Cabecera a la Persona
                End If
            
            Else 'False significa que la persona no existe en la tabla, por lo que la damos de alta con los datos actuales del rst1
            
                DoCmd.RunSQL "INSERT INTO GestionTarifasNoRecibidas (IdPersonas, Nombre, Apellidos, Email, Cargo) " _
                & " VALUES (" & rst1![IdPersonas] & ", '" & rst1![Nombre] & "', '" & rst1![Apellidos] & "', '" & rst1![Email] & "', '" & rst1![Cargo] & "') "
                rst1.MovePrevious 'Movemos uno atrás para volver a comprobar con los nuevos datos
            End If
            
            rst1.MoveNext
        Loop
    End If
        
    Set db = Nothing
    Set rst1 = Nothing
    Set rst2 = Nothing
    
Exit_ActualizarGestionTarifasNoRecibidas:
    Exit Function

Err_ActualizarGestionTarifasNoRecibidas:
    MsgBox Err.Description
    Resume Exit_ActualizarGestionTarifasNoRecibidas
    
DoCmd.SetWarnings True 'Activar Warnings
End Function
¡AVISO! Introducir los valores debería hacerse con los propios Rerdsets ya que están activados...


Un saludo a todos.

Psdt: Ya puede algún moderador cerrar el tema y darlo por solucionado
  #3 (permalink)  
Antiguo 26/01/2012, 16:58
 
Fecha de Ingreso: enero-2012
Mensajes: 2
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Consulta SELECT generando columnas

Bueno desde el punto de vista del querys, si es que no te entendí mal, lo que quieres esta mal, porque digamos que te arroje estos resultados:

-Fila1 Nombre1 Email1 Soporte1 Soporte2 Soporte3
-Fila2 Nombre2 Email2 Soporte4 Soporte5 Soporte6 Soporte7 Soporte 8
-Fila3 Nombre3 Email3 Soporte9

Si te das cuenta por cada soporte se tendría que generar una columna, por lo que si una persona tuviera 20 soportes, tendrías que generarle 20 columnas, eso esta totalmente mal.

Bueno hasta donde te entendí. Esta mal, Saludos
  #4 (permalink)  
Antiguo 27/01/2012, 10:21
 
Fecha de Ingreso: enero-2012
Mensajes: 49
Antigüedad: 12 años, 11 meses
Puntos: 4
Respuesta: Consulta SELECT generando columnas

Hola cerodiablo,


precisamente lo que quiero es que si una persona tiene 20 soportes, me generé 20 columnas. Ésto se debe a que lo necesito para después enviar un correo con Outlook, tirando de los datos de dicha tabla en la que ponga algo como lo siguiente:

***** las tarifas de los siguientes soportes:

- Soporte 1 - Soporte 6 - Soporte 11 - Soporte 16
- Soporte 2 - Soporte 7 - Soporte 12 - Soporte 17
- Soporte 3 - Soporte 8 - Soporte 13 - Soporte 18
- Soporte 4 - Soporte 9 - Soporte 14 - Soporte 19
- Soporte 5 - Soporte 10 - Soporte 15 - Soporte 20


No se si ahora queda más claro. De todos modos quiero aclarar que el uso de esa tabla es exclusivo para el envío del correo, no se trata de una tabla sobre la que se manejen datos.


Un saludo.

Etiquetas: access
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:57.