28 de junio de 2004

Reiniciar los contadores de campos AutoIncrementales

Con Visual FoxPro 8.0 se introdujeron los campos AutoIncrementales, veremos una forma de reiniciarlos.

El caso puede llegar en el momento en que se desea borrar todo el contenido de una tabla con autoincrementales, pero tambien deseas que dichos incrementos inicien como si la tabla fuera "nueva".

Está claro que lo puedes hacer mediante el diseñador de tablas, pero esta opción no estará disponible en tiempo de ejecución ("Runtime"), lo mismo pasará en el caso de que desees hacerlo con cursores creados con el comando CREATE CURSOR.

A continuación un código que mandé como respuesta a esta duda en el newsgroup de microsoft, el cual ayudará a realizar esta tarea programáticamente.

****************************************************
* Procedure: ResetTables
* Author: Esparta Palma   Date: 17/Mayo/2004
* Purpose: Reinicia los contadores de AutoIncrementales en un cursor
* Parameters: 
*     tcCursor: The cursor (can include full or relative path) or alias
* Returns:
*      < 0 : Number of reset fields
*      -1  : Error -> Wrong parameters
*      -2  : Error -> The table doesn't exist in the path
*      -3  : Error -> Acess denied, used by another user
*      -4  : Error -> Used by this user, but not Exclusive
*      -5  : Error -> Unknow Error
*      -6  : Error -> Error altering the cursor
* Use:
*     lnSucess = ResetTable("myCursor")
****************************************************
PROCEDURE ResetTables
LPARAMETERS tcCursor
LOCAL llError 
llError = .F.

IF VARTYPE(tcCursor)="C" AND NOT EMPTY(tcCursor) AND NOT (IsNull(tcCursor))
    IF NOT USED(Juststem(tcCursor))
        TRY
            USE (tcCursor) IN 0 EXCLUSIVE
        CATCH TO loErrorUsing
            llError = .T.
            DO CASE
                CASE loErrorUsing.ErrorNo = 1
                    lnReturnValue = -2 && The Table doesn't exists
                CASE loErrorUsing.ErrorNo = 1705
                    lnReturnValue = -3 && Acess denied, used by another user
                OTHERWISE
                    lnReturnValue = -5 &&Unknow Error
            ENDCASE
        ENDTRY
        IF llError 
          RETURN lnReturnValue
        ENDIF
    ELSE
        IF NOT ISEXCLUSIVE(tcCursor)
            RETURN -4 && Used by this user, but not Exclusive
        ENDIF
    ENDIF
    llError = .F.
    lnChangedFields = 0
    FOR lnFields=1 TO AFIELDS(laFields,tcCursor)
        IF laFields[lnFields,18] # 0 &&This Field has AutoInc
           TRY
             ALTER TABLE (tcCursor) ALTER COLUMN (laFields[lnFields,1]);
                   INT AUTOINC NEXTVALUE 1 STEP (laFields[lnFields,18])
               lnChangedFields = lnChangedFields + 1
           CATCH TO loError
              llError = .T.
               ?[  Error: ] + STR(loError.ErrorNo)
               ?[  Message: ] + loError.MESSAGE
               lnReturnValue =  -6 &&Error Altering the Table
           ENDTRY
           IF llError 
             RETURN lnReturnValue
           ENDIF
        ENDIF
    ENDFOR
ELSE
    RETURN -1 && Wrong parameters...
ENDIF
RETURN lnChangedFields

ENDPROC

El procedimiento anterior, lo que hace es utilizar la tabla que hemos pasado de parametro(si es que no está en uso), si tiene algún error, devolverá un valor menor que cero ( < 0) , si cambia algún campo que tuvo incremental devolverá un número mayor que cero ( > 0) , si no cambia nada, devolverá cero... Hay que recordar que puede haber "n" campos autoincrementales un un cursor, y cada uno de esos campos, puede tener un valor distinto en su STEP...

Espero te sirva.

Espartaco Palma

No hay comentarios. :

Publicar un comentario