Access (Ayer Pregunte pero no me respondieron)

Tengo el Siguiente Problema
Tabla : Contrato Precio CodItem Naturaleza
1 5 XX A
1 6 XC A
1 8 XA A
1 10 XB B
Necesito Hacer la Siguiente Consulta
Contrato Naturaleza SPrecio Items
1 A 19 XX-XC-XA
1 B 10 XB
Items Pueden ser como Máximo 3(Como lo muestra el ejemplo)
Puedo hacer un programa y crear una tabla, pero esa no es la idea, deseo mediante una consulta obtener el resultado que necesito.
Me parece que puedo ver la definición de las funciones "Agregadas de SQL", eventualmente podría a partir de una crear una nueva, que permita concatenar, que en definitiva es lo que necesito.
Si existe otra manera por favor háganme saberla.
Gracias.
Omar Moncada ([email protected])
Respuesta
Puedes hacerlo a través de una consulta, con la función Mid(string, start[, length]), y si quieres concatenar los caracteres que rescates, crea una columna el tu consulta y usas el carácter '&' para concatenar los campos que necesites.
Si te entendí correctamente esa seria la respuesta. Avisame como te va.

2 respuestas más de otros expertos

Respuesta
1
Lamento no haber podido responder a tu consulta en el momento en que la hiciste, pero he estado de vacaciones, y hoy que me incorporo a mis actividades me he encontrado con varios mensajes, entre ellos el tuyo. Reitero nuevamente mis disculpas.
Bien, en el intento de ayudarte sobre tu consulta, se me ocurre que puedes plantear una consulta de datos agrupados, de la siguiente forma:
Criterios de agrupación: Contrato, Naturaleza)
Criterio de Suma (Precio)
De esta forma obtendrás solo la primera parte de la información que deseas es decir:
Contrato - Naturaleza - SPrecio
1 A 19
1 B 10
Creo que hasta aquí ya has llegado.
La segunda forma que te propongo es que utilices la tabla con todos sus datos, y hagas las agrupaciones que necesites en un informe de Access, que tiene muchísima potencia en la agrupación, siempre claro esta, que lo que necesites es reportar esta información, si lo que necesitas es mostrarla en pantalla mediante formulario, a lo mejor se te complica algo, si no es así, puedes hacer presentaciones preliminares desde el informe.
También puedes probar a realizar consultas de referencias cruzadas, posiblemente esta solución te ayude, siempre que el origen de datos no sea SQL, ya que el objeto PIVOT, no esta permitido en este entorno.
Sofocles, Muchas gracias por tu respuesta.
Te voy a explicar el problema con datos reales.
Yo actualmente trabajo en una inmobiliaria, los clientes compran Departamentos, habitualmente con una bodega y/o varios estacionamientos, como por ejemplo "El cliente Omar Moncada compra el departamento 401 y los estacionamianto 05,08 y 02", más gráficamente
Cliente - Item - Cód-Precio
0001 - DEPTO - 01- 52
0001 - ESTAC - 05 - 12
0001 - ESTAC - 08 - 10
0001 - ESTAC - 02 - 08
Los datos están organizados en filas y como cada cliente puede comprar 1 o más ESTAC, deseo obtener una consulta de datos agrupados de la siguiente forma :
Cliente - Item - Cód-SumadePrecio
0001 - DEPTO - 01- 52
0001 - ESTAC - (05,08,02) - 30
Es decir que la consulta al agrupar pueda concatenar los número de ESTAC, esto no se puede hacer con las actuales funciones Agregadas de SQL, es decir solo tengo sumas, promedios, máx, mín, etc.
Con las actuales funciones podría obtener:
Cliente - Item - Cód-SumadePrecio
0001 - DEPTO - 01- 52
0001 - ESTAC - (05,02) - 30
Donde se puede crear la expresión máx(Cód)&","&mín(Cód), esto da como resultado 05,02. Pero solo me sirve para dos registros... ¿y cuándo tengo más de dos?.
Mi consulta en cuestión es como puedo agregar una función "Agregadas de SQL", en este caso que reciba como parámetro un campo grupo y lo concatene.
Estuve tratando de editar los complementos de access (archivos MDA), pero no supe como editar los módulos, de esta manera podría a partir de la definición de una función ya hecha, crear una nueva.
De antemano gracias.
Atte. Omar Moncada ([email protected])
He analizado tu consulta y he realizado pruebas creando una tabla similar a la que me planteas. El resultado ha sido OK.
La Select esta formada de la siguiente forma:
SELECT Tabla1.Cliente, Tabla1.Item, AgruparCod([Cliente],[Item]) AS Cod, Sum(Tabla1.Precio) AS SumaDePrecio
FROM Tabla1
GROUP BY Tabla1.Cliente, Tabla1.Item;
Como puedes observar el campo Cod, lo he sustituido por una expresión que comprende una función que yo mismo he creado y que te expongo a continuación:
Public Function AgruparCod(Cliente, Item)
On Error GoTo Error_AGruparCod
Dim DB As DATABASE
Set DB = CurrentDb()
Dim rst As Recordset
Dim sql As String
Dim AgruStr As String
sql = "SELECT Tabla1.*"
sql = sql & " FROM Tabla1"
sql = sql & " WHERE Tabla1.Cliente='" & Cliente & "'"
sql = sql & " AND Tabla1.Item='" & Item & "'"
Set rst = DB.OpenRecordset(sql)
Do While Not rst.EOF
If AgruStr <> "" Then
AgruStr = AgruStr & "-" & rst!Cod
Else
AgruStr = rst!Cod
End If
rst.MoveNext
Loop
rst.Close
AgruparCod = AgruStr
Exit Function
Error_AGruparCod:
MsgBox Error$, 48, "Pruebas"
Exit Function
Resume
End Function
El resultado es el que tu esperabas, es decir:
Cliente - Item - Cód-SumadePrecio
0001 - DEPTO - 01- 52
0001 - ESTAC - (05,08,02) - 30
La función la he realizado con currentdb, es decir con la base de datos activa, pero para hacerlo contra una base de datos servidor, es muy sencillo, simplemente hay que sustituir la currendb por el path donde se encuentre la base de datos. Si por el contrario, utilizas ADO, entonces debes sustituir varios parámetros y añadir otros nuevos, en este caso ponte en contacto conmigo, si acaso no lo quieres intentar, en [email protected].
Respuesta
Tendrás que explicarte un poco más si quieres ayuda

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas