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
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.