Gatilho tabelas diferentes, MVC modelo 3, FwFldGet

Olá pessoal, sou nova em desenvolvimento ADVPL, estou com o seguinte problema. criei um MVC modelo 3, com duas grids. No grid 1: ZA4_CODA(Grid 1),grid 2: ZA5_CODR(Grid 2). Eu queria que o campo ZA5_CODR recebesse a mesma informação digitada na ZA4_CODA.

Usei o FwFldGet("ZA4_CODA"), no ini. Padrão do campo ZA5_CODR. Porem a primeira linha a informação vem em branco depois que começa a ser preenchido.

Os campos são reais, li que precisaria de um gatilho mas o mesmo que criei não deu certo.

Alguém pode me ajudar, ou mandar um modelo de gatilho de duas tabelas diferentes. onde um dispara (ZA4) e Recebe(ZA5). a imagem mostra que ao clicar em INCLUIR o campo ZA5_CODR vem vazio. como inicial já preenchido?

aa.jpg

MODEL

// REGRAS DE NEGÓCIO Static Function ModelDef() // INSTANCIA O MODELO Local oModel := MPFormModel():New("FwDesM",,,,)

// INSTANCIA OS SUBMODELOS Local oStruZA3 := FwFormStruct(1, "ZA3") Local oStruZA4 := FwFormStruct(1, "ZA4") Local oStruZA5 := FwFormStruct(1, "ZA5")

//FWStruTrigger. Local aAux := {} aAux := FWStruTrigger('ZA4_CODA','ZA5_CODR','u_zGat(M->ZA4_CODA)',.F.) oStruZA4:AddTrigger(aAux[1],aAux[2],aAux[3],aAux[4]) // //oStruct:AddTrigger("Campo Origem", "Campo Destino", "Bloco de código na validação da execução do gatilho", "Bloco de código na execução do gatilho")

// DEFINE SE OS SUBMODELOS SERÃO FIELD OU GRID oModel:AddFields("ZA3MASTER", NIL, oStruZA3) oModel:AddGrid("ZA4DETAIL", "ZA3MASTER", oStruZA4) oModel:AddGrid("ZA5DETAIL", "ZA4DETAIL", oStruZA5)

// DEFINE A RELAÇÃO ENTRE OS SUBMODELOS oModel:SetRelation("ZA4DETAIL", {{"ZA4_FILIAL", "FwXFilial('ZA4')"}, {"ZA4_COD", "ZA3_COD"}}, ZA4->(IndexKey(1))) oModel:SetRelation("ZA5DETAIL", {{"ZA5_FILIAL", "FwXFilial('ZA5')"}, {"ZA5_COD", "ZA3_COD"}, {"ZA5_CODR", "ZA4_CODA"}}, ZA5->(IndexKey(1)))

//Setando Primary Key oModel:SetPrimaryKey({'ZA3_FILIAL','ZA3_COD'})

// DESCRIÇÃO DO MODELO oModel:SetDescription("Processos de Automação")

// DESCRIÇÃO DOS SUBMODELOS oModel:GetModel("ZA3MASTER"):SetDescription("Requisições") oModel:GetModel("ZA4DETAIL"):SetDescription("GRID 1") oModel:GetModel("ZA5DETAIL"):SetDescription("GRID 2") Return (oModel)

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

Boa tarde,

Você pode usar a função FWStruTrigger.

Documentação: TDN FWStruTrigger

Exemplo:


Static Function ModelDef()
    Local oModel  := Nil
    Local oStruct := Nil

    Local aAux := {}

    oStruct := FwFormStruct( 1, 'ZFV' )

    aAux := FWStruTrigger('ZFV_CODOPE', 'ZFV_NOMOPE', 'U_MNTA005A(M->ZFV_CODOPE)', .F.)
    oStruct:AddTrigger(aAux[1],aAux[2],aAux[3],aAux[4])

    // Demais triggers e personalizações
    ...

    oModel := MPFormModel():New( 'MdlZFV' , /* bFuncPre */, /* bFuncPOS */, /* bFuncGRV */, /*bCancel*/ )

    oModel:AddFields( 'ZFVMASTER' , /*Owner*/, oStruct , /*bPre*/, /*bPos*/, /*bLoad*/ )

    ...

Da mesma forma que foi adicionado o trigger na Struct do Fields no exemplo, você pode adicionar na Struct da Grid.

EDIT1:

Segue um exemplo de como eu faria pra resolver o seu problema, e as considerações.


// REGRAS DE NEGÓCIO
Static Function ModelDef()
    // INSTANCIA O MODELO
    Local oModel := MPFormModel():New("FwDesM",,,,)

    // INSTANCIA OS SUBMODELOS
    Local oStruZA3 := FwFormStruct(1, "ZA3")
    Local oStruZA4 := FwFormStruct(1, "ZA4")
    Local oStruZA5 := FwFormStruct(1, "ZA5")

    oModel:SetDescription("Processos de Automação")

    // DEFINE OS SUBMODELOS
    oModel:AddFields("ZA3MASTER", NIL, oStruZA3)
    oModel:SetPrimaryKey({'ZA3_FILIAL','ZA3_COD'})

    oModel:AddGrid("ZA4DETAIL", "ZA3MASTER", oStruZA4)
    oModel:SetRelation("ZA4DETAIL", {{"ZA4_FILIAL", "FwXFilial('ZA4')"}, {"ZA4_COD", "ZA3_COD"}}, ZA4->(IndexKey(1)))
    oModel:GetModel('ZA4DETAIL'):SetUniqueLine({'ZA4_COD', 'ZA4_CODA'})

    oModel:AddGrid("ZA5DETAIL", "ZA4DETAIL", oStruZA5)
    oModel:SetRelation("ZA5DETAIL", {{"ZA5_FILIAL", "FwXFilial('ZA5')"}, {"ZA5_COD", "ZA4_COD"}, {"ZA5_CODR", "ZA4_CODA"}}, ZA5->(IndexKey(1)))
    oModel:GetModel('ZA5DETAIL'):SetUniqueLine({'ZA5_COD', 'ZA5_CODR', 'ZA5_X'}) // nao sei qual usa indice unico da ZA5, por isso chamei o ultimo campo de ZE5_X

    // DESCRIÇÃO DOS SUBMODELOS
    oModel:GetModel("ZA3MASTER"):SetDescription("Requisições")
    oModel:GetModel("ZA4DETAIL"):SetDescription("GRID 1")
    oModel:GetModel("ZA5DETAIL"):SetDescription("GRID 2")

Return (oModel)


Static Function ViewDef()
    Local oModel := Nil, oView := Nil
    Local oStrctZA3 := Nil, oStrctZA4 := Nil, oStrctZA5 := Nil

    // Definicao dos campos redundantes que serao retidados da tela
    Local aCposZA3 := {'ZA3_FILIAL'}
    Local aCposZA4 := {'ZA4_FILIAL', 'ZA4_COD'}
    Local aCposZA5 := {'ZA5_FILIAL', 'ZA5_COD', 'ZA5_CODR'}

    // Tirando os campos redundantes dos submodelos
    oStrctZA3 := FwFormStruct(2, 'ZA3', {|cCampo| aScan(aCposZA3, AllTrim(cCampo)) == 0})
    oStrctZA4 := FwFormStruct(2, 'ZA4', {|cCampo| aScan(aCposZA4, AllTrim(cCampo)) == 0})
    oStrctZA5 := FwFormStruct(2, 'ZA5', {|cCampo| aScan(aCposZA5, AllTrim(cCampo)) == 0})

    oModel := FwLoadModel(cFonte)
    oView := FwFormView():New()
    oView:SetModel(oModel)

    // Setando as views
    oView:AddField('VIEW1_ZA3', oStrctZA3, 'ZA3MASTER')
    oView:AddGrid('VIEW2_ZA4', oStrctZA4, 'ZA4DETAIL')
    oView:AddGrid('VIEW3_ZA5', oStrctZA5, 'ZA5DETAIL')

    // Resto das definiçoes
    ...

Return oView

Primeiro ponto, vi que no seu relacionamento da ZA5 com a ZA4 você usou a tabela ZA3 e ZA4. Como a ZA4 já está relacionada com a a ZA3 então podemos relacionar a ZA5 somente com a ZA4.

Segundo ponto, na view eu retirei os campos do relacionamento e um deles era o que você estava preocupada em preencher com o trigger. Como temos o relacionamento estabelecido, as informações vão ser preenchidas corretamente na tabela então não precisamos nos preocupar e podemos apenas mostrar as informações que "importam".

Dessa forma, as linhas do grid 2 sempre vão estar apontadas para a linha posicionada da grid 1. Se você mudar de linha na grid 1, a grid 2 vai ser atualizada segundo o relacionamento.

Faça uns testes ai e veja se te atende!

Obs: Eu mudei a ordem de algumas coisas no ModelDef apenas para deixar mais claro, creio que a ordem não altere o resultado.

Olá Evandro. Obrigada por ajudar.
Uma dúvida no caso eu uso duas tabelas diferentes. eu teria que posicionar a tabela que quero o conteúdo em memoria. como seria o FWStruTrigger. tentei achar exemplos na internet mas não achei nada parecido.

Entendi, o problema é ser duas grids. Nesse caso você vai ter que amarrar essas tabelas na definição do Modeldef e ocultar os campos redundantes na Viewdef. Você pode enviar como está o Modeldef aqui para darmos uma olhada?

Olá Evandro, desculpa a demora, não recebi notificação da resposta… editei o post com o Model,logo abeixo da imagem, está bagunçado o código no post, mas acho que dá para entender o SetRelation entre as grids. Agradeço pela atenção.

Sem problemas, o Edit1 contém um exemplo, espero que ajude.

Olá Evandro, sim você tem toda razão no relacionamento da ZA5 com a ZA3. Realmente o grid vai posicionar de acordo com as informações selecionadas da Grid 1 mostrando o itens relacionados em sí com a grid 2. modifiquei meu SetRelation e deixei somente as informações que importam.
Muito Obrigada pela ajuda.
Abraço!