Usar classe FwBrowse para editar tabela e array

Boa tarde!

Prezados, gostaria de saber se alguém já utilizou a classe FwBrowse para edição de dados (seja de tabela ou de array). Similar a funcionalidade da MsNewGetDados, onde seja possível editar campos e/ou adicionar novos. Se sim, teria algum exemplo para passar? Estou tendo dificuldades ao implantar a opção de adicionar novas linhas.

Estou pensando em utilizar essa classe em substituição a MsNewGetDados, mas não sei se vale a pena.

Agradeço pela atenção.

Giordano, eu passei por uma migração semelhante de um fonte que precisava de 2 legendas, marcação atualizando em array em tabela temporária e depois em base dados, ou seja, o circo todo :-)

No final o que ficou mais fácil foi usar o TCBrowse que me parece o método construtor de todas as outras funções e o que dá mais flexibilidade:

http://tdn.totvs.com/display/tec/TCBrowse <-- documentação bem completa com exemplo

https://www.blogadvpl.com/exemplo-de-grids-no-protheus-msnewgetdados/

apesar de ser sobre msnewgetdados nos comentários tem dois exemplos sobre tcbrowse com marcação que complementam bem o exemplo do tdn

Estava usando o TwBrowse em algumas rotinas, sabe me dizer se existe alguma diferença entre eles? (algum que seja mais recomendável ou etc).

Estava pensando mais no FwBrowse por questão de interface, pois nessa rotina que estou desenvolvendo usaria dois Browses onde um seria de marcação (FwMarkBrowse) e outro de edição. Como o FwBrowse possui a interface igual ao FwMarkBrowse, ficaria padronizado.

Olá, utilizando o tcBrowse com campo editável é bem simples


oList := TCBrowse():New(020,005,440,220,,,,oDlg,,,,,,,,,,,,.F.,,.T.,,.F.,,,)        
oList:AddColumn(TCColumn():New(" "                   , {|| If(aItens[oList:nAt,01],oBmpSim,oBmpNao) },,,,,,.T.,.F.,,,,.F., ) )
oList:AddColumn(TCColumn():New(" "                   , {|| If(aItens[oList:nAt,02],oOk,oNo) },,,,,,.T.,.F.,,,,.F., ) )
oList:AddColumn(TCColumn():New("Nota Fiscal"        , {|| aItens[oList:nAt,03]},"@!",,,"CENTER", 030,.F.,.F.,,{|| .F. },,.F., ) )
oList:AddColumn(TCColumn():New("Série"                , {|| aItens[oList:nAt,04]},"@!",,,"CENTER", 040,.F.,.F.,,,,.F., ) )
oList:AddColumn(TCColumn():New("Pedido"                , {|| aItens[oList:nAt,05]},"@!",,,"CENTER", 030,.F.,.F.,,,,.F., ) )
oList:AddColumn(TCColumn():New("Volume"               , {|| aItens[oList:nAt,06]},"@!",,,"CENTER", 030,.F.,.F.,,,,.F., ) )
oList:AddColumn(TCColumn():New("Emissão"            , {|| aItens[oList:nAt,07]},"@D",,,"CENTER", 030,.F.,.F.,,,,.F., ) )
oList:AddColumn(TCColumn():New("Transportadora"        , {|| aItens[oList:nAt,08]},"@!",,,"LEFT"  , 040,.F.,.F.,,{|| },,.F., ) )
oList:SetArray(aItens)
oList:bWhen        := { || Len(aItens) > 0 }
oList:bRClicked    := { || lEditCell (@aItens, oList, "@!", 8)}

/*
Utilizamos a função lEditCell
Onde:
1o parametro = array do browse
2o parametro = objeto do browse
3o parametro = mascara do campo editável
4o parametro = posição no browse do campo que ficará editável
*/ 

usando o SetKey você pode programar alguma outra tecla para a edição do campo

Mas a utilização do msnewgetdados ainda é a melhor

Mas o FWBrowse permite facilmente a edição, utilizo bastante, basta um duplo clique ou pressionar a tecla enter


Private oBrowse    := FWBrowse():New()
oBrowse:SetOwner(oDlg)
oBrowse:SetDescription("Simulação Tabela Global Price")
oBrowse:SetDataArray()
oBrowse:SetColumns(aColunas)
oBrowse:SetArray(aDados)
oBrowse:lHeaderClick:=.F.
oBrowse:SetLocate() // Habilita a Localização de registros
oBrowse:SetSeek(nil,aSeek)
oBrowse:SetFieldFilter(aFiltro)
oBrowse:AddCustomConfig("Filial",{|o| MBrFilialCfg(o,Self) }, { || MBrSaveFilCfg(Self) } )
oBrowse:SetEditCell( .T. )                 // indica que o grid é editavel
oBrowse:acolumns[15]:ledit     := .T.
oBrowse:acolumns[15]:cReadVar:= 'aDados[oBrowse:nAt,15]'
oBrowse:Activate()

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Bom dia, Rodrigo! Obrigado pelos exemplos, estarei realizando alguns testes. Estava procurando algumas alternativas ao MsNewGetDados, já que ela se tornou depreciada.

Rodrigo, com o TCBrowse é possível para o usuário adcionar novas linhas?

Rodrigo, no FWBRowse a Edição só é possível com o Enter ou duple clique? E para sair do campo, Enter novamente? Quando aperta o Enter para sair o cursor pula para a coluna da direita, e como quero editar várias linhas porém na mesma coluna tem que toda hora ficar voltando o cursor.

Quanto ao posicionamento do cursor eu consegui usando FWBrowse():GoColumn e voltei para coluna anterior.

Giordano, segue um exemplo que utilizei o FWBrowse editável. Neste caso, o usuário edita os campos como também cria novas linhas. Utilizo um array para isso e não uma tabela do sistema.

Para incluir linhas novas basta utilizar o setInsert(.T.). Porém, tive que utilizar o método setAfterAddLine para 'inicializar' os campos do array com os devidos tamanhos.


// Coloco o FWBrowse dentro de um dialog
oDespesBrw := fwBrowse():New()
oDespesBrw:setDataArray()
oDespesBrw:setArray( aDespes )
oDespesBrw:disableConfig()
oDespesBrw:disableReport()
oDespesBrw:setOwner( oPanelDw )

oDespesBrw:addColumn({"Despesa"                , {||aDespes[oDespesBrw:nAt,01]}, "C", pesqPict("ZEE","ZEE_CODDES")    , 1, tamSx3("ZEE_CODDES")[1]/2    ,                            , .T. , , .F.,, "xEETDESPES",, .F., .T.,                                    , "xEETDESPES"    })
oDespesBrw:addColumn({"Descrição"            , {||aDespes[oDespesBrw:nAt,02]}, "C", pesqPict("ZEE","ZEE_DESPES")    , 1, tamSx3("ZEE_DESPES")[1]/2    ,                            , .F. , , .F.,, "xZEEDESPES",, .F., .T.,                                    , "xZEEDESPES"    })
oDespesBrw:addColumn({"Tabela Pré Cálculo"    , {||aDespes[oDespesBrw:nAt,03]}, "C", pesqPict("ZEE","ZEE_CODIGO")    , 1, tamSx3("ZEE_CODIGO")[1]/2    ,                            , .F. , , .F.,, "xZEECODIGO",, .F., .T.,                                    , "xZEECODIGO"    })
oDespesBrw:addColumn({"Moeda Pré Cálculo"    , {||aDespes[oDespesBrw:nAt,04]}, "C", pesqPict("ZEE","ZEE_MOEDA")    , 1, tamSx3("ZEE_MOEDA")[1]/2    ,                            , .F. , , .F.,, "xZEEMOEDA"    ,, .F., .T.,                                    , "xZEEMOEDA"    })
oDespesBrw:addColumn({"Valor Pré Cálculo"    , {||aDespes[oDespesBrw:nAt,05]}, "N", pesqPict("ZEE","ZEE_VALOR")    , 2, tamSx3("ZEE_VALOR")[1]        , tamSx3("ZEE_VALOR")[2]    , .F. , , .F.,, "xValPreCal",, .F., .T.,                                    , "xValPreCal"    })
oDespesBrw:addColumn({"Documento"            , {||aDespes[oDespesBrw:nAt,06]}, "C", pesqPict("SE2","E2_NUM")        , 1, tamSx3("E2_NUM")[1]        , tamSx3("E2_NUM")[2]        , .T. , , .F.,, "xEETDOCTO"    ,, .F., .T.,                                    , "xEETDOCTO"    })
oDespesBrw:addColumn({"Série"                , {||aDespes[oDespesBrw:nAt,07]}, "C", pesqPict("SF1","F1_SERIE")    , 1, tamSx3("F1_SERIE")[1]        , tamSx3("F1_SERIE")[2]        , .T. , , .F.,, "xC7XSERIE"    ,, .F., .T.,                                    , "xC7XSERIE"    })
oDespesBrw:addColumn({"Espécie"                , {||aDespes[oDespesBrw:nAt,08]}, "C", pesqPict("SF1","F1_ESPECIE")    , 1, tamSx3("F1_ESPECIE")[1]    , tamSx3("F1_ESPECIE")[2]    , .T. , , .F.,, "xC7XESPECI",, .F., .T.,                                    , "xC7XESPECI"    })
oDespesBrw:addColumn({"Operação"            , {||aDespes[oDespesBrw:nAt,09]}, "C", pesqPict("SD1","D1_OPER")    , 1, tamSx3("D1_OPER")[1]        , tamSx3("D1_OPER")[2]        , .T. , , .F.,, "xC7XOPER"    ,, .F., .T.,                                    , "xC7XOPER"    })
oDespesBrw:addColumn({"Emissão"                , {||aDespes[oDespesBrw:nAt,10]}, "D", pesqPict("SE2","E2_EMISSAO")    , 1, tamSx3("E2_EMISSAO")[1]    , tamSx3("E2_EMISSAO")[2]    , .T. , , .F.,, "xEETDESADI",, .F., .T.,                                     , "xEETDESADI"    })
oDespesBrw:addColumn({"Valor Documento"        , {||aDespes[oDespesBrw:nAt,11]}, "N", pesqPict("SE2","E2_VALOR")    , 2, tamSx3("E2_VALOR")[1]        , tamSx3("E2_VALOR")[2]        , .T. , , .F.,, "xEETVALORR",, .F., .T.,                                    , "xEETVALORR"    })
oDespesBrw:addColumn({"Adiantamento"        , {||aDespes[oDespesBrw:nAt,12]}, "C", pesqPict("EET","EET_BASEAD")    , 1, tamSx3("EET_BASEAD")[1]    , tamSx3("EET_BASEAD")[2]    , .T. , , .F.,, "xEETBASEAD",, .F., .T., { "S=Sim","N=Não" }                , "xEETBASEAD"    })
oDespesBrw:addColumn({"Moeda"                , {||aDespes[oDespesBrw:nAt,13]}, "C", pesqPict("EET","EET_ZMOED")    , 1, tamSx3("EET_ZMOED")[1]        , tamSx3("EET_ZMOED")[2]    , .T. , , .F.,, "xEETZMOED"    ,, .F., .T., { "1=R$","2=US$","3=EUR","4=GBP" }    , "xEETZMOED"    })
oDespesBrw:addColumn({"Taxa Neg."            , {||aDespes[oDespesBrw:nAt,14]}, "N", pesqPict("EET","EET_ZTX")    , 2, tamSx3("EET_ZTX")[1]        , tamSx3("EET_ZTX")[2]        , .T. , , .F.,, "xEETZTX"    ,, .F., .T.,                                    , "xEETZTX"        })
oDespesBrw:addColumn({"Valor Moeda"            , {||aDespes[oDespesBrw:nAt,15]}, "N", pesqPict("EET","EET_ZVLMOE")    , 2, tamSx3("EET_ZVLMOE")[1]    , tamSx3("EET_ZVLMOE")[2]    , .T. , , .F.,, "xEETZVLMOE",, .F., .T.,                                    , "xEETZVLMOE"    })
oDespesBrw:addColumn({"Observação"            , {||aDespes[oDespesBrw:nAt,16]}, "C", pesqPict("EET","EET_ZOBS")    , 1, tamSx3("EET_ZOBS")[1]        , tamSx3("EET_ZOBS")[2]        , .T. , , .F.,, "xEETZOBS"    ,, .F., .T.,                                    , "xEETZOBS"    })
oDespesBrw:addColumn({"Pago Por"            , {||aDespes[oDespesBrw:nAt,17]}, "C", pesqPict("EET","EET_PAGOPO")    , 1, tamSx3("EET_PAGOPO")[1]    , tamSx3("EET_PAGOPO")[2]    , .T. , , .F.,, "xEETPAGOPO",, .F., .T., {    "1=Despachante","2=Exportador" }, "xEETPAGOPO"    })
oDespesBrw:addColumn({"Recebido Por"        , {||aDespes[oDespesBrw:nAt,18]}, "C", pesqPict("EET","EET_RECEBE")    , 1, tamSx3("EET_RECEBE")[1]    , tamSx3("EET_RECEBE")[2]    , .T. , , .F.,, "xEETRECEBE",, .F., .T.,                                    , "xEETRECEBE"    })
oDespesBrw:addColumn({"Ref. Rec."            , {||aDespes[oDespesBrw:nAt,19]}, "C", pesqPict("EET","EET_REFREC")    , 1, tamSx3("EET_REFREC")[1]    , tamSx3("EET_REFREC")[2]    , .T. , , .F.,, "xEETREFREC",, .F., .T.,                                    , "xEETREFREC"    })
oDespesBrw:addColumn({"Evento"                , {||aDespes[oDespesBrw:nAt,20]}, "C", pesqPict("EET","EET_EVENT")    , 1, tamSx3("EET_EVENT")[1]        , tamSx3("EET_EVENT")[2]    , .T. , , .F.,, "xEETEVENT"    ,, .F., .T.,                                    , "xEETEVENT"    })
oDespesBrw:addColumn({"Data Desemb."        , {||aDespes[oDespesBrw:nAt,21]}, "D", pesqPict("EET","EET_DTDEMB")    , 1, tamSx3("EET_DTDEMB")[1]    , tamSx3("EET_DTDEMB")[2]    , .T. , , .F.,, "xEETDTDEMB",, .F., .T.,                                    , "xEETDTDEMB"    })
oDespesBrw:addColumn({"Vencimento"            , {||aDespes[oDespesBrw:nAt,22]}, "D", pesqPict("EET","EET_DTVENC")    , 1, tamSx3("EET_DTVENC")[1]    , tamSx3("EET_DTVENC")[2]    , .T. , , .F.,, "xEETDTVENC",, .F., .T.,                                    , "xEETDTVENC"    })
oDespesBrw:addColumn({"Natureza"            , {||aDespes[oDespesBrw:nAt,23]}, "C", pesqPict("EET","EET_NATURE")    , 1, tamSx3("EET_NATURE")[1]    , tamSx3("EET_NATURE")[2]    , .T. , , .F.,, "xEETNATURE",, .F., .T.,                                    , "xEETNATURE"    })
oDespesBrw:addColumn({"Prefixo"                , {||aDespes[oDespesBrw:nAt,24]}, "C", pesqPict("EET","EET_PREFIX")    , 1, tamSx3("EET_PREFIX")[1]    , tamSx3("EET_PREFIX")[2]    , .T. , , .F.,, "xEETPREFIX",, .F., .T.,                                    , "xEETPREFIX"    })
oDespesBrw:addColumn({"Centro Custo"        , {||aDespes[oDespesBrw:nAt,25]}, "C", pesqPict("EET","EET_ZCCUST")    , 1, tamSx3("EET_ZCCUST")[1]    , tamSx3("EET_ZCCUST")[2]    , .F. , , .F.,, "xEETZCCUST",, .F., .T.,                                    , "xEETZCCUST"    })
oDespesBrw:addColumn({"Item Ctb.Deb"        , {||aDespes[oDespesBrw:nAt,26]}, "C", pesqPict("EET","EET_ZITEMD")    , 1, tamSx3("EET_ZITEMD")[1]    , tamSx3("EET_ZITEMD")[2]    , .F. , , .F.,, "xEETZITEMD",, .F., .T.,                                    , "xEETZITEMD"    })
oDespesBrw:addColumn({"NF FORNEC"            , {||aDespes[oDespesBrw:nAt,27]}, "C", pesqPict("EET","EET_ZNFORN")    , 1, tamSx3("EET_ZNFORN")[1]    , tamSx3("EET_ZNFORN")[2]    , .T. , , .F.,, "xEETZNFORN",, .F., .T.,                                    , "xEETZNFORN"    })

oDespesBrw:setEditCell( .T. , { || vldDoc() } )

oDespesBrw:setInsert( .T. )
oDespesBrw:setLineOk( { || chkLineOk() } )

oDespesBrw:aColumns[1]:XF3 := 'SYB'

oDespesBrw:setAfterAddLine( { || posIncLine() } )

oDespesBrw:activate( .T. )

//----------------------------------------------------------------
// Executa apos a inclusao de uma nova linha
// Inicializa o array com os tamanhos para liberar digitacao
//----------------------------------------------------------------
static function posIncLine()
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETDESPES"    ):nOrder ] := space( tamSx3( "ZEE_CODDES" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xZEEDESPES"    ):nOrder ] := space( tamSx3( "YB_DESCR" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xZEECODIGO"    ):nOrder ] := space( tamSx3( "ZEE_CODIGO" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xZEEMOEDA"    ):nOrder ] := space( tamSx3( "ZEE_MOEDA" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xValPreCal"    ):nOrder ] := 0
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETDOCTO"    ):nOrder ] := space( tamSx3( "E2_NUM" )[1]         )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xC7XSERIE"    ):nOrder ] := space( tamSx3( "F1_SERIE" )[1]         )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xC7XESPECI"    ):nOrder ] := space( tamSx3( "F1_ESPECIE" )[1]     )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xC7XOPER"        ):nOrder ] := space( tamSx3( "D1_OPER" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETDESADI"    ):nOrder ] := cToD("//")
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETVALORR"    ):nOrder ] := 0
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETBASEAD"    ):nOrder ] := space( tamSx3( "EET_BASEAD" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZMOED"    ):nOrder ] := space( tamSx3( "EET_ZMOED" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZTX"        ):nOrder ] := 0
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZVLMOE"    ):nOrder ] := 0
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZOBS"        ):nOrder ] := space( tamSx3( "EET_ZOBS" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETPAGOPO"    ):nOrder ] := space( tamSx3( "EET_PAGOPO" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETRECEBE"    ):nOrder ] := space( tamSx3( "EET_RECEBE" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETREFREC"    ):nOrder ] := space( tamSx3( "EET_REFREC" )[1]     )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETEVENT"    ):nOrder ] := space( tamSx3( "YB_EVENT" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETDTDEMB"    ):nOrder ] := cToD("//")
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETDTVENC"    ):nOrder ] := cToD("//")
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETNATURE"    ):nOrder ] := space( tamSx3( "YB_NATURE" )[1]        )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETPREFIX"    ):nOrder ] := space( tamSx3( "EET_PREFIX" )[1]     )
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZCCUST"    ):nOrder ] := "2404"
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZITEMD"    ):nOrder ] := "12"
    aDespes[ oDespesBrw:at() , oDespesBrw:GetColByID("xEETZNFORN"    ):nOrder ] := space( tamSx3( "EET_ZNFORN" )[1]        )
return

Boa tarde, Gustavo! Obrigado pelo exemplo. Nesse caso, como você adiciona novas linhas? Apertando a seta pra baixo do teclado?

Existe a possibilidade de se utilizar o FWMARKBROWSE e permitir alterar ou seja editar 2 colunas ?