Hola, me encuentro ante la siguiente situación.
Tengo un @ElementCollection con atributos que dependen de un valor específico del padre.
En el ejemplo Factura - DetalleFactura, tendría que seleccionar el precio unitario del producto en función del tipo de cliente. Lo mismo me sucede con los descuentos por cada ítem.
¿Hay alguna manera de que cada vez que se cree un detalle de la factura se le pase la referencia a ésta?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Los elementos de una @ElementCollection son @Embeddable que no tienen referencia al padre, esto es diferente a la @OneToMany. La ventaja es que puedes reutilizar esos @Embeddable en otras entidades, la desventaja es que no puedes poner lógica en el @Embeddable que dependa del padre, porque son de padre desconocido.
Lo que quiero decir es que no vas a poder usar un @DefaultValueCalculator. Eso no es ningún problema, puedes usar una acción @OnChague para cuando cambie la referencia a producto, desde la acción puedes acceder a la vista y de ahí al cliente.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola Javier! Gracias por responder, hice eso exactamente pero me encuentro ante otro problema ahora.
En la vista principal tengo un campo "PorcentajeDescuento" que al cambiarlo necesito que me recalcule los totales debajo de la @ElementCollection.
Si coloco @OnChange en PorcentajeDescuento, tan solo al hacer click en "Nuevo" me da error:
WARNING: ¡ADVERTENCIA! No se ha reaccionado correctamente al cambio de MetaProperty:DetalleCotizacion.view.porcentajeDescuento.
Es decir, necesito resolver 2 cosas:
1) Evitar que se ejecute la acción @OnChange de PorcentajeDescuento al quere crear una nueva entidad.
2) Recalcular los detalles de mi factura cuando cambio el valor de PorcentajeDescuento.
Gracias de antemano.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
1) Evitar que se ejecute la acción @OnChange de PorcentajeDescuento al quere crear una nueva entidad.
Al pulsar nuevo el valor cambia por lo que el @OnChage salte, eso no lo puedes evitar. Si no ¿que clase de @OnChange sería, que a veces va y a veces no? Tendrás que adaptar la lógica de tu acción para que no falle, se cual sea el valor que reciba.
2) Recalcular los detalles de mi factura cuando cambio el valor de PorcentajeDescuento.
getView().refreshCollections();
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola Javier:
Ante todo, muchas gracias por responder.
Estoy de acuerdo con tu punto de vista respecto de @OnChange, pero de todas formas produce errores al crear una nueva entidad en donde hay una referencia dentro de un @ElementCollection que está anotada con @OnChange. Lo que ocurre es que se intenta insertar un Map vacío en la posición -1 de un List. De momento lo solucioné agregando la condición || collectionEditingRow == -1 en el método moveViewValuesToCollectionValues() de la clase org.openxava.view.View en la línea 2986 (ver código más abajo).
Si crees que está bien mi modificación, puedo reportarlo como bug.
Saludos,
private void moveViewValuesToCollectionValues() {
if (!isRepresentsElementCollection()) {
View parent = getParent();
if (parent == null) return;
parent.moveViewValuesToCollectionValues();
return;
}
if (collectionValues == null || collectionEditingRow == -1) return;
if (collectionEditingRow == collectionValues.size()) collectionValues.add(collectionEditingRow, getAllValues());
else collectionValues.set(collectionEditingRow, getAllValues());
}
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola, me encuentro ante la siguiente situación.
Tengo un @ElementCollection con atributos que dependen de un valor específico del padre.
En el ejemplo Factura - DetalleFactura, tendría que seleccionar el precio unitario del producto en función del tipo de cliente. Lo mismo me sucede con los descuentos por cada ítem.
¿Hay alguna manera de que cada vez que se cree un detalle de la factura se le pase la referencia a ésta?
Hola Gonzalo:
Los elementos de una @ElementCollection son @Embeddable que no tienen referencia al padre, esto es diferente a la @OneToMany. La ventaja es que puedes reutilizar esos @Embeddable en otras entidades, la desventaja es que no puedes poner lógica en el @Embeddable que dependa del padre, porque son de padre desconocido.
Lo que quiero decir es que no vas a poder usar un @DefaultValueCalculator. Eso no es ningún problema, puedes usar una acción @OnChague para cuando cambie la referencia a producto, desde la acción puedes acceder a la vista y de ahí al cliente.
Ayuda a otros en este foro como yo te ayudo a ti.
Hola Javier! Gracias por responder, hice eso exactamente pero me encuentro ante otro problema ahora.
En la vista principal tengo un campo "PorcentajeDescuento" que al cambiarlo necesito que me recalcule los totales debajo de la @ElementCollection.
Si coloco @OnChange en PorcentajeDescuento, tan solo al hacer click en "Nuevo" me da error:
WARNING: ¡ADVERTENCIA! No se ha reaccionado correctamente al cambio de MetaProperty:DetalleCotizacion.view.porcentajeDescuento.
Es decir, necesito resolver 2 cosas:
1) Evitar que se ejecute la acción @OnChange de PorcentajeDescuento al quere crear una nueva entidad.
2) Recalcular los detalles de mi factura cuando cambio el valor de PorcentajeDescuento.
Gracias de antemano.
Hola Gonzalo:
Al pulsar nuevo el valor cambia por lo que el @OnChage salte, eso no lo puedes evitar. Si no ¿que clase de @OnChange sería, que a veces va y a veces no? Tendrás que adaptar la lógica de tu acción para que no falle, se cual sea el valor que reciba.
Ayuda a otros en este foro como yo te ayudo a ti.
Hola Javier:
Ante todo, muchas gracias por responder.
Estoy de acuerdo con tu punto de vista respecto de @OnChange, pero de todas formas produce errores al crear una nueva entidad en donde hay una referencia dentro de un @ElementCollection que está anotada con @OnChange. Lo que ocurre es que se intenta insertar un Map vacío en la posición -1 de un List. De momento lo solucioné agregando la condición || collectionEditingRow == -1 en el método moveViewValuesToCollectionValues() de la clase org.openxava.view.View en la línea 2986 (ver código más abajo).
Si crees que está bien mi modificación, puedo reportarlo como bug.
Saludos,
Hola Gonzalo:
Para saberlo debería lanzar toda la suite de pruebas junit, además de añadir una para el nuevo bug.
Sí, por favor.
Ayuda a otros en este foro como yo te ayudo a ti.