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.