Frequentemente vejo as pessoas perguntando: Tenho o formulário A com um registro selecionado, quero que quando eu clicar no botão X, abra o formulário B, já com o registro filtrado (pertinente ao registro do formulário A). Talvez a pergunta tenha ficado confusa, mas vamos lá, talvez com o código fique mais claro, ou não.

Basicamente a operação consiste em sempre usar um MenuItem e preencher os argumentos do mesmo, seja via Properties ou então via linha de código.

Quando usamos via properties (não exisge código), basta que os relacionamentos estejam corretamente setados e que você informe na propriedade DataSource do botão (menuItem) o datasource que irá enviar junto com o clique, o resto, o próprio AX já irá fazer.

O pessoal do http://www.fourone.se/ escreveu um artigo e publicou um job que:

Primeiro ira exibir o formulário CustTable filtrado pelo registro de cliente código 4004 e quando este formulário for fechado, o formulário CustTrans será exibido mostrando dados sobre o cliente que vimos no form CustTable. Também é exibido como você também pode parar o código esperando que o formulário seja fechado ou então simplesmente dar um detach e continuar independente do que aconteça no formulário.

Abaixo o código com alguns comentários:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
static void FO_OpenFilteredForms(Args _args)
{
  Args		argsCust,	argsTrans;
  FormRun 	formRun, 	formRun2;
  //Aqui é feita a seleção do cliente código 4004 e atribuído a variável custTable
  CustTable 	custTable = CustTable::find("4004");
  ;
 
  //Aqui é passado o nome do formulário que será aberto, no caso, CustTable
  argsCust = new Args(formStr(CustTable));
  //Aqui é passado o registro previamente selecionado, no caso, o cliente código 4004
  argsCust.record(custTable);
 
  formRun = classFactory.formRunClass(argsCust);
  formRun.init();
  formRun.run();
  //Aqui é o comando onde a instrução de esperar pelo formulário é dada
  formRun.wait();
 
  print "Isto será impresso quando " + "o formulário CustTable for fechado.";
  pause;
 
  //Aqui é passado o nome do formulário que será aberto, no caso, CustTrans
  argsTrans = new Args(formStr(CustTrans));
  //Aqui é passado o registro previamente selecionado, no caso, o cliente código 4004
  //Perceba que o registro é o mesmo, nada mudou, o que mudou foi o formulário
  argsTrans.record(custTable);
 
  formRun2 = classFactory.formRunClass(argsTrans);
  formRun2.init();
  formRun2.run();
  //Aqui é o comando onde a instrução de não esperar (detach) pelo formulário é dada
  formRun2.detach();
 
  print "Isto será impresso quando " + "o formulário CustTrans for aberto.";
  pause;
}

[]s
Pichler