28 de noviembre de 2007

Agregar campo autoincremental a tabla con registros

Tuve que agregar un campo incremental a varias tablas que tenían cantidades variables de registros y me encontré con el problema que, por un lado, a todos los registros les puso el valor de cero; y por otro lado, el campo era de sólo lectura.

Imaginé que había una función que actualizaba ese campo en todos los registros, pero busqué información al respecto en la documentación y web pero al no encontrarla (y con la presión de terminar el trabajo lo más pronto posible) hice la función siguiente:

FUNCTION NewIncrem
   LPARAMETERS lcTabla, lcNombreCampo, lnError, lnUltInc
   * abre la tabla
   TRY
      USE (lcTabla) IN 0 EXCLUSIVE
      lnError = 0
   CATCH
      MESSAGEBOX("Error al abrir tabla", 48, "Error")
      lnError = 1
   ENDTRY
   IF lnError = 1
      RETURN 0
   ENDIF
   * crea el campo, si ya existe el nombre o es inválido cancela la operación
   * crea el campo como numérico para poder actualizar los valores
   TRY
      SELECT (lcTabla)
      ALTER TABLE (lcTabla) ADD COLUMN (lcNombreCampo) N(10)
   CATCH
      MESSAGEBOX("Error al crear el campo", 48, "Error")
      lnError = 1
   ENDTRY
   IF lnError = 1
      RETURN 0
   ENDIF
   * actualiza los valores del campo
   REPLACE (lcNombreCampo) WITH RECNO() ALL
   * actualiza el tipo de campo a incremental y el siguiente valor del autoincremental
   ALTER TABLE (lcTabla) ALTER COLUMN (lcNombreCampo) I
   GO BOTTOM
   lnUltInc = &lcNombreCampo
   ALTER TABLE (lcTabla) ALTER COLUMN (lcNombreCampo) INT AUTOINC NEXTVALUE iUltReg+1 STEP 1
   RETURN 1
ENDFUNC
Lo primero que hace es crear el campo como numérico, para poder reescribirlo, le pone a cada fila el número de registro que le corresponde. Luego, modifica el tipo de campo a entero autoincremental y actualiza el valor siguiente en la base de datos.

Devuelve numérico: 0 si falló, 1 si se realizó la operación.

Para llamarlo:
=NewIncrem("miTabla", "miCampo")


Arturo Panana

No hay comentarios. :

Publicar un comentario

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.