Insertar registro dentro xBrowse...

Insertar registro dentro xBrowse...

Postby ACC69 » Wed Jan 06, 2016 3:14 pm

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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Wed Jan 06, 2016 10:10 pm

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!
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby joseluisysturiz » Thu Jan 07, 2016 12:24 am

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().
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Insertar registro dentro xBrowse...

Postby FranciscoA » Thu Jan 07, 2016 12:57 pm

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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Thu Jan 07, 2016 3:11 pm

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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby joseluisysturiz » Thu Jan 07, 2016 6:59 pm

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Thu Jan 07, 2016 10:09 pm

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.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby joseluisysturiz » Thu Jan 07, 2016 11:43 pm

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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Mon Jan 11, 2016 4:21 pm

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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Tue Jan 19, 2016 3:00 pm

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.
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby RenOmaS » Wed Jan 20, 2016 7:38 pm

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.
Saludos/regards
RenOmaS

skype: americo.balboa
User avatar
RenOmaS
 
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Insertar registro dentro xBrowse...

Postby RSalazarU » Thu Jan 21, 2016 1:11 am

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.
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: Insertar registro dentro xBrowse...

Postby RSalazarU » Thu Jan 21, 2016 1:17 am

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
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Thu Mar 03, 2016 9:03 pm

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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Insertar registro dentro xBrowse...

Postby ACC69 » Fri Mar 04, 2016 5:13 pm

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
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 82 guests