¡Hola a todos!
Cuando tenemos una relación maestro-detalle entre dos conjuntos de datos, al llamar al método
Cancel o
Delete de la tabla maestra, una de las primeras cosas que sucede es que
la tabla detalle intenta guardar su registro actual en caso de que éste se encuentre en modo de edición o inserción y la propiedad Modified esté en True. He revisado el código de la VCL, descubriendo la causa de ello. Tiene que ver con el evento interno deCheckBrowseMode lanzado por los métodos mencionados, y tal comportamiento puede ser hasta cierto punto respetable y útil.
No obstante, en muchas ocasiones me ha resultado inconveniente que suceda eso. Al grado de que he llegado a escribir código como este:
Código Delphi
[-]
TablaDetalle.Cancel;
TablaMaestra.Cancel;
Código Delphi
[-]
TablaDetalle.Cancel;
TablaMaestra.Delete;
Parece algo simple, pero una regla que he aprendido de la programación es que por cada sentencia escrita aumenta la probabilidad de los problemas. ¿Qué pasa si, en lugar de uno solo, son tres los conjuntos de datos detalle de nuestra tabla maestra? Tendríamos que escribir algo como esto:
Código Delphi
[-]
TablaDetalle1.Cancel;
TablaDetalle2.Cancel;
TablaDetalle3.Cancel;
TablaMaestra.Cancel;
¿Y si fuera una relación maestro-detalle triple
Tabla1-Tabla2-Tabla3? Tendríamos que asegurarnos de establecer el correcto orden de cancelaciones:
Código Delphi
[-]
Tabla3.Cancel;
Tabla2.Cancel;
Tabla1.Cancel;
No vayamos a poner por error primero
Tabla2 y luego
Tabla3 porque nos aguada la sopa.
Todo esto me ha llevado a agregar una nueva propiedad Boolean a mi componente derivado de TClientDataSet, la cual he llamado
AutoCancelDetails (se aceptan sugerencias de nombres alternativos). La idea es que si esta propiedad tiene un valor de True, baste una sola sentencia para cancelar el modo de edición en todos los conjuntos de datos relacionados.
De igual forma, una sentencia como
se aseguraría de cancelar el modo de edición de todas las tablas detalle.
La pregunta de los 64 GB:
¿Debe tener esta nueva propiedad un valor predeterminado de True? Esto significaría que el componente predeterminadamente tendría cierto y muy específico comportamiento que diferiría del nativo, lo cual podría darle más peso a que el valor predeterminado sea False. ¿Pero acaso no son muy pocas las situaciones donde desearíamos que un
Cancel o un
Delete sobre una tabla maestra se asegure de guardar un posible registro en edición de sus conjuntos de datos detalles?
¿Ustedes qué opinan? ¿Aprueban esta declaración?
Código Delphi
[-]
Property AutoCancelDetails :Boolean Read FAutoCancelDetails
Write FAutoCancelDetails Default True;
Gracias por sus opiniones.
Al González.