Adodc, datagrid, datacombo

Abreviando. Tengo un DATACOMBO que relleno por medio de un control ADODC. Entonces, en función de lo que selecciones en el DATACOMBO, así se tiene que rellenar el DATAGRID. Eso lo hace perfecto, el problema es que el control DATAGRID también te permite actualizar, insertar y eliminar un registro. Por ejemplo, si quiero insertar un registro, pues en la fila en blanco relleno los campos y al desplazarme a otra fila en teoría la info. Debería quedar almacenada en la BD. Estoy trabajando con ACCESS 2000. Mi problema es que quiero que los cambios se vean reflejados de forma inmediata en el datacombo y eso no te lo hace ni pa tras. Tanto te lo actualiza al instante, como no te borra un registro, en fin, una patata.
Entonces me gustaría que me explicaras como puedo conseguir esto de la forma más sencilla posible o como lo harías tú. Si no es mucho pedir, como puedo realizar informes decentes. Prove el control DATAREPORT pro no se me ocurre como puedo realizar con el consultas parametrizadas.

1 Respuesta

Respuesta
1
Lo que hago yo para arreglar ese tipo de desaguisados, es forzar al DataCombo a que recargue los datos. Para esto, haría esto:
set dataCombo.DataSource=Nothing
ADODC.Recordset.Requery
set dataCombo.DataSource=ADODC
Es rudimentario, pero funciona.
Para parametrizar DataReports, lo mejor es crearlos sin asociarlos a ningún recordset. El DataReport te permite escribir los nombres de campos a mano, aunque no haya ningún DataSource, y como tú sabes los nombres de los campos de tu consulta, esto no será problema (supongo).
Entonces, en Access, creas la consulta parametrizada, por ejemplo:
PARAMETERS pID Long;
SELECT * FROM tTabla WHERE tTabla.id=[pID]
Luego, con un objeto ADODB.Command, haces esto:
With Command
.Parameters.Append .CreateParameter ("pID", adBigInt, , , 0)
Set DataReport.DataSource=Com.Execute
End With
La consulta devuelve un RecordSet que se asocia al DataReport. Entonces puedes hacer el Show.
Pero, problema, los informes no suelen ser simples listados, sino que lo útil es hacerlos del tipo maestro-detalle, por lo que hay que usar el Data Shaping.
El Data Shaping no puedes hacerlo desde Access, por lo que no te quedará otra alternativa que escribir el SQL adecuado en un String, y manipularlo para pasarle parámetros. Lo que yo suelo hacer, es crear una consulta en el DataEnvironment con la foirma que deseo, pero sin parametrizar ni nada semejante. Luego extraigo el SQL-Data Shaping de la consulta, ejecutando el código con esta línea añadidas:
Clipboard. SetText DataEnv. RsConsulta. Source
Luego, al pulsar Ctrl+V, saldrá algo así:
Shape
{SELECT * FROM Tabla} AS cTabla APPEND
(( SHAPE
{SELECT * FROM Tabla2} AS cTabla2
COMPUTE cConsulta BY 'agregado1','agregado2') AS cCounsulta_Grouping
RELATE 'id' TO 'id') AS cConsulta_Grouping
Entonces, tienes que insertar dos (o más, según la consulta que hayas hecho) cadenas que luego sustituirás por los criterios de tu búsqueda, "|C1|" y "|C2|", y lo meterás todo en un String:
Dim SQL as String
SQL=
"SHAPE " & _
"{SELECT * FROM Tabla |C1|} AS cTabla " & _
"APPEND " & _
"(( SHAPE " & _
"{SELECT * FROM Tabla2 |C2|} AS cTabla2 " & _
"COMPUTE cConsulta " & _
"BY 'agregado1','agregado2') AS " & _
"cCounsulta_Grouping " & _
"RELATE 'id' TO 'id') AS " & _
"cConsulta_Grouping"
Bueno, ya falta poco.
Entonces, confeccionas los criterios de búsqueda según consideres, con el método que prefieras. Haciéndolo directamente:
C1="WHERE a=1"
C2="WHERE precio>0"
y finalmente:
SQL=Replace(SQL,"|C1|",C1)
SQL=Replace(SQL,"|C2|",C2)
Teniendo en cuenta que, si no quieres usar criterios (por ejemplo, en C1), tienes que hacer lo mismo, pero con C1="", porque sino te dará un error de sintaxis.
Luego no tienes que hacer más que, con el mismo recordset que usaste para diseñar el Report, y que sigue asociado a él, llamado "cConsulta"
DtEnv. RscConsulta. Close
DtEnv. RscConsulta. Open SQL, ConexionDelDtEnv, adOpenKeySet, adLockReadOnly, adCmdText
Es un poco lioso, pero es la única manera que encontrado que REALMENTE funciona, ya que otras que he experimentado no dan los resultados esperados.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas