sql - example - ClientDataset.RefreshRecord ya no funciona en Delphi XE para tablas unidas, ¿alguna solución temporal?
clientdataset delphi example (1)
TClientDataset.RefreshRecord ya no genera la parte de combinación de tabla de SQL al intentar actualizar un registro en un ClientDataset conectado a un conjunto de datos con una tabla unida en la declaración de SQL.
Como resultado, llamar a este método da como resultado "errores en los nombres de columnas inválidos" de SQL para cada campo que no se encuentre en la tabla principal.
Esto no fue un problema en Delphi 2010 y antes.
El error ocurre con los componentes DBX4 o BDE conectados al TClientDataset y, por lo tanto , es muy probable que el problema sea un problema con los cambios al código TClientDataset.
Para replicar este problema:
Cree una nueva aplicación en Delphi XE con solo un formulario y suelte los componentes de base de datos necesarios (TSQLMonitor, TSQLConnection, TSQLQuery, TDatasetProvider, TClientDataset, TDatasource y TDBGrid) y vincúlelos entre sí.
Creó una instrucción SQL simple con una unión de tabla y la colocó en la propiedad TSQLDataset.SQL.
La instrucción SQL incluía solo dos campos: el campo clave de la tabla principal y un campo de una tabla unida, por ejemplo, en pseudocódigo:
Select
MainTable.IntegerKeyField
, JoinedTable.JoinField
FROM MainTable
LEFT OUTER JOIN JoinedTable ON MainTable.LookupFieldID = JoinedTable.JoinKeyField
Agregue ambos campos como campos persistentes tanto en TSQLQuery como en TClientDataset con Provider Flag para el campo clave, incluido pfInKey (RefreshRecord no funcionará si no sabe qué campo es la clave, por lo tanto, los campos persistentes son obligatorios).
Agregue dos botones en el formulario: uno abre el Clientdataset y el segundo botón llama a clientdataset.refreshrecord;
Ejecute la aplicación, presione el botón para abrir el conjunto de datos y las pantallas de datos en la cuadrícula.
Presione el botón Actualizar registro, y obtendrá el error de SQL "nombre de columna no válido" para el campo unido.
Cierre la aplicación, abra el registro de SQLMonitor y en la declaración de actualización de SQL que Delphi generó, verá que no ha incluido la declaración de combinación de tabla.
====
Realmente apreciaría cualquier idea sobre cómo solucionar esto.
Intente usar una view
en la base de datos para implementar la unión requerida. Entonces el componente delphi puede simplemente seleccionar de view_name en lugar de tener que manejar la unión en sí misma.