Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Problema al obtener datos de MsAccess con componentes SQLdb nativos (https://www.clubdelphi.com/foros/showthread.php?t=88745)

Kenobi 25-07-2015 20:49:19

Problema al obtener datos de MsAccess con componentes SQLdb nativos
 
Hola, tiempo sin escribir, el problema que me ocupa y culpable de al menos 2 canas nuevas es el siguiente:

tengo una(s) base(s) de datos con varias tablas cada una(70 bd a razon de 4 tablas cada una), es una aplicación legada la idea es migrar todo a un esquema de datos mas optimo, (por ejemplo todo eso se resume a una sola bd y 3 tablas maximo) hasta ahora el proceso a tenido varios inconvenientes pero el ultimo ... caramba, resulta pues que un campo de las tablas es de tipo doble(en access) con su asignación decimal en automatico etc, esto conlleva que puede almacenar números: 13455 23564,45 523,2
pues bien el problema es que cuando los capturo con
Código Delphi [-]
tabla.FieldByName('campo').AsFloat
me devuelve 13,46 235,64 52,32 respectivamente , como comprenderan nada bien, me urge resolverlo .....

unos comentarios posteriores,
no puedo cambiar nada en las bases de datos originales
no puedo migrar las bd con una aplicacion especializada
en realidad estoy utilizando lazarus con los componentes SqlDB nativos

Gracias se que me podran ayudar ....

Kenobi 25-07-2015 20:57:13

Tambien con delphi
 
Acabo de probar con delphi y es exactamente el mismo problema .....

ecfisa 25-07-2015 21:06:00

Hola Kenobi.

Sería muy bueno si pudieras adjuntar parte de una de las tablas, que contenga algunas filas no significantes pero con alguna columna que arroje ese resultado, como para poder probar.

Saludos :)

Kenobi 25-07-2015 22:03:39

Claro ni mas faltaba
 
1 Archivos Adjunto(s)
Acá va una versión simplificada de una de las bases de datos con una tabla ....

gracias por tu atención .....

ecfisa 25-07-2015 23:21:43

Hola Kenobi.

Probé la tabla con ADO y no me sucede, el código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  tb: TADOTable;
begin
  tb:= ADOTable1;
  tb.First;
  tb.DisableControls;
  try
    while not tb.Eof do
    begin
      ListBox1.Items.Add(FloatToStr(tb.FieldByName('PrimerSubTotal').AsFloat));
      tb.Next;
    end;
  finally
    tb.EnableControls;
  end;
end;

Salida:


Tal vez sean los componentes ¿ Cuales estás usando ?

Saludos :)

AgustinOrtu 25-07-2015 23:46:24

Voy a tirar un par de items para que revises a ver si con alguno le encontras la vuelta:

1. revisar la configuracion regional. Deberia coincidir con el formato del campo de la bd access
2. desde delphi utilizar alguna funcion para darle el formato que necesitas al numero (FormatFloat por ejemplo)
3. Que pasa si usas en ves de Field.AsFloat, Field.AsCurrency? Field.Value???

Kenobi 26-07-2015 01:10:39

Resuelto
 
Estoy avergonzado por molestarlos con algo que al final fue error mio, como mencione en el primer post son muchas bases de datos y muchas tablas en cada una, pues resulta que las mas actualizadas se les reformateo el valor en cuestión luego no coincide con su valor en bd anteriores, todo un problema nuevo para afrontar en la migración, por cuanto doy por cerrado esta mi duda ya que el speudo bug no existia en realidad, o no era propio de lazarus era de las tablas y sus datos ...

Mil disculpas y agradezco el tiempo invertido.....

Casimiro Notevi 26-07-2015 01:55:25

Tendrás que cumplir una penitencia :p

nlsgarcia 26-07-2015 02:06:55

Kenobi,

Cita:

Empezado por Kenobi
...Problema al obtener datos de MsAccess con componentes SQLdb nativos...resulta pues que un campo de las tablas es de tipo doble...esto conlleva que puede almacenar números: 13455 23564,45 523,2...me devuelve 13,46 235,64 52,32 respectivamente...

:rolleyes:

Revisa este código:
Código Delphi [-]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, sqldb, odbcconn, mssqlconn, FileUtil, Forms, Controls,
  Graphics, Dialogs, DBGrids, StdCtrls, ShellApi;

type

  { TForm1 }

  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    ODBCConnection1: TODBCConnection;
    SQLTransaction1: TSQLTransaction;
    SQLQuery1: TSQLQuery;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
   Form1: TForm1;
   CRLF : Array [0..1] of Char = (#13,#10);

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin

   ODBCConnection1.Driver := 'Microsoft Access Driver (*.mdb, *.accdb)';
   ODBCConnection1.Params.Add('DBQ=D:\DB\Access\bd.mdb');
   ODBCConnection1.Connected := True;
   ODBCConnection1.KeepConnection := True;

   SQLTransaction1.DataBase := ODBCConnection1;
   SQLTransaction1.Action := caCommit;
   SQLTransaction1.Active := False;

   SQLQuery1.DataBase := ODBCConnection1;
   SQLQuery1.UsePrimaryKeyAsKey := False;

   SQLQuery1.Close;
   SQLQuery1.SQL.Text := 'Select * from Tabla';
   SQLQuery1.Open;

   DataSource1.DataSet := SQLQuery1;

   DBGrid1.DataSource := DataSource1;
   DBGrid1.Columns.Items[0].Width:= 100;
   DBGrid1.Columns.Items[1].Width:= 300;
   DBGrid1.Columns.Items[2].Width:= 100;
   DBGrid1.ReadOnly := true;

end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
   C1 : Integer;
   C2 : String;
   C3 : Double;
   Data : String;

begin

   C1 := DBGrid1.Columns.Items[0].Field.AsInteger;
   C2 := DBGrid1.Columns.Items[1].Field.AsString;
   C3 := DBGrid1.Columns.Items[2].Field.AsFloat;

   Data := Format(' Codigo = %d %s PrimerLapso = %s %s PrimerSubTotal = %g ',[C1, CRLF, C2, CRLF, C3]);

   MessageDlg('Data', Data, mtinformation,[mbok],0);

end;


end.
El código anterior en Lazarus Versión 1.4.0 FPC 2.6.4 sobre Windows 7 Professional x32, Realiza una consulta de la BD del Msg #4 en MS Access por medio de los componentes de acceso de datos SQLdb, como se muestra en la siguiente imagen:



Cita:

Empezado por Kenobi
...al final fue error mio...son muchas bases de datos y muchas tablas ...resulta que las mas actualizadas se les reformateo el valor en cuestión luego no coincide con su valor en bd anteriores...

^\||/

Espero sea útil :)

Nelson.

ecfisa 26-07-2015 08:08:36

Cita:

Empezado por Kenobi (Mensaje 494849)
Estoy avergonzado por molestarlos con algo que al final fue error mio, como mencione en el primer post son muchas bases de datos y muchas tablas en cada una, pues resulta que las mas actualizadas se les reformateo el valor en cuestión luego no coincide con su valor en bd anteriores, todo un problema nuevo para afrontar en la migración, por cuanto doy por cerrado esta mi duda ya que el speudo bug no existia en realidad, o no era propio de lazarus era de las tablas y sus datos ...

Mil disculpas y agradezco el tiempo invertido.....

Ni lo menciones, son cosas que pasan cuando uno lidia con tanto dato y encima ajeno. Me alegra que lo hayas solucionado ^\||/.

Saludos :)


La franja horaria es GMT +2. Ahora son las 22:00:09.

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