Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Aplicacion distribuida Modificar TSQLDataSet en servidor (https://www.clubdelphi.com/foros/showthread.php?t=72321)

delphijm 10-02-2011 18:05:38

Aplicacion distribuida Modificar TSQLDataSet en servidor
 
Hola a todos,

Estoy desarrolando una aplicacion de 3 capas con DBExpress y TWebConnection via HTTP...

En el lado del servidor tengo el DataModule remoto donde estan ubicados los TSQLDataSet con sus correspondientes TDatasetProvider, a los que accedo desde el lado del cliente...

El tema esta en que en algunos casos me interesaria poder modificar el DataSet que me genera el TSQLDataSet (select * from xxx) antes de enviarlo al cliente...

En concreto me interesaria poder añadir un nuevo campo que no proviene de la base de datos y alimentarlo con el valor que me interese...

No se como hacer esto, si debo hacerlo en algun evento del TSQLDataSet o en alguno del TDataSetProvider...

El hecho es que lo he intentado, por ejemplo, en el evento AfterOpen del TSQLDataSet y tambien en el OnGetData del TDataSetProvider y en ambos casos me lanza un "error catastrofico"...

Alguien sabe como podria imlementar esto??

Gracias

ElKurgan 11-02-2011 07:56:37

Una opción es activar en el Provider la propiedad "AllowCommandText". Con esto ya puedes modificar cualquier sentencia SQL en "ClientDataset.CommandText" que estés usando en el lado cliente.

Saludos

delphijm 12-02-2011 18:51:45

Cita:

Empezado por ElKurgan (Mensaje 390658)
Una opción es activar en el Provider la propiedad "AllowCommandText". Con esto ya puedes modificar cualquier sentencia SQL en "ClientDataset.CommandText" que estés usando en el lado cliente.

Saludos

Hola ElKurgan,

Con esta propiedad que me comentas puedo cambiar el CommandText del TSQLDataSet desde el lado del cliente, si, asi cuando haces el open del TClientDataSet en el cliente provoca que el TSQLDataSet en el servidor ejecute el CommandText asignado desde el cliente...

Ya uso esto actualmente para determinar que sentencia SELECT usar pero el tema esta en que cuando el TSQLDataSet del servidor ya ha obtenido el conjunto de datos y se los envia al TDataSetProvider, ANTES de que este se los envie por la "red" al TClientDataSet, y TODAVIA en el lado del servidor, me interesa actuar en el dataset en el sentido de añadir un nuevo campo fkInternalCalc y recorrer todo el dataset para asignarle un valor...

El valor que quiero asignar a esta nueva columna lo tengo que recuperar de una tabla de la BBDD y claro, no quiero hacer esto en el cliente y empezar a lanzar solicitudes por la red para cada registro...

La cuestion es, en que evento del TDataSetProvider del lado del servidor, puedo modificar el dataset antes de que este se envie al cliente?

Gracias y Un saludo

Al González 12-02-2011 19:35:40

Cita:

Empezado por delphijm (Mensaje 390600)
En concreto me interesaria poder añadir un nuevo campo que no proviene de la base de datos y alimentarlo con el valor que me interese...

Cita:

Empezado por delphijm (Mensaje 390785)
El valor que quiero asignar a esta nueva columna lo tengo que recuperar de una tabla de la BBDD [...]

¿Tendrá o no tendrá esa columna información extraída de la base de datos? :)

delphijm 12-02-2011 21:14:20

Hola Al,

En el dataset quiero añadir un nuevo campo de tipo fkInternalCalc (para poder hacer con el lo que quiera sin afectar a la BBDD), asi acabare teniendo en este dataset, los campos de la tabla + este nuevo campo...

Con esto, quiero recorrer el dataset desde el primer hasta el ultimo registro (first, while not eof, next,....) y asignar un valor a este nuevo campo...

Este valor lo obtendre de la base de datos a traves de un TClientDataSet + TDataSetProvider + TSQLDataSet diferentes...

En concreto, la tabla principal es, por ejemplo, una tabla de facturas con varios campos, uno de ellos, el codigo del cliente... Pero yo quiero añadir tambien el nombre del cliente...

Este nuevo campo es para almacenar el nombre del cliente que obtendre de la tabla de clientes...

Gracias Al

Josep Mª

Al González 13-02-2011 06:10:31

En ese caso lo más adecuado sería añadir el nombre del cliente en las columnas de la consulta SQL, y luego, en el objeto campo correspondiente desactivar las banderas pfInUpdate y pfInWhere. Esto es otra manera de hacer que un campo no se considere a la hora de aplicar los cambios a la base de datos.

delphijm 13-02-2011 11:11:22

Hola Al,

Mañana lo probare...

La sentencia select la construyo en tiempo de ejecucion por lo que en tiempo de diseño no conozco los campos que existiran en el dataset...

En algun evento del TSQLDataSet del lado del servidor cambiare estos flags del campo "añadido"... Esto esta claro...

Lo que no veo tan claro es en que evento del TSQLDataSet o quizas mejor del TDataSetProvider, siempre en el lado del servidor, podre asignar valor a esta columna... Como decia en el primer mensaje, me lanzaba un "error catastrofico" cuando intentaba crear el campo y asignarle valor en algunos eventos... Pero quizas el problema estaba en el momento de crear el nuevo campo... Como asi como indicas el campo ya vendra creado quizas me funcione...

Lo probare y ya te contare...

Gracias

delphijm 18-02-2011 20:00:09

Hola Al,

Ya me funciona perfectamente... Intento exponer el tema por si sirve de ayuda para alguien...

El tema esta en lo siguiente:

La sentencia select la construyo en el lado del cliente segun mis necesidades y modifico la propiedad "commandtext" del TSQLDataSet del lado del servidor a traves del metodo AS_Execute del interface AppServer del clientDataset asi:

CDSPedidos.AppServer.AS_Execute(provider, commandSQL, params, own)

donde "commandSQL" es la sentencia select que obtengo, ahora no viene al caso como, pero era de un tipo asi:

select PED.*, CLI.nombre as NombreCliente from TABLAPedidos PED
join TABLAClientes CLI on PED.idCliente=CLI.idCliente

Por mas que hacia nunca conseguia que la consulta me devolviera la columna con el nombre del cliente...

Lo siento, me ofusque en enfocar el problema en el join pensando que quizas no podia incluirse join en la propiedad "CommandText"...

El problema es que, en el TSQLDataSet del servidor habia hecho persistentes todos los campos de la tabla PED sin incluir el campo NombreCliente, asi, al ser persistentes todos los campos menos este, claro, nunca me llegaba...

Simplemente he acabado asignando un valor a la propiedad Commandtext del TSQLDataSet del servidor "generica", es decir de un tipo como el anterior, asi al hacer los campos persistentes ya me incluye el nombre del cliente... De hecho lo unico "dinamico" que añado segun mis necesidades en el select es todo lo correspondiente a la clausula "where"...

Y ya esta... pagando la inexperiencia en Delphi, pero persistire en el intento de dominarlo...

Gracias por vuestra ayuda ElKurgan y Al

Josep Mª


La franja horaria es GMT +2. Ahora son las 20:14:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi