none
Erro ao criar linhas de um diário. (Tudo automático) RRS feed

  • Pergunta

  • Bom galera

    Estou criando diários de transferência de estoque, vindo a partir da tela de Ordem de Produção (form ProdTable). Nela criei um botão que abre a tela "InventJournalTable", onde há outro botão em que crio um diário e em seguida as linhas desse diário, cujos itens que vão para as linhas são os mesmos da BOM da OP de onde eu vim.

    Já funcionou, porém encontrei dois bugs q é coisa do AX e ñ to conseguindo burlar.

    O 1º é q se ñ tiver nenhum diário aparecendo na tela de diários (ou seja, vou criar o 1º), ao clicar no botão q fiz q cria o diário e as linhas, a criação das linhas ñ se completa pois o objeto journalTransData na linha 5 do método datasourceInitValuePre() da classe InventJournalFormTrans , que tem essa aparência:

    void datasourceInitValuePre()
    {
        ;
        super();
        journalTransData.initFromJournalTable();
    }

    É dito como um objeto não criado (pelo erro)

    Tentei rastrear onde esse objeto é criado mas ainda ñ consegui.

    O engraçado é q se já existe um diário e eu o deletando ou não, as linhas são criadas normalmente sem acusar erro nenhum.

    Se eu separar as funções, ou seja, um botão pra primeiro criar o diário e depois outro pra criar as linhas desse diário, tbm funciona.

    Eu mudei um pouco a criação do diário fazendo com q ele seja salvo antes de eu qrer criar as linhas, mas ñ adiantou. Parece q criar as linhas em seguida do diário causa algum erro.

    Alguem já teve esse problema e conseguiu resolver?

    O outro problema é com relação a contagem das linhas que o diário tem. Na tela do diário, há um campo q diz qtas linhas foram criadas. E qdo eu crio as linhas automáticamente, crio qtas forem de uma só vez.

    Acontece q se algum item precisa ser reservado pq ñ tem qtdade suficiente ao q será transferido, aparece uma telinha de aviso. E essa telinha faz com que sejam contados sempre 1 linha a mais do q realmente foi criado.

    Nesse caso eu pensei em só criar a próxima linha se a primeira foi criada sem problemas. No caso eu veria se a telinha foi mostrada.

    Se alguem já se deparou com esse problema tbm e tem alguma idéia, fico grato pela ajuda.

    Confesso que ainda estou tentando resolver o 1º problema.

    Quer solução q eu chegar postarei. Valeu por ler até aqui, ficou um pouco longo, hehe.

    T+

    terça-feira, 29 de junho de 2010 02:43

Todas as Respostas

  • Opa, bom dia!

     

    Sobre o seu primeiro erro, você primeiro precisa efetivar a criação do journal. Veja só: initFromJournaltable ou seja, inicia da tabela journal, mas como você provavelmente não efetivou a inserção do diário, ele não consegue pegar os dados básicos para criação das linhas que talvez estejam em outro escopo e é por isso que quando você separa os métodos, funciona.

     

    Sobre o segundo erro, é mais especifico e teria que debugar para ver o que acontece, eu sinceramente não conheço bem a ponto de já te falar qual é o problema.

     

    Abraço.


    []s Pichler
    terça-feira, 29 de junho de 2010 10:55
  • É. Quando eu abro o form de diários e já existe um diário. Não dá o erro. Então deve ser o form que cria esse objeto q qdo acusa o erro, ele ainda ñ foi criado.

    Vou ver isso de efetivar a criação do diário.

    Valeu mais uma vez. Já é um começo da solução.

    T+

    terça-feira, 29 de junho de 2010 13:12
  • Então cara, estranho todo esse papo de abrir o form e etc...

     

    A sequência deve ser: Criar o diário (*journal) -> criar as linhas (*trans).

     

    Abraço.


    []s Pichler
    terça-feira, 29 de junho de 2010 13:32
  • Deixa eu explicar melhor então.

    Eu colokei um campo ProdId na tabela InventJournalTable pq esses diários de transferência serão de transferência de itens do estoque para a produção.

    Tem uma tela de parâmetros que controla qual é o depósito de origem e qual será o nome do diário.

    A partir do form de OP (form ProdTable) eu abro, através de um botão, o form InventJournalTable, q é a tela de diários. Porém ela é aberta mostrando apenas os diários para a OP selecionada em ProdTable, ou seja, ela faz um filtro.

    Até aí td normal, nenhum problema com isso. O problema como eu disse é se caso ainda ñ existam diários para a OP selecionada, e eu vou criar o 1º, aí q dá o erro. E o q tá pegando é q tem um monte de classes que são responsáveis pelo funcionamento do diário e das linhas dele.

    Da primeira vez eu criava o dário na tabela e depois fazia um executeQuery() do dataSource do form. Criava o diário certinho, mas provavelmente eu pensei q estava deixando de chamar algum método.

    Agora eu abro o form, faço um InventJournalTable_ds.create() e apenas preencho o nome do diário pq o resto ele preenche sozinho. Daí eu salvo com o método write().

    Vou dar mais uma fuçada aqui nas classes e ver o que consigo. Valeu pela ajuda.

    T+

    terça-feira, 29 de junho de 2010 14:23
  • Opa, deu certo uma experiência q fiz.

    Agora qdo eu abro o form de diário. Se ñ existem diários ainda, eu já crio um logo no inicio, mas sem linhas. Se o usuário clicar no botão pra criar linhas, eu crio linhas pra esse diário criado no início. A partir dos próximos cliques eu já crio o diário e as linhas em seguida.

    Vou tratar agora que se o usuário deletar esse diário criado no início, o botão vai ter q criar um outro diário antes das linhas, q é o funcionamento normal.

    Pelo q entendi, deve haver um loop q controla o form qdo ele está aparentemente estático. E deve ser nesse loop q é inicializado aquele objeto de classe q causava o erro. A unica coisa q descobri é q akele método q dá o erro é chamado do método initValue() do data source InventJournalTrans do form InventJournalTransfer (form das linhas) .

    Vou partir p/ o 2º problema.

    T+

    terça-feira, 29 de junho de 2010 16:11
  • Opa

    O 1º problema ficou com a "solução" que eu descrevi no post acima.

    O 2º problema eu contornei assim:

    Eu vi q no método InventMovement::setAutoReserving() é feito uma verificação se há itens disponíveis no estoque pra ser transferido. Se não houver, uma telinha de aviso é mostrada onde o usuário pode alterar para uma qtdade de item disponível.

    Essa verificação é chamada pelo método write() do dataSource InventJournalTrans do form InventJournalTransfer (form das linhas).

    Na verdade é chamado, de dentro de write(), o método journalFormTrans.datasourceWritePre() . E neste é q é chamado o método de verificação de itens.

    Acontece que eu criava todas as linhas de uma vez. Então essa telinha qdo aparecia mais de uma em seguida, acontecia algo que o AX dizia q existiam mais linhas do realmente foram criadas.

    Me disseram que essa telinha não é importante no preenchimento automático pq na hr de validar é verificado de novo. Então eu cancelei a verificação, mexendo na classe que chama o método setAutoReserving() ( ou seja, datasourceWritePre() ). Fiz isso através de um parâmetro. Agora a telinha não aparece e o AX não se perde na contagem.

    Tbm pensei em outras soluções, como preencher uma linha e esperar um retorno do método dizendo que está ok com os itens. Enfim...

    Sei que não resolvi os problemas, e sim me desviei deles. Ta parecendo a solução da fifa para os erros dos árbitros na copa, kkk. Mas eu precisava terminar logo isso :/

    Valeu pela ajuda Pichler.

    T+

    terça-feira, 29 de junho de 2010 20:34
  • opa, que nada, não ajudei em nada!

     

    Escuta, você pode criar todas as linhas de uma vez só, não tem problema nenhum no entanto, algumas regras / sequencias precisam ser seguidas! Fica muito dificil ajudar assim, o melhor, nesses casos é encontrar o ponto onde o problema acontece e postar aqui o código.

     

    mas é isso ai, abraço.


    []s Pichler
    terça-feira, 29 de junho de 2010 21:36
  • Me passa um email e te mando um .XPO desse projeto.

    T+

    quarta-feira, 30 de junho de 2010 15:21
  • Era só pra vc ver q o código não está errado. Ele funciona como eu queria e programei. O erro está no fluxo das coisas ou na falta de chamar algum método de alguma das classes envolvidas.

    Eu tenho q abrir as telas pq é assim que o usuário vai trabalhar, com as telas abertas.

    T+

    quinta-feira, 1 de julho de 2010 12:50
  • opa, manda para ricardo at pichler dot com do br

     

    Abraço


    []s Pichler
    quinta-feira, 1 de julho de 2010 13:20
  • Valeu

    T+

    quinta-feira, 1 de julho de 2010 13:58