| |||
| 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, a@a.com, soporte1, soporte2 , soporteN A partir de INNER JOINs lo que consigo es lo siguiente: Alvaro, Sanchez, a@a.com, soporte1 Alvaro, Sanchez, a@a.com, soporte2 ... Alvaro, Sanchez, a@a.com, 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 06:05 Razón: Cambiar título a uno más adecuado |
| |||
| 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:
¡AVISO! Introducir los valores debería hacerse con los propios Rerdsets ya que están activados... 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
Un saludo a todos. Psdt: Ya puede algún moderador cerrar el tema y darlo por solucionado |
| |||
| 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 |
| |||
| 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. |