Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Consultas en cliente movil a un server Datasnap (https://www.clubdelphi.com/foros/showthread.php?t=86776)

lbidi 01-10-2014 18:12:45

Consultas en cliente movil a un server Datasnap
 
Estimados.

Estoy realizando pruebas con los servidores DataSnap y aplicaciones mobiles. He visto casi todos los videos y ejemplos que hay los cuales me han funcionado, pero hasta ahora no he logrado hacer lo siguiente, necesito hacer consultas a "demanda" contra mi server dsanp y por lo que he visto hasta ahora, hay que "crear" las consultas previamente en el server para que pueda "publicarlas" al cliente.

O sea.. tengo el ds server con una FDConnection, una FDQuery y un TDataSetProvider. Me conecto a mi bd sin problemas.

Por otro lado tengo mi cliente movil con los componentes TSQLConnection ( apuntando al dnsap) , un DSProviderConnection y un TClientDaset ( apuntando al TDataSetProvider del server ).

Mi problema y aqui el motivo de la pregunta es como puedo hacer x ej. de agregar un tedit en el form
principal del cliente movil y obtener un dataset de una tabla cualquiera y obviamente asignarle el resultado a otros tedits. Se que debo utilizar parametros pero no me doy cuenta como y donde se lo indicio para que el server lo tome y me devuelva la respuesta que necesito. Se entiende?
Los componentes que uso en el cliente son los que deberia usar?

Uno esta acostumbrado a realizar consultas de ese tipo y con joins de varias tablas en aplicaciones comunes de escritorio pero con las moviles y los datasnap me las estoy viendo dificil.
Se puede hacer este tipo de consultas ???

Se agradece cualquier luz en el camino.. ;)

Saludos.

edgargh 01-10-2014 23:29:06

Hola, hay varias formas de hacerlo, yo lo manejo de la siguiente manera:

Del lado del servidor datasnap solo dejo la conexión y el dataset (Query o Table) enlazado a la conexion.

Ejemplo: Creo una funcion que se llama lista_estados que recibe de parametro una cadena con el nombre del pais sobre el cual deseo obtener el listado de los estados y el resultado lo regreso en un dataset

Código Delphi [-]
function TServerModule.lista_estados(Pais: string):TDataset;
begin
  qry_estados.Close;
  qry_estados.SQL.Clear;
  qry_estados.SQL.Add('select clave, nombre_estado ');
  qry_estados.SQL.Add('from estados ');
  qry_estados.SQL.Add('where nombre_pais='+quotedstr(pais));
  qry_estados.SQL.Add(' order by nombre_estado');
  qry_estados.Open;

  result:=qry_estados;
end;


De lado del cliente móvil agrego:

TSQLServerMethod.- lo nombro sm_estados y asocio las propiedades:

SQLConnection conexion_al_servidor_datasnap
ServerMethodName TServerModule.lista_estados
Params Nos aparecen 2 parametros: Pais (Entrada) y ReturnParameter (salida). Asociamos el tipo ftWideString al parametro Pais


TDatasetProvider.- lo nombro dsp_estados y le asocio en la propiedad Dataset el nombre de mi servermethod (sm_estados).

TClientDataSet .- lo nombro cds_estados y le asocio en la propiedad ProviderName el nombre de mi datasetprovider (dsp_estados)


Finalmente, hago mi consulta:
Código Delphi [-]
    sm_estados.close;
    sm_estados.Params.ParamByName('Pais').Value:=editpais.text;
    sm_estados.ExecuteMethod;
    sm_estados.SQLConnection.Close;
El resultado lo tengo en cds_estados y lo visualizo donde quiera. Saludos y espero sea lo que necesitas.

lbidi 03-10-2014 17:43:33

Gracias Edgard por responder.

Ahora mi pregunta es, segun tu experiencia, es necesario definir previamente todas las consultas en el ds server antes de poder "usarlas" desde el cliente ? En otras palabras, es posible desde el cliente crear las consultas ( querys ) que necesite y que el ds server me responda ??? Como ??

Mil gracias

Saludos cordiales.

AgustinOrtu 12-10-2014 22:46:01

Buenas, esto no es una critica, solo expongo mi punto de vista al trabajar con datasnap.

La idea del trabajo con datasnap es un escenario de cliente-servidor, en la cual el cliente es quien se adapta al servidor y no el servidor al cliente. Imaginate que el servidor lo programa otra persona y vos no tenes acceso a modificarlo o agregarle funcionalidad directamente, basicamente es un "arreglate con lo que te doy, si no lo tengo lo lamento". Cuando estas en el cliente movil el servidor deberia ser una caja negra, no sabes exactamente como trabaja, solamente sabes que le pides algo y el cumple y te devuelve.

Dicho esto, yo creo que la forma correcta de trabajar con datasnap, es publicando todos los metodos necesarios en el servidor y que el cliente haga los llamados correspondientes. El cliente basicamente se encarga de, pedir informacion y luego presentarla, ordenarla , formatearla, como decimos aca, ponerla pipi cucu.

Saludos!

Casimiro Notevi 12-10-2014 23:08:36

Cita:

Empezado por AgustinOrtu (Mensaje 482966)
... el servidor deberia ser una caja negra, no sabes exactamente como trabaja, solamente sabes que le pides algo y el cumple y te devuelve.

Exactamente, esa es la filosofía cliente/servidor.

mamcx 12-10-2014 23:30:24

Cita:

Empezado por lbidi (Mensaje 482520)
En otras palabras, es posible desde el cliente crear las consultas ( querys ) que necesite y que el ds server me responda ??? Como ??

De la misma manera que lo harias en una app monolitca. Solo que en vez de tener todo acoplado (logica, GUI, datos, etc) lo desacoplas:

Código Delphi [-]

procedure CargarClientes(...)
begin
  Clientes := ServidorRemoto.ListarClientes(["Codigo", "Nombre"], TWhere(Campo="Codigo", Valor=1));
end;

function ListarCliente(ListaCampos, Filtros):TDataSet
---
P.D:
Ten en cuenta que una vez tenes un servidor expuesto en internet, no solo tu cliente sera el unico que exista. Estas abriendote a que te envien datos/comandos maliciosos (y ademas, tampoco debes confiar en *tu propio* cliente: Lee sobre injeccion de sql en google!)

AgustinOrtu 13-10-2014 04:38:20

Cita:

Empezado por mamcx (Mensaje 482968)
Ten en cuenta que una vez tenes un servidor expuesto en internet, no solo tu cliente sera el unico que exista. Estas abriendote a que te envien datos/comandos maliciosos (y ademas, tampoco debes confiar en *tu propio* cliente: Lee sobre injeccion de sql en google!)

Con respecto a este punto, podes usar autenticación y autorización de datasnap. Yo mucho no te puedo decir más que darte algún link que tengo ahí guardado pendiente de estudio para el día que realice algo en serio, de momento solo he jugado un poco con datasnap

edn.embarcadero.com/article/41267

Saludos!

lbidi 15-10-2014 02:23:28

Muchas gracias a todos por sus respuestas. Me han dado muchas ideas y sugerencias.

Saludos.


La franja horaria es GMT +2. Ahora son las 08:53:14.

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