Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Concatenar campos en un subinforme

278 views
Skip to first unread message

Toni

unread,
Jan 22, 2013, 2:56:35 AM1/22/13
to
Buenas de nuevo,

Trabajo con Acces 2007, y sigo con mis problemillas.... en este caso tengo la siguiente situación:

PETICIONES TABLAPUENTE MOTIVOS
IdPeticiones ---- IdPeticion
IdMotivo --- IdMotivo
NombreMotivo

En un subinforme, necesito, para cada IdPeticiones, crear una consulta que lea todos los campos de PETICIONES y agrupe, en un campo, todos los NOMBREMOTIVO del registro. Es decir:

IdPeticiones: 57
FechaPeticion: ...
...
CampoConcatenado: "Pendiente de pago, Fuera de terminio, No cumple edad"

Cada registro así elaborado, lo mostraría en el subinforme de manera continua.

Espero haberme explicado. Muchas gracias.

José Mª Fueyo

unread,
Jan 22, 2013, 3:43:04 AM1/22/13
to
Hola
¿Y cual es tu problema?

Salu2
--
José Mª Fueyo
[MS MVP Access]

Toni

unread,
Jan 22, 2013, 7:35:01 AM1/22/13
to

Pues que no se cómo hacerlo! Se me ocurre que puedo crear un evento en el mismo subinforme, pero desconozco cómo.


El dimarts 22 de gener de 2013 9:43:04 UTC+1, José Mª Fueyo va escriure:

José Mª Fueyo

unread,
Jan 22, 2013, 7:56:38 AM1/22/13
to
Hola
Puedes crearte una función a la cual pases como parámetro el ID de petición, y que concatene en una variable de texto las descripciones de motivo. Esa variable es la que devuelve la citada función. Úsala en un campo calculado, por ejemplo, de la consulta que es origen de datos de tu informe.

Toni

unread,
Jan 22, 2013, 9:16:15 AM1/22/13
to
Jose Mª,

Creo entender lo que me dices, pero el problema me surge en cuanto a dónde colocar la función. Tengo la función hecha, mediante Recordset, y funciona, devolviendo un valor String.

Me dices que debo colocarla en la consulta de origen de datos? Cómo?



El dimarts 22 de gener de 2013 13:56:38 UTC+1, José Mª Fueyo va escriure:

José Mª Fueyo

unread,
Jan 22, 2013, 12:32:05 PM1/22/13
to
Hola
Crea un campo calculado en la consulta origen de datos de tu informe

Toni

unread,
Jan 23, 2013, 3:30:52 AM1/23/13
to

Jose Mª,

Me voy acercando a la solución:

He creado la siguiente función pública en un módulo:

Public Function EncadenarMotius(Condicio As Integer) As String

Dim rs As Recordset
Dim sCadena As String

rs.OpenRecordset ("SELECT Motius.NomMotiu FROM Motius " & _
"INNER JOIN TPMotius ON Motius.IdMotiu = TPMotius.IdMotius " & _
"WHERE (TPMotius.IdPeticio) = " & Condicio)

sCadena = ""

rs.MoveFirst

Do Until rs.EOF = True
sCadena = sCadena & ", " & rs!NomMotiu
rs.MoveNext
Loop

EncadenarMotius = Right(sCadena, Len(sCadena) - 2)

End Function


Des de la consulta origen de datos del informe, creo el siguiente campo:

EncadenarMotius([IdPeticio]) AS MotiusJunts


Al ejecutar el informe, el código se para en el OpenRecordset, y me da un error '91 en tiempo de ejecución, variable de objeto o bloque With no establecido'.

La consulta SELECT funciona en el editor de consultas... Dónde está la equivocación?

Gracias



El dimarts 22 de gener de 2013 18:32:05 UTC+1, José Mª Fueyo va escriure:

José Mª Fueyo

unread,
Jan 23, 2013, 3:46:54 AM1/23/13
to
Hola
¿Probaste en la ventada de inmediato a llamar la función, pasándola un valor conocido, para depurarla?

Toni

unread,
Jan 23, 2013, 4:19:52 AM1/23/13
to

Sí, ya lo probé, y obtiene el error 91 que te he comentado...

Al dar el error de 'variable de objeto'... ¿Puede ser un error al crear el Recordset des de un módulo? Es suficiente con declarar la variable rs como recordset, y luego darle contenido con .OpenRecordset?

El dimecres 23 de gener de 2013 9:46:54 UTC+1, José Mª Fueyo va escriure:

José Mª Fueyo

unread,
Jan 23, 2013, 5:37:57 AM1/23/13
to
Hola
Declaras la variable de tipo recordset, pero no la instancias. Todo tipo de objeto hay que instanciarlo antes de usarlo

Dim rs As Recordset
Dim sCadena As String

set rs=CurrentDb.OpenRecordset ("SELECT Motius.NomMotiu FROM Motius " & _
"INNER JOIN TPMotius ON Motius.IdMotiu = TPMotius.IdMotius " & _
"WHERE (TPMotius.IdPeticio) = " & Condicio)

Toni

unread,
Jan 23, 2013, 5:43:05 AM1/23/13
to

Cierto, me falto definir la database... gracias de nuevo!


El dimecres 23 de gener de 2013 11:37:57 UTC+1, José Mª Fueyo va escriure:

Toni

unread,
Feb 13, 2013, 3:09:57 AM2/13/13
to
Buenos dias de nuevo,

Aquí estoy con otra duda, que espero me puedas ayudar a resolver. Trabajo con Access 2007.

Tengo un informe con una consulta como origen de datos, y debo crear una función para utilizarla en esta consulta con campo calculado.

El problema que tengo es que la función devuelve tres campos, y no uno solo.

Debo crear una función para cada campo, o puedo hacerlo todo en un solo campo calculado y una sola función?

Gracias

José Mª Fueyo

unread,
Feb 13, 2013, 7:23:58 AM2/13/13
to
Hola
Una función admite parámetros. En función de ellos, puedes configurar una salida u otra.

Salu2
--
José Mª Fueyo
[MS MVP Access]

Toni

unread,
Feb 13, 2013, 8:58:55 AM2/13/13
to

Jose Mª, gracias

A lo mejor no me expliqué bién... Tengo una tabla TITULARES, y una tabla REPRESENTANTES, relacionadas. Un titular puede o no puede tener representante.

La consulta és para crear un informe de correspondència. Debo cargar los campos Nombre, Apellidos, y dirección del representante y, si no hay representante, el nombre, apellidos y dirección del titular.

En la función, puedo discriminar con un If-Then si hay o no representante, pero mi duda reside en cómo, desde la consulta, puedo cargar estos datos. ¿Debo hacer una función y un campo calculado para cada valor, o hay alguna manera de hacerlo todo en una única función?

Gracias de nuevo.
Toni


El dimecres 13 de febrer de 2013 13:23:58 UTC+1, José Mª Fueyo va escriure:

José Mª Fueyo

unread,
Feb 15, 2013, 4:54:16 AM2/15/13
to
Hola
Puedes pasar como parámetro de la función, el campo que usar para relacionar ambas tablas. Que la función devuelva un string.
Primero compruebas sí hay registro relacionado en la tabla de representantes según el ID pasado. Que existe, devuelves los datos del representante. Que no, devuelves los datos del titular.

Dentro de la consulta, creas un campo calculado con el generador de expresiones en el cual pones la función creada, y como parámetro el nombre del campo relacionado.
Espero te sirva.

Toni

unread,
Feb 15, 2013, 6:48:22 AM2/15/13
to
Gracias, Jose Mª.

Todo esto ya lo conseguí. Tengo la función con el parametro IDTitular, que és el que relaciona las tablas, y en la función compruebo si existe el IDRepresentante en la tabla TITULARES mediante un Recordset.

A partir de ahi, mediante un If-Then, cargo en un segundo Recordset el nombre del titular, o el nombre del representante, segun los casos.

La duda que ahora se me presenta es: ¿Debo hacer una función, con todo este procedimiento, para cada uno de los campos que quiero cargar en la consulta (nombre remitente, dirección remitente, CP remitente, y ciudad remitente), o puedo hacerlo de alguna manera para que una sola función me devuelva todos los campos? Y, si es así ¿Cómo los cargo luego en la consulta?

Gracias
Toni

El divendres 15 de febrer de 2013 10:54:16 UTC+1, José Mª Fueyo va escriure:

José Mª Fueyo

unread,
Feb 18, 2013, 12:46:37 PM2/18/13
to
Hola
La función, ¿que te devuelve?

Toni

unread,
Feb 19, 2013, 2:22:00 AM2/19/13
to

Ahora mismo la función devuelve el nombre del titular o el nombre del representante, como te comentava anteriormente.
Puedo hacer una función para cada valor (nombre, dirección, código postal, municipio, ciudad), pero me interesaria poder devolver, en la misma función, todos estos valores, pues voy a necesitar esta operación en diferentes partes del código.

El dilluns 18 de febrer de 2013 18:46:37 UTC+1, José Mª Fueyo va escriure:

QuiqueViñals

unread,
Mar 5, 2013, 5:38:07 PM3/5/13
to
Concatena en una string pública delimitada, y luego splitea según tus necesidades.
0 new messages