Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en RXMemoryData com Delphi XE5 (https://www.clubdelphi.com/foros/showthread.php?t=86160)

luisarturop 25-06-2014 10:34:19

Error en RXMemoryData com Delphi XE5
 
Saludos a todos,

Tengo una aplicación de funciona correctamente en Delphi 7 y estoy migrando a Delphi XE5, y con esto de la instalación de los nuevos componentes, me he topado con un error que probablemente es un BUG de los nuevos componentes que me descargue... He buscado en todos los foros, Google, etc. y no he conseguido algo que me pueda ayudar.

Los componentes son los RXLib para Delphi XE5 y el objeto que me esta dando problemas es el RXMemoryData, el error que me ocurre lo explico en el siguiente código:

Código Delphi [-]
RxMemoryData1.Open; 
RxMemoryData1.Append; 
RxMemoryData1CampoNombre.Value := 'Prueba'; 
RxMemoryData1.Post;

Este código me funciona perfectamente en Delphi 7, pero estos componentes RXLib en Delphi XE5 al correr paso a paso me voy cuenta que el valor "Prueba" no es asignado al "CampoNombre" de la tabla RXMemoryData. La unica diferencia que veo pueda estar afectando, es que el RXMemoryData utiliza los tipos de dato AnsiString en vez de String.
He probado realizando lo siguiente:

Código Delphi [-]
var Nombre : AnsiString; 
begin 
Nombre := 'Prueba'; 
RxMemoryData1.Open; 
RxMemoryData1.Append; 
RxMemoryData1CampoNombre.Value := Nombre ; 
RxMemoryData1.Post; 
end;


Código Delphi [-]
var Nombre : AnsiString; 
begin 
Nombre := 'Prueba'; 
RxMemoryData1.Open; 
RxMemoryData1.Append; 
RxMemoryData1.FieldbyName('CampoNombre').AsString := Nombre ; 
RxMemoryData1.Post; 
end;


entre otras pruebas y no logro hacer que el campo que cree en el RXMemoryData le sea asignado el valor correspondiente.

Muchas Gracias,

Espero me puedan ayudar.

Saludos.

Casimiro Noteví 25-06-2014 13:46:32

¿Sale algún mensaje de error?

luisarturop 25-06-2014 14:13:44

No, simplemente al correr paso a paso me doy cuenta de que el valor no le es asignado al campo creado en el RXMemoryData, revise las propiedades de éste, comparado con el de delphi 7 y estan idénticas. El codigo original de delphi 7 utiliza mas campos pero el comportamiento es el mismo y tal como lo reproduje en el ejemplo que coloque en el Hilo.

luisarturop 25-06-2014 14:27:43

Reproduciendo el error nuevamente hice lo siguiente:

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, RxMemDS, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    RxMemoryData1: TRxMemoryData;
    RxMemoryData1Nombre: TStringField;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  RxMemoryData1.Open;
  // Ingreso el primer registro
  RxMemoryData1.Append;
  RxMemoryData1Nombre.Value := 'Luis';
  RxMemoryData1.Post;
  // Ingreso el segundo registro
  RxMemoryData1.Append;
  RxMemoryData1Nombre.Value := 'Arturo';
  RxMemoryData1.Post;
  RxMemoryData1.First;
  while not RxMemoryData1.Eof do
  begin
    Memo1.Lines.Add(RxMemoryData1Nombre.Value);
    RxMemoryData1.Next;
  end;
  RxMemoryData1.Close;
end;

end.

Ingrese 2 registros al RXMemoryData, y al preguntar la propiedad recordcount me dice que hay 2 registros, pero al recorrer con el "while", el campo: "RxMemoryData1Nombre.Value" aparece vacio.
El "FieldKind" del campo "Nombre" ingresado en el RXMemoryData es "fkData". Probe tambien colocandolo como: "fkCalculated" y nada, de ninguna forma almacena el valor, solo ingresa el registro en blanco.

¿Que podrá ser? De verdad no tengo ni idea... Asumo que pueda ser un BUG de estos nuevos componentes RXLib, el problema es que en la aplicación que estoy migrando hay muchos procesos que utilizan este componente RXMemoryData y cambiar esas rutinas es inicialmente Impensable...

Manuel 25-06-2014 15:09:57

Intentar con esto
 
A mi me paso lo mismo con una campo de esas características, lo que hice fue borrar los campos de la tabla de memoria y crearlos nuevamente, prueba con eso.

luisarturop 25-06-2014 17:12:51

Nueva Solución encontrada...
 
Nada Manuel,

El error persiste, continué investigando y encontré aqui en ClubDelphi que al parecer este error se ha venido presentando desde la versión de RXLib de Delphi XE.
Ya encontré una solución alterna, la planteo por si alguien se le presenta el mismo inconveniente.
En mi caso el RXMemoryData no lo conecto a una Tabla en BD ya que lo utilizo para la revisión de un proceso. La solución es la siguiente:
En vez de utilizar un RXMemoryData, utilice un TClientDataSet, obligatoriamente debo asociarle un TDataSetProvider y a este DataSetProvider es necesario asociarle un DataSet (ó Tabla en BD), por esto le asocie el RXMemoryData original. Una vez hecho esto puedo realizar lo siguiente en código Delphi:

Código Delphi [-]

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, RxMemDS, Vcl.StdCtrls,
  Datasnap.DBClient, Datasnap.Provider, ZAbstractRODataset, ZAbstractDataset,
  ZAbstractTable, ZDataset;

type
  TForm1 = class(TForm)
    Button1: TButton;
    RxMemoryData1: TRxMemoryData;
    RxMemoryData1Nombre: TStringField;
    Memo1: TMemo;
    ClientDataSet1: TClientDataSet;
    ClientDataSet1Nombre: TStringField;
    DataSetProvider1: TDataSetProvider;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientDataSet1.Open;
  // Ingreso el primer registro
  ClientDataSet1.Append;
  ClientDataSet1Nombre.Value := 'Luis';
  ClientDataSet1.Post;
  // Ingreso el segundo registro
  ClientDataSet1.Append;
  ClientDataSet1Nombre.Value := 'Zolibel';
  ClientDataSet1.Post;
  // Ingreso el tercer registro
  ClientDataSet1.Append;
  ClientDataSet1Nombre.Value := 'Arturo';
  ClientDataSet1.Post;
  // Ingreso el cuarto registro
  ClientDataSet1.Append;
  ClientDataSet1Nombre.Value := 'Juan';
  ClientDataSet1.Post;

  // Si deseo filtrar algun dato lo hago tipo SQL de la siguiente manera:
  ClientDataSet1.Filter := 'Nombre='+QuotedStr('Zolibel')+' or Nombre='+QuotedStr('Juan');
  ClientDataSet1.Filtered := True;

  // Si deseo Ordenar los datos por algún Campo lo hago de la siguiente manera
  ClientDataSet1.IndexFieldNames := 'Nombre';

  ClientDataSet1.First;
  while not ClientDataSet1.Eof do
  begin
    Memo1.Lines.Add(ClientDataSet1Nombre.Value);
    ClientDataSet1.Next;
  end;
  ClientDataSet1.Close;
end;

end.

Es algo rebuscado, pero a mí me funciona por los momentos. Espero a alguien lo pueda sacar de apuros también.

Muchas Gracias,

Saludos

Manuel 25-06-2014 17:16:38

Se agradece mucho tu aporte.


La franja horaria es GMT +2. Ahora son las 06:50:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi