Caros,
A idéia hoje é mostrar como configurar o gerenciador de documentos para podermos utilizarmos no proximo tutorial, a idéia consiste em configurar sequencia numérica, diretório de arquivos e algumas outras configurações para o AX saber como tratar quando formos anexar um documento a um registro.
Para começar vamos até: Básico -> Gerenciando Documentos -> Tipos de Documentos.
Neste formulário, vamos apenas configurar o item do tipo “Documento”, vamos para a aba geral e lá vamos configurar o diretório de arquivo morto, que é onde os arquivos gerados pelo AX serão salvos e caso queira configurar algo mais.
Depois, vá até Básico -> Gerenciando Documentos -> Parâmetros e configure na aba Sequencias Numéricas e configure a sequencia númerica que será usada pelo AX para dar nome aos documentos criados.
Ok, agora que já temos o AX configurado e pronto para gerar documentos, vamos para o proximo post, a parte prática!
Próximo post: http://www.daxbr.com.br/?p=1879
[]s
Pichler
Caros,
Há alguns dias atrás eu postei como chegar ao cálculo de comissões por recebimento, mas agora analisando diferente, eu cheguei a outra query:
SELECT CS.TRANSDATE , SUM(CS.SETTLEAMOUNTCUR) AS SETTLEAMOUNTMST , CT2.INVOICE , C.NAME AS CNAME , CMT.AMOUNTMST AS AMOUNTMST , DT.NAME , CT2.AMOUNTCUR AS INVOICEAMOUNT , CASE WHEN PC.NUMOFPAYMENT = '' THEN '1' WHEN ISNULL(PC.NUMOFPAYMENT, '1') = '1' THEN '1' -- Não sei porque tenho que fazer assim, sei que se comparo com Null ou qualquer outra coisa não funciona. ELSE PC.NUMOFPAYMENT END AS NUMOFPAYMENT , CIT.NAME AS ITEMNAME FROM CUSTTRANS AS CT INNER JOIN CUSTSETTLEMENT CS ON CS.TRANSCOMPANY = CT.DATAAREAID AND CS.TRANSRECID = CT.RECID AND CS.ACCOUNTNUM = CT.ACCOUNTNUM INNER JOIN CUSTTABLE C ON C.ACCOUNTNUM = CT.ACCOUNTNUM AND C.DATAAREAID = CT.DATAAREAID INNER JOIN CUSTTRANS CT2 ON CT2.RECID = CT.OFFSETRECID AND CT2.DATAAREAID = CT.DATAAREAID INNER JOIN COMMISSIONTRANS CMT ON CMT.INVOICEID = CT2.INVOICE AND CMT.DATAAREAID = CT2.DATAAREAID INNER JOIN EMPLTABLE ET ON ET.EMPLID = CMT.EMPLID AND ET.DATAAREAID = CMT.DATAAREAID INNER JOIN DIRPARTYTABLE DT ON DT.PARTYID = ET.PARTYID AND DT.DATAAREAID = ET.DATAAREAID INNER JOIN CUSTINVOICEJOUR CIJ ON CIJ.INVOICEID = CT2.INVOICE AND CIJ.DATAAREAID = CT2.DATAAREAID LEFT OUTER JOIN PAYMSCHED PC ON PC.NAME = CIJ.PAYMENTSCHED AND PC.DATAAREAID = CIJ.DATAAREAID INNER JOIN CUSTINVOICETRANS CIT ON CIT.INVOICEID = CIJ.INVOICEID AND CIT.DATAAREAID = CIJ.DATAAREAID AND CIT.INVENTTRANSID <> '' AND CIT.NUMBERSEQUENCEGROUP = CIJ.NUMBERSEQUENCEGROUP WHERE CT.TRANSTYPE = '15' AND CIJ.RETURNITEMNUM = '' AND CT2.TRANSTYPE = '2' AND CIJ.INVOICEAMOUNT > 0 AND CT.DATAAREAID = 'DAT' GROUP BY CS.TRANSDATE, CT2.INVOICE, C.NAME, CMT.AMOUNTMST, DT.NAME, CT2.AMOUNTCUR, PC.NUMOFPAYMENT, CIT.NAME, CT2.TRANSTYPE |
A mudança mais significativa é que agora parto da CustTrans onde o tipo de transação for igual a 15 (Payment) enquanto na outra versão, eu partia da CustSettlement (liquidação de clientes).
Post inicial: http://www.daxbr.com.br/?p=1834
Obs.: Novamente, isto serve para a minha situação atual, ou seja, use por sua conta e risco!
[]s
Pichler
27 Dec 2010
Posted by: Ricardo Pichler in: Configuração, Diversos, X++
Caros,
Em algumas implementações, em especial nas que o cliente tem poucas licenças, há um recurso bastante útil que derruba a conexãos dos usuários inativos após X minutos. Para aqueles que não conhecem, o recurso pode ser encontrado em:
Ferramentas -> Opções -> Desligamento Automático = Número de minutos.
Caso queira configurar o de outro(s) usuário(s): Administração -> Usuários -> Escolhe o usuário -> Opções de usuário -> Desligamento Automático.
Caso queira fazer para todos os usuários cadastrados:
1 2 3 4 5 6 | static void Job5(Args _args) { UserInfo userInfo; ; update_recordset userInfo setting autologoff = 5; } |
Caso queira que todos os novos usuários sejam cadastrados com um valor default quando forem adicionados ao AX, vá no formulário SysUserInfo, DataSource UserInfo, Método write e antes do super() coloque:
1 | userInfo.autoLogOff = 5; |
[]s
Pichler
Caros,
Uma funcionalidade bem legal do AX e que infelizmente é muito pouco usada é a de associar a um erro que foi gerado por falta de parâmetro, uma forma de o usuário ir para onde ele deve fazer a configuração do ‘tal parâmetro’! Vou tentar ser mais claro usando um exemplo: “Imagine que o usuário tem que configurar a Sequência Numérica antes de realizar o processo de exportação de um arquivo qualquer e ele ainda não configurou! Geralmente geramos apenas um erro do tipo ‘você deve configurar a Sequência ….’ e o usuário ou consultor tem que procurar o que configurar!” No entanto, você pode dar a oportunidade do usuário clicar duas vezes na própria mensagem de erro e abrir o formulário que ele precisa, simples assim! (Ou até mesmo clicar no botão “corrigir erro”)
Vamos ao exemplo:
1 2 3 4 5 6 7 | static void Job1(Args _args) { ; //Não criei um label porque é só para o exemplo, um label DEVE ser criado sempre! error('Você deve configurar os paramêtros do CNAB','http://www.daxbr.com.br', SysInfoAction_Formrun::newFormname(formstr(CNABParameters))); //CNABParameters é um formulário que fiz para algumas configurações extras para a integração com o CNAB que o Matiazo disponibilizou em seu site. } |
Existem algumas variações que podem ser usadas neste caso:
1 2 3 4 5 | static void Job2(Args _args) { ; error("Você deve configurar os paramêtros do CNAB",'http://www.daxbr.com.br',SysInfoAction_Formrun::newFormnameControlnameDesc(formstr(CNABParameters), identifierstr(Archive_ArchivePath), "@SYS4157")); } |
Mudando o valor do SysInfoAction_Formrun para newFormnameControlnameDesc cria um botão e o resultado é este:
Agora basta usar a criatividade!
Abraço,
Pichler
Pessoal,
Uma funcionalidade que já vi muita gente reclamando é que o AX calcula o pagamento da comissão, no entanto, não atrela aos recebimentos, ou nem tem um relatório que faz este controle.
Surgiu a necessidade de fazer isso aqui onde estou trabalhando, o esquema aqui é simples, tem sempre um único imposto para determinada situação, então eu já coloco o percentual da comissão menos os impostos na definição do grupo e fica tudo bem, mas ai pra vocês que tiverem casos mais complexos, é só ajustar.
Fiz em SQL porque fiz um relatório no report server, pro meu caso funcionou legal e espero que ajude vocês!
SELECT CS.TRANSDATE , SUM(CS.SETTLEAMOUNTCUR) AS SETTLEAMOUNTMST , CT.INVOICE , C.NAME AS CNAME , CMT.AMOUNTMST AS AMOUNTMST , DT.NAME , CT.AMOUNTCUR AS INVOICEAMOUNT, ISNULL(PC.NUMOFPAYMENT, 1) AS NUMOFPAYMENT , CIT.NAME AS ITEMNAME FROM CUSTSETTLEMENT CS INNER JOIN CUSTTRANS CT ON CT.DATAAREAID = CS.DATAAREAID AND CT.RECID = CS.TRANSRECID AND CT.ACCOUNTNUM = CS.ACCOUNTNUM INNER JOIN CUSTTABLE C ON C.ACCOUNTNUM = CT.ACCOUNTNUM INNER JOIN COMMISSIONTRANS CMT ON CMT.INVOICEID = CT.INVOICE INNER JOIN EMPLTABLE ET ON ET.EMPLID = CMT.EMPLID INNER JOIN DIRPARTYTABLE DT ON DT.PARTYID = ET.PARTYID INNER JOIN CUSTINVOICEJOUR CIJ ON CIJ.INVOICEID = CT.INVOICE LEFT OUTER JOIN PAYMSCHED PC ON PC.NAME = CIJ.PAYMENTSCHED INNER JOIN CUSTINVOICETRANS CIT ON CIT.INVOICEID = CIJ.INVOICEID AND CIT.NUMBERSEQUENCEGROUP = CIJ.NUMBERSEQUENCEGROUP WHERE CIJ.INVOICEAMOUNT > 0 AND CS.DATAAREAID = 'DAT' -- trocar para a sua empresa! (Obrigado Peterson!) GROUP BY CS.TRANSDATE , CT.INVOICE , C.NAME , CMT.AMOUNTMST , DT.NAME , CT.AMOUNTCUR , PC.NUMOFPAYMENT , CIT.NAME |
Vale observar, que eu pego todas as comissões que o valor são maiores do que 0, ou seja, não estou levando em consideração os cancelamentos, que devem sim ser tratados ou então você pagará comissões a vendas canceladas.
[]s
Pichler