Adrian:
Tambien tengo este codigo, para manejar con TDataBase
Son similares a las anteriores + las ventajas que te da TDatabase
METHOD Duplica(lRelease,lUnlock) CLASS TDataADS
METHOD DuplicaDwn(lReleaseLocks,lUnlock) CLASS TDataADS
METHOD InsDownRecord(lReleaseLocks,lUnlock) CLASS TDataADS
METHOD InsUpRecord(lReleaseLocks,lUnlock) CLASS TDataADS
METHOD SwapUpRecord() CLASS TDataADS
METHOD SwapDownRecord() CLASS TDataADS
//Funciones Para manejar la insercion de registros
//----------------------------------------------------------------------------//
METHOD Duplica(lRelease,lUnlock) CLASS TDataADS
local aRecord := AClone(::aBuffer)//FieldsToArray()
Default lUnlock := .T.
If ::Append(lRelease)
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
if lUnlock
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( ::RecNo() )//DBRUnLock(RECNO())
endif
return .T.
endif
return .F.
//----------------------------------------------------------------------------//
METHOD DuplicaDwn(lReleaseLocks,lUnlock) CLASS TDataADS // duplicates current record, debajo del actual
local aRecord := AClone(::aBuffer)//FieldsToArray()
Default lUnlock := .T.
If ::InsDownRecord(lReleaseLocks,.F.)
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
if lUnlock
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( ::RecNo() )//DBRUnLock(RECNO())
endif
return .T.
endif
return .F.
//----------------------------------------------------------------------------//
METHOD InsDownRecord(lReleaseLocks,lUnlock) CLASS TDataADS // Inserta un registro, debajo del actual (NO se deberia tener ordenes activos)
local nRecord:=::Recno()
local aRecord
//local aRecordBlank
Default lUnlock := .T.
//Verificamos que se pueda bloquear todos los registros a ser movidos
::Skip()
DO WHILE !::EOF()
if ! ::RecLock( ::RecNo() )//bloqueamos todos los registros//NetRecLock(, RECNO() )
MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsDownRecord(..)" )
return .F.
endif
::Skip()
ENDDO
//Vamos al final de la tabla (estamos en Eof())
::GoBottom()//Skip(-1)
//copiamos el ultimo registro a un Array
aRecord := AClone(::aBuffer)//FieldsToArray()
//Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
if !::Append()//estamos al final de la tabla//!NetAppend( ,lReleaseLocks)
Return .F.
endif
//aRecordBlank := AClone(::aBuffer)//FieldsToArray()
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
::Skip(-1)
DO WHILE ::Recno()<>nRecord
::Skip(-1)
aRecord := AClone(::aBuffer)//FieldsToArray()
::Skip(1)
::RecLock( ::RecNo() )//ya esta bloqueado//RLock()
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
::RecUnLock( ::RecNo() )
::Skip(-1)
ENDDO
::Skip()
::RecLock( ::RecNo() )//RLock()
::Blank()//::aBuffer := aRecordBlank //ArrayToFields(aRecordBlank)
::Save()
if lUnlock
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( ::RecNo() )
endif
//::UnLock()//DbUnLock()
return .T.
//----------------------------------------------------------------------------//
METHOD InsUpRecord(lReleaseLocks,lUnlock) CLASS TDataADS // Inserta un registro, arriba del actual
local nRecord:=::Recno()
local aRecord
//local aRecordBlank
Default lUnlock := .T.
//Verificamos que se pueda bloquear todos los registros a ser movidos
DO WHILE !::EOF()
if ! ::RecLock( ::RecNo() )//bloqueamos todos los registros//NetRecLock(, RECNO() )
MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsUpRecord(..)" )
return .F.
endif
::Skip()
ENDDO
////Nos vamos al final de archivos
//DBGoBottom ()
////copiamos el ultimo registro a un Array
//aRecord := AClone(::aBuffer)//FieldsToArray()
//Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
if !::Append()//estamos al final de la tabla//!NetAppend( ,lReleaseLocks)
Return .F.
endif
//aRecordBlank := AClone(::aBuffer)//FieldsToArray()
//ArrayToFields(aRecord)
//DbSkip(-1)
DO WHILE ::Recno()<>nRecord
::Skip(-1)
aRecord := AClone(::aBuffer)//FieldsToArray()
::Skip(1)
::RecLock( ::RecNo() )//ya esta bloqueado//RLock()
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
::RecUnLock( ::RecNo() )
::Skip(-1)
ENDDO
::RecLock( ::RecNo() )//RLock()
::Blank()//::aBuffer := aRecordBlank //ArrayToFields(aRecordBlank)
::Save()
if lUnlock
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( ::RecNo() )
endif
//::UnLock()//DbUnLock()
return .T.
//----------------------------------------------------------------------------//
METHOD SwapUpRecord() CLASS TDataADS
local aRecord,nRecord
local aRecordUp,nRecordUp
if ::RecLock( nRecord:=::RecNo() )//NetRecLock(, nRecord:=RECNO() )
aRecord := AClone(::aBuffer)//FieldsToArray()
if ::DbSkipper(-1)=1 .and. ::RecLock( nRecordUp:=::RecNo() )//NetRecLock(, nRecordUp:=RECNO() )
aRecordUp := AClone(::aBuffer)//FieldsToArray()
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( nRecordUp )//DbRUnlock(nRecordUp)
::GoTo(nRecord)//DBGoto(nRecord)
::aBuffer := aRecordUp //ArrayToFields(aRecordUp)
::Save()
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( nRecord )//DbRUnlock(nRecord)
else
return .F.
endif
else
return .F.
endif
return .T.
//----------------------------------------------------------------------------//
METHOD SwapDownRecord() CLASS TDataADS
local aRecord,nRecord
local aRecordDown,nRecordDown
if ::RecLock( nRecord:=::RecNo() )//NetRecLock(, nRecord:=RECNO() )
aRecord := AClone(::aBuffer)//FieldsToArray()
if ::DbSkipper()=1 .and. ::RecLock( nRecordDown:=::RecNo() )//NetRecLock(, nRecordDown:=RECNO() )
aRecordDown := AClone(::aBuffer)//FieldsToArray()
::aBuffer := aRecord //ArrayToFields(aRecord)
::Save()
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( nRecordDown )//DbRUnlock(nRecordDown)
::GoTo(nRecord)//DBGoto(nRecord)
::aBuffer := aRecordDown //ArrayToFields(aRecordDown)
::Save()
::Commit()//::Save() no lo hace, porque el registro estaba bloqueado
::RecUnLock( nRecord )//DbRUnlock(nRecord)
else
return .F.
endif
else
return .F.
endif
return .T.
Espero que tambien te sirva, si hay algun error hazmelo saber, lo corrijo y avanzamos
Atentamente,
Rolando