none
Custo Médio do Produto (AverageCostPrice) RRS feed

  • Pergunta

  • Bom dia !

    Preciso adicionar um display com o custo médio do produto (AverageCostPrice) no seguinte form: Gerenciamento de Estoque / Diários / Contagem de Itens / Contagem / Linhas (InventJournalCount). Eu criei um método, porém, não obtive o resultado esperado que é, quando o colaborador insere uma linha com um  item, este display mostra o preço do custo médio de venda. Como nem todos os produtos tem um custo médio, pois dependem de quantidade em estoque, eu tenho um job que popula uma tabela que chamei de CMV, nesta tabela eu tenho ItemId, InventDimId, CMV(Valor) e InventSiteId. Abaixo o método do display que coloquei na grid:

    display
    real CMV()
    {
    CMV _CMV;
    select CMV
    from _CMV
    where _CMV.InventDimId == InventJournalTrans.InventDimId &&
    _CMV.ItemId == InventJournalTrans.ItemId;
    return _CMV.CMV;
    
    }

    Mas, ele não traz valor nenhum...sempre 0,00...

    Alguém sabe me dizer o por que ? 

    Obrigado.

    quarta-feira, 13 de março de 2013 12:16

Respostas

  • Boa tarde.

    Faça o seguinte:

    Crie o seguinte método na tabela InventJournalTrans:

    display real displayAvgPrice(InventJournalTrans _inventJournalTrans)
    {
        InventSum                           inventSum;
        InventDim                           inventDim;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;
        ;
    
        inventSum.ItemId = _inventJournalTrans.ItemId;
    
        inventDim = InventDim::find(_inventJournalTrans.InventDimId);
    
        inventDimParm.initFromInventDim(inventDim);
    
        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);
    
        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
    
        if(qty == 0)
            average = 0;
        else
            average = value / qty;
    
        return average;
    }

    Depois, vá até o Grid (abra outra AOT ao lado da AOT com este método visível), e arraste este método até o Grid. Ele irá criar um campo RealEdit.

    Depois, vá nas propriedades do campo que acabou de ser criado, e edite a propriedade "Datasource". Coloque a tabela InventJournalTrans na propriedade Datasource.

    Agora, ao alterar o item ou dimensão, o valor será atualizado.

    Obviamente o ideal é que utilize algum EDT e que ponha alguma label, pois desta forma os valores virão sem casas decimais e sem label na Grid.

    O importante é que o valor virá conforme o esperado. Só fica agora pendente você arrumar os detalhes.

    Abraço.


    Gustavo Bagno E. da Silva

    • Marcado como Resposta matfurrier segunda-feira, 1 de abril de 2013 11:59
    quinta-feira, 28 de março de 2013 19:43

Todas as Respostas

  • Bom dia.

    Faltou passar o parâmetro da linha do grid. Sempre que vc criar um método em um grid, tem que passar o dataSource ligado ao grid. Seu método corrigido fica assim:

    display real CMV(InventJournalTrans _inventJournalTrans)
    {
    CMV _CMV;
    select CMV
    from _CMV
    where _CMV.InventDimId   ==   _inventJournalTrans.InventDimId 
    &&  _CMV.ItemId              == _inventJournalTrans.ItemId;
    return _CMV.CMV;
    }
    Espero ter ajudado.

    Até mais.


    Adeilson Assis Desenvolvedor / Consultor Funcional em Microsoft Dynamics AX 2009

    • Sugerido como Resposta Adeilson Assis quarta-feira, 13 de março de 2013 13:20
    quarta-feira, 13 de março de 2013 13:20
  • Adeilson, obrigado pela ajuda.

    Porém, ele ainda está trazendo como 0,00. O que eu notei debugando o método é que, na verdade, quando insiro uma linha nova para contagem, o método não é chamado nenhuma vez, ou seja, ele não calcula porque os parâmetros não chegam nele. Lembrando que, coloquei este método direto na grid. Ele deveria ser ativado assim que o usuário preenchesse com o site (InventDimId), pois um mesmo item pode ter em vários estoques.

    Existe alguma maneira de este método ser chamado assim que o campo site for preenchido ??

    Mais uma vez, obrigado.

    quarta-feira, 13 de março de 2013 13:39
  • Reparei que existe mais 1 erro no código. Após o select tem que usar a variável _CMV e está apenas CMV chamando a tabela diretamente o que não retornará nada. Corrija o método para ficar assim:

    display real CMV(InventJournalTrans _inventJournalTrans)
    {
    CMV _CMV;
    select _CMV
    from _CMV
    where _CMV.InventDimId   ==   _inventJournalTrans.InventDimId 
    &&  _CMV.ItemId              == _inventJournalTrans.ItemId;
    return _CMV.CMV;
    }

    Até mais.


    Adeilson Assis Desenvolvedor / Consultor Funcional em Microsoft Dynamics AX 2009

    • Sugerido como Resposta Adeilson Assis quarta-feira, 13 de março de 2013 16:52
    quarta-feira, 13 de março de 2013 13:56
  • Então Adeilson, a variável CMV, é um campo dentro da tabela _CMV.

    Se eu colocar com underline, ele dirá que não existe este campo na tabela...

    O que eu reparei foi o seguinte....a tabela InventJournalTrans que eu tento relacionar o display, a princípio não tem os dados como Item, Estoque, Contagem e etc...ele só tem estes dados após salvar a linha inserida. 
    Eu tentei inclusive colocar a tabela que eu criei no DataSource e adicionar o campo diretamente da tabela, mas sem sucesso em todas as possibilidades de Joins que eu realizei.

    Este passo para visualizar o CMV é muito importante para gente.

    Obrigado.

    quarta-feira, 13 de março de 2013 17:02
  • Nesse cenário você tem três objetos com o nome CMV:

    Tabela: CMV

    Variável: _CMV

    Campo: CMV

    Quando vc dá um select, tem que ser na variável _CMV. o underline tem que ser nesse "CMV" após o select. O resto está certo. Olha o seu código e o último que eu te mandei.

    Um método só retorna valor quando a linha não está no estado de insert ou update, ou seja, tem sim que salvar primeiro.

    Att.


    Adeilson Assis Desenvolvedor / Consultor Funcional em Microsoft Dynamics AX 2009

    quarta-feira, 13 de março de 2013 18:51
  • Obrigado pela atenção Adeilson.

    Fiz o seguinte...alterei o nome do campo na tabela....passei de CMV para Valor..o método ficou assim:

    display real CMV(InventJournalTrans _inventJournalTrans)
    {
    CMV _CMV;
    select Valor
    from _CMV
    where _CMV.InventDimId   ==   _inventJournalTrans.InventDimId
    &&  _CMV.ItemId              == _inventJournalTrans.ItemId;
    return _CMV.Valor;
    }

    Porém, ele ainda não traz o valor, sempre 0,00.

    Tudo bem se ele tiver que salvar para atualizar.

    Obrigado mesmo !

    quarta-feira, 13 de março de 2013 19:02
  • Na verdade você não precisa de tabela para resolver o seu problema!!! Verifique a API utilizada abaixo:

    static void Job3(Args _args)
    {
        InventSum                           inventSum;
        InventDim                           inventDim;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;

        inventSum.ItemId = "MP0001";

        inventDim.InventSiteId = "BR1";

        inventDimParm.InventSiteIdFlag = NoYes::Yes;
        inventDimParm.ItemIdFlag = NoYes::Yes;

        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);

        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
       
        average = value / qty;
       
        print qty;
        print value;
        print average;
        pause;
    }


    Software Development Engineer - Global Finance Management Team - www.daxdev.com.br -

    quarta-feira, 13 de março de 2013 20:27
  • Na verdade você não precisa de tabela para resolver o seu problema!!! Verifique a API utilizada abaixo:

    static void Job3(Args _args)
    {
        InventSum                           inventSum;
        InventDim                           inventDim;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;

        inventSum.ItemId = "MP0001";

        inventDim.InventSiteId = "BR1";

        inventDimParm.InventSiteIdFlag = NoYes::Yes;
        inventDimParm.ItemIdFlag = NoYes::Yes;

        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);

        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
       
        average = value / qty;
       
        print qty;
        print value;
        print average;
        pause;
    }


    Software Development Engineer - Global Finance Management Team - www.daxdev.com.br -

    Rodrigo, o cálculo foi exato aqui executando o Job.

    Porém, como eu vou colocar esta informação no grid do form ? Como disse acima, ele não precisa mostrar no momento em que digito a informação, mas, quando salvar, preciso desta informação. 

    No print do Job foi exato...eu tenho como executar num display seguindo esta mesma lógica ?

    Obrigado !!

    quarta-feira, 13 de março de 2013 20:50
  • Na verdade você não precisa de tabela para resolver o seu problema!!! Verifique a API utilizada abaixo:

    static void Job3(Args _args)
    {
        InventSum                           inventSum;
        InventDim                           inventDim;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;

        inventSum.ItemId = "MP0001";

        inventDim.InventSiteId = "BR1";

        inventDimParm.InventSiteIdFlag = NoYes::Yes;
        inventDimParm.ItemIdFlag = NoYes::Yes;

        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);

        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
       
        average = value / qty;
       
        print qty;
        print value;
        print average;
        pause;
    }


    Software Development Engineer - Global Finance Management Team - www.daxdev.com.br -

    Rodrigo, o cálculo foi exato aqui executando o Job.

    Porém, como eu vou colocar esta informação no grid do form ? Como disse acima, ele não precisa mostrar no momento em que digito a informação, mas, quando salvar, preciso desta informação. 

    No print do Job foi exato...eu tenho como executar num display seguindo esta mesma lógica ?

    Obrigado !!

    Consegui converter para um display, mas, ele nunca é chamado no Form, com isso, o valor sempre fica zero...

    Está correta este display ?

    display real calcula_cmv(InventJournalTrans _InventJournalTrans)
    {
        InventSum                           inventSum;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;
        ;
    
        inventSum.ItemId = _InventJournalTrans.ItemId;
    
        inventSum.InventDimId = _InventJournalTrans.inventDimId;
    
        inventDimParm.InventSiteIdFlag = NoYes::Yes;
        inventDimParm.ItemIdFlag = NoYes::Yes;
    
        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);
    
        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
    
        average = value / qty;
    
        return average;
    }
    

    Obrigado !!!

    sexta-feira, 15 de março de 2013 11:22
  • Nas tabelas que tem acesso ao estoque, normalmente você tem um inner join com a tabela InventDimId, ela só é preenchida quando você grava a linha pois o sistema chama um método chamado InventDim::findOrCreate().

    Vindo do form, você pode ler a inventDim pelo data source, tente usar use o método getJoinChildFormDataSource para pegar a tabela IvnetDim do formulário, assim você vai ter o valores de deposito e site.


    Software Development Engineer - Global Finance Management Team - www.daxdev.com.br -

    sexta-feira, 15 de março de 2013 15:04
  • Rodrigo, bom dia.

    Aqui utilizamos o 2009 ainda...vi o JoinChild mas não consegui parametrizar no método do CMV.

    Você tem idéia de como posso declarar este conceito do JoinChild para estas tabelas ?

    Obrigado.

    quinta-feira, 21 de março de 2013 13:30
  • Boa tarde.

    Faça o seguinte:

    Crie o seguinte método na tabela InventJournalTrans:

    display real displayAvgPrice(InventJournalTrans _inventJournalTrans)
    {
        InventSum                           inventSum;
        InventDim                           inventDim;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;
        ;
    
        inventSum.ItemId = _inventJournalTrans.ItemId;
    
        inventDim = InventDim::find(_inventJournalTrans.InventDimId);
    
        inventDimParm.initFromInventDim(inventDim);
    
        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);
    
        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
    
        if(qty == 0)
            average = 0;
        else
            average = value / qty;
    
        return average;
    }

    Depois, vá até o Grid (abra outra AOT ao lado da AOT com este método visível), e arraste este método até o Grid. Ele irá criar um campo RealEdit.

    Depois, vá nas propriedades do campo que acabou de ser criado, e edite a propriedade "Datasource". Coloque a tabela InventJournalTrans na propriedade Datasource.

    Agora, ao alterar o item ou dimensão, o valor será atualizado.

    Obviamente o ideal é que utilize algum EDT e que ponha alguma label, pois desta forma os valores virão sem casas decimais e sem label na Grid.

    O importante é que o valor virá conforme o esperado. Só fica agora pendente você arrumar os detalhes.

    Abraço.


    Gustavo Bagno E. da Silva

    • Marcado como Resposta matfurrier segunda-feira, 1 de abril de 2013 11:59
    quinta-feira, 28 de março de 2013 19:43
  • Boa tarde.

    Faça o seguinte:

    Crie o seguinte método na tabela InventJournalTrans:

    display real displayAvgPrice(InventJournalTrans _inventJournalTrans)
    {
        InventSum                           inventSum;
        InventDim                           inventDim;
        InventDimParm                       inventDimParm;
        InventSumFinancial                  inventSumFinancial;
        InventQty                           qty;
        CostAmount                          value;
        real                                average;
        ;
    
        inventSum.ItemId = _inventJournalTrans.ItemId;
    
        inventDim = InventDim::find(_inventJournalTrans.InventDimId);
    
        inventDimParm.initFromInventDim(inventDim);
    
        inventSumFinancial = InventSumFinancial::newSumReport(today(), inventSum, inventDim, inventDimParm);
    
        qty     += inventSumFinancial.qty();
        value   += inventSumFinancial.value();
    
        if(qty == 0)
            average = 0;
        else
            average = value / qty;
    
        return average;
    }

    Depois, vá até o Grid (abra outra AOT ao lado da AOT com este método visível), e arraste este método até o Grid. Ele irá criar um campo RealEdit.

    Depois, vá nas propriedades do campo que acabou de ser criado, e edite a propriedade "Datasource". Coloque a tabela InventJournalTrans na propriedade Datasource.

    Agora, ao alterar o item ou dimensão, o valor será atualizado.

    Obviamente o ideal é que utilize algum EDT e que ponha alguma label, pois desta forma os valores virão sem casas decimais e sem label na Grid.

    O importante é que o valor virá conforme o esperado. Só fica agora pendente você arrumar os detalhes.

    Abraço.


    Gustavo Bagno E. da Silva

    PER-FEI-TO Gustavo !!

    Saiu exatamente como precisamos.

    Muito obrigado mesmo !

    Obrigado a todos que contribuíram !!

    segunda-feira, 1 de abril de 2013 12:00