Ver Mensaje Individual
  #2  
Antiguo 08-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El tipo Number en Paradox corresponde al campo Float y Dbase III+ no tiene campos de punto flotante. Si te fijas ni siquiera el Database Desktop lo puede hacer:

New table|DBase III+|Borrow... (desde una tabla Paradox)

y sucederá lo mismo que ya has visto, aparecen los campos pero sin tipo de datos.

Esto no necesariamente quiere decir que no se pueda hacer la exportación. Lo que sucede es que el único tipo de datos numérico (enteros o con decimales) que acepta DBase III+ es NUMBER que no es otra cosa que un BCD y los BCD sólo aceptan un número fijo de decimales. Como en un tipo de datos Float no hay forma inherente de determinar cuántos decimales maneja (por algo es punto flotante), utilerías como el Database Desktop no tienen forma de saber cuántos especificar para hacer la conversión.

Sin embargo, a menos que trabajes con cálculos de precisión astronómica , es muy posible que puedas saber de antemano el número máximo de decimales que vas a tener en tu tabla Paradox.

Si por ejemplo, sabes que tus valores tendrán un máximo de 3 decimales con una precisión de 7 (es decir 7 es el mayor número de digitos contando parte entera y parte decimal) entonces puedes usar un campo NUMBER (BCD) especificando 7 como precisión y 3 como decimales (quizá debas especificar 9 en lugar de 7 ya que creo que DBase requiere dos dígitos para almacenar el punto y el signo).

Ya en la práctica, lo que haría es definir yo mismo la estructura de la tabla destino usando un TTable y añadiendo los correspondientes TFieldDef.

Un campo de Paradox como el descrito antes lo especificaría así:

Código Delphi [-]
with TablaDbase do
begin
  DatabaseName := tu alias;
  TableName := nombre de la tabla;

  with FieldDefs.Add do
  begin
    Name := nombre del campo;
    DataType := ftBCD;
    Precision := 7 ; // ¿9?
    Size := 3;
  end;

  {
    otras definiciones de campo
  }
  end;

  CreateTable;
end;

Ya con la estructura definida puedes usar el BatchMove para hacer la transferencia.

------------------

Nota además que éste tipo de datos (Number en Paradox) no es ni con mucho el único que te va a dar problemas. Money, LongInt, AutoInc, todos esos tendrás que tratarlos según el caso. Creo que el único que no da lata es el Short. En todos los casos tendrás que determinar tú mismo la mejor forma de colocarlos en un NUMBER (BCD) de DBase.

También claro, te causarán problemas los campos Time y TimeStamp; DBase III+ sólo acepta Date (¿en qué estarían pensando los diseñadores de DBase? ) que supongo que tendrás que almacenar como cadenas (campo CHARACTER en DBase) y ni que decir de Graphic, Binary, Bytes, Ole, etc. pues no veo forma de almacenar binarios en DBase III +. Los únicos tipos de datos en DBase son

CHARACTER
NUMBER
DATE
LOGICAL
MEMO

La única forma que veo de guardar datos binarios en DBase III+ es haciendo una codificación de binario a ASCII; no me preguntes cómo porque no sé pero si el correo electrónico lo puede hacer...

Moraleja: ¿Es realmente necesario que exportes a DBase?

------------------

Otra cosa: ¿por qué el requerimiento de usar SQL? Las bases de datos de escritorio como Paradox y DBase no están hechas para SQL. A no ser que sea muy necesario yo prefiero usar TTable en lugar de TQuery ya que el rendimiento es mucho mejor.

// Saludos
Responder Con Cita