Página 1 de 1

Problema con TDBBrowse lAutoSave .f.

Publicado: Mar Jun 17, 2025 4:50 pm
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 337 veces
TDBBrowse 2.png
TDBBrowse 2.png (8.29 KiB) Visto 337 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

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

Re: Problema con TDBBrowse lAutoSave .f.

Publicado: Jue Jun 19, 2025 11:14 am
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

Re: Problema con TDBBrowse lAutoSave .f.

Publicado: Jue Jun 19, 2025 5:06 pm
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

Re: Problema con TDBBrowse lAutoSave .f.

Publicado: Jue Jun 19, 2025 9:06 pm
por ignacio
Estupendo. Muchas gracias.

Un saludo