AxAltera não funciona com browser de arquivo temporário

Boa tarde.

Tenho uma rotina que cria um browse (FWMBrowse()) usando o arquivo temporário. Neste browse, adicionei algumas opções para serem executadas (ex: Incluir, Visualizar, Alterar). Ao clicar na opção Alterar, o sistema executa uma função que deverá posicionar em um cadastro e depois executar o AxAltera(). Entretanto, apesar de estar posicionando corretamente, o cadastro sempre é exibido como uma ação de visualizar.

Exemplo do trecho:


 dbSelectArea("SA2")
 dbSetOrder(1)
 if dbSeek(XFILIAL("SA2")+"00000101")
   //AQUI O SISTEMA DEVERIA MONTAR UMA TELA PARA ALTERAÇÃO, PORÉM A TELA É EXIBIDA 
   //COMO VISUALIZAÇÃO
   AxAltera("SA2", SA2->(RecNo()), 4) 
 else
   MsgStop("Falha ao localizar registro")
 endif

Alguma sugestão? Desde já agradeço a atenção.

At Rodrigo de Oliveira

Rodrigo, sendo um FWMBrowse, você tem um menudef correto? Por favor, consegue postar ele para analisarmos?

Interessado aqui, sempre que uso tabela temporária com o fwmbrowse tenho que montar na unha as funções de inclusão, alteração e exclusão para atualizar a tabela temporária e o que for necessário nas tabelas do banco, se tiver como usar os Axs da vida seria uma mão na roda.

um exemplo que costumo usar, veja que no menudef manda todas as ações para rotinas personalizadas:

https://www.blogadvpl.com/componente-fwmbrowse-trabalhando-com-tabelas-temporarias-e-criando-sub-menus/

Josué,

Eu estou usando o AxAltera para manipular outro arquivo.
Por exemmplo, no browse temporário tenho a informação de código+loja do fornecedor. Através do browser eu quero chamar a rotina de alteração de cadastro deste fornecedor.
Não tenho a intenção de manipular o arquivo temporário…

At
Rodrigo de Oliveira

ahhh, pensei que tinha macete para o arquivo temporário com axcadastro, iria economizar muuuuito código…

pode ser que dentro da axaltera o pessoal esteja colocando objetos em comum com o fwmbrowse, eu daria uma parada no debug com o a tela de alteração aberta e daria uma olhada nos objetos públicos e privados em busca de algum conflito…

uma outra saída é destruir o objeto do fwmbrowse antes do axcadastro e depois reconstrui-lo quando sair do axcadastro…

Sim Daniel, tenho o MenuDef().

Segue:


Static Function MenuDef()
    Local aRotina := {}

    aadd(aRotina,{"Visualizar","U_ZCZVBMNT(2)",0,2})
    aadd(aRotina,{"Incluir","U_ZCZVBMNT(3)",0,3})
    aadd(aRotina,{"Alterar","U_ZCZVBMNT(4)",0,4})
    aadd(aRotina,{"Cancelar","U_ZCZVBMNT(5)",0,5})
    aadd(aRotina,{"Email Parecer","U_ZCENVPAR()",0,6})

    IF RetCodUsr()$GetMV("MV_ZCZVBME")
        aadd(aRotina,{"Finalizar","U_ZCZVBFIM()",0,6})
    ENDIF

Return(aRotina)

Bom dia Rodrigo, você está criando a variável aRotina como private?

Bom dia

Sim Daniel.
Fora do MenuDef() tenho uma variavel aRotina como private.
Com exceção da opção Alterar, todas as opções do MenuDef() estão funcionando corretamente.

At
Rodrigo de Oliveira.

Bom dia Rodrigo, quando existe a variável Private aRotina, o sistema leva em consideração o legado, utilizando o nOpc, sua quarta posição do array a aRotina e acaba verificando que sua posição do array na verdade trata-se do Cancelar(U_ZCZVBMNT), por conta disso é comum ver MenuDef na seguinte ordenação/forma:

  • Pesquisar
    • Visualizar
    • Incluir
    • Alterar
    • Excluir

static function MenuDef()

local aRotina as array

aRotina := {}

aAdd(aRotina, {"Pesquisar", "AxPesqui", 0, 1})

aAdd(aRotina, {"Visualizar", "AxVisual", 0, 2})

aAdd(aRotina, {"Incluir", "AxInclui", 0, 3})

aAdd(aRotina, {"Alterar", "AxAltera", 0, 4})

aAdd(aRotina, {"Excluir", "AxDeleta", 0, 5})

return aRotina


Você pode criar o aRotina com essa ordenação ou verificar a possibilidade de não trabalhar mais com essa variável private.

Olá Daniel.
Obrigado pela resposta.
Realmente a ordem no aRotina era a responsável.
Após passar a utilizar a opção “Alterar” na quarta posição, funcionou corretamente.
Obrigado!