Campo autoincremental en DBF

Post Reply
horacio
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Campo autoincremental en DBF

Post by horacio »

Colegas, estoy creando una base de datos dbf con un campo incremental pero cuando lo genero el mismo tiene una longitud de cuatro enteros por mas que le ponga un número mayor en la longitud. Hay alguna manera de incrementar esa longitud?. Desde ya muchas gracias.

Saludos
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Campo autoincremental en DBF

Post by carlos vargas »

* src/rdd/dbf1.c
+ added support for autoincrement fields with counter longer then 4 bytes
Warning: if someone created tables with such fields i.e. { "I:+", 8, 0 }
after my modification which added support for AutoInc flags in
all numeric DBF fields then he should update counters manually
using DBS_COUNTER flag. New code uses 64bit counters for suuch
field located in different part of DBFFIELD structure.

* src/rdd/dbf1.c
+ finished support for AutoInc flag (+) for all numeric fields (N, F, I, B)
in DBF* RDDs. Now user can define field like:
{ "COUNTER", "I:+", 4, 0 }
and they will work like autoincrement fields but without any assign
restrictions.

* harbour/src/rdd/dbf1.c
+ added new dbFieldInfo() actions:
DBS_COUNTER - get/set autoincrement field counter
DBS_STEP - get/set autoincrement field step
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
karinha
Posts: 7885
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Contact:

Re: Campo autoincremental en DBF

Post by karinha »

Buen día. Muestre la fuente de cómo lo está haciendo y explique para qué sirve este campo incremental. ¿Es para controlar la numeración de algo que estás haciendo? En caso afirmativo, en HARBOUR, ¿RecNo() + 1 no funciona? En xHarbour funciona bien.

Gracias.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
horacio
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Campo autoincremental en DBF

Post by horacio »

Hola, en realidad me pidieron una aplicación en base de datos DBF que hace mucho que no trabajo y estoy experimentando con las nuevas características pensando que esta funcionaba como un campo autoincremental tipo SQL. Si mal no recuerdo Recno() me indica el ordinal de un registro pero si hago un Pack ese valor varía cosa que no sucede con este campo. Si alguien no me puede echar luz sobre como variar su longitud usaré un numerador externo. Muchas gracias por tu respuesta

Saludos
FiveWiDi
Posts: 1207
Joined: Mon Oct 10, 2005 2:38 pm

Re: Campo autoincremental en DBF

Post by FiveWiDi »

horacio wrote:Hola, en realidad me pidieron una aplicación en base de datos DBF que hace mucho que no trabajo y estoy experimentando con las nuevas características pensando que esta funcionaba como un campo autoincremental tipo SQL. Si mal no recuerdo Recno() me indica el ordinal de un registro pero si hago un Pack ese valor varía cosa que no sucede con este campo. Si alguien no me puede echar luz sobre como variar su longitud usaré un numerador externo. Muchas gracias por tu respuesta

Saludos
Hola Horacio,

A mi así {"NUMEUNIC","N:+",6,0 } me funciona, de momento ya tengo numerados con 5 cifras.

Entiendo que así {"NUMEUNIC","I:+",6,0 } no debe ser la misma longitud/tipo de dato.

Prueba con "N:+" en vez de "I:+".
Un Saludo
Carlos G.

FiveWin 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Campo autoincremental en DBF

Post by carlos vargas »

si no estoy mal, entiendo que por defecto
{ "COUNTER", "I:+", 4, 0 }
se le asigna 4 byte para almacenar el numero contador de la fila o registro, esto no es 4 digitos "1234" como si de una cadena se tratara, si no que se asigna 128 bit (8bit x 4 len) para almacenar el numero, lo cual da para un numero muy muy grande. n o hay necesidad de mayor longitud al menos para la mayoria de _.


alguien con mas conocimientos pudiera aclararlo por favor.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Campo autoincremental en DBF

Post by carlos vargas »

como comentario adicional, una vez utilice en una tabla ads un campo de tipo ROW, el cual se incrementa automaticamente cada vez que el registro era modificado, lo cual sumado a un campo de tipo timestamp que se actualiza cada vez que el registro se modificada nos servia para darnos cuantas si los datos eran modificados (alteravan la info para que cuadrara a la fuerza), y efectivamente asi era. :-) auditoria de datos.

veo que harbour tambien ya lo implementa, asi hay muchisimas cosas ya implementadas en harbour que no sabemos que existen y que no las usamos por desconocimiento.
; Current field type mappings are:
C; Character,n HB_FT_STRING,n ADS_STRING
N; Numeric,n,d HB_FT_LONG,n,d ADS_NUMERIC
D; Date,n HB_FT_DATE,3 or 4 or 8 ADS_COMPACTDATE; ADS_DATE
ShortDate HB_FT_DATE,3 ADS_COMPACTDATE
L; Logical HB_FT_LOGICAL,1 ADS_LOGICAL
M; Memo,n HB_FT_MEMO,4 or 9 or 8 ADS_MEMO
B; Double,,d HB_FT_DOUBLE,8,d ADS_DOUBLE
I; Integer,n HB_FT_INTEGER, 2 or 4 or 8 ADS_SHORTINT; ADS_INTEGER; ADS_LONGLONG
ShortInt HB_FT_INTEGER,2 ADS_SHORTINT
Longlong HB_FT_INTEGER,8 ADS_LONGLONG
P; Image HB_FT_IMAGE,9 or 10 ADS_IMAGE
W; Binary HB_FT_BLOB,4 or 9 or 10 ADS_BINARY
Y; Money HB_FT_CURRENCY,8,4 ADS_MONEY
Z; CurDouble,,d HB_FT_CURDOUBLE,8,d ADS_CURDOUBLE
T,4; Time HB_FT_TIME,4 ADS_TIME
@; T,8; TimeStamp HB_FT_TIMESTAMP,8 ADS_TIMESTAMP
+; AutoInc HB_FT_AUTOINC,4 ADS_AUTOINC
^; RowVersion HB_FT_ROWVER,8 ADS_ROWVERSION
=; ModTime HB_FT_MODTIME,8 ADS_MODTIME
Raw,n HB_FT_STRING,n (+HB_FF_BINARY) ADS_RAW
Q; VarChar,n HB_FT_VARLENGTH,n ADS_VARCHAR; ADS_VARCHAR_FOX
VarBinary,n HB_FT_VARLENGTH,n (+HB_FF_BINARY) ADS_VARBINARY_FOX; ADS_RAW
CICharacter,n HB_FT_STRING,n ADS_CISTRING
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
nageswaragunupudi
Posts: 10691
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Campo autoincremental en DBF

Post by nageswaragunupudi »

To create an auto-increment field,
just use datatype "+"
{ "ID", "+", 4, 0 }
That is enough. Please try it.

Do not worry about the width of "4". They do not represent decimal digits. The value is stored as 4 hex bytes. The maximum value in hex is 0xFFFFFFFF = 4,294,967,295. This is a lot more than enough.

For Date of last update of the record use datatype :
{ "UPDATE", "=", 8, 0 }

For Version number use
{ "NVERSION", "V", 10, 0 }
Regards

G. N. Rao.
Hyderabad, India
Post Reply