Páginas

Como criar uma nova sequência numérica customizada

Outro dia meu amigo Abraão estava com dúvidas para criar uma nova sequência numérica, por isso estou postando um passo a passo para a criação.

1- Primeiro criei um ExtendedDataType MyNumberSequence.

2- Depois criei uma tabela chamada MyTable, para servir de exemplo e adicionei o ExtendedDataType que será nosso campo sequencial.

3- No nosso caso vamos criar uma sequência numérica para o módulo de Contas à Receber, então na classe NumberSeqReference_Customer vamos alterar o método loadModule() e adicionar o seguinte trecho de código:
  1. if (isConfigurationkeyEnabled(configurationkeynum(MyConfigKey))
  2. {
  3.     numRef.DataTypeId = typeId2ExtendedTypeId(typeid(MyNumberSequence)); //Nome do EDT
  4.     numRef.ConfigurationKeyId = configurationkeynum(MyConfigKey); //Nome da ConfigKey
  5.     numRef.ReferenceLabel = literalstr("Nome q aparece na tela de parâmetros para atribuir a sequencia");
  6.     numRef.ReferenceHelp = literalstr("Nova Sequência");
  7.     numRef.WizardContinuous = true;
  8.     numRef.WizardManual = NoYes::No;
  9.     numRef.WizardAllowChangeDown = NoYes::No;
  10.     numRef.WizardAllowChangeUp = NoYes::No;
  11.     numRef.SortField = 20; //Muito importante, respeitar a sequencia do método
  12.     numRef.WizardHighest = 999999;
  13.     this.create(numRef);
  14. }
Obs.: Como já adicionei em comentário no método é muito importante respeitar a senquencia do método, e para esse caso criei também uma ConfigurantionKey para controle de segurança.

4- Agora vamos criar um método na SalesParameters (pois estamos criando a sequência no módulo de Contas à Receber)
  1. static client server NumberSequenceReference numRefMyNumberSequence()
  2. {
  3.     ;
  4.     return NumberSeqReference::findReference(typeId2ExtendedTypeId(typeid(MyNumberSequence))); //Nome do seu EDT
  5. }
5- Agora vamos criar a nossa sequência numérica no seguinte caminho:

Básico - Configurações - Sequências Numéricas - Sequências Numéricas

6- Agora vamos atribuir a sequência numérica criada ao nosso formulário no caminho:

Contas à Receber - Configurações - Parâmetros, na aba Sequências Numéricas

7- Agora vamos criar um formulário customizado utilizando nossa tabela, declarar uma variável global:
  1. public class FormRun extends ObjectRun
  2. {
  3.     NumberSeqFormHandler numberSeqFormHandler;
  4. }
E criar o seguinte método no formulário:
  1. NumberSeqFormHandler numberSeqFormHandler()
  2. {
  3.     if (!numberSeqFormHandler)
  4.     {
  5.         numberSeqFormHandler = numberSeqFormHandler::newForm(SalesParameters::numRefMyNumberSequence().NumberSequence, element, MyTable_DS, fieldNum(MyTable, MyNumberSequence));
  6.     }
  7.     return numberSeqFormHandler;
  8. }
8- Agora vamos sobreescrever os métodos create(), write() e delete() do DataSource do formulário, com os seguintes códigos:
  1. public void create(boolean _append = false, boolean extern = false)
  2. {
  3.     ;
  4.     element.numberSeqFormHandler().formMethodDataSourceCreatePre();
  5.     super(_append);
  6.     if(!extern)
  7.     {
  8.         element.numberSeqFormHandler().formMethodDataSourceCreate();
  9.     }
  10. }
No write() com o código:
  1. public void write()
  2. {
  3.     ttsbegin;
  4.     element.numberSeqFormHandler().formMethodDataSourceWrite();
  5.     super();
  6.     ttscommit;
  7. }
E no delete() como código:
  1. public void delete()
  2. {
  3.     element.numberSeqFormHandler().formMethodDataSourceDelete();
  4.     super();
  5. }
 E podemos testar nossa sequência numérica, que irá funcionar.

[]'s
Alexssander

Como trabalhar com relatórios via Reporting Services utilizando a query da AOT

Ontem o meu amigo Leandro Sales me perguntou como criar um relatório no Reporting Services utilizando a query da AOT, já havia postado no blog como chamar de dentro do Visual Studio uma classe do AX para retornar um buffer com os dados. Hoje vou postar como retornar os dados utilizando a quey criada na AOT.

Primeiro devemos criar nossa query, para exemplo vamos criar uma query bem simples, porém podemos utilizar todos os recursos do objeto query.

Objeto Query na AOT

Em seguida vamos criar um novo projeto no Visual Studio em C# com o template Dynamics AX Reporting Project.

Agora com o projeto criado vamos adicionar um novo DataSet e para esse DataSet vamos selecionar a query que criamos no AX, selecionar os campos que iremos utilizar.


Feito isso nossa estrutura do relatório ficará da seguinte maneira.

Estrutura do relatório no Visual Studio

Agora com os dados já filtrados e selecionados, podemos manipular os dados dentro do Visual Studio aproveitando todos os recursos que temos para criar o Design, Parâmetros, Filtros, Agrupamento e tudo mais.

Espero que tenha sido útil.

[]'s
Alexssander

Gerar um relatório a partir de um registro selecionado

Ontem meu amigo Abraão me pediu ajuda pra gerar um relatório de acordo com um registro selecionado em um formulário. E me lembrava que já tinha feito e que era muito simples, porém não me recordava dos detalhes. Então em uma breve conversa com meu amigo Leandro Honório ele me ajudou muito e concluí os detalhes e ajudei o Abraão a solucionar o problema. Como já tinha passado pela mesma situação e não guardei tomei nota da resolução, decidi postar dessa vez para termos mais um auxílio.

Nesse caso tenho o formulário AssetTable e preciso criar um botão no formulário que leve para um relatório, porém as informações do relatório devem ser baseadas no registro selecionado.

Primeiro criei um relatório simples com o DataSource AssetTable e no design adicionei 2 campos apenas para demonstrar, a estrutura do relatório ficou da seguinte maneira:

Estrutura do relatório

Em seguida declarei a tabela como uma variável global:
  1. public class ReportRun extends ObjectRun
  2. {
  3.     AssetTable currentRecord;
  4. }
Depois sobreescrevi o método init, para que no momento que ele iniciar o relatório nossa variável global receba os parâmetro do registro selecionado:
  1. public void init()
  2. {
  3.     super();
  4.     currentRecord = element.args().record();
  5. }
E em seguida vamos sobreescrever o método fetch, para executar nossa query e para que possamos adicionar o range atual ao DataSource, assim preenchendo o DataSource apenas com os dados do registro selecionado:
  1. public boolean fetch()
  2. {
  3. boolean ret;
  4. ;
  5.  
  6. queryRun = new QueryRun(this);
  7. queryRun.query().dataSourceTable(tablenum(AssetTable)).addRange(fieldnum(AssetTable, AssetId)).value(currentRecord.AssetId);
  8. ret = super();
  9. return ret;
  10. }
Feito isso vamos desabilitar a propriedade Interactive do Relatório e na Query.

Com o relatório criado vamos criar um MenuItem do nosso relatório e no nosso formulário criar um botão partindo do MenuItem e passar a propriedade DataSouce para a tabela que estamos utilizando.

E com isso ao selecionar um registro e clicarmos no botão o relatório é gerado a partir do registro selecionado.

[]'s
Alexssander