No vídeo de hoje, vamos demonstrar em como editar o conteúdo de um campo usando FWBrowse.
Hoje, a dúvida foi feita pelo grande Fernando, onde ele perguntou como usar uma grid customizada com FWBrowse com edição de campos.
Então foi criado as tratativas nas colunas através de FWBrwColumn.
E abaixo o código fonte desenvolvido para exemplificar:
#Include "Totvs.ch" /*/{Protheus.doc} User Function zVid0039 Função que demonstra como atualizar valores da grid usando FWBrowse @type Function @author Atilio @since 01/09/2021 @version version /*/ User Function zVid0039() Local aArea := GetArea() //Fontes Local cFontUti := "Tahoma" Local oFontAno := TFont():New(cFontUti,,-38) Local oFontSub := TFont():New(cFontUti,,-20) Local oFontSubN := TFont():New(cFontUti,,-20,,.T.) Local oFontBtn := TFont():New(cFontUti,,-14) //Janela e componentes Private oDlgGrp Private oPanGrid Private oGetGrid Private aColunas := {} Private cAliasTab := "TMPSBM" //Tamanho da janela Private aTamanho := MsAdvSize() Private nJanLarg := aTamanho[5] Private nJanAltu := aTamanho[6] //Cria a temporária oTempTable := FWTemporaryTable():New(cAliasTab) //Adiciona no array das colunas as que serão incluidas (Nome do Campo, Tipo do Campo, Tamanho, Decimais) aFields := {} aAdd(aFields, {"XXCODIGO", "C", 6, 0}) aAdd(aFields, {"XXDESCRI", "C", 30, 0}) aAdd(aFields, {"XXQUANTI", "N", 9, 2}) aAdd(aFields, {"XXEMISSA", "D", 8, 0}) aAdd(aFields, {"XXOBSERV", "C", 100, 0}) //Define as colunas usadas, adiciona indice e cria a temporaria no banco oTempTable:SetFields( aFields ) oTempTable:AddIndex("1", {"XXCODIGO"} ) oTempTable:Create() //Monta o cabecalho fMontaHead() //Montando os dados, eles devem ser montados antes de ser criado o FWBrowse FWMsgRun(, {|oSay| fMontDados(oSay) }, "Processando", "Buscando grupos") //Criando a janela DEFINE MSDIALOG oDlgGrp TITLE "Dados" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL //Labels gerais @ 004, 003 SAY "FAT" SIZE 200, 030 FONT oFontAno OF oDlgGrp COLORS RGB(149,179,215) PIXEL @ 004, 050 SAY "Listagem Genérica de" SIZE 200, 030 FONT oFontSub OF oDlgGrp COLORS RGB(031,073,125) PIXEL @ 014, 050 SAY "Dados Temporários" SIZE 200, 030 FONT oFontSubN OF oDlgGrp COLORS RGB(031,073,125) PIXEL //Botões @ 006, (nJanLarg/2-001)-(0052*01) BUTTON oBtnFech PROMPT "Fechar" SIZE 050, 018 OF oDlgGrp ACTION (oDlgGrp:End()) FONT oFontBtn PIXEL //Dados @ 024, 003 GROUP oGrpDad TO (nJanAltu/2-003), (nJanLarg/2-003) PROMPT "Browse" OF oDlgGrp COLOR 0, 16777215 PIXEL oGrpDad:oFont := oFontBtn oPanGrid := tPanel():New(033, 006, "", oDlgGrp, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/2 - 13), (nJanAltu/2 - 45)) oGetGrid := FWBrowse():New() oGetGrid:DisableFilter() oGetGrid:DisableConfig() oGetGrid:DisableReport() oGetGrid:DisableSeek() oGetGrid:DisableSaveConfig() oGetGrid:SetFontBrowse(oFontBtn) oGetGrid:SetAlias(cAliasTab) oGetGrid:SetDataTable() oGetGrid:SetEditCell(.T., {|| .T.}) oGetGrid:lHeaderClick := .F. oGetGrid:AddLegend(cAliasTab + "->XXQUANTI == 0", "YELLOW", "Quantidade zerada") oGetGrid:AddLegend(cAliasTab + "->XXQUANTI < 0", "RED", "Quantidade menor que zero") oGetGrid:AddLegend(cAliasTab + "->XXQUANTI > 0", "GREEN", "Quantidade maior que zero") oGetGrid:SetColumns(aColunas) oGetGrid:SetOwner(oPanGrid) oGetGrid:Activate() ACTIVATE MsDialog oDlgGrp CENTERED //Deleta a temporaria oTempTable:Delete() RestArea(aArea) Return Static Function fMontaHead() Local nAtual Local aHeadAux := {} //Adicionando colunas //[1] - Campo da Temporaria //[2] - Titulo //[3] - Tipo //[4] - Tamanho //[5] - Decimais //[6] - Máscara //[7] - Editável? .T. = sim, .F. = não aAdd(aHeadAux, {"XXCODIGO", "Código", "C", 6, 0, "", .F.}) aAdd(aHeadAux, {"XXDESCRI", "Descricao", "C", 30, 0, "", .F.}) aAdd(aHeadAux, {"XXQUANTI", "Quantidade", "N", 9, 2, "@E 999,999.99", .T.}) aAdd(aHeadAux, {"XXEMISSA", "Emissão", "D", 8, 0, "", .T.}) aAdd(aHeadAux, {"XXOBSERV", "Observação", "C", 100, 0, "", .T.}) //Percorrendo e criando as colunas For nAtual := 1 To Len(aHeadAux) oColumn := FWBrwColumn():New() oColumn:SetData(&("{|| " + cAliasTab + "->" + aHeadAux[nAtual][1] +"}")) oColumn:SetTitle(aHeadAux[nAtual][2]) oColumn:SetType(aHeadAux[nAtual][3]) oColumn:SetSize(aHeadAux[nAtual][4]) oColumn:SetDecimal(aHeadAux[nAtual][5]) oColumn:SetPicture(aHeadAux[nAtual][6]) //Se for ser possível ter o duplo clique If aHeadAux[nAtual][7] oColumn:SetEdit(.T.) oColumn:SetReadVar(aHeadAux[nAtual][1]) //oColumn:SetValid({|| fSuaValid()}) EndIf aAdd(aColunas, oColumn) Next Return Static Function fMontDados(oSay) Local aArea := GetArea() Local nAtual := 0 Local nTotal := 50 Local dDtRef := Date() Local cCodAtu := "000000" Local cDescri := "" Local nQuanti := 0 Local dEmissa := sToD("") //Faz um laço de repetição For nAtual := 1 To nTotal //Muda a mensagem na regua nAtual++ oSay:SetText("Adicionando registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...") //Pega as variáveis que vão ser gravadas cCodAtu := Soma1(cCodAtu) cDescri := "[" + Time() + "] Teste - " + cCodAtu nQuanti := Randomize(-5, 5) dEmissa := DaySub(dDtRef, nAtual) //Insere os dados na temporária RecLock(cAliasTab, .T.) (cAliasTab)->XXCODIGO := cCodAtu (cAliasTab)->XXDESCRI := cDescri (cAliasTab)->XXQUANTI := nQuanti (cAliasTab)->XXEMISSA := dEmissa (cAliasTab)->XXOBSERV := "" (cAliasTab)->(MsUnlock()) Next RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Bom dia, sabe como faço para que apareça o campo de pesquisa?
Bom dia Mauricio, tudo bem?
Com FWBrowse eu nunca precisei, mas você pode dar uma olhada nesse artigo, que eu demonstro em como fazer no FWMarkBrowse, pode ser que funcione: https://terminaldeinformacao.com/2023/03/06/criando-pesquisa-em-uma-fwmarkbrowse-ti-responde-046/
Abraços.
Bom dia Dan, tudo bem por ai?
Nesse exemplo, você precisa dar um duplo clique, ou enter, na coluna editável que deseja alterar. Você sabe me dizer se é possível ter o mesmo comportamento da MsNewGetDados onde ele já assume o que você digita, sem precisar selecionar a coluna antes? Muito obrigada!
Boa tarde Mary, tudo joia graças a Deus e você?
Nunca precisei mexer nesse comportamento na classe FWBrowse, então não sei dizer se existe essa possibilidade.
Se eu encontrar algo, eu atualizo o artigo.
Um grande abraço.
Boa tarde Dan,
É possivel utilizar consulta padrão no grid FWBROWSE?
Bom dia Fabio, tudo joia?
Eu não precisei ainda, mas o que você pode fazer, é colocar um breakpoint logo após criar uma FWBrwColumn, e ver na lista de atributos dela, se existe algum “F3”, “LookUp”, “ConPad”, etc… algum que faça alusão a consulta padrão.
Nesse link tem um exemplo de como ver as propriedades de um objeto: https://terminaldeinformacao.com/2023/09/29/como-ver-os-atributos-de-um-objeto-em-advpl/
Um grande abraço.
Boa noite, tudo bem?
É possível configurar alteração automática de um campo quando houver alteração manual em outro campo, similar a um gatilho?
Parabéns pelo ótimo conteúdo 😀
Bom dia Gabriel, tudo joia graças a Deus e você?
Opa, primeiramente obrigado pelo feedback, é muita bondade sua.
Sim, é possível, mas através da validação de campo. Então por exemplo, você coloca uma validação no campo COD_PROD, e dentro dessa validação, você atualiza o campo DESC_PROD através de RecLock se usar FWTemporaryTable.
Nós já temos um exemplo pronto que irá ao ar daqui uns meses na série Ti Responde no YouTube, mas se você for assinante premium nos mande um email e quiser o conteúdo exclusivo de forma antecipada, nos envie um eMail que lhe mandamos o prw.
Tenha uma ótima e abençoada quinta feira.
Um grande abraço.