Page 1 of 2

Insertar registro dentro xBrowse...

PostPosted: Wed Jan 06, 2016 3:14 pm
by ACC69
Hola buenos dias, antes que nada, les deseo Feliz Año nuevo 2016.

A todos ,es posible insertar una linea y registrar un nuevo registro dentro de un xBrowse ,en caso que al usuario retrocediera un registro anterior o en medio de los registros ya capturados ,por ejemplo:

1.- registro 1
2.- registro 2
3.- registro 3
"Insertando nuevo registro " al darle click o Insert
4.- registro 4
5.- registro 5

Pero que por ejemplo entre registro 3 y 4 se insertara un nuevo registro para el caso que el usuario se haya equivocado capturar algun dato!,esperando haberme explicado a lo que quiero hacer,quedo de ustedes, de algun ejemplo para mis necesidades.

Saludos y buen dia !

Atte: Adrian C. C.
acc69@hotmail.com

Re: Insertar registro dentro xBrowse...

PostPosted: Wed Jan 06, 2016 10:10 pm
by ACC69
ACC69 wrote:Hola buenos dias, antes que nada, les deseo Feliz Año nuevo 2016.

A todos ,es posible insertar una linea y registrar un nuevo registro dentro de un xBrowse ,en caso que al usuario retrocediera un registro anterior o en medio de los registros ya capturados ,por ejemplo:

1.- registro 1
2.- registro 2
3.- registro 3
"Insertando nuevo registro " al darle click o Insert
4.- registro 4
5.- registro 5

Pero que por ejemplo entre registro 3 y 4 se insertara un nuevo registro para el caso que el usuario se haya equivocado capturar algun dato!,esperando haberme explicado a lo que quiero hacer,quedo de ustedes, de algun ejemplo para mis necesidades.

Saludos y buen dia !

Atte: Adrian C. C.
acc69@hotmail.com



Nadie ha tenido ese inconveniente de insertar datos en medio de varios registros o no me explique bien :( :?:

Saludos!

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 07, 2016 12:24 am
by joseluisysturiz
Si estas usando un array para contener tus registros...puedes usar AINS(), aca referencia del libro de clipper, espero te ayude, saludos... :shock:

AINS()
Inserta un elemento NIL en una matriz
------------------------------------------------------------------------------
Sintaxis

AINS(<aDestino>, <nPosición>) --> aDestino

Argumentos

<aDestino> es la matriz en la que se va a insertar el nuevo
elemento.

<nPosición> es la posición en la que se va a insertar el nuevo
elemento.

Devuelve

AINS() devuelve una referencia a la matriz destino, <aDestino>.


Descripción

AINS() es una función de matrices que inserta un nuevo elemento en una
matriz especificada. El elemento recién insertado será de tipo NIL
hasta que se le asigne un nuevo valor. Después de la inserción, el
último elemento de la matriz se descarta y todos los elementos que van
detrás del elemento nuevo se desplazan una posición.

¡Advertencia! AINS() debe utilizarse con cuidado en matrices
multidimensionales. En CA-Clipper las matrices multidimensionales se
crean anidando unas matrices dentro de otras. La utilización de AINS()
en una matriz multidimensional elimina el último elemento de la matriz
y, si dicho elemento es una submatriz, se pierden una o más
dimensiones. Para insertar una nueva dimensión en una matriz, añada
primero un nuevo elemento al final de la matriz mediante AADD() o
ASIZE() antes de utilizar AINS().

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 07, 2016 12:57 pm
by FranciscoA
Hola Adrian. Talvez esto ayude en algo. Es para DBFs pequeñisimas.
viewtopic.php?f=6&t=23673&start=0&hilit=insertar+registro#p127231

Tambien podrias pasar tu dbf a un array, hacer como te indica José Luis, y luego pasar de nuevo el array a dbf.
Saludos.

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 07, 2016 3:11 pm
by ACC69
FranciscoA wrote:Hola Adrian. Talvez esto ayude en algo. Es para DBFs pequeñisimas.
http://fivetechsupport.com/forums/viewt ... ro#p127231

Tambien podrias pasar tu dbf a un array, hacer como te indica José Luis, y luego pasar de nuevo el array a dbf.
Saludos.



Hola buenos dias gracias por su atencion a mi peticion de consulta,de antemano les agradezco.

Pero no uso arrays,ni uso sql querys, actualmente estoy usando indices cdx y OrdScope(),para que me traiga los datos de registros en el browse,pongo la imagen, y ver si me explique bien, ya que estuve viendo la rutina,pero no me entendi claramente a lo que quiero hacer o no supe como interpretarlo del ejemplo del Ing. Francisco.

He aqui la imagen lo que quiero hacer,para que el usuario se le haga facil regresar al registro anterior e insertar linea y capturar de nuevo el registro consecutivo

Image

Saludos y gracias por su atencion.

Atte: Adrian C. C.
acc69@hotmail.com

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 07, 2016 6:59 pm
by joseluisysturiz
No se si estoy entendiendo bien, pero si el valor a INSERTAR se agregar manualmente, el TRI247, porque no solamente ordenar por ese campo y listo.? como dije antes, no se si estoy entendiendo bien lo que deseas hacer...dando una idea a lo que ya dijo Francisco...si usas un array para editar tus registros, como ya te comente, podrias agregar en registro nuevo en la posicion que quieras, y luego hacer un DELETE condicionado en la DBF y volcar los datos del ARRAY a la DBF, haciendo asi consecutivos los registros devueltos...comenta haber si es la idea correcta, saludos... :shock:

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 07, 2016 10:09 pm
by ACC69
joseluisysturiz wrote:No se si estoy entendiendo bien, pero si el valor a INSERTAR se agregar manualmente, el TRI247, porque no solamente ordenar por ese campo y listo.? como dije antes, no se si estoy entendiendo bien lo que deseas hacer...dando una idea a lo que ya dijo Francisco...si usas un array para editar tus registros, como ya te comente, podrias agregar en registro nuevo en la posicion que quieras, y luego hacer un DELETE condicionado en la DBF y volcar los datos del ARRAY a la DBF, haciendo asi consecutivos los registros devueltos...comenta haber si es la idea correcta, saludos... :shock:



Hola Ing. Jose Luis, haz visto en una hoja de calculo o sea el software excel, cuando le das click a las lineas numericas a tu izquierda, y le das insertar te deja un espacio en linea en blanco para capturar el registro y si igual podria ordenarlo ,pero no es el caso, ya que cada vez que se encuentra siempre le daras click ordenar,imaginate una captura de poliza asi en contabilidad:

Se veria esteticamente cada vez que se consulte dicha poliza capturada sin necesidad de ordenar

5020-001 Gasto de ventas 5,000.00
1700-001 IVA Acreditable 800.00
111-0001 Bancos Banamex 5,800.00


A que se veria de esa forma no nuy estetico, ...todo porque el usuario se le olvido capturar la cuenta 1700-0001,claro que se puede eliminar pero si fueran mas de 20 registros,tendria que eliminar todos,y no tengo ningun problema en eliminar cada registro, mi problema es esta como insertar una linea. :shock:

5020-001 Gasto de ventas 5,000.00
111-0001 Bancos Banamex 5,800.00
1700-001 IVA Acreditable 800.00


Saludos y gracias por tu atencion.

Atte: Adrian C. C.

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 07, 2016 11:43 pm
by joseluisysturiz
Cuando dije lo de ordenar seria por el campo con el numero de REFERENCIA, asi quedaria en su ordeny ser veria bien logica y esteticamente...Creo ya entender un poco mas lo que quieres, creo que con lo que te dije sobre ARRAY funcionaria, ya que puedes agregar registros en la posicion que quieras...no se si quiera si has intentado lo que te sugeri, aunque sea con un array sencillo y pequeño haber si cumple y llena tu requerimiento, otra opcion que se me vino al vuelo seria agregar un appen blank ya que usas DBF, mover(copiar), los registros una posicion hacia abajo y luego en el que quieres insertar el registro nuevo...luego de blanquearlo, usar replace por los datos nuevos entrados, no se si me entiendes o te confundo mas...saludos... :shock:

Re: Insertar registro dentro xBrowse...

PostPosted: Mon Jan 11, 2016 4:21 pm
by ACC69
joseluisysturiz wrote:Cuando dije lo de ordenar seria por el campo con el numero de REFERENCIA, asi quedaria en su ordeny ser veria bien logica y esteticamente...Creo ya entender un poco mas lo que quieres, creo que con lo que te dije sobre ARRAY funcionaria, ya que puedes agregar registros en la posicion que quieras...no se si quiera si has intentado lo que te sugeri, aunque sea con un array sencillo y pequeño haber si cumple y llena tu requerimiento, otra opcion que se me vino al vuelo seria agregar un appen blank ya que usas DBF, mover(copiar), los registros una posicion hacia abajo y luego en el que quieres insertar el registro nuevo...luego de blanquearlo, usar replace por los datos nuevos entrados, no se si me entiendes o te confundo mas...saludos... :shock:



Gracias por tu atencion Ing. Luis, pero no quiero usar arreglos,me implica mover todo mi codigo ,alguna otra solucion ?? he visto en el foro hace años que es similiar lo que quiero hacer ,pero no lo encuentro en el foro,no recuerdo que año fue ,que igual compartio su codigo de como insertar un registro con su dialogo.

Saludos y buen dia !

Atte: Adrian C. C.
acc69@hotmail.com

Re: Insertar registro dentro xBrowse...

PostPosted: Tue Jan 19, 2016 3:00 pm
by ACC69
ACC69 wrote:
joseluisysturiz wrote:Cuando dije lo de ordenar seria por el campo con el numero de REFERENCIA, asi quedaria en su ordeny ser veria bien logica y esteticamente...Creo ya entender un poco mas lo que quieres, creo que con lo que te dije sobre ARRAY funcionaria, ya que puedes agregar registros en la posicion que quieras...no se si quiera si has intentado lo que te sugeri, aunque sea con un array sencillo y pequeño haber si cumple y llena tu requerimiento, otra opcion que se me vino al vuelo seria agregar un appen blank ya que usas DBF, mover(copiar), los registros una posicion hacia abajo y luego en el que quieres insertar el registro nuevo...luego de blanquearlo, usar replace por los datos nuevos entrados, no se si me entiendes o te confundo mas...saludos... :shock:



Gracias por tu atencion Ing. Luis, pero no quiero usar arreglos,me implica mover todo mi codigo ,alguna otra solucion ?? he visto en el foro hace años que es similiar lo que quiero hacer ,pero no lo encuentro en el foro,no recuerdo que año fue ,que igual compartio su codigo de como insertar un registro con su dialogo.

Saludos y buen dia !

Atte: Adrian C. C.
acc69@hotmail.com



Al parecer creo que nadie ha hecho de insertar lineas y agregar registro con dialogo a capturar datos :( :cry:

+1

Saludos
Atte: Adrian C. C.

Re: Insertar registro dentro xBrowse...

PostPosted: Wed Jan 20, 2016 7:38 pm
by RenOmaS
Boas En tu codigo..

cuando adicionas el registro y antes de hacer el refresh del browse asigna los dados que conforman el indice, eso deveria insertar la linea(en el browse) y hacer el efecto que pretendes.

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 21, 2016 1:11 am
by RSalazarU
Adrian:

Yo tengo el siguiente codigo para lo que quieres (usadas con ALIAS):

FUNCTION DBDuplica( lReleaseLocks, lUnLock, lVerMsgError )
FUNCTION InsDupRecord(lRelease,lUnlock)
FUNCTION InsDownRecord(lReleaseLocks,lUnlock)
FUNCTION InsUpRecord(lReleaseLocks,lUnlock)
FUNCTION SwapUpRecord()
FUNCTION SwapDownRecord()

Code: Select all  Expand view

//----------------------------------------------------------------------------//
//Duplica registro, similar a DupRecord() de FWH(dbtools), pero no desbloquea el registro añadido si no se lo indica en lUnLock
//lReleaseLocks indica si se debe liberar los bloqueos previos o no
FUNCTION DBDuplica( lReleaseLocks, lUnLock, lVerMsgError )
local aCpos := FieldsToArray( )

   DEFAULT lUnLock := .F.
   DEFAULT lVerMsgError := .F. //no se deberia mostra ningun mensaje en estas funciones, en forma similar a DBAppend()

   DBAppend(lReleaseLocks)
   if !NETERR()

      ArrayToFields(aCpos)

      if lUnLock
         DbCommit( )
         DbUnLock( )
      endif

      //return .T.   //01/02/13
      slNetOK := .T. //01/02/13

   else
      if lVerMsgError //no se deberia mostra ningun mensaje en estas funciones, en forma similar a DBAppend()
         MsgStop( "No se pudo duplicar el registro / Could not duplicate the record")
      endif
      slNetOK := .T. //01/02/13
   endif

   //RETURN .F.       //01/02/13
   RETURN ( slNetOK ) //01/02/13

//Funciones Para manejar la insercion de registros
//----------------------------------------------------------------------------//
function InsDupRecord(lRelease,lUnlock) // duplicates current record, debajo del actual

   local aRecord

   Default lUnlock TO .T.

   aRecord := FieldsToArray()

   If InsDownRecord(lRelease,.F.)
      //if NetRecLock(, RECNO() )
         ArrayToFields(aRecord)
     if lUnlock
            DBRUnLock( RECNO() )
         endif
      //else
         //MsgInfo( "El registro esta en uso, intente nuevamente", "InsDupRecord(..)" )
      //endif
   endif

return .T.

//----------------------------------------------------------------------------//
function InsDownRecord(lReleaseLocks,lUnlock) // Inserta un registro, debajo del actual

   local nRecord:=Recno()
   local aRecord
   local aRecordBlank

   Default lUnlock TO .T.

   //Verificamos que se pueda bloquear todos los registros a ser movidos
   DbSkip()
   DO WHILE !EOF()
      if ! NetRecLock(, RECNO() )
         MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsDownRecord(..)" )
         return .F.
      endif
      DbSkip()
   ENDDO

   //Nos vamos al final de archivos
   DBGoBottom ()

   //copiamos el ultimo registro a un Array
   aRecord := FieldsToArray()

   //Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
   //APPEND BLANK
   if !NetAppend( ,lReleaseLocks)
      Return .F.
   endif
   aRecordBlank := FieldsToArray()

   ArrayToFields(aRecord)

   DbSkip(-1)

   DO WHILE Recno()<>nRecord
      DbSkip(-1)
      aRecord := FieldsToArray()
      DbSkip(1)
      DBRLock(Recno())
      ArrayToFields(aRecord)
      DbRUnLock(Recno())
      DbSkip(-1)
   ENDDO
   //DbUnLock()

   DbSkip(1)
   DBRLock(Recno())
   ArrayToFields(aRecordBlank)
   if lUnlock
      DbRUnLock(Recno())
   endif

return .T.
//----------------------------------------------------------------------------//
function InsUpRecord(lReleaseLocks,lUnlock) // Inserta un registro, arriba del actual

   local nRecord:=Recno()
   local aRecord
   local aRecordBlank

   Default lUnlock TO .T.

   //Verificamos que se pueda bloquear todos los registros a ser movidos
   DO WHILE !EOF()
      if ! NetRecLock(, RECNO() )
         MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsUpRecord(..)" )
         return .F.
      endif
      DbSkip()
   ENDDO

   //Nos vamos al final de archivos
   DBGoBottom ()

   //copiamos el ultimo registro a un Array
   aRecord := FieldsToArray()

   //Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
   if !NetAppend(,lReleaseLocks)
      Return .F.
   endif
   aRecordBlank := FieldsToArray()

   ArrayToFields(aRecord)

   DbSkip(-1)

   DO WHILE Recno()<>nRecord
      DbSkip(-1)
      aRecord := FieldsToArray()
      DbSkip(1)
      DBRLock(Recno())
      ArrayToFields(aRecord)
      DbRUnLock(Recno())
      DbSkip(-1)
   ENDDO
   //DbUnLock()

   DBRLock(Recno())
   ArrayToFields(aRecordBlank)
   if lUnlock
      DbRUnLock(Recno())
   endif

return .T.
//----------------------------------------------------------------------------//
function SwapUpRecord()
   local aRecord,nRecord
   local aRecordUp,nRecordUp

   if NetRecLock(, nRecord:=RECNO() )

      aRecord := FieldsToArray()

      if DbSkipper(-1)=-1 .and. NetRecLock(, nRecordUp:=RECNO() )

         aRecordUp := FieldsToArray()
         ArrayToFields(aRecord)
     DBCommit()
         DbRUnlock(nRecordUp)

         DBGoto(nRecord)
         ArrayToFields(aRecordUp)
     DBCommit()
         DbRUnlock(nRecord)

      else
         return .F.
      endif
   else
      return .F.
   endif

return .T.
//----------------------------------------------------------------------------//
function SwapDownRecord()
   local aRecord,nRecord
   local aRecordDown,nRecordDown

   if NetRecLock(, nRecord:=RECNO() )

      aRecord := FieldsToArray()

      if DbSkipper(1)=1 .and. NetRecLock(, nRecordDown:=RECNO() )

         aRecordDown := FieldsToArray()
         ArrayToFields(aRecord)
     DBCommit()
         DbRUnlock(nRecordDown)

         DBGoto(nRecord)
         ArrayToFields(aRecordDown)
     DBCommit()
         DbRUnlock(nRecord)

      else
         return .F.
      endif
   else
      return .F.
   endif

return .T.

 


Espero que te sirva

Atentamente,

Rolando.

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Jan 21, 2016 1:17 am
by RSalazarU
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

Code: Select all  Expand view

//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

Re: Insertar registro dentro xBrowse...

PostPosted: Thu Mar 03, 2016 9:03 pm
by ACC69
RSalazarU wrote:Adrian:

Yo tengo el siguiente codigo para lo que quieres (usadas con ALIAS):

FUNCTION DBDuplica( lReleaseLocks, lUnLock, lVerMsgError )
FUNCTION InsDupRecord(lRelease,lUnlock)
FUNCTION InsDownRecord(lReleaseLocks,lUnlock)
FUNCTION InsUpRecord(lReleaseLocks,lUnlock)
FUNCTION SwapUpRecord()
FUNCTION SwapDownRecord()

Code: Select all  Expand view

//----------------------------------------------------------------------------//
//Duplica registro, similar a DupRecord() de FWH(dbtools), pero no desbloquea el registro añadido si no se lo indica en lUnLock
//lReleaseLocks indica si se debe liberar los bloqueos previos o no
FUNCTION DBDuplica( lReleaseLocks, lUnLock, lVerMsgError )
local aCpos := FieldsToArray( )

   DEFAULT lUnLock := .F.
   DEFAULT lVerMsgError := .F. //no se deberia mostra ningun mensaje en estas funciones, en forma similar a DBAppend()

   DBAppend(lReleaseLocks)
   if !NETERR()

      ArrayToFields(aCpos)

      if lUnLock
         DbCommit( )
         DbUnLock( )
      endif

      //return .T.   //01/02/13
      slNetOK := .T. //01/02/13

   else
      if lVerMsgError //no se deberia mostra ningun mensaje en estas funciones, en forma similar a DBAppend()
         MsgStop( "No se pudo duplicar el registro / Could not duplicate the record")
      endif
      slNetOK := .T. //01/02/13
   endif

   //RETURN .F.       //01/02/13
   RETURN ( slNetOK ) //01/02/13

//Funciones Para manejar la insercion de registros
//----------------------------------------------------------------------------//
function InsDupRecord(lRelease,lUnlock) // duplicates current record, debajo del actual

   local aRecord

   Default lUnlock TO .T.

   aRecord := FieldsToArray()

   If InsDownRecord(lRelease,.F.)
      //if NetRecLock(, RECNO() )
         ArrayToFields(aRecord)
     if lUnlock
            DBRUnLock( RECNO() )
         endif
      //else
         //MsgInfo( "El registro esta en uso, intente nuevamente", "InsDupRecord(..)" )
      //endif
   endif

return .T.

//----------------------------------------------------------------------------//
function InsDownRecord(lReleaseLocks,lUnlock) // Inserta un registro, debajo del actual

   local nRecord:=Recno()
   local aRecord
   local aRecordBlank

   Default lUnlock TO .T.

   //Verificamos que se pueda bloquear todos los registros a ser movidos
   DbSkip()
   DO WHILE !EOF()
      if ! NetRecLock(, RECNO() )
         MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsDownRecord(..)" )
         return .F.
      endif
      DbSkip()
   ENDDO

   //Nos vamos al final de archivos
   DBGoBottom ()

   //copiamos el ultimo registro a un Array
   aRecord := FieldsToArray()

   //Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
   //APPEND BLANK
   if !NetAppend( ,lReleaseLocks)
      Return .F.
   endif
   aRecordBlank := FieldsToArray()

   ArrayToFields(aRecord)

   DbSkip(-1)

   DO WHILE Recno()<>nRecord
      DbSkip(-1)
      aRecord := FieldsToArray()
      DbSkip(1)
      DBRLock(Recno())
      ArrayToFields(aRecord)
      DbRUnLock(Recno())
      DbSkip(-1)
   ENDDO
   //DbUnLock()

   DbSkip(1)
   DBRLock(Recno())
   ArrayToFields(aRecordBlank)
   if lUnlock
      DbRUnLock(Recno())
   endif

return .T.
//----------------------------------------------------------------------------//
function InsUpRecord(lReleaseLocks,lUnlock) // Inserta un registro, arriba del actual

   local nRecord:=Recno()
   local aRecord
   local aRecordBlank

   Default lUnlock TO .T.

   //Verificamos que se pueda bloquear todos los registros a ser movidos
   DO WHILE !EOF()
      if ! NetRecLock(, RECNO() )
         MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsUpRecord(..)" )
         return .F.
      endif
      DbSkip()
   ENDDO

   //Nos vamos al final de archivos
   DBGoBottom ()

   //copiamos el ultimo registro a un Array
   aRecord := FieldsToArray()

   //Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
   if !NetAppend(,lReleaseLocks)
      Return .F.
   endif
   aRecordBlank := FieldsToArray()

   ArrayToFields(aRecord)

   DbSkip(-1)

   DO WHILE Recno()<>nRecord
      DbSkip(-1)
      aRecord := FieldsToArray()
      DbSkip(1)
      DBRLock(Recno())
      ArrayToFields(aRecord)
      DbRUnLock(Recno())
      DbSkip(-1)
   ENDDO
   //DbUnLock()

   DBRLock(Recno())
   ArrayToFields(aRecordBlank)
   if lUnlock
      DbRUnLock(Recno())
   endif

return .T.
//----------------------------------------------------------------------------//
function SwapUpRecord()
   local aRecord,nRecord
   local aRecordUp,nRecordUp

   if NetRecLock(, nRecord:=RECNO() )

      aRecord := FieldsToArray()

      if DbSkipper(-1)=-1 .and. NetRecLock(, nRecordUp:=RECNO() )

         aRecordUp := FieldsToArray()
         ArrayToFields(aRecord)
     DBCommit()
         DbRUnlock(nRecordUp)

         DBGoto(nRecord)
         ArrayToFields(aRecordUp)
     DBCommit()
         DbRUnlock(nRecord)

      else
         return .F.
      endif
   else
      return .F.
   endif

return .T.
//----------------------------------------------------------------------------//
function SwapDownRecord()
   local aRecord,nRecord
   local aRecordDown,nRecordDown

   if NetRecLock(, nRecord:=RECNO() )

      aRecord := FieldsToArray()

      if DbSkipper(1)=1 .and. NetRecLock(, nRecordDown:=RECNO() )

         aRecordDown := FieldsToArray()
         ArrayToFields(aRecord)
     DBCommit()
         DbRUnlock(nRecordDown)

         DBGoto(nRecord)
         ArrayToFields(aRecordDown)
     DBCommit()
         DbRUnlock(nRecord)

      else
         return .F.
      endif
   else
      return .F.
   endif

return .T.

 


Espero que te sirva

Atentamente,

Rolando.


Hola buenas tardes a todos, estuve fuera un tiempo del foro,y no he revisado mis mensajes, aun apenas leo tu mensaje Ing. Rolando y disculpa por no responderle y gracias por compartir tu rutina,le eche vistazo rapido a tu rutina, pero no se me hace conocido unas funciones que veo en tu rutina, por ejemplo:

ArrayToFields()
FieldsToArray()
DbSkipper(1)
DbRUnlock(nRecord)
NetRecLock(, nRecordDown:=RECNO() )

Y tampoco he realizado alguna rutina por arrays que todos comentan que es mas facil insertar usando AINS(), que hacerlo directamente en dbf,cuando lo que quiero hacer es insertar un registro a mitad por ejemplo de una factura o captura de cuentas de contabilidad,volvere a retomar de nuevo esa rutina que me falta insertar registro.

Saludos y buen dia.!
Atte: Adrian C. C.
acc69@hotmail.com

Re: Insertar registro dentro xBrowse...

PostPosted: Fri Mar 04, 2016 5:13 pm
by ACC69
ACC69 wrote:
RSalazarU wrote:Adrian:

Yo tengo el siguiente codigo para lo que quieres (usadas con ALIAS):

FUNCTION DBDuplica( lReleaseLocks, lUnLock, lVerMsgError )
FUNCTION InsDupRecord(lRelease,lUnlock)
FUNCTION InsDownRecord(lReleaseLocks,lUnlock)
FUNCTION InsUpRecord(lReleaseLocks,lUnlock)
FUNCTION SwapUpRecord()
FUNCTION SwapDownRecord()

Code: Select all  Expand view

//----------------------------------------------------------------------------//
//Duplica registro, similar a DupRecord() de FWH(dbtools), pero no desbloquea el registro añadido si no se lo indica en lUnLock
//lReleaseLocks indica si se debe liberar los bloqueos previos o no
FUNCTION DBDuplica( lReleaseLocks, lUnLock, lVerMsgError )
local aCpos := FieldsToArray( )

   DEFAULT lUnLock := .F.
   DEFAULT lVerMsgError := .F. //no se deberia mostra ningun mensaje en estas funciones, en forma similar a DBAppend()

   DBAppend(lReleaseLocks)
   if !NETERR()

      ArrayToFields(aCpos)

      if lUnLock
         DbCommit( )
         DbUnLock( )
      endif

      //return .T.   //01/02/13
      slNetOK := .T. //01/02/13

   else
      if lVerMsgError //no se deberia mostra ningun mensaje en estas funciones, en forma similar a DBAppend()
         MsgStop( "No se pudo duplicar el registro / Could not duplicate the record")
      endif
      slNetOK := .T. //01/02/13
   endif

   //RETURN .F.       //01/02/13
   RETURN ( slNetOK ) //01/02/13

//Funciones Para manejar la insercion de registros
//----------------------------------------------------------------------------//
function InsDupRecord(lRelease,lUnlock) // duplicates current record, debajo del actual

   local aRecord

   Default lUnlock TO .T.

   aRecord := FieldsToArray()

   If InsDownRecord(lRelease,.F.)
      //if NetRecLock(, RECNO() )
         ArrayToFields(aRecord)
     if lUnlock
            DBRUnLock( RECNO() )
         endif
      //else
         //MsgInfo( "El registro esta en uso, intente nuevamente", "InsDupRecord(..)" )
      //endif
   endif

return .T.

//----------------------------------------------------------------------------//
function InsDownRecord(lReleaseLocks,lUnlock) // Inserta un registro, debajo del actual

   local nRecord:=Recno()
   local aRecord
   local aRecordBlank

   Default lUnlock TO .T.

   //Verificamos que se pueda bloquear todos los registros a ser movidos
   DbSkip()
   DO WHILE !EOF()
      if ! NetRecLock(, RECNO() )
         MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsDownRecord(..)" )
         return .F.
      endif
      DbSkip()
   ENDDO

   //Nos vamos al final de archivos
   DBGoBottom ()

   //copiamos el ultimo registro a un Array
   aRecord := FieldsToArray()

   //Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
   //APPEND BLANK
   if !NetAppend( ,lReleaseLocks)
      Return .F.
   endif
   aRecordBlank := FieldsToArray()

   ArrayToFields(aRecord)

   DbSkip(-1)

   DO WHILE Recno()<>nRecord
      DbSkip(-1)
      aRecord := FieldsToArray()
      DbSkip(1)
      DBRLock(Recno())
      ArrayToFields(aRecord)
      DbRUnLock(Recno())
      DbSkip(-1)
   ENDDO
   //DbUnLock()

   DbSkip(1)
   DBRLock(Recno())
   ArrayToFields(aRecordBlank)
   if lUnlock
      DbRUnLock(Recno())
   endif

return .T.
//----------------------------------------------------------------------------//
function InsUpRecord(lReleaseLocks,lUnlock) // Inserta un registro, arriba del actual

   local nRecord:=Recno()
   local aRecord
   local aRecordBlank

   Default lUnlock TO .T.

   //Verificamos que se pueda bloquear todos los registros a ser movidos
   DO WHILE !EOF()
      if ! NetRecLock(, RECNO() )
         MsgInfo( "Un Registro esta en uso, intente nuevamente", "InsUpRecord(..)" )
         return .F.
      endif
      DbSkip()
   ENDDO

   //Nos vamos al final de archivos
   DBGoBottom ()

   //copiamos el ultimo registro a un Array
   aRecord := FieldsToArray()

   //Añadimos un registro en blanco y guardamos sus valores (vacios) en una Array
   if !NetAppend(,lReleaseLocks)
      Return .F.
   endif
   aRecordBlank := FieldsToArray()

   ArrayToFields(aRecord)

   DbSkip(-1)

   DO WHILE Recno()<>nRecord
      DbSkip(-1)
      aRecord := FieldsToArray()
      DbSkip(1)
      DBRLock(Recno())
      ArrayToFields(aRecord)
      DbRUnLock(Recno())
      DbSkip(-1)
   ENDDO
   //DbUnLock()

   DBRLock(Recno())
   ArrayToFields(aRecordBlank)
   if lUnlock
      DbRUnLock(Recno())
   endif

return .T.
//----------------------------------------------------------------------------//
function SwapUpRecord()
   local aRecord,nRecord
   local aRecordUp,nRecordUp

   if NetRecLock(, nRecord:=RECNO() )

      aRecord := FieldsToArray()

      if DbSkipper(-1)=-1 .and. NetRecLock(, nRecordUp:=RECNO() )

         aRecordUp := FieldsToArray()
         ArrayToFields(aRecord)
     DBCommit()
         DbRUnlock(nRecordUp)

         DBGoto(nRecord)
         ArrayToFields(aRecordUp)
     DBCommit()
         DbRUnlock(nRecord)

      else
         return .F.
      endif
   else
      return .F.
   endif

return .T.
//----------------------------------------------------------------------------//
function SwapDownRecord()
   local aRecord,nRecord
   local aRecordDown,nRecordDown

   if NetRecLock(, nRecord:=RECNO() )

      aRecord := FieldsToArray()

      if DbSkipper(1)=1 .and. NetRecLock(, nRecordDown:=RECNO() )

         aRecordDown := FieldsToArray()
         ArrayToFields(aRecord)
     DBCommit()
         DbRUnlock(nRecordDown)

         DBGoto(nRecord)
         ArrayToFields(aRecordDown)
     DBCommit()
         DbRUnlock(nRecord)

      else
         return .F.
      endif
   else
      return .F.
   endif

return .T.

 


Espero que te sirva

Atentamente,

Rolando.


Hola buenas tardes a todos, estuve fuera un tiempo del foro,y no he revisado mis mensajes, aun apenas leo tu mensaje Ing. Rolando y disculpa por no responderle y gracias por compartir tu rutina,le eche vistazo rapido a tu rutina, pero no se me hace conocido unas funciones que veo en tu rutina, por ejemplo:

ArrayToFields()
FieldsToArray()
DbSkipper(1)
DbRUnlock(nRecord)
NetRecLock(, nRecordDown:=RECNO() )

Y tampoco he realizado alguna rutina por arrays que todos comentan que es mas facil insertar usando AINS(), que hacerlo directamente en dbf,cuando lo que quiero hacer es insertar un registro a mitad por ejemplo de una factura o captura de cuentas de contabilidad,volvere a retomar de nuevo esa rutina que me falta insertar registro.

Saludos y buen dia.!
Atte: Adrian C. C.
acc69@hotmail.com


+1 Ing. Rolando

Saludos