Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar Array como Parametro (https://www.clubdelphi.com/foros/showthread.php?t=91773)

usuario1000 21-04-2017 21:20:40

Pasar Array como Parametro
 
Holal a todos.

Tengo un problemilla que he intentado resolver y no hay manera. Expongo lo que me ocurre:
Sigo desarrollando mi aplicación Cliente - Servidor, y ahora me toca enviar los datos del cliente al servidor para que los grabe en la tabla correspondiente.
El problema que se me plantea es que cuando llamo a la funcion que he creado previamente en el servidor e intento pasarle los datos, estos son muchos, exactamente 45 parametros y me da error, porque superan los 32 que existe como máximo en cuanto a pasar parametros se refiere.
La solucion que intento dar es crear un Array de String con 45 posiciones y pasar el Array como único parámetro a através de la función, pero me da errores de incompatibilidad de datos.

He leido algo por el foro de crear el array dentro de un Type, pero no me aclaro, por si alguien me lo puede explicar de manera sencilla y clara con un ejemplo. Lo que tengo ahora mismo es esto.
Código Delphi [-]
Function GrabarDatos:Boolean;
var
    funcion:Tservermethods1client;

    tabla: Array of String;
begin

     funcion := Tservermethods1client.Create
             (FModuloDatos.SQLConnection.DBXConnection);

    SetLength(tabla,45);
    tabla[0] := Edit1.text;  
    tabla[1] := Edit2.text;
    ....
    Tabla[45]:= edit45.text;

     resultado:= funcion.GragarEnServidorDatos(Tabla); 

end;
Así no me funciona, pero no se como arreglarlo para enviar los datos al servidor.

Agradezco un poco de luz, gracias a todos.

nota: Delphi 10 Seattle.

Caminante 21-04-2017 21:29:56

Hola

Para declarar un tipo de dato que sea un array puedes hacer:

Código Delphi [-]
Type

MiArray=Array[1..45]of string;

Y para usarlo

Código Delphi [-]
var
 UnaVariable:MiArray;

Saludos

usuario1000 21-04-2017 21:35:45

Cita:

Empezado por Caminante (Mensaje 515761)
Hola

Para declarar un tipo de dato que sea un array puedes hacer:

Código Delphi [-]Type MiArray=Array[1..45]of string;


Y para usarlo

Código Delphi [-]var UnaVariable:MiArray;


Saludos


Gracias Caminante por responder tan rápido, pero si hago eso al compilar me da el siguiente error:
E2010 Incompatible types: 'string' and 'MiArray'

En la funcion:
resultado:= funcion.GrabarEnServidorDatos(Tabla);

Caminante 21-04-2017 21:42:29

Y de que tipo es Tabla.
En ese caso debes usar el mismo tipo de dato que estas creando.

usuario1000 21-04-2017 21:44:45

Cita:

Empezado por Caminante (Mensaje 515764)
Y de que tipo es Tabla.
En ese caso debe ser del mismo tipo que estas creando.

Tabla está definido como:

tabla:MiArray;

Caminante 21-04-2017 21:48:11

Pues se me hace raro
Podrias poner un poco mas de codigo?

usuario1000 21-04-2017 21:54:01

Cita:

Empezado por Caminante (Mensaje 515766)
Pues se me hace raro
Podrias poner un poco mas de codigo?

He avanzado un poquito.
Lo que tengo ahora mismo es:
Código Delphi [-]
 
type
  TMiRegistro = record
       TablaDatos : array [0..45]  of String;
  end;
...
function TFRecibidas.grabarFactura:Boolean;
var
  tabla : TMiRegistro;
begin

  funcion := Tservermethods1client.Create
    (FModuloDatos.SQLConnection.DBXConnection);

        tabla.TablaDatos[0]:= eDocumento.Text;
        tabla.TablaDatos[1]:= eAno.Text;
        tabla.TablaDatos[2]:= eEmp.Text;
         ...

  resultado := funcion.GrabarFactura(tabla.TablaDatos[0]);   // Así sí lo compila, pero no me deja pasar la tabla completa me da error

end;

Código Delphi [-]
 [dcc32 Error] FacturasRecibidas.pas(1639): E2010 Incompatible types: 'string' and 'TMiRegistro'

usuario1000 21-04-2017 21:56:37

Código Delphi [-]
resultado := funcion.GrabarFactura(tabla);  // Esto es lo que pretendo pasar, la tabla completa, Pero da el error antes dicho.

Caminante 21-04-2017 22:04:27

En el metodo grabarfactura pareciera que el parametro que le pasas esta esperando un string y no un Array.

Es la unica explicacion que le veo.

Como esta declarado este metodo???

usuario1000 21-04-2017 22:09:53

El metodo declarado en el servidor al que llamo desde el cliente está declarado de la siguiente forma:
Código Delphi [-]
function GrabarFactura (tabla:array of string):boolean;

Caminante 21-04-2017 22:11:00

Tambien debe ser de tipo MiArray sino se interpreta como un tipo diferente.

usuario1000 21-04-2017 22:11:56

Cita:

Empezado por Caminante (Mensaje 515771)
Tambien debe ser de tipo MiArray sino se interpreta como un tipo diferente.

Ok, lo voy a cambiar y te comento lo que me sale.

usuario1000 21-04-2017 22:20:44

Cita:

Empezado por usuario1000 (Mensaje 515772)
Ok, lo voy a cambiar y te comento lo que me sale.

He declarado lo mismo que en el Cliente, pero ahora la funcion GrabarFactura no la reconoce en el CLIENTE
:confused:

Caminante 21-04-2017 22:31:52

Bueno ahi no sabria decirte, nunca he usado datasnap. Pero en una aplicacion ordinaria deberia funcionar.

Voy a ver si investigo algo sobre el tema.

usuario1000 21-04-2017 22:56:49

Cita:

Empezado por Caminante (Mensaje 515774)
Bueno ahi no sabria decirte, nunca he usado datasnap. Pero en una aplicacion ordinaria deberia funcionar.

Voy a ver si investigo algo sobre el tema.


ok, voy a ver si doy mientras con la solución

Soa Pelaez 29-04-2017 00:08:29

Podes hacerlo de esta manera.

Código Delphi [-]
//Tabla --> Es el clientdataset que envia la información al servidor
function EnviaInfoCDS(Tabla: TClientDataSet): OleVariant;
var
 Info: OleVariant;
 i: Integer;
begin
  Info:= VarArrayCreate([0, Tabla.FieldCount], varVariant);
  for i := 0 to Tabla.FieldCount -1 do
     Info[i] := Tabla.Fields[i].Value;
  Result:= Info;
end;

Y el result lo envias dentro de la función que tienes en el servidor, la variable que lo recibe debe ser de este tipo y ya asi te sirve.

En el servidor haces lo contrario a esta función para recibir el contenido de la variable me explico.
Ambos clientdataset deben tener la misma cantidad de campos.

Código Delphi [-]
procedure RecibeInfoCDS(Info: OleVariant);
begin
  //Tabla --> Es el clientdataset que recibe la información que envia el cliente.
  for i := 0 to Tabla.FieldCount -1 do
     Tabla.Fields[i].Value:= Info[i];
end;

usuario1000 29-04-2017 15:22:20

Muchas gracias, Soa Pelaez, lo pondré en práctica, puesto que he tenido que ingeniarmelas para hacerlo de otra manera menos ortodoxa. :D.

En cuanto me salga la ocasión, que me saldrá, la pongo en práctica.

Muy agradecido. ^\||/


La franja horaria es GMT +2. Ahora son las 10:47:54.

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