Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Lightbulb Pasar objetos entre Cliente y Servidor

Hola Club, En mi aplicación Datasnap quiero hacer una función del lado servidor que tome como parámetro un objeto tipo TClientDataSet y otro tipo TField, el problema es que aparentemente y no se bien el porque pero así parece en la ayuda Delphi, solo soporta entre las capas los siguientes tipos de datos, algo que resulta bastante limitado.

Boolean, SmallInt, Integer, Int64 ,Single ,Double ,AnsiString ,String ,
TDBXTime ,TDBXDate ,TJSONValue and all descendents ,TDBXWideStringValue ,TDBXAnsiStringValue, TDBXUInt8Value ,TDBXInt8Value ,TDBXInt16Value ,TDBXInt32Value ,TDBXInt64Value ,TDBXSingleValue ,TDBXDoubleValue ,TDBXBcdValue ,TDBXTimeValue ,TDBXDateValue
TDBXTimeStampValue ,TDBXBooleanValue ,TDBXReaderValue ,TDBXStreamValue

los siete primeros tipos son familiares pero los tipo TDBX, resultan nuevos para mi y estan relacionados con DBEXPRESS, ademas aparecen como clases.
¿Alguno de ustedes ha utilizado este tipo de datos?
¿Alguien tiene alguna sugerencia de como podría pasar objetos entre las dos capas?

Cualquier información referida es bienvenida.
Utilizo Delphi 2010.
Quizás en las versiones XE y XE2 esto se halla ampliado (que lo digan los usuarios de estas versiones).
Responder Con Cita
  #2  
Antiguo 07-06-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Para pasar mensajes por fuera del proceso de un ejecutable (osea, lo que esta en memoria en tu programa) con capacidad de operar en internet se necesita serializar/deserializar las cosas.

http://es.wikipedia.org/wiki/Serializaci%C3%B3n

Piensa que el mundo exterior a tu ejecutable no es delphi, ergo, no entiende los tipos de datos y funciones de delphi. Aunque te comuniques Delphi=>Delphi no hay una forma de decir "Hey, haz de cuenta que corremos en el mismo espacio de memoria, asi tu estes en nigeria!".

Asi que hay que traducir un objeto en un formato simplificado.

Por ejemplo, si una clase:

Código Delphi [-]
Persona = TPersona
  Nombre:String;

Persona.Nombre := 'mamcx';

Entonces se pasaria en un formato como json, xml, binario, o ini como este caso:

Código Delphi [-]
[TPersona]
Nombre=mamcx

Entre ambos procesos.

El que se pueda enviar TDBXTime y demas es solo porque esas clases tienen definido su codigo de serializacion/deserializacion. Osea, realmente NO ESTAS PASANDO EL OBJETO, estas pasando los datos que permiten recrear el objeto en el otro lado.

Entonces, debes es convertir tu objeto delphi en un formato que ambos extremos entiendan, como por ejemplo:

(Esto es un caso GENERICO)
http://stackoverflow.com/questions/3...ti-and-not-cus

y luego en el extremo que recibe el formato, creas un objeto TClientDataSet, y le metes esos valores.

----

AFORTUNADAMENTE ClientDataset permite guardar datos en un stream/xml:

http://stackoverflow.com/questions/3...xml-contents-i

Código Delphi [-]
ClientDataSet1.SaveToFile('file.xml',dfXML);
//Cargas el archivo en un string y lo envias aqui

Defines que el servidor pasa datos string.

y usas el metodo de LoadFromFile en el otro extremo. Listo
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 07-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Código Delphi [-]
ClientDataSet1.SaveToFile('file.xml',dfXML);
//Cargas el archivo en un string y lo envias aqui

Defines que el servidor pasa datos string.

y usas el metodo de LoadFromFile en el otro extremo. Listo[/quote]

Hola, muchas gracias por la respuesta gracias. guiame un poco como sera esto de cargar el un archivo xml. ya que no tengo experiencia en este lenguaje. Del lado servidor lo que tengo es esto por ejemplo:

Código Delphi [-]
function TPLDBVALIDACION.DatoVacio(oClientDataSet: TCustomClientDataset; var oCampo: TField): boolean;
begin
 // ...
end;

Esta función la llamaría desde el lado cliente al generar la clase cliente atreves del componente SQLConnection obviamente que esto no es posible ya que este tipo de datos (TCustomClientDataset y TField) no son soportados, por lo tanto como lo arias de la forma que vos me recomendaste?

Slds.
Responder Con Cita
  #4  
Antiguo 07-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Estuve probando el procedimiento y va bien pero al instante de hacer el LoadFromFile me da una excepción donde enuncia que no se puede abrir el archivo "C:\Users\..." (toda la ruta exacta en donde esta ubicado). Luego formula: El sistema no puede encontrar el archivo especificado. todo en la misma notificación. pero resulta raro que no lo localize siendo que la dirección que figura es exacta.

Código Delphi [-]
  vClientDataSet:= TCustomClientDataset.Create(nil);
  vClientDataSet.LoadFromFile(archivo); <----------------- Acá.
  vClientDataSet.Open;
Responder Con Cita
  #5  
Antiguo 08-06-2012
Avatar de StartKill
StartKill StartKill is offline
Miembro
 
Registrado: ene 2004
Posts: 299
Poder: 21
StartKill Va por buen camino
Hola Jere_84
Vamos a guiarnos por la sugerencia de mamcx, que está muy buena

Antes de nada unas palabras...: "El poderoso Datasnap que acorta distancias"

Jere_84 dice:
Cita:
Hola Club, En mi aplicación Datasnap quiero hacer una función del lado servidor que tome como parámetro un objeto tipo TClientDataSet y otro tipo TField, el problema es que aparentemente y no se bien el porque pero así parece en la ayuda Delphi, solo soporta entre las capas los siguientes tipos de datos, algo que resulta bastante limitado. .....
mamcx responde a la duda, solo vamos tomar la solución que él dá: (al margen de la explicación que nos dió, corta y buena)
Cita:
AFORTUNADAMENTE ClientDataset permite guardar datos en un stream/xml:

http://stackoverflow.com/questions/3...xml-contents-i

Código Delphi [-]
ClientDataSet1.SaveToFile('file.xml',dfXML);
//Cargas el archivo en un string y lo envias aqui
Defines que el servidor pasa datos string.
y usas el metodo de LoadFromFile en el otro extremo. Listo
Haciendo mas fácil esto:
En el lado cliente de tu aplicativo Datasnap
Código Delphi [-]
procedure TForm13.Button1Click(Sender: TObject);
var
   f: TextFile;
   xml, line: string;
   fileName: string;
begin
   fileName:= ExtractFilePath( Application.ExeName ) + 'datos.xml';
   ClientDataSet1.Open;
   ClientDataSet1.SaveToFile(fileName, dfXML);
   AssignFile(f, fileName);
   // podrias mejorar la lectura del archivo en un objeto memo
   reset(f);
   while not Eof(f) do
   begin
      ReadLn(f, line);
      xml := xml + line;
   end;
   closeFile(f);
   //-----
   //....
   xxxxx.carga(xml);  //llamas a tu método en el server; 
end;

En el lado server el método que recepciona los datos debria ser mas o menos asi:
Código Delphi [-]
procedure TServerMethodsServerProductos.carga(xml: string);
var
   f: TextFile;
   fileName: string;
begin
   fileName:= ExtractFilePath( Application.ExeName ) + 'dstos.xml';
   AssignFile(f, fileName);
   Rewrite(f);
   Write(f, xml);
   closeFile(f);
   ClientDataSet2.close;
   ClientDataSet2.LoadFromFile(fileName);
   ClientDataSet2.Open;
end;

Espero que sirva de algo el código...


Your friend

StartKill
Lima-Perú

Última edición por StartKill fecha: 08-06-2012 a las 01:18:03.
Responder Con Cita
  #6  
Antiguo 08-06-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Hola StartKill. Gracias por el código ¿Esto anda si mi aplicación cliente y servidor se alojan en distintas terminales de una red? o ¿En el caso de que estén conectadas por internet, en redes distintas?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Llamados a objetos entre formularios cmagno OOP 3 19-02-2010 22:41:01
se pueden pasar objetos como parametros? gabrielflowers PHP 1 01-04-2009 18:58:16
Cliente / Servidor carlosro_ec C++ Builder 2 11-12-2005 17:06:14
Cliente/Servidor Juvenal Varios 1 02-03-2005 21:27:43
BD en Cliente-servidor Phacko Conexión con bases de datos 0 18-08-2004 00:03:41


La franja horaria es GMT +2. Ahora son las 14:15:56.


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
Copyright 1996-2007 Club Delphi