MATA020 - erro execauto

Boa tarde prezados,
Estou tentando replicar um registro de uma filial para outra, na verdade, alterar um registro. Estou posicionado nele e quero, após salvá-lo, alterar o registro correspondente em outra filial. Mas embora eu passe o array com a filial de destino no campo A2_FILIAL, a operação de alteração e esteja posiconado na filial de destino, ele tenta INSERIR o registro na filial corrente, dando erro de chave duplicada. Ou seja, ele perde o posiconamento na filial de de destino e não respeita a operação passada na chamada do exec. Tanto no Execauto convencional quanto na rotina MVC.
Alguém já passou por isso e conseguiu solucionar? Quando a rotina é executada por schedule, funciona corretamente.

Desde já agradeço!

2 curtidas

Boa tarde @sistemas04 .

O array não vale de nada com a filial se você não mudar a variável cFilAnt para a filial que você deseja.

Segue exemplo

cFilBkp:= cFilAnt
cFilAnt := "nova filial"

Executa o execauto

cFilAnt := cFilBkp
2 curtidas

Boa tarde,

Isso também foi feito e em algumas tentativas, até posiconando o registro na filial, através de um DbSeek.

1 curtida

Dbssek não iria resolver mesmo, mas o cfilant eu já fiz assim e funcionou, uma dúvida, você ta usando isso em um ponto de entrada no momento do cadastro?

Essa replicação tem chamada em ponto de entrada e no outras ações do browser. Em ambos os casos o mesmo erro acontece. Pensei que poderia ser algo relacionado a recursividade das rotinas, mas no outras ações não há nenhuma operação em paralelo.

1 curtida

Qual ponto de entrada vc ta usando?

CUSTOMERVENDOR, no cIdPonto MODELCOMMITNTTS. Quando altero um fornecedor, após a gravação total do modelo e fora da transação, segundo descrição, chama a replicação para a filial, então ele acaba passando pelo mesmo ponto outra vez antes de encerrar a primeira execução. Pensei que poderia ser algo nesse sentido, mas no outras ações esse cenário em teoria não acontece.

Em vez de usar execauto, tente isso.

Fiz isso em outro projeto e deu certo também

é um fonte de exemplo de outra rotina, mas da pra usar a mesma coisa.

1 curtida

Muito obrigado pela disponibilidade, vou ver se mais alguém se manifesta em relação ao execauto, senão adiro a sua sugestão.

1 curtida

Acho que o problema é porque vc está usando o execauto da própria rotina, então ele meio que entra em recursividade, talvez precise fazer alguns tratamentos:

  • Tratar para não rodar essa rotina específica nas demais chamadas pelo execauto
  • Mudar a variável cFilAnt para a filial destino e forçar o posicionamento da SM0 usando o método FWSM0Util():setSM0PositionBycFilAnt()
  • Depois de processar a filial destino restaurar a filial atual.
  • Também acho que o ponto ideal serja o MODELCOMMITNTTS que é após todas as gravações e fora da transação.
1 curtida

Obrigado amigo, o ponto de entrada eu já estou utilizando o Modelcommitntts, eu vou tentar forçar a SM0 com esse método que você sugeriu.

Não esquece de quando terminar o execauto retornar para a filial anterior, para sempre manter a filial correta.

1 curtida