Page 1 of 1

OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 2:07 pm
by mariordz
Buenos días compañeros del foro, estoy experimentando la edición de datos directamente en un xbrowse, cuando construyo el xbrowse tengo una columna que ya tiene valores y que pueden ser editados por el usuario, se edita el valor, pero al darle enter no guarda los cambios, ni en el xbrowse, ni en el DBF, ¿Alguna idea de que me este faltando?

Saludos.

Code: Select all  Expand view

function resulrep
    Public oDlg, oBrw
    Public oBtn1, oBtn2, oBtn3
    ciccc="S"
    do while ciccc="S"
    close all
    USE &dbtmp1 shared new alias repos
    DEFINE DIALOG oDlg resource "dlgverdb3" of oVentprinc title "Consulta de incidencias de recursos humanos" font oFont1g
    redefine say prompt"Lista de incidencias existentes, elige el criterio de consulta" ID 0 of oDlg
    define font oFont1  name "TIMES NEW ROMAN" size 0,-12 bold
        oBrw := TXBrowse():New( oDlg )
        oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW //barra selectora
    oBrw:nColDividerStyle := LINESTYLE_INSET
    oBrw:nRowDividerStyle := LINESTYLE_INSET
    oBrw:lColDividerComplete := .t. //completa pintado hasta el footer cuando lineas no llenan todo el browse
    oBrw:nHeaderHeight := 22 //Altura cabeceras de col
    oBrw:lRecordSelector := .t. //poner o no, COL de la flechita de la izq
    oBrw:bClrHeader := {|| { nRGB(152, 251, 152), nRGB(47, 79, 79) } }//{|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO
    oBrw:bClrFooter := oBrw:bClrHeader
    oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
    oBrw:bClrSel := {|| { nRGB( 0, 0,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
    oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
        oBrw:nRowHeight := 19

    oCol = oBrw:AddCol()
    oCol:bStrData = { || (repos->codigo) }
        oCol:nDataStrAlign := 0
    oCol:cHeader = "Código"
    oCol:nWidth = 100
    oCol:oHeaderFont := oFont1
    oCol:bClrHeader := { || {  65535, nRGB(47, 79, 79) } }

    oCol = oBrw:AddCol()
    oCol:bStrData =  { || repos->descrip }
    oCol:nDataStrAlign := 0
        oCol:cHeader = "Descripción"
    oCol:nWidth = 220
    oCol:oHeaderFont := oFont1
    oCol:bClrHeader := { || {  65535, nRGB(47, 79, 79) } }

    oCol = oBrw:AddCol()
    oCol:bStrData = { || transform(repos->solicita,"###,###.##") }
        oCol:nDataStrAlign := 0
    oCol:cHeader = "Solicitados"
    oCol:nWidth = 90
    oCol:bEditValue = { || repos->solicita }
    oCol:cEditPicture := "@Z 999,999.99"
    oCol:nEditType := EDIT_GET
    oCol:bOnPostEdit = { | oCol, xVal, nKey | If( nKey == VK_RETURN, (DBRLOCK(), (repos->solicita := xVal), DBUNLOCK()) ,) }
    oCol:bLClickHeader:= {|| oBrw:Gotop() }
     
    oBrw:SetRDD()
    
    oBrw:CreatefromResource(2)

    redefine button oBtn1 ID 3 of oDlg action msgalert("Boton 1","1")
        redefine button oBtn2 ID 4 of oDlg action msgalert("Boton 2","2")
    REDEFINE Button oBtn3 ID 5 OF oDlg action (ciccc:="N",oDlg:end())
        activate dialog oDlg centered
   enddo
return
 

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 3:04 pm
by FranciscoA
Intenta de esta manera:
Code: Select all  Expand view
  oCol = oBrw:AddCol()
   // oCol:bStrData = { || transform(repos->solicita,"###,###.##") }
    oCol:nDataStrAlign := 0
    oCol:cHeader = "Solicitados"
    oCol:nWidth = 90
    oCol:bEditValue = { || repos->solicita }
    oCol:cEditPicture := "@Z 999,999.99"
    oCol:nEditType := EDIT_GET
   // oCol:bOnPostEdit = { | oCol, xVal, nKey | If( nKey == VK_RETURN, (DBRLOCK(), (repos->solicita := xVal), DBUNLOCK()) ,) }
    oCol:bOnPostEdit = { | oCol, xVal, nKey | If( nKey == VK_RETURN, (DBRLOCK(), repos->solicita := xVal, DBUNLOCK()) ,) }
    oCol:bLClickHeader:= {|| oBrw:Gotop() }

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 5:10 pm
by mariordz
Muchas gracias por tu respuesta, desafortunadamente el comportamiento sigue siendo el mismo, la única diferencia es que con estos cambios no se ven los datos de la columna "solicitados" (creo que porque son datos numéricos en el DBF) hasta que le doy doble click a la celda para editarlos, de todas formas lo edito y me guarda cero en el DBF.

Alguna otra sugerencia será bienvenida.

Gracias

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 5:23 pm
by cnavarro
Has probado a cambiar el estilo del xbrowse?
Code: Select all  Expand view

oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
 

Para la edicion

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 6:43 pm
by mariordz
Gracias Cristóbal, pero el problema no es la edición (si tengo la línea como sugieres), el problema es que no salva los valores digitados por el usuario, puse un msgalert(xval,xval) y me muestra el dialogo con el valor cero, pero si edito el valor ya existente en esa celda y le doy enter no me salva el valor cero, leí que al querer salvar compara el valor en el DBF contra el valor en el xbrowse y solo lo cambia si detecta alguna diferencia, lo que no se es porque no guarda el valor que se digito y me guarda un cero.

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 6:56 pm
by cnavarro
Te he entendido
Lo que he querido decir es que si has probado a cambiar ese estilo de linea que tienes definido en el XBrowse

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 8:32 pm
by FranciscoA
mariordz wrote:...no se ven los datos de la columna "solicitados" (creo que porque son datos numéricos en el DBF)


Efectivamente, si los datos en la columna son numericos, y el valor de estos es 0, no se verán porque así tienes definido el PICTURE:
oCol:cEditPicture := "@Z 999,999.99" //no mostrará valores en 0
oCol:cEditPicture := "@ 999,999.99" //muestra valores en 0

Por otra parte, y perdona la pregunta... ¿Para qué usas Do While... Enddo ?
Saludos.

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 9:23 pm
by mariordz
Francisco, aunque en este caso en especial no es necesario el uso del do while-enddo, copie parte de un código que había escrito (en el que no necesitaba editar los datos) y lo use como "template" para usarlo aquí, en el otro programa donde lo usaba me era útil, ya que mostraba una serie de datos de los cuales podía filtrar e imprimir, así, cada vez que se generaba un reporte el sistema volvía a mostrar la lista completa para generar un nuevo filtrado, en caso de que el usuario así lo necesitara.

Saludos.

Re: OnPostEdit, no guarda cambios

PostPosted: Tue Apr 15, 2014 10:36 pm
by cmsoft
Hola Mario:
Yo reproduje el código en mi equipo (solo la parte del xBrowse) y funciona bien la rutina que colocaste. Lo hice desde codigo en lugar desde recurso por causas obvias. Pero tal vez tengas algo que ver el recurso, o las variables globales que tengas definidas. Busca el hilo por ahí.
Espero serte de ayuda

Re: OnPostEdit, no guarda cambios

PostPosted: Wed Apr 16, 2014 2:37 am
by FranciscoA
Mario, también probé tu código, de la siguiente manera y funciona bien.

Code: Select all  Expand view
//-------------------------
function resulrep
local dbtmp1 := "dbhola"
    local oDlg, oBrw, oCol
    local oBtn1, oBtn2, oBtn3

    USE &dbtmp1 shared new alias repos
    DEFINE DIALOG oDlg resource "BROWSITO" of oWnd title "Consulta de incidencias de recursos humanos"

    oBrw := TXBrowse():New( oDlg )
    oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW //barra selectora
    oBrw:nColDividerStyle := LINESTYLE_INSET
    oBrw:nRowDividerStyle := LINESTYLE_INSET
    oBrw:lColDividerComplete := .t. //completa pintado hasta el footer cuando lineas no llenan todo el browse
    oBrw:nHeaderHeight := 22 //Altura cabeceras de col
    oBrw:lRecordSelector := .t. //poner o no, COL de la flechita de la izq
    oBrw:bClrHeader := {|| { nRGB(152, 251, 152), nRGB(47, 79, 79) } }//{|| { nRGB(140, 0, 0), nRGB(229,0,0) } } // VERDECITO
    oBrw:bClrFooter := oBrw:bClrHeader
    oBrw:bClrStd := {|| { nRGB( 0, 0, 0), nRGB(255,248,220) } } // colores para lineas normales
    oBrw:bClrSel := {|| { nRGB( 0, 0,255), nRGB(241,222,088) } } // para barra de linea selecc cuando el control no tiene el foco
    oBrw:bClrSelFocus := {|| { nRGB( 0, 0, 0), nRGB(248,195, 34) } } // para barra de linea selecc cuando el control tiene el foco
    oBrw:nRowHeight := 19

    oCol = oBrw:AddCol()
    oCol:bStrData = { || (repos->codigo) }
    oCol:nDataStrAlign := 0
    oCol:cHeader = "Código"
    oCol:nWidth = 100
    oCol:bClrHeader := { || {  65535, nRGB(47, 79, 79) } }

    oCol = oBrw:AddCol()
    oCol:bStrData =  { || repos->descrip }
    oCol:nDataStrAlign := 0
    oCol:cHeader = "Descripción"
    oCol:nWidth = 220
    oCol:bClrHeader := { || {  65535, nRGB(47, 79, 79) } }

    oCol = oBrw:AddCol()
    oCol:nDataStrAlign := 0
    oCol:cHeader = "Solicitados"
    oCol:nWidth = 90
    oCol:bEditValue = { || repos->solicita }
    oCol:cEditPicture := "@Z 999,999.99"
    oCol:nEditType := EDIT_GET
    oCol:bOnPostEdit = { | oCol, xVal, nKey | If( nKey == VK_RETURN, (DBRLOCK(), (repos->solicita := xVal), DBUNLOCK()) ,) }
    oCol:bLClickHeader:= {|| oBrw:Gotop() }
     
    oBrw:SetRDD()
   
    oBrw:CreatefromResource(118)

    redefine button oBtn1 ID 304 of oDlg action msgalert("Boton 1","1")
    redefine button oBtn2 ID 305 of oDlg action msgalert("Boton 2","2")
    REDEFINE Button oBtn3 ID 306 OF oDlg action (oDlg:end())
    activate dialog oDlg centered
repos->(dbclosearea())
return nil