Saludos: Necesito saber como hacer una Query de en DataSnap digamos un Inser o un Update de las tablas que quiera, Hasta Ahora en todos los tutoriales que he leido de DataSnap solo he visto establecer una conexión y utilizar DBExpress conectado a las tablas pero del lado del cliente no he podido hacer consultas libres a varias tablas. solo Aplicar Updates a los Dataset conectados. No se si me explico bien . por ejemplo tengo en DataSnap XE un servidor corriendo , conectado el cliente y trabajo las tablas con grid etc sin problemas , las puedo modificar y todo, ahora quiero hacer una query que ocupe varias tablas como lo hago ???? [img alt=Responder Con Cita]http://www.clubdelphi.com/foros/images/botones/quote.gif[/img][/color]

Querys en DataSnap
Started by
juank1971
, Mar 02 2011 02:39 PM
3 replies to this topic
#1
Posted 02 March 2011 - 02:39 PM
#2
Posted 02 March 2011 - 05:30 PM
Realmente no entiendo bien que es lo que estás haciendo exactamente, ni tampoco que es lo que quieres, pero intuyendo un poco te sugiero:
1- En vez de usar Tablas (si es a TSQLTable a lo que te refieres cuado hablas de tablas) usa TSQlQuery, por ejemplo, coloca en su propiedad SQL lo siguiente:
Ahora si lo que quieres es parametrizar o modificar una consulta sobre el mismo TSQLQuery, utiliza la propiedad CommadText del TClientDataset para cambiar la consulta, solo debes tener en cuenta que si usas campos persistentes en el TSQLQuery, la nueva consulta debe contener los mismos campos más no los mismos parámetros.
Si te explicas un poco mejor quizá podríamos ayudarte de una manera mas eficiente.
Saludos
1- En vez de usar Tablas (si es a TSQLTable a lo que te refieres cuado hablas de tablas) usa TSQlQuery, por ejemplo, coloca en su propiedad SQL lo siguiente:
SELECT * FROM TU_TABLA
Ahora si lo que quieres es parametrizar o modificar una consulta sobre el mismo TSQLQuery, utiliza la propiedad CommadText del TClientDataset para cambiar la consulta, solo debes tener en cuenta que si usas campos persistentes en el TSQLQuery, la nueva consulta debe contener los mismos campos más no los mismos parámetros.
Si te explicas un poco mejor quizá podríamos ayudarte de una manera mas eficiente.
Saludos
#3
Posted 03 March 2011 - 08:03 AM
Ok ME explico:
En DataSnap uso XE. como se pueden hacer consultas en el cliente, esa es mi duda.
Hasta Ahora tengo DbExpress en el servidor DataSnap
TsqlConnection conectado a Mysql a una base de datos con varias tablas
TsqlDataSet con select nombre,id_cliente from clientes
TDataSetProvider conectado al TsqlDataSet esto esta en el ServerContainerUnit1 del servidor DataSnap y todo funciona perfecto.
En el cliente
Un TsqlConnection, DsProviderConnection,TclientDataset y TDataSource conectado al servidor DataSnap y veo todo bien, pero quiero tener libertad en el cliente para poder usar el elnguaje SQL mas libre, digamos hacer consultas complejas y optener resultados en el cliente.
por ejemplo select id_cliente from facturas where id_cliente not in (select id_cliente from clientes)
esa query esta trabaja sobre dos tablas.
Lo que quiero es ejecutar cualquier consulta desde el cliente en una base de datos de varias tablas MySql que la tengo conectada en el DataSnap. que hasta ahora solo veo en los tutoriales de DataSnap solo conexiones ya preelaboradas en el servidor , como estas select id_cliente from facturas y eso me deja acceder desde el cliente solo a esos registros, pero yo quiero que en el cliente se puedan hacer querys libremente sin tener que diseñarlas previamente en el servidor .
Como siempre se ha hecho en delphi sin usar DataSnap yo siempre he puesto un objeto Query el que sea conectado a un Connection el que sea y he podido hacer cualquier consulta a una base de dsatos completa de varias tablas y eso es lo que no se como hacer en DataSnap
En DataSnap uso XE. como se pueden hacer consultas en el cliente, esa es mi duda.
Hasta Ahora tengo DbExpress en el servidor DataSnap
TsqlConnection conectado a Mysql a una base de datos con varias tablas
TsqlDataSet con select nombre,id_cliente from clientes
TDataSetProvider conectado al TsqlDataSet esto esta en el ServerContainerUnit1 del servidor DataSnap y todo funciona perfecto.
En el cliente
Un TsqlConnection, DsProviderConnection,TclientDataset y TDataSource conectado al servidor DataSnap y veo todo bien, pero quiero tener libertad en el cliente para poder usar el elnguaje SQL mas libre, digamos hacer consultas complejas y optener resultados en el cliente.
por ejemplo select id_cliente from facturas where id_cliente not in (select id_cliente from clientes)
esa query esta trabaja sobre dos tablas.
Lo que quiero es ejecutar cualquier consulta desde el cliente en una base de datos de varias tablas MySql que la tengo conectada en el DataSnap. que hasta ahora solo veo en los tutoriales de DataSnap solo conexiones ya preelaboradas en el servidor , como estas select id_cliente from facturas y eso me deja acceder desde el cliente solo a esos registros, pero yo quiero que en el cliente se puedan hacer querys libremente sin tener que diseñarlas previamente en el servidor .
Como siempre se ha hecho en delphi sin usar DataSnap yo siempre he puesto un objeto Query el que sea conectado a un Connection el que sea y he podido hacer cualquier consulta a una base de dsatos completa de varias tablas y eso es lo que no se como hacer en DataSnap
#4
Posted 03 March 2011 - 08:36 AM
En el servidor DataSnap hice esto en el modulo de los metodos que son visibles desde los clientes
una funcion que se le pasa como parámetros una consulta y devuelve unos resultados en el objeto TSQLQuery
y en el cliente la uso de la siguiente manera, despues de haber comprobado y generado la clase respectiva en el cliente con la respectiva funcion del servidor
donde DataSnapCon es la conexion al servidor DataSnap y GetServerComandos es la funcion que tengo creada en el servidor que se le pasa una onsulta como parámetros y me devuelve un TSQLQuery.
y me da en esta linea Data := Consulta.GetServerComandos(s);
el error
Remote error : Insufficientent RTTI available to support this operation
delphi
[b][pre][size=3]function TServerMethods1.GetServerComandos(SQ: string): TSQLQuery; begin with ServerComandos do begin active := false; sql.Add(SQ); ExecSQL; end; result := ServerComandos; end;[/size][/pre][/b]
una funcion que se le pasa como parámetros una consulta y devuelve unos resultados en el objeto TSQLQuery
y en el cliente la uso de la siguiente manera, despues de haber comprobado y generado la clase respectiva en el cliente con la respectiva funcion del servidor
delphi
var Consulta:TServerMethods1Client; Data:TSQLQuery; begin Data :=TSQLQuery.Create(nil); // creo un objeto TSQLQuery vacio Consulta := TServerMethods1Client.Create(ClientModule1.DataSnapCon.DBXConnection); // creo el objeto de acceso a los metodos en el cliente con la conexion DataSnap realizada try s:= 'select id_acceso from accesos where'+ ' (id_acceso not in '+ ' ( select id_acceso from acceso_usuario where id_usuario = '+ IntTostr(Idu)+'))' ; //asigno el resultado de la fucnion del servidor al objeto Data con la query //pasada como parametros Data := Consulta.GetServerComandos(s); finally Consulta.Free; // libero los metodos end;
donde DataSnapCon es la conexion al servidor DataSnap y GetServerComandos es la funcion que tengo creada en el servidor que se le pasa una onsulta como parámetros y me devuelve un TSQLQuery.
y me da en esta linea Data := Consulta.GetServerComandos(s);
el error
Remote error : Insufficientent RTTI available to support this operation