In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Problema con TDBBrowse lAutoSave .f.

Foro de Xailer profesional en español
Responder
ftwein
Mensajes: 55
Registrado: Lun Oct 22, 2007 5:17 pm

Problema con TDBBrowse lAutoSave .f.

Mensaje por ftwein »

Hola,

Usando Xailer\Samples\DataControls\MemDataset2 y modificando algunas líneas para ilustrar el problema.

Pasos para ilustrar el problema:

1. En el primer registro, columna "First", cambie el valor a UNO.

2. En el segundo registro, columna "Last", haga doble clic para editar el campo y presione ENTER para confirmar.

3. Verá que el valor de la columna "Primero" de la segunda fila cambiará a UNO.

Es un error de DBBrowse1Column1PostEdit ? Hay alguna forma de evitar este comportamiento ?

Gracias.

Fausto
TDBBrowse 1.png
TDBBrowse 1.png (8.81 KiB) Visto 338 veces
TDBBrowse 2.png
TDBBrowse 2.png (8.29 KiB) Visto 338 veces

Código: Seleccionar todo

//------------------------------------------------------------------------------

METHOD FormInitialize( oSender ) CLASS TForm1

   LOCAL oCol

   SET EPOCH TO 1950

   ::oDBBrowse1:nMarqueeStyle:= bmSOLIDCELL
   ::oDBBrowse1:lAutoSave:= .f.

   FOR EACH oCol IN ::oDBBrowse1:aCols
      IF oCol:cHeader == "First"
         oCol:nEditType := beLISTBOX
         oCol:aEditListBound:= { "ONE", "TWO", "THREE" }
         oCol:aEditListText:= { "ONE", "TWO", "THREE" }
      ELSE
         oCol:nEditType := beGET
      ENDIF
      oCol:OnPostEdit := "DBBrowse1Column1PostEdit"
   NEXT

RETURN Nil

//------------------------------------------------------------------------------

METHOD DBBrowse1Column1PostEdit( oSender, Value, lCanceled, nKey ) CLASS TForm1
LOCAL oDS:= oSender:oDataField:oDataSet
IF !oDS:lOnEdit()
   oDS:Edit()
ENDIF
oDS:FieldPut( oDS:FieldPos( oSender:oDataField:cName ), Value )
oDS:Update()
RETURN Nil

//------------------------------------------------------------------------------
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9440
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Problema con TDBBrowse lAutoSave .f.

Mensaje por ignacio »

Buenos días,

Le ruego pruebe a modificar el siguiente método del fichero BrwCol.prg:

Código: Seleccionar todo

METHOD PostEdit( lCanceled, nKey ) CLASS XBrwColumn

   LOCAL Value
   LOCAL nAt

   IF ::lOnPostEdit
      RETURN Nil
   ENDIF

   DEFAULT lCanceled TO .F.

   ::lOnPostEdit := .T.

   WITH OBJECT ::oGridEdit
      Value := :Value
      IF :lReadOnly .AND. Len( ::aEditListBound ) > 0
         IF ( nAt := AScan( :aItems, Value ) ) > 0
            Value := ::aEditListBound[ nAt ]
            // Debido a que desde el inspector siempre son de tipo caracter
            IF Valtype( Value ) == "C" .AND. ::cEditValType == "N"
               Value := Val( Value )
            ENDIF
         ENDIF
      ENDIF
      ::OnPostEdit( @Value, @lCanceled, nKey )
      :Value := Value
   END WITH

   ::lOnPostEdit := .F.
   ::lEdited     := .F.  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NUEVA LÍNEA <<<<<<<<<<<<<<<<<<<<<

RETURN Nil
En el fichero DBBrowse.prg sustituir completamente el método CancelEdit:

Código: Seleccionar todo

METHOD CancelEdit( lAbort, nKey ) CLASS XDBBrowse

   LOCAL oCol
   LOCAL nEditMode := ::nEditMode
   LOCAL lOk

   IF ! ::lEditMode .OR. ::oDataset == Nil .OR. !::oDataSet:lOpen
      RETURN Nil
   ENDIF

   ::Super:CancelEdit( @lAbort, nKey )

   IF ::oDataset:lOnEdit
      IF lAbort
         ::oDataSet:Cancel()
      ELSE
         lOk := ::oDataSet:Update()
         IF nEditMode = beAPPEND .AND. lOk
            ::nLen ++
            ::nRowSel ++
            ::OnChange( .T. )
         ENDIF
      ENDIF
      FOR EACH oCol IN ::aCols
         WITH OBJECT oCol
            :oGridEdit:oDataSet := Nil
         END WITH
      NEXT
   ENDIF

   ::Redraw()

RETURN Nil
El código de post edición se simplifica:

Código: Seleccionar todo

METHOD DBBrowse1Column1PostEdit( oSender, Value, lCanceled, nKey ) CLASS TForm1

   LOCAL oDS:= oSender:oDataField:oDataSet

   oDS:FieldPut( oDS:FieldPos( oSender:oDataField:cName ), Value )

RETURN Nil
Si lo puede probar a fondo se lo agradezco. Si no sabe hacer los cambios, le puedo mandar los módulos OBJ para que lo incorpore directamente en el proyecto, pero sería importante que estuviese usando la última versión de Xailer.

Un saludo
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
ftwein
Mensajes: 55
Registrado: Lun Oct 22, 2007 5:17 pm

Re: Problema con TDBBrowse lAutoSave .f.

Mensaje por ftwein »

Hola,

He realizado los cambios y probado mi aplicación, y todo funciona correctamente.

La actualizaré para los usuarios y esperaré su respuesta.

Muchas gracias.

Fausto Di Creddo Trautwein
Tw Software
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9440
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Problema con TDBBrowse lAutoSave .f.

Mensaje por ignacio »

Estupendo. Muchas gracias.

Un saludo
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder