Página 1 de 1

FR extraño comportamiento en Datasets

Publicado: Mar Oct 10, 2017 6:03 pm
por bingen
Buenas Ignacio, cuando enviamos un dataset a FR, bien con AddDataSet o directamente cargandolo en un objeto FR (lo puedes ver en vuestro ejemplo C:\Xailer\Samples\FastReport\MemDataSet.prg) el Dataset asignado lo pones en un Masterdata y perfecto, pero para muchas cosas viene bien simplemente poner campos sobre la propia hoja de FR o en otra banda que no sea un MasterData, como la del título.

Así lo hemos hecho hasta ahora e iba bien, pero ahora resulta que a pesar de estar el Dataset original por ejemplo, en el registro 5 de 20, cuando lo pasamos al FR y pedimos que nos ponga un campo sin el Masterdata siempre sale el campo del último registro y no del registro en el que está el dataset original y claro nos causa muchos quebraderos de cabeza.

Imagina que el FR es un diploma del alumno seleccionado, que es un FR3 con simples campos sobre el papel que tiene un fondo de diploma, pues ahora el último alumno es al que sale en todos los diplomas.

Se puede hacer algo, he intentado incluso sobrecargar el AddDataSet pero no hay manera.

Muchas gracias.

Re: FR extraño comportamiento en Datasets

Publicado: Mié Oct 11, 2017 4:53 pm
por ignacio
Buenas tardes Bingen,

Los datasets alimentan a FR y una vez alimentado se produce una casi absoluta desconexión entre el dataset original de Xailer y el dataset de FR. Es FR el que luego y según como se haya incorporada el dataset en el informe hará la navegación a través del mismo. Es decir, FR tiene que saber como navegar a través del dataset que no está en el MasterData. Supongo que a lo mejor por scripting y con los eventos de FR podrías modificar la posición del cursor del segundo dataset o incuso aún más sencillo establecer una relación entre ambas tablas. Si se te complica, lo más sencillo es que utilices funciones o variables.

Un saludo

Re: FR extraño comportamiento en Datasets

Publicado: Lun Oct 23, 2017 11:52 am
por bingen
Hola Ignacio, buenos días, sigo pegándome con esto.

Creo que lo que me dices es impracticable, resulta que el odataset que contiene FR si que está en el registro que tiene que estar, es decir que si el FRDataSet que yo alimento está en el registro 6 de 20 y pruebo los eventos
::OnAfterLoad:={|o| Logdebug(o:aDataSets[1]:oDataSet:RecNo())}
::OnBeforePrint:={|o| Logdebug(o:aDataSets[1]:oDataSet:RecNo())}
todo el rato incluso antes de imprmir cada línea del MasterData me dice que estoy en el recno() = 6 pero si pongo un campo como te decía fuera del masterdataset, por ejemplo en la banda del título que se ejecuta antes del masterdataset, ese campo siempre tiene el valor del útimo registro del dataset, el 20 ¿?¿?¿?¿?¿?¿?

O sea que no puedo hacer nada para que el oDataSet se resitue por que ya lo está, raro no? Antes no pasaba y no se desde cuando está pasando por que me he dado cuanta con la última versión.

Con variables podría hacerlo pero me va a tocar retocar docenas de FR3 y meter muchas líneas de código.

Si se te ocurre otra cosa me comentas por favor.

Gracias.

Re: FR extraño comportamiento en Datasets

Publicado: Lun Oct 23, 2017 4:45 pm
por ignacio
bingen escribió:Hola Ignacio, buenos días, sigo pegándome con esto.
... resulta que el odataset que contiene FR si que está en el registro que tiene que estar ...
La pregunta correcta a hacerse es: ¿Cómo se recorre el dataset secundario por FR mientras se recorre el dataset principal también por FR? Por lo que intuyo, pretendes añadir un dataset que es completamente tonto, en el sentido de que no tiene ni idea de como moverse y por lo tanto no se mueve y está siempre parada en el mismo registro.
bingen escribió:O sea que no puedo hacer nada para que el oDataSet se resitue por que ya lo está, raro no?
Lo que es raro es que el dataset sepa lo que pretendes hacer tu con él por ciencia infusa. O es master-data o es una dataset que tiene una relación con el master-data.
bingen escribió:Antes no pasaba y no se desde cuando está pasando por que me he dado cuanta con la última versión.
Permíteme que lo dude y más aún cuando desde la última versión sólo se han hecho unos simples retoques.

Voy a intentar explicar como funciona FR, ya no sólo con Xailer, sino también con Delphi, .NET y cualquier otro entorno de desarrollo (te adelanto que lo que hacía Sergey no me importa demasiado, lo siento ;-)):

Toda la información de cualquier dataset los recibe FR en el momento que se cargan sus datos con la instrucción oFRDataset:Load(). Esta operación se hace en bloque, antes de que se realice ningún tipo de impresión. Todos los datos se almacenan en un dataset de memoria que el propio FR gestiona. Por lo tanto, es absolutamente normal que el recno() de tu Dataset de Xailer esté en Eof().

¿Cómo se consigue que la posición de un dataset cambie con el movimiento de otro dataset? A través de una relación. Así de fácil. Es decir, cuando se construye el listado, los datasets están en principio completamente cargados y es responsabilidad de FR establecer la navegación de los datasets secundarios cuando se mueve el principal. Y está absolutamente contraindicado el cambiar manualmente la posición de su cursor, por motivos obvios.

El único mecanismo que existe de sincronización entre FR y Xailer es en sentido contrario al que tu demandas. Y es que cuando FR navega por SUSdatasets existe la posibilidad (que consume recursos) de que tus datasets de Xailer actualicen su posición. Y dicha propiedad se llama: TFastReport:lSynchroData. Pero el hecho de que tu te muevas por tus dataset de Xailer a FR no le afecta lo más mínimo. Y esto es así desde la versión 0.01. Lo siento.

Un saludo