Tela MVC com Fields -> Grid -> Detalhe

Estou desenvolvendo uma tela MVC onde eu tenho uma Enchoice/Fields (cabeçalho)[Pai], uma Grid (itens)[Filho] e uma outra Enchoice/Fields (detalhes do filho setado na Grid)[Neto].

Se fosse duas grids, eu sei muito bem como relacioná-las e ao clicar em uma o sistema mostrar a outra só com os registros relacionados. No meu cenário o objeto Neto não precisa ser uma Grid porque o relacionamento entre eles é sempre 1 para 1, então usei Fields, agora não sei como faço para que ao clicar na Grid esse detalhamento seja atualizado.

Alguém saberia dizer como poderia ser feito?

Você precisa apenas usar um setRelation corretamente, entre o pai e neto O relation desse ultimo FormField vai ser algo como:


TABELA_AVO_ID+TABELA_PAI_ID

Rodrigo obrigado pelo apoio, não entendi a solução. Eu tentei relacionar o neto com o filho, mas não funcionou visto que o neto não é um grid, quando eu uso ele como grid funciona, mas não preciso de um grid porque é relacionamento 1=1. Ele abre, mas não atualiza quando clico em diferentes registros da grid filho.

Boa tarde, Cirilo.

Pelo que entendi você quer detalhar o registro da grid. Para o vinculo de uma Grid com um Field, gerei esse exemplo com a tabela SC6 (grid e detalhe).

Importante no relacionamento vincular todos os campos da chave, se a relação não estiver "completa", o conteúdo não aparecerá.


/*/{Protheus.doc} ModelDef
    Modelo de dados
    @type function
    @version 1.0
    @author Daniel Scheeren
    @since 02/03/2023
    /*/
Static Function ModelDef()
    Local oModel    := Nil
    Local oStPai    := FWFormStruct(1, 'SC5')
    Local oStFilho  := FWFormStruct(1, 'SC6')
    Local oStNeto   := FWFormStruct(1, 'SC6')

    Local aFilhoRel := {}
    Local aNetoRel  := {}
    Local bCommit   := {|oModel| CommitLib(oModel) }

    oModel := MPFormModel():New('TESTE01M', /*bPreValidacao*/, /*bTudoOK*/, bCommit, /*bCancel*/)

    // componente pai
    oModel:AddFields('SC5PAI',/*cOwner*/,oStPai, /*bPre*/, /*bPost*/, )
    oModel:SetPrimaryKey({ 'C5_FILIAL' , 'C5_NUM'})

    // componente grid filho
    oModel:AddGrid('SC6FILHO','SC5PAI',oStFilho,/*bLinePre*/, /*bPosVld*/ ,/*bPre*/,/*bPos*/,/*bLoad*/)

    // relacionamento entre o Pai e Filho
    aAdd(aFilhoRel, {'C6_FILIAL','C5_FILIAL'})
    aAdd(aFilhoRel, {'C6_NUM',   'C5_NUM'})

    // monta o relacionamento entre Pai e Filho
    oModel:SetRelation('SC6FILHO', aFilhoRel, SC6->(IndexKey(1)))

    // componente neto
    oModel:AddFields('SC6NETO','SC6FILHO',oStNeto, /*bPre*/, /*bPost*/, )

    // relacionamento entre o Filho e Neto
    aAdd(aNetoRel, {'C6_FILIAL' ,'FWxFilial("SC6")'})
    // aqui vinculei ao registro da SC5, pois o campo C6_NUM por padrão não se encontra na estrutura gerada pela FWFormStruct
    aAdd(aNetoRel, {'C6_NUM'    ,'SC5->C5_NUM'})
    aAdd(aNetoRel, {'C6_ITEM'   ,'C6_ITEM'})
    aAdd(aNetoRel, {'C6_PRODUTO','C6_PRODUTO'})

    // monta o relacionamento entre Filho e Neto
    oModel:SetRelation('SC6NETO', aNetoRel, SC6->(IndexKey(1)))

    // descrição da tela
    oModel:SetDescription("Exemplo pai x filho x neto")

Return oModel

/*/{Protheus.doc} ViewDef
    Interface
    @type function
    @version 1.0
    @author Daniel Scheeren
    @since 02/03/2023
    /*/
Static Function ViewDef()

    Local aAreaSX3    := SX3->(GetArea())
    Local oView     := Nil
    Local oModel    := FWLoadModel('TESTE01')
    Local oStPai    := FWFormStruct(2, 'SC5')
    Local oStFilho  := FWFormStruct(2, 'SC6')
    Local oStNeto   := FWFormStruct(2, 'SC6')

    // criando a View
    oView := FWFormView():New()
    oView:SetModel(oModel)

    // componente pai
    oView:AddField('VIEW_PAI',oStPai,'SC5PAI')
    // componente filho
    oView:AddGrid('VIEW_FILHO',oStFilho,'SC6FILHO')
    // componente neto
    oView:AddField('VIEW_NETO',oStNeto,'SC6NETO')

    // seta o tamanho
    oView:CreateHorizontalBox('CABEC',50)
    oView:CreateHorizontalBox('GRID',25)
    oView:CreateHorizontalBox('RODAPE',25)

    // amarra a view x box
    oView:SetOwnerView('VIEW_PAI','CABEC')
    oView:SetOwnerView('VIEW_FILHO','GRID')
    oView:SetOwnerView('VIEW_NETO','RODAPE')

    // habilita título de cada view
    oView:EnableTitleView( 'VIEW_PAI', "Pedido de venda" )
    oView:EnableTitleView( 'VIEW_FILHO', "Itens" )

    RestArea(aAreaSX3)

Return oView

Caso queira vincular outra tabela, por exemplo Detalhe pai (SC5), Grid filho (SC6) e detalhe neto (SB1), o exemplo também atende.

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

1 curtida

Realmente seu exemplo funciona perfeitamente, muito obrigado. Fiquei intrigado porque o meu não estava funcionando de maneira semelhante, vou usar esse como modelo para examinar o meu. Valeu pela força!