Alterar consulta F3 em tempo de execução no MVC

Tenho um campo que armazena o código do cliente ou do fornecedor, da mesma forma que existe no pedido de venda. O que estou precisando é que ao abrir a tela para alteração a consulta padrão dele seja configurada de acordo com o tipo da nota.

Estou criando o meu formulário com a função para ser chamada após o formulário ser carregado:


Local oModel := MPFormModel():New('DTIXMLMODEL', {|oModel| VldPre(oModel)})

Nessa função de validação estou tentando alterar a consulta F3


static function VldPre(oModel)    
    Local oEstru := Nil
    If oModel:GetOperation() == MODEL_OPERATION_UPDATE
        oEstru := oModel:GetModel('SDSMASTER'):GetStruct()    

        if oModel:GetValue('SDSMASTER', 'DS_TIPO') == "N"            
            oEstru:SetProperty('DS_FORNEC', MVC_VIEW_TITULO, "Fornecedor")
            oEstru:SetProperty('DS_FORNEC', MVC_VIEW_LOOKUP, "SA2")
        else
            oEstru:SetProperty('DS_FORNEC', MVC_VIEW_TITULO, "Cliente")
            oEstru:SetProperty('DS_FORNEC', MVC_VIEW_LOOKUP, "SA1")
        EndIf
    EndIf
return .T.

Só que dessa forma aparece o erro:

erro no parâmetroFWFormViewStruct: Campo:DS_FORNEC não encontrado. on FWFORMMODELSTRUCT:SETPROPERTY(FWFORMMODELSTRUCT.PRX) 12/07/2019 17:27:31 line : 554

Mas o campo DS_FORNEC existe.

Bom dia Frederico,

Existe alguns pontos importantes:

  • Esse campo realmente existe em seu modelo? Se você fizer um getValue em um conout por exemplo, gera exceção também? Se sim, você precisa verificar seu modelo de dados e talvez inserir esse campo no mesmo.
    • Repare que você está utilizando o modelo de dados e pegando a estrutura do mesmo, porém você utiliza de um DEFINE de MVC da VIEW (MVC_VIEW_TITULO), isso também pode gerar exceções

Normalmente consulta que são dinâmicas dessa forma, são criadas no SXB como uma consulta específica, onde você cria sua própria função, então na sua função customizada você consegue pegar o modelo ativo (FWModelActive), verificar o valor do seu campo e assim abrir uma ConPad1 conforme sua regra:

http://tdn.totvs.com/pages/releaseview.action?pageId=6814971

http://tdn.totvs.com/display/framework/FWModelActive

Alterar propriedades do modelo em execução não é uma boa prática, pois você precisa também se preocupar com o refresh, muitas vezes sua alteração não reflete imediatamente para o usuário, gerando comportamentos inesperados, exceções etc.

Exemplo de como sua função pode ser:


#include 'protheus.ch'
#include 'fwmvcdef.ch'

user function lookA1A2()
local lOk as logical
local oModel as object
local cAliasSXB as char

lOk := .F.
oModel := FWModelActive()

if oModel != nil .and. oModel:isActive() .and. oModel:getOperation() == MODEL_OPERATION_UPDATE
    cAliasSXB := Iif( oModel:getValue('SDSMASTER', 'DS_TIPO') == 'N', 'SA2', 'SA1' )
    lOk := ConPad1(,,, cAliasSXB)
endif

return lOk

Olá…
Já usava esse recurso há alguns anos. Mas ao converter em MVC, ocorre erro após selecionar o registro.
A chamada da pergunta ocorre normal. Abre a tela do F3 corretamente. Mas ao selecionar o registro, ocorre:

argument error in function Len() on AJUSTRET(PROTHEUSLOOKUP.PRW) 23/05/2019 19:17:57 line : 927

Estou com esse mesmo problema. Você conseguiu resolver?

Vanessa, acabei desistindo de fazer em MVC.

Frederico, Você consegue fazer isso no proprio view se você chamar o incluir e o alterar em uma função e alimentando uma variável controla o status da inclusão e alteração.

Felipe, nesse caso eu teria que construir a tela de inclusão/alteração na mão? Teria um exemplo básico de como fazer isso?

Olá, você pode ajustar a consulta padrão utilizando a função: FWFLDGET https://tdn.totvs.com/display/framework/FWFldGet

Sendo assim o conteúdo retornado da função será definido no campo que se destina a consulta padrão, você só informa o campo de origem, no meu caso é o ZS5_PERFIL. Exemplo de retorno: 1,2,3.

exemplo.png

Estou utilizando uma função específica no cadastro de consulta padrão, para localizar tipos de códigos na tabela genérica, passei pelo erro: argument error in function Len() on AJUSTRET(PROTHEUSLOOKUP.PRW), e como no MVC você necessita do uso do SetValue para definir valores ou do GetValue para buscar valores no modelo de dados ativo.

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

Faço da seguinte forma, no meu exemplo é um master detail, considerando que o campo da master (ZG1_FILDOC) influencia no detail (ZG2_FILDOC).

Na Viewdef coloco a seguinte alteração da estrutura.

oDetail:SetProperty('ZG2_FILDOC', MVC_VIEW_LOOKUP, { || fGetF3() } )

Criei duas consultas padrões na SXB e faço o processo de alteração no momento da alteração do campo.

static function fGetF3()
return iif( FwFldGet('ZG1_TIPO') == '4' , 'XSF2' , 'XSF1' )