Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Error al guardar valores en un Array de TRemotable. (https://www.clubdelphi.com/foros/showthread.php?t=79598)

mlegnazzi 20-07-2012 16:32:47

Error al guardar valores en un Array de TRemotable.
 
Hola a todos. Necesito de su ayuda. Tengo la siguiente declaración:

Código Delphi [-]
TInvoice_Body = class(TRemotable)
private
FItem_Descripcion: string;
FItem_Value: Currency;
published
property Item_Descripcion: string read FItem_Descripcion write FItem_Descripcion;
property Item_Value: Currency read FItem_Value write FItem_Value;
end;
IBodyArray = array of tInvoice_Body;
y luego..
Código Delphi [-]
TInvoice = class(TRemotable)
private
FInvoiceBody : IBodyArray;
public
published
property InvoiceBody : IBodyArray read FInvoiceBody write FInvoiceBody;
end;

Mi problema es que al asignar valores al array me da un error de memoria:

Result.InvoiceBody[0].Item_Descripcion := 'X';

Alguien me sabria decir que estoy haciendo mal. Desde ya muchas gracias.

Matias

egostar 20-07-2012 17:37:42

Podrías mostrar el código completo de como estás asignando los valores, así no se te puede dar comentario alguno.

Saludos

matiaslegnazzi 20-07-2012 18:00:49

Egostar, gracias por tu respuesta. Adjunto el codigo completo.
Es la primera vez que utilizo TRemotable y creo que mi problema es que no inicializo Items (arrayofitem). Pero ya lo intenté y no se como hacerlo.
Saludos y Gracias

Código Delphi [-]
Invoice_Body = class(TRemotable)
  private
    FItem_Descripcion: string;
    FItem_Value: Currency;
   published
    property Item_Descripcion: string read FItem_Descripcion write FItem_Descripcion;
    property Item_Value: Currency read FItem_Value write FItem_Value;

  end;
  ArrayOfItem = array of Invoice_Body;

   TInvoice = class(TRemotable)
  private
    FBranch_Code: Integer;
    FItems: ArrayOfItem;
  public
   published
    property Branch_Code: Integer read FBranch_Code write FBranch_Code;
    property Items: ArrayOfItem read FItems write FItems;
  end;

   { Invokable interfaces must derive from IInvokable }
  IwsEPS30 = interface(IInvokable)
  ['{43B60693-DBC8-4874-8267-A93FB02EAD08}']

   function WSEPS30_Invoice(ParamsStr:trParams): tInvoice; stdcall;

Luego en el código de WSEPS30_Invoice....
Código Delphi [-]
function twsEPS30.WSEPS30_Invoice(ParamsStr:trParams): tInvoice; stdcall;
var ck: widestring;
    cal: currency;
    tr_bl: OleVariant;
begin
 svr:= CoEps30Svr.create();
 result := tInvoice.Create;
 svr.LogOnEx(ParamsStr.SystemName,Paramsstr.ClientId,Paramsstr.UserName,Paramsstr.Password,Paramsstr.  AppName,ck);
 svr.PrepareByMoney(ck, Paramsstr.ClientId, Paramsstr.MeterNumber, Paramsstr.Money, 0, cal);
 tr_bl:= svr.GetInvoiceData(ck,svr.Confirm(ck));
 With Result do
 Begin
  Branch_Code := tr_bl[0][1];
  Items[0].Item_Descripcion := tr_bl[1][0][0];
  Items[0].Item_Value := tr_bl[1][0][1];
 End;
End;

egostar 20-07-2012 18:37:33

Hola matiaslegnazzi

Intenta con esto

Código Delphi [-]
function twsEPS30.WSEPS30_Invoice(ParamsStr:trParams): tInvoice; stdcall;
var 
  ck: widestring;
  cal: currency;
  tr_bl: OleVariant;
  
begin
  svr:= CoEps30Svr.create();
  result := tInvoice.Create;
  svr.LogOnEx(ParamsStr.SystemName,Paramsstr.ClientId,Paramsstr.UserName,Paramsstr.Password,Paramsstr. AppName,ck);
  svr.PrepareByMoney(ck, Paramsstr.ClientId, Paramsstr.MeterNumber, Paramsstr.Money, 0, cal);
  tr_bl:= svr.GetInvoiceData(ck,svr.Confirm(ck));
  
  //Asignamos el espacio de memoria con los registros que quieras regresar, por lo que veo es solo uno
  Setlength(result.Items,1); 
  
  With Result do
  Begin
    Branch_Code := tr_bl[0][1];
    Items[0].Item_Descripcion := tr_bl[1][0][0];
    Items[0].Item_Value := tr_bl[1][0][1];
  End;
End;

Saludos

matiaslegnazzi 20-07-2012 18:48:02

Gracias Egostar. Había intentado eso pero recibo el siguiente error al compilar:

[Error] wsEPS30Impl.pas(80): Constant object cannot be passed as var parameter

Saludos.

egostar 20-07-2012 19:01:39

Ok, ¿y si cambias esto?

Código Delphi [-]
Invoice_Body = record
  Item_Descripcion: string;
  Item_Value: Currency;
end;

ArrayOfItem = array of Invoice_Body;

Lo hago de memoria, pero me parece que no necesitas hacer del Arreglo de Items una clase TRemotable, ya que está dentro de otra clase TRemotable, debe bastar con un record.

Saludos

matiaslegnazzi 20-07-2012 19:12:06

Hice la modificacion, pero sigue dando el mismo error al compilar.

Me parece que si lo declaro como Record en lugar de Tremotable pierdo la property Item_Description e Item_value.

Agradezco tu ayuda. Por mi parte voy a investigar porque da ese error al inicializar el array.
Saludos

matiaslegnazzi 20-07-2012 20:03:27

No hay caso. Ya intente de mil formas y recibo el error de memoria, como si el array no estuviera inicializado. Tampoco puedo inicializarlo en la declaracion del array.
Saludos

matiaslegnazzi 20-07-2012 21:40:31

SOLUCIONADO!!!!

Código Delphi [-]
 var     n: ArrayOfItem;

 ...

 setlength(n,1);
 n[0]:=Invoice_Body.create;
 n[0].Item_Descripcion:= tr_bl[1][0][0];
 n[0].Item_Value := tr_bl[1][0][1];
 result.Item:=copy(n);


La franja horaria es GMT +2. Ahora son las 11:30:17.

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