El asunto es que los campos autoincrementales, como lo dije en un mail 
anterior, no se deberían usar dentro de la aplicación para darle sentido a 
algo, como por ejemplo un número de factura. Solamente sirven para identificar 
unívocamente a un registro (si se usan como claves primarias o candidatas). 
Sirven para las relaciones padre/hijo. Por eso, si se pierde un número en la 
secuencia al borrar el registro, no debería afectar.

Ojo, si el número es  parte de una relación padre/hijo, en que en la tabla 
padre es clave primaria y actúa como foránea en N registros de la tabla hija, 
tenés que cuidar la integridad referencial.

En un sistema en red, el número al que te referís, que debería ser un número de 
control, lo manejás en una tabla auxiliar, que guarda los números de control 
para facturas, remitos, recibos, etc.

Ejemplo:

NUMEROS.DBF

descrip        Nrocontrol

FACTURA       1234
REMITO          4789

ETC

CABECERA.DBF    (tabla padre)
cabid     I autoincremental
fecha D
franro  C(8)         && 00008767   numero de la fra que coincide con el 
formulario preimpreso
fractrl  I               &&  1234    viene de la tabla auxiliar NUMEROS.DBF
Total   N(10,2)      && guarda el total de la fra
etc

DETALLES.DBF
detid      I  autoincremental
cabid     I   foránea   && repite el número de la id de la tabla de cabecera en 
cada registro del detalle
cant       I
precio   N(10,2)
etc

Cuando grabás abris una transacción, pero te mando este ejemplo:

local cNroFra,nCabId,lOk

cursorsetprop('buffering',5,'cabecera')
cursorsetprop('buffering',5,'detalles')

select numeros
locate for descrip = 'FACTURA'
do while not rlock()
enddo
cNroFra = nrocontrol
replace nrocontrol with padl(alltrim(val(cNroFra)+1),8,'0')
unlock

begin transaction
insert into cabecera ........

nCabId = getautoincvalue()         && capturás el número autoincremental 
generado


lOK = tableupdate(1,.t.,'cabecera')
if lOK
   select curFra
   scan all
        insert into detalles(cabid,etc) values(nCabId, etc)
   endscan
   lOK = tableupdate(1,.t.,'detalles')
endif   

if lOK
   end transaction
else
   rollback
   tablerevert('cabecera')
   tablerevert('detalles')
endif 

Aqui se ve cómo se captura el número autoincremental generado en la tabla 
cabecera y se graba como clave foranea en la tabla detalles. El número de 
control es el que vos generás, para el caso en que uses una controladora 
fiscal. La CF te devuelve el número de factura que generó y luego, buscando tu 
número de control, le grabás el número real de la factura fiscal en el campo 
franro.

Por eso digo que si perdés la secuencia del autoincremental, no importa, 
siempre que en la tabla hija grabes como clave foránea el número (cualquiera 
sea) que se autogenere en la tabla padre.

Rafael Copquin


  ----- Original Message ----- 
  From: Juan Luis Calcagno 
  To: GUFA List Member 
  Sent: Thursday, November 26, 2009 1:31 PM
  Subject: [GUFA] Campo Autoincremental


  Rafael,

  Pero aun si fuese eso, lo que no cierra es lo de "devolver el valor"  o 
restarle 1, como decia anteriormente, eso solo funciona para un sistema 
monousuario. O estoy crazy?

  Saludos,
  Juan Luis Calcagno
    ----- Original Message ----- 
    From: Rafael Copquin 
    To: GUFA List Member 
    Sent: Thursday, November 26, 2009 11:18 AM
    Subject: [GUFA] Campo Autoincremental


    En realidad no estás hablando de autoincrementales,¿verdad? Porque los 
campos autoincrementales en VFP son readonly, entonces te da error si intentás 
cambiarlos. Te referís a una tabla auxiliar que tiene el último número para 
cada tabla, me parece.

    Rafael Copquin

      ----- Original Message ----- 
      From: Estela Lázaro 
      To: GUFA List Member 
      Sent: Thursday, November 26, 2009 10:50 AM
      Subject: [GUFA] Campo Autoincremental


      Hola

      Yo uso una tablita auxiliar con todos los campos "autoincrementales" y le 
voy sumando 1 y si revierto y es el mismo - 1, se lo resto.

      Me parece más rápido si tenés muchs registros

      Saludos
       
      Estela Lázaro

      D&SIP


      Desarrollo y Servicios Informáticos Profesionales


      www.dsip.com.ar 







--------------------------------------------------------------------------
      De: Norberto Mario Alvarez <[email protected]>
      Para: GUFA List Member <[email protected]>
      Enviado: jueves, 26 de noviembre, 2009 9:59:13
      Asunto: [GUFA] Campo Autoincremental


      Ok, muchas gracias, voy a cambiar la lógica!!!. Voy a tomar de un select  
el valor máximo en el momento de guardar. Desde ya muchas gracias.



      Norberto Alvarez





      De: [email protected] [mailto:[email protected]] En nombre de Rafael Copquin
      Enviado el: jueves, 26 de noviembre de 2009 09:17 a.m.
      Para: GUFA List Member
      Asunto: [GUFA] Campo Autoincremental



      Esa es una de las razones por las cuales los campos autoincrementales se 
deberían utilizar solamente como claves primarias surrogadas. Si por ejemplo 
las usamos para generar números de facturas (que deberían coincidir con el 
número del formulario preimpreso), en caso de error o de que, como dice 
Antonio, alguien grabe antes que vos, se te puede armar una galleta infernal.



      Deberías considerarlas equivalentes a un número de registro. Pero a 
diferencia de recno(), que te da el número de registro y permanece constante a 
menos que borres algunos registros y le hagas un pack a la tabla, dicho número 
es absolutamente independiente del número de registro. En otras palabras, si 
tenés una tablita con 10 registros y borrás el último, por ejemplo, le hacés un 
pack y después agregás otro registro, dicho nuevo registro va a tener el número 
10 de recno(), pero en el caso de la clave autoincremental va a tener el 11. Si 
vos hubieras basado tu lógica en el recno() tendrías un resultado que no es el 
correcto. En cambio, con el número autoincremental podés borrar todos los 
registros que quieras, pero el registro siempre conserva su identidad 
inalterable. Las relaciones entre tablas no se te modifican, en fin......



      Rafael Copquin





        ----- Original Message ----- 

        From: Antonio M. Castaño 

        To: GUFA List Member 

        Sent: Wednesday, November 25, 2009 8:27 PM

        Subject: [GUFA] Campo Autoincremental



        Hola Norberto:



        Es así. Es lo que hacen todos los motores de base de datos. Cuando vos 
hacés el append te "reserva" el número siguiente de el campo autoncremental. 
Hace eso, porque en ese mismo momento, alguien podría estar haciendo otro 
append. Si no tiene reservado una para vos, qué número le asignaría si el otro 
graba primero?. Lo que te garantiza el motor es que sean todos diferentes. NO 
que sean consecutivos.



        Si necesitás un campos incremental, todos consecutivos, lo tenés que 
manejar de otra manera, con lógica programada por vos.



        Saludos!



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

      Encontra las mejores recetas con Yahoo! Cocina. 
      http://ar.mujer.yahoo.com/cocina/

Responder a