Discussion:
Concatenar campos en un subinforme
(demasiado antiguo para responder)
Toni
2013-01-22 07:56:35 UTC
Permalink
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
2013-01-22 08:43:04 UTC
Permalink
Hola
¿Y cual es tu problema?

Salu2
--
José Mª Fueyo
[MS MVP Access]
Toni
2013-01-22 12:35:01 UTC
Permalink
Pues que no se cómo hacerlo! Se me ocurre que puedo crear un evento en el mismo subinforme, pero desconozco cómo.
Post by José Mª Fueyo
Hola
¿Y cual es tu problema?
Salu2
--
José Mª Fueyo
[MS MVP Access]
José Mª Fueyo
2013-01-22 12:56:38 UTC
Permalink
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.

Salu2
--
José Mª Fueyo
[MS MVP Access]
Toni
2013-01-22 14:16:15 UTC
Permalink
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?
Post by José Mª Fueyo
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.
Salu2
--
José Mª Fueyo
[MS MVP Access]
José Mª Fueyo
2013-01-22 17:32:05 UTC
Permalink
Hola
Crea un campo calculado en la consulta origen de datos de tu informe

Salu2
--
José Mª Fueyo
[MS MVP Access]
Toni
2013-01-23 08:30:52 UTC
Permalink
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
Post by José Mª Fueyo
Hola
Crea un campo calculado en la consulta origen de datos de tu informe
Salu2
--
José Mª Fueyo
[MS MVP Access]
José Mª Fueyo
2013-01-23 08:46:54 UTC
Permalink
Hola
¿Probaste en la ventada de inmediato a llamar la función, pasándola un valor conocido, para depurarla?

Salu2
--
José Mª Fueyo
[MS MVP Access]
Toni
2013-01-23 09:19:52 UTC
Permalink
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?
Post by José Mª Fueyo
Hola
¿Probaste en la ventada de inmediato a llamar la función, pasándola un valor conocido, para depurarla?
Salu2
--
José Mª Fueyo
[MS MVP Access]
José Mª Fueyo
2013-01-23 10:37:57 UTC
Permalink
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)

Salu2
--
José Mª Fueyo
[MS MVP Access}
Toni
2013-01-23 10:43:05 UTC
Permalink
Cierto, me falto definir la database... gracias de nuevo!
Post by José Mª Fueyo
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)
Salu2
--
José Mª Fueyo
[MS MVP Access}
Toni
2013-02-13 08:09:57 UTC
Permalink
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
2013-02-13 12:23:58 UTC
Permalink
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
2013-02-13 13:58:55 UTC
Permalink
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
Post by José Mª Fueyo
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]
José Mª Fueyo
2013-02-15 09:54:16 UTC
Permalink
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.

Salu2
--
José Mª Fueyo
[MS MVP Access]
Toni
2013-02-15 11:48:22 UTC
Permalink
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
Post by José Mª Fueyo
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.
Salu2
--
José Mª Fueyo
[MS MVP Access]
José Mª Fueyo
2013-02-18 17:46:37 UTC
Permalink
Hola
La función, ¿que te devuelve?

Salu2
--
José Mª Fueyo
[MS MVP Access]
Toni
2013-02-19 07:22:00 UTC
Permalink
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.
Post by José Mª Fueyo
Hola
La función, ¿que te devuelve?
Salu2
--
José Mª Fueyo
[MS MVP Access]
QuiqueViñals
2013-03-05 22:38:07 UTC
Permalink
Concatena en una string pública delimitada, y luego splitea según tus necesidades.
Loading...