Boa noite, criei duas grids que são populadas por duas consultas e relacionadas pela classe FWBrwRelation, foi adicionado as colunas (FWBrwColumn) a configuração oColumn:SetEdit(.T.) e na FWBrowse a função para permitir a edição de campos (SetEditCell(.T., {|| .T.})) porém não estou conseguindo editar nenhum campo da grid por nada.
Estou utilizando a forma de criar com base em uma query pois foi como consegui criar o relacionamento entre as duas grid's.
Alguem já passou por isso e conseguiu resolver, ou alguma orientação de como fazer.
Segue o fonte abaixo
User Function FFRT004()
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 oPanGrid2
Private oLeftGrd
Private oRightGrd
Private aColLeft := {}
Private aColRight := {}
Private cAliasTab1 := "LFT"
Private cAliasTab2 := "RGT"
//Tamanho da janela
Private aTamanho := MsAdvSize()
Private nJanLarg := aTamanho[5]
Private nJanAltu := aTamanho[6]
Private nMJLarg := nJanLarg/2 // Largura da metade da janela
Private QryLeft := ""
Private QryRight := ""
//Monta o cabecalho
fMontaHead('L')
fMontaHead('R')
//Montando os dados, eles devem ser montados antes de ser criado o FWBrowse
FWMsgRun(, {|oSay| QryLeft := fMontDados(oSay, 'L') }, "Processando", "Buscando fornecedores")
FWMsgRun(, {|oSay| QryRight := fMontDados(oSay, 'R') }, "Processando", "Buscando placas")
//Criando a janela
DEFINE MSDIALOG oDlgGrp TITLE "Gerar Financeiro Frete" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Labels gerais
@ 004, 100 SAY "Consolidar" SIZE 200, 030 FONT oFontSub OF oDlgGrp COLORS RGB(031,073,125) PIXEL
@ 014, 100 SAY "Fechamento de Frete" 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
//Fornecedores
@ 024, 003 GROUP oGrpL TO (nJanAltu/2-003), (nMJLarg/2-003) PROMPT "Fornecedores" OF oDlgGrp COLOR 0, 16777215 PIXEL
oGrpL:oFont := oFontBtn
oPanGrid := tPanel():New(033, 006, "", oDlgGrp, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/4 - 12), (nJanAltu/2 - 45))
oLeftGrd := FWBrowse():New()
oLeftGrd:DisableFilter()
oLeftGrd:DisableConfig()
oLeftGrd:DisableReport()
oLeftGrd:DisableSeek()
oLeftGrd:DisableSaveConfig()
oLeftGrd:SetFontBrowse(oFontBtn)
oLeftGrd:SetAlias(cAliasTab1)
oLeftGrd:SetDataQuery()
oLeftGrd:SetQuery(QryLeft)
oLeftGrd:SetEditCell(.T., {|| .T.})
oLeftGrd:lHeaderClick := .F.
oLeftGrd:SetColumns(aColLeft)
oLeftGrd:SetOwner(oPanGrid)
oLeftGrd:Activate()
//Placas
@ 024, (nMJLarg/2) GROUP oGrpR TO (nJanAltu/2-003), (nMJLarg-006) PROMPT "Placas" OF oDlgGrp COLOR 0, 16777215 PIXEL
oGrpR:oFont := oFontBtn
oPanGrid2 := tPanel():New(033, (nMJLarg/2+003), "", oDlgGrp, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/4 - 12), (nJanAltu/2 - 45))
oRightGrd := FWBrowse():New()
oRightGrd:DisableFilter()
oRightGrd:DisableConfig()
oRightGrd:DisableReport()
oRightGrd:DisableSeek()
oRightGrd:DisableSaveConfig()
oRightGrd:SetFontBrowse(oFontBtn)
oRightGrd:SetAlias(cAliasTab2)
oRightGrd:SetDataQuery()
oRightGrd:SetQuery(QryRight)
oRightGrd:SetEditCell(.T., {|| .T.})
oRightGrd:lHeaderClick := .F.
oRightGrd:SetColumns(aColRight)
oRightGrd:SetOwner(oPanGrid2)
oRightGrd:Activate()
//Faz o relacionamento entre os dois browses
oRelaction:= FWBrwRelation():New()
oRelaction:AddRelation( oLeftGrd , oRightGrd , { { "ZC3_CODFOR" , "ZC3_CODFOR" } } )
oRelaction:Activate()
//Atualiza os browses e cria a janela na tela
oLeftGrd:Refresh()
oRightGrd:Refresh()
ACTIVATE MsDialog oDlgGrp CENTERED
RestArea(aArea)
Return
/*/{Protheus.doc} fMontaHead
(long_description)
@type Static Function
@author Pablo Henrique
@since 27/05/2024
@version 1.0
@param pIdent, caractere, Identificador da grid a ser criada
/*/
Static Function fMontaHead( pIdent )
Local nAtual
Local cIdent := pIdent
Local aHeadAux := {}
if cIdent == 'L'
//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, {"ZC3_CODFOR", "CODIGO", "C", TamSx3("ZC3_CODFOR")[1], 0, "", .F.})
aAdd(aHeadAux, {"ZC3_FORNEC", "NOME", "C", TamSx3("ZC3_FORNEC")[1], 0, "", .F.})
aAdd(aHeadAux, {"ZC3_VLRPAG", "VALOR", "N", TamSx3("ZC3_VLRPAG")[1], 2, "@E 999,999.99", .F.})
aAdd(aHeadAux, {"ZC3_PACREC", "%ACRÉSCIMO", "N", 09, 2, "@E 999,999.99", .T.})
//Percorrendo e criando as colunas
For nAtual := 1 To Len(aHeadAux)
oColumn := FWBrwColumn():New()
oColumn:SetData(&("{|| " + cAliasTab1 + "->" + 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(aColLeft, oColumn)
Next
elseif cIdent == 'R'
//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, {"ZC3_CODFOR", "FORNECEDOR", "C", TamSx3("ZC3_CODFOR")[1], 0, "", .T.})
aAdd(aHeadAux, {"ZC3_PLACA" , "PLACA", "C", TamSx3("ZC3_PLACA")[1] , 0, "", .T.})
aAdd(aHeadAux, {"ZC3_CODMOT", "COD_MOTORISTA", "C", TamSx3("ZC3_CODMOT")[1], 0, "", .T.})
aAdd(aHeadAux, {"ZC3_MOTORI", "MOTORISTA", "C", TamSx3("ZC3_MOTORI")[1], 0, "", .T.})
aAdd(aHeadAux, {"ZC3_VLRPAG", "VALOR", "N", TamSx3("ZC3_VLRPAG")[1], 2, "@E 999,999.99", .T.})
aAdd(aHeadAux, {"ZC3_BONIFC", "BONIFICAÇÃO", "N", TamSx3("ZC3_VLRPAG")[1], 2, "@E 999,999.99", .T.})
//Percorrendo e criando as colunas
For nAtual := 1 To Len(aHeadAux)
oColumn := FWBrwColumn():New()
oColumn:SetData(&("{|| " + cAliasTab2 + "->" + 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(aColRight, oColumn)
Next
endif
Return
Static Function fMontDados(oSay, pIdent)
Local aArea := GetArea()
Local cQuery := ""
Local cIdent := pIdent
if cIdent == 'L'
cQuery := " " + CLRF
elseif cIdent == 'R'
cQuery := " " + CLRF
endif
RestArea(aArea)
Return cQuery
Pablo, uma query é uma leitura do banco de dados, ela não é editável, já tentou fazer via tabela temporária?
— Daniel Mendes 28 de May de 2024Tentei fazer por tabela temporaria porém a primeira linha das duas grid's sempre vinham vazias, além de que não consegui fazer o relacionamento entre as duas grids utilizando tabelas temporarias, a classe FWBrwRelation ficava me retornando que não conseguiu encontrar o campo com o nome que dava a coluna.
— Pablo Henrique Ribeiro da Silva 29 de May de 2024