Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Definir campo en dbase num(1,0) / ftBCD (https://www.clubdelphi.com/foros/showthread.php?t=42947)

DavidLM2007 26-04-2007 18:32:51

Definir campo en dbase num(1,0) / ftBCD
 
Hola a todos y enhorabuena por este magnifico foro.

Mi primera pregunta.

Estoy generando la estructura de una tabla dBase en Delphi. Tengo que generar campo de tipo Number.

Lo hago de esta forma: (con el formato ftBCD en Size se pone el numero de decimales y en precision la longitud total de dígitos.)

with AddFieldDef do begin
Name := 'Asien';
DataType := ftBCD;
Size := 0;
Precision := 6;
end;

Con esto generaría un Num (6,0)

Pero tengo un problema necesito generar un num(1,0) y pongo esto

with AddFieldDef do begin
Name := 'Campo';
DataType := ftBCD;
Size := 0;
Precision := 1;
end;

Mi sorpresa es que cuando consulto con el Database Dektop el campo veo que me lo crea con longitud 20 y decimales 4,
Sabeis por que sucede esto?
Y como puedo solucionarlo?

PD: la estructura debe ser definida de esta forma, viene dada por un famoso fabricante de programa de contabilidad que funciona sobre de Dbase.

Muchas gracias.

marcoszorrilla 26-04-2007 19:26:07

Aunque te hablo de memoria, sino recuerdo mal en Dbase el ancho del campo es contando la coma y los decimales por ejemplo ancho 3 y 1 decimal=1,5
tres posciones 2 números más la coma.

Prueba así a ver y nos cuentas:

with AddFieldDef do begin
Name := 'Campo';
DataType := ftBCD;
Size := 2;
Precision := 1;
end;


Espero te sirva.

DavidLM2007 26-04-2007 19:40:36

Gracias por la respuesta,

Nada, no funciona, pone Size 20 y dec 4, creo que es el máximo porque cuando no especificas precision ni size es lo que pone.

Por ejemplo si quiero un numerico de 5 digitos y 2 decimales pongo y funciona perfectamente

with AddFieldDef do begin
Name := 'Campo';
DataType := ftBCD;
Size := 2;
Precision := 5;
end;

DavidLM2007 26-04-2007 19:59:50

Os cuento mas pruebas

Si pongo:

with AddFieldDef do begin
Name := 'TCasado';
DataType := ftBCD;
Size := 0;
Precision := 2;
end;

Lo genera prefectamente.

Si pongo:

with AddFieldDef do begin
Name := 'TCasado';
DataType := ftBCD;
Size := 2;
Precision := 5;
end;

y luego en el campo (directamente en el DB Desktop) introduzco el valor

236,23 -> se convierte en 236,20
16,24 -> se convierte en 16,24
12345,62 -> se convierte en 12346,00

DavidLM2007 27-04-2007 11:11:19

Sigo haciendo pruebas..

Si pongo
Precision: 1, size: 0 --> 20, 4 ,
Precision: 1, size: 1 --> 20,4 ,
Precision: 2, size: 1 --> Error Invalid field descriptor

Creo que lo que pasa es que por lo menos tenemos que definir dos de precsion porque la coma cuenta tambien.

Cualquier pista, ayuda sera bienvenidad

necesito crear el campo numeric 1,0 !!!!


GRacias.

Jose_Pérez 11-07-2019 12:31:02

Ya sé que ha llovido mucho desde que hiciste tu consulta. Pero he tenido tu mismo problemas y navegando había llegado hasta aquí. Y como posteriormente he dado con una solución, aquí la dejo. Más vale tarde que nunca. :D

Pues resulta que, al menos en el formato dBase III+, utilizando AddFieldDef no deja crear un campo binario, es decir, num(1,0). ¿Solución? Lo creamos, como num(2,0) y, una vez creada la tabla, abrimos el archivo y reescribimos la longitud deseada.

Código Delphi [-]

With AddFieldDef Do
     begin
     Name:= 'Campo';
     DataType:= ftBCD;
     Size:= 0;
     Precision:=2;
     end;

Tabla.CreateTable;

// Posición es la que ocupa el campo en la descripción de la estructura de la tabla.
SetLengthBinary('c:\NombreTabla.dbf',Posicion);

Código Delphi [-]
procedure TfrmEstructura.SetLengthBinary(dbFile: String; PosicionCampo: Integer);
const
  Value: Byte=1;
var
  F: File of byte;
begin

  AssignFile(F,dbFile);
  Reset(F);
  Seek(F,(PosicionCampo*32)+16);
  Write(F,Value);
  CloseFile(F);

end;


La franja horaria es GMT +2. Ahora son las 02:43:31.

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