Logo Passei Direto
Buscar

Apostila DEV MS 365 FinOps por Luis Prado

Ferramentas de estudo

Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

1 
 
 
 
 
 
Introdução ao desenvolvimento e personalização. 
 
 
 
 
 
 
 
 
 2 
 
 
Índice 
 
Conceitual............................................................................................................................................... 3 
Diferenciando nuvem de arquitetura local................................................................................4 
Ferramentas de desenvolvimento no Visual Studio..............................................................5 
Elementos, modelos e pacotes........................................................................................................9 
Formulários do tipo Dialogs.........................................................................................................16 
Gerenciamento de Dados.(Entidade de dados, EDT, Enum, Tables)...........................25 
Interface do Usuário (Menus, MenuItem, Forms, Label)..................................................46 
Segurança..............................................................................................................................................69 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 3 
 
 
 
Conceitual 
O Microsoft Dynamics AX é uma solução de enterprise resource planning (ERP) para 
organizações de porte médio e grande que ajuda as pessoas a trabalharem 
efetivamente, gerenciar alterações e competir no mundo inteiro. O Microsoft 
Dynamics AX funciona de maneira semelhante e integrada ao software da Microsoft 
e é uma solução que automatiza e simplifica processos financeiros, de business 
intelligence e de cadeia de suprimentos de uma forma que ajude você em seus 
negócios. 
 
O Dynamics AX agora é Dynamics 365 for Finance and Operations. 
 
Planejamento de Recursos Empresariais ou planeamento de recurso corporativo é 
um sistema de informação que integra todos os dados e processos de uma 
organização em um único sistema. A integração pode ser vista sob a perspectiva 
funcional e sob a perspectiva sistêmica. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 4 
 
 
Diferenciando nuvem de arquitetura local 
Um entendimento da arquitetura subjacente do Dynamics 365 for Finance and 
Operations ajudará você a apreciar a rica funcionalidade da interface do 
usuário. Alguns componentes de arquitetura podem variar entre implantações na 
nuvem e locais. 
As implantações em nuvem oferecem um serviço totalmente gerenciado pela 
Microsoft, enquanto as implantações locais são implantadas localmente no data 
center de um cliente. Metodologias diferem entre implantações hospedadas em 
nuvem e locais. A implementação que uma empresa usa será baseada em quem é o 
trustee de dados desejado e quem gerenciará o ciclo de vida do aplicativo. 
Implantação na nuvem 
Uma implantação em nuvem oferece vários benefícios, incluindo tempo de 
implementação reduzido, custos mais baixos de hardware e infraestrutura e 
desenvolvimento menos invasivo. Um dos principais benefícios de escolher uma 
implantação na nuvem é que o serviço de ERP é totalmente gerenciado pela 
Microsoft. Portanto, as implantações na nuvem são uma oferta de software como 
serviço (SaaS). Isso permite que as organizações aumentem ou diminuam 
facilmente, dependendo das necessidades da empresa. Implantações em nuvem 
também permitem que os clientes permaneçam atualizados de maneira consistente, 
previsível e transparente. Essa cadência, que permite atualizações contínuas do 
aplicativo, visa reduzir os custos de atualização, fornecer acesso a todos os recursos 
mais recentes, melhorar o desempenho e oferecer uma melhor experiência de 
suporte. 
Implantação no local 
Ao decidir qual tipo de implantação sua organização deve usar, você deve considerar 
a abordagem geral da implementação e o gerenciamento da 
infraestrutura. Considerações adicionais incluem as preferências organizacionais 
para atender às necessidades normativas e de conformidade dos negócios. Nesses 
tipos de situações, uma implantação local pode ser escolhida. 
As organizações que optam por implantar Finanças e Operações no local também 
precisam assumir a propriedade de várias tarefas que, de outra forma, teriam sido 
executadas pela Microsoft. Essas tarefas incluem a configuração de soluções de alta 
disponibilidade, soluções de recuperação de desastre e ambientes de 
sandbox. Tenha em mente que existem diferenças de funcionalidade entre 
implantações locais e implantações na nuvem. 
 
 
 5 
 
 
Ferramentas de desenvolvimento no Visual Studio 
 
Quais são as ferramentas de desenvolvimento? 
Uma alteração notável do Microsoft Dynamics AX 2012 é que o Microsoft Dynamics 
365 for Finance and Operations não inclui um aplicativo rich-client (ax32.exe). De 
uma perspectiva de desenvolvimento, isso significa que o ambiente de 
desenvolvimento do Microsoft Dynamics AX 2012, MorphX, não é mais usado. Em 
seu lugar, o desenvolvimento de aplicativos é realizado exclusivamente no Visual 
Studio. As ferramentas de desenvolvimento suportam todas as tarefas de 
desenvolvimento, incluindo depuração e cenários de testes locais. Um objetivo 
principal da experiência de desenvolvimento é manter os conceitos familiares do 
Microsoft Dynamics AX 2012 e adaptá-los perfeitamente à estrutura e aos 
paradigmas do Visual Studio. 
O Visual Studio 2015 é o exclusivo ambiente de desenvolvimento integrado (IDE) 
para desenvolvimento. Todo o seu trabalho de desenvolvimento de aplicativos será 
executado com ele. Esta seção é uma visão geral dos principais recursos adicionados 
ao Visual Studio quando as ferramentas de desenvolvimento são instaladas. 
Explorador de Aplicações 
No Visual Studio, o armazenamento de modelo é representado pelo Explorador de 
Aplicativos. No menu Exibir, clique em Explorador de aplicativos para abri-lo. O 
Explorador de Aplicativos corresponde à Árvore de Objetos de Aplicativos (AOT) 
com a qual você pode estar familiarizado no Microsoft Dynamics AX 2012. Use o 
Explorador de Aplicativos para procurar e interagir com os elementos no 
armazenamento de modelos que definem os aplicativos. 
 
 
A ilustração a seguir mostra o Explorador de Aplicativos. 
 
 
 6 
 
 
 
 
 
 7 
O modelo de projeto 
Até mesmo um aplicativo simples pode ter um grande número de elementos em seu 
modelo. O modelo do Projeto de Operações foi adicionado ao Visual Studio para 
ajudá-lo a organizar e gerenciar os elementos com os quais você está trabalhando 
para um modelo. Você usará o projeto para projetar, construir e testar elementos de 
modelo. É comum ter vários projetos em uma única solução do Visual Studio. A 
ilustração a seguir mostra três projetos em uma solução do Visual Studio. 
 
 
Designers de elementos 
As ferramentas do Visual Studio contêm designers para cada tipo de elemento no 
aplicativo. Você usará esses designers quando criar ou modificar elementos. A 
ilustração a seguir mostra o designer de elemento para um elemento de formulário. 
 
 
 
 8 
Editor de código 
O código do X ++ é escrito no editor de código do Visual Studio. Os recursos padrão 
que um desenvolvedor espera do editor de código são suportados. Por exemplo, 
seções de código são redimensionáveis. O IntelliSense fornece orientação à medida 
que você escreve ou modifica o código. 
 
 
Menu do Dynamics 365 
As ferramentas adicionam o menu do Dynamics 365 ao Visual Studio. Várias 
ferramentas que você usará durante o processo de desenvolvimento são 
encontradas aqui. Por exemplo, as ferramentas para gerenciar modelos são 
acessadas no menu. 
 
 
 
 
 
 
 
 
 
 
 
 9 
Elementos, modelos e pacotes 
Elementos, modelos e pacotes representam a hierarquia estrutural no Visual Studio 
for Finance and Operations. ElementosAplicar padrão | Campos e Grupos de 
Campo. 
25. Mude o nome do controlo para GeneralFields. 
26. No painel de formulário, expanda Data Sources, ConWHSVehicleParameters e, 
em seguida, Grupos de campo. 
27. Arraste o grupo de campos Padrões para o controle GeneralFields no painel de 
desenho, conforme mostrado na captura de tela a seguir: 
 
 
 55 
 
28. Verifique cada nó quanto a erros de conformidade de padrão. 
29. Finalmente, teremos uma tarefa especial para formulários de parâmetros; para 
garantir que pelo menos existe um registro, clique no nó Métodos e escolha Override| 
init. 
30. Crie uma linha em branco antes da chamada para super() e digite a seguinte linha 
de código: 
ConWHSVehicleParameters::Find(); 
31. Salve e feche o editor de códigos e os designers de formulários. 
 
Nota: 
Quando especificamos o padrão principal do design do formulário, somos guiados 
para os controles que deve adicionar e onde. Isso nos ajuda a garantir que os 
formulários que criamos sigam uma prática recomendada design de interface do 
usuário, que, por sua vez, torna nossos formulários mais fáceis de usar, mais rápidos 
de treinar e menos propenso a erro do usuário. Ainda podemos desativar o padrão 
usando o padrão Personalizado; isso nos permite adicionar qualquer controle em 
qualquer ordem. Isso deve ser evitado, e o design do formulário deve ser 
redesenhado que ele usa padrões padrão. 
 
O formulário é baseado na classe FormRun. Podemos ver isso abrindo (clique duas 
vezes) classDeclaration para o formulário CustGroup: 
public class ConWHSVehicleParameters extends FormRun 
Este é na verdade um arquivo de definição que o FormRun instancia para construir 
e executar a forma. Uma vez que o sistema construiu o design do formulário usando 
SysSetupFormRun, ele executará as tarefas de inicialização e execute o formulário. 
Os principais métodos são Init e Run. Estes podem ser substituído no formulário 
para executar tarefas adicionais de inicialização. Uma das principais tarefas do 
método FormRunInit é construir as fontes de dados do formulário, estes não são 
referências de tabela, mas objetos FormDataSource construídos a partir das 
tabelas listadas sob o Nó Origens de dados. No caso do formulário 
 
 
 56 
ConWHSVehicleParameters, o sistema cria o seguinte objeto da fonte de dados 
ConWHSVehicleParameters para nós: 
o ConWHSVehicleParameters as type ConWHSVehicleParameters(table) 
o ConWHSVehicleParameters_DS as type FormDataSource 
o ConWHSVehicleParameters_Q as type Query 
o ConWHSVehicleParameters_QR as type QueryRun 
Normalmente não estamos preocupados com os objetos Query e QueryRun, pois 
podemos acessá-los através do objeto FormDataSource de qualquer maneira. 
As fontes de dados são declaradas como variáveis globais para o formulário e 
fornecem uma camada de funcionalidade entre o formulário e a tabela. Isso nos 
permite controlar a interação entre os controles de formulário vinculados e a tabela. 
Vamos sobrescrever o método init na fonte de dados e, em seguida, substituir o 
modifiedField evento em um campo; o editor de código apresentará a alteração da 
seguinte maneira: 
[Form] 
public class ConWHSVehicleParameters extends FormRun 
{ 
public void init() 
{ 
ConWHSVehicleParameters::Find(); 
super(); 
} 
[DataSource] 
class ConWHSVehicleParameters 
{ 
public void init() 
{ 
super(); 
} 
[DataField] 
class DefaultVehicleGroupId 
{ 
public void modified() 
{ 
super(); 
} 
} 
} 
} 
 
Ele adiciona a fonte de dados como uma classe na declaração de classe do formulário 
e, em seguida, adiciona o campo como uma classe dentro da classe de fonte de dados. 
Este é o único local em Operações onde este ocorre. Se a classe de fonte de dados 
fosse uma classe, ela teria que estender FormDataSource. O Os atributos Form, 
DataSource e DataField são uma pista do que está acontecendo aqui. Como tudo 
código executável compila para os tipos CLR, o compilador usa esses atributos para 
 
 
 57 
criar os tipos reais. A estrutura é escrita como tal para nossa conveniência como uma 
apresentação de código. 
Vamos pegar o método modifiedField. Este é um evento que ocorre após o O evento 
validateField retorna true. A chamada super() chama o método modifiedField da 
tabela. método. Podemos nos perguntar por que a chamada para super () não tem 
parâmetro. Isso acontece por trás as cenas, e é útil que isso seja tratado por nós. Esse 
padrão é seguido pelos seguintes métodos: 
 
 
DataSource method Calls table method 
validateWrite validateWrite 
write write (in turn, insert or update) 
initValue initValue 
validateDelete validateDelete 
delete delete 
DataField.validateField validateField(FieldId) 
DataField.modifiedField modifedField(FieldId) 
 
O initValue, validateField, modifiedField, validateWrite e os métodos 
validateDelete são chamados apenas de eventos de formulário, o método de 
gravação não chama validateWrite. A partir disso, podemos escolher onde colocar 
nosso código, e essa decisão é muito importante. A regra a seguir é fazer as 
alterações os mais altas possíveis: tabela, fonte de dados, e controle de formulário. 
Tipos de link do Data Source de formulário: 
 
O tipo de link da fonte de dados de formulário é uma propriedade da fonte de dados 
do formulário. Podemos adicionar mais de uma tabela como fonte de dados ao 
formulário. Essas fontes de dados devem ter a relação de nível de tabela, então, o 
desenvolvedor não precisa trabalhar na parte de codificação para encontrar os 
registros de relação. A tabela abaixo descreve cada tipo de relacionamento (Join): 
 
Tipo de Join Relacionamento 
Active O tipo de link ativo atualiza as origens de dados filho sem 
qualquer atraso quando você seleciona o registro da tabela 
pai. Quando você lida com mais registros, isso afetará o 
desempenho do aplicativo. 
Delay O tipo de link de origem de dados de formulário de atraso 
também é o mesmo que o método ativo. O método de atraso 
diferente não será atualizado imediatamente quando você 
selecionar o registro pai. Ele atualizará a fonte de dados filha 
quando você selecionar a tabela pai, a instrução de uso de pausa 
do D365FO, antes de atualizar a fonte de dados filha. 
 
 
 58 
Passive O tipo de link da fonte de dados de formulário passivo não 
atualiza a fonte de dados filha automaticamente. 
Inner Join O tipo de link da origem de dados do formulário de junção 
interna exibe as linhas que correspondem à tabela pai e à tabela 
filha. Por exemplo, se o pedido não tiver detalhes do pedido, o 
pedido não será exibido. 
Outer join O tipo de link da origem de dados do formulário de associação 
externa retornará todos os registros pai e registros filhos 
correspondentes. Ele retornará todas as linhas na tabela 
pai. Aqui, o Pedido 4 não tem os registros filhos (detalhes do 
pedido), mas está sendo preenchido na grade do pedido. É a 
diferença entre junção interna e junção externa. 
Exist join 
As linhas de correspondência de tipo de link de origem de dados 
de formulário existentes correspondem à tabela pai. Ele se 
comporta como inner join, mas o diferente é uma vez que a linha 
pai é correspondida com os registros filhos, em seguida, para o 
processo e atualiza na grade, o D365FO não considera quantos 
registros na tabela filha para a linha pai. 
Not exist join 
Não existe o tipo de link da fonte de dados do formulário de 
junção é um método totalmente oposto a existir. Ele retornará 
os registros pai não correspondentes com registros filhos. 
 
Criando itens de menu (menuitem) 
Itens de menu são uma referência a um objeto que desejamos adicionar a um menu. 
Nós temos três tipos de itens de menu: exibição, saída e ação. A exibição é usada para 
adicionar formulários. A saída é usada para relatórios, e Action é usado para classes. 
Itens de menu também são adicionados como privilégios ao sistema de segurança. 
Usuáriosque não são o administrador não poderão ver os itens de menu, a menos 
que tenham uma função, dever ou privilégio que lhes dá acesso ao nível de acesso 
necessário do item de menu. 
Só precisaremos de um formulário, relatório ou classe para a qual precisamos criar 
o item de menu. 
1. Escolha para adicionar um novo item ao projeto. 
2. Selecione Interface do Usuário no painel esquerdo e Forma no lado direito painel. 
3. Nomeie o item de menu como o mesmo formulário; nesse caso, 
ConWHSVehicleParameters. 
4. Digite o rótulo @ SYS7764 como a propriedade Label; este é o menor rótulo @SYS 
que não tem contexto específico descrito. 
5. Crie um rótulo de texto de ajuda para manter as configurações de gerenciamento 
do veículo e seqüências numéricas. Atribuir o ID à propriedade HelpText. 
6. Digite ConWHSVehicleParameters na propriedade Object. 
 
 
 59 
7. A propriedade ObjectType é Form por padrão, portanto, isso está correto. 
8. Salve o item de menu e abra a tabela ConWHSVehicleParameters e, em seguida, 
insira ConWHSVehicleParameters na propriedade Form Ref. 
9. Por fim, abra o menu ConWHSVehicleManagement e arraste 
oConWHSVehicleParameters, item de menu na parte superior do nó Configuração. 
10. Salve e feche as guias abertas. 
 
Embora esta atividade esteja listada isoladamente, ela deve sempre ser feita como 
parte do processo. 
Por exemplo, o processo de criação de uma tabela de parâmetros envolve quatro 
etapas principais: 
1. Crie a tabela 
2. Crie o formulário 
3. Crie o item de menu 
4. Adicione o item de menu ao menu 
Quase todas as tabelas que criamos em Operações terão um formulário usado para 
mantê-lo. Então, a última parte do design da tabela é dizer ao design da tabela qual 
formulário é utilizado para esse fim. É assim que a opção visualizar detalhes 
funciona no cliente. A chave estrangeira é usada para determinar a tabela, e a 
propriedade Form Ref da tabela é usada para determinar o formulário a ser usado. 
Os detalhes da chave estrangeira são usados para filtrar o formulário. Todos isso 
acontece automaticamente com base nos metadados. Itens de menu para 
formulários e relatórios acionam o sistema para criar e executar o formulário ou 
relatório definição. O formulário é renderizado no navegador usando um JavaScript 
muito inteligente que interfaces com o servidor, e os relatórios são essencialmente 
renderizados usando o SSRS. As classes devem tem um método de ponto de entrada 
estático para ser chamado. 
 
Criando formulários de configuração 
Seguiremos o mesmo padrão do formulário de Parâmetros. Usando tabelas, 
Estrutura de Dados Estruturas. Padrões de grade. Nossa tabela tem dois campos, 
então usaremos o design do formulário de lista Simples padrão. Isso segue o padrão 
de criação de uma tabela do tipo Group. 
Siga os passos abaixo: 
1. Escolha para adicionar um novo item ao projeto. 
2. Selecione Interface do Usuário no painel esquerdo e Forma no lado direito painel. 
 
 
 60 
3. Nomeie o formulário conforme o nome da tabela; nesse caso, 
ConWHSVehicleGroup. 
4. Arraste a tabela ConWHSVehicleGroup do projeto para as origens de dados 
nó do designer de formulários. 
5. Use o mesmo rótulo como a tabela para a propriedade Caption do nó Design. 
6. Defina as propriedades Source Data Source e Data Sources para o nome da tabela, 
ConWHSVehicleGroup. 
7. Aplique o padrão Simple List ao Design (clique com o botão direito e escolha Apply 
Pattern | Lista Simples). 
8. Adicione um controle ActionPane; renomear para FormActionPaneControl como 
haverá apenas seja um neste formulário. 
9. Selecione novamente o nó Design. O padrão destaca que precisamos de um filtro 
personalizado Grupo, que é um controle de grupo. Então, adicione um novo controle 
do tipo Group. 
10. Renomeie o controle para CustomFilterGroup, para facilitar a referência. 
11. Podemos ver que o novo controle de grupo precisa de um padrão; atribuir 
personalizado e rápido Filtros 
12. Agora teremos mais a fazer para esse controle. O padrão destaca que nós 
devemos ter um QuickFilterControl. Clique com o botão direito no 
CustomFilterGroup controle e escolha Novo | QuickFilterControl. 
13. Clique com o botão direito do mouse no nó Design e selecione Novo | Grade. 
14. Podemos renomear o controle para FormGridControl, pois haverá apenas uma 
grade controle com este padrão. 
15. A propriedade Data Source não herda do nó pai, e devemos especifique isso como 
ConWHSVehicleGroup. 
16. Criamos um grupo de campos Visão Geral para esta tabela, portanto, defina o 
Grupo de Dados propriedade para Visão geral. 
17. Volte para o controle QuickFilter e defina Target Control para o controle de grade 
nome e Coluna Padrão para o controle padrão desejado do controle de destino. 
18. Verifique novamente se há erros no painel de padrões e salve o formulário. 
19. Em seguida, crie um item de menu usando o mesmo nome do formulário e o 
mesmo rótulo nós usamos na propriedade Caption. 
20. Preencha a propriedade Form Ref da tabela com o nome do item de menu. 
 
 
 61 
21. Por fim, adicione o item de menu ao menu de configuração para que ele fique sob 
os Parâmetros item do menu. 
 
 
 
Nota: 
As etapas foram semelhantes à forma de parâmetro, embora houvesse apenas mais 
algumas para completo. Podemos ver que o padrão é na verdade uma lista de tarefas, 
embora erros de padrão impedir que o projeto seja construído. 
Se você quiser realmente testar o formulário, você pode fazer isso seguindo estas 
etapas: 
1. Crie o pacote usando o Dynamics 365 FO | Construa Modelos, selecione o 
pacote de a lista. 
2. Se adicionarmos tabelas ou campos desde a última sincronização do banco 
de dados, sincronize os bancos de dados clicando com o botão direito do 
mouse no projeto e escolhendo sincronizar com 
banco de dados. 
3. Abra as propriedades do projeto. 
4. Defina a opção Tipo de objeto de inicialização como MenuItemDisplay. 
5. Defina a opção Startup Object para o item de menu a ser aberto, por exemplo, 
ConWHSVehicleGroup. 
6. Especifique a empresa inicial; A USMF é uma empresa útil para quando 
estamos usando a VM de desenvolvedor que usam os dados de demonstração 
da Microsoft. 
7. Feche o formulário de propriedades e pressione F5. 
Também é assim que depuramos o código, e se um ponto de interrupção for 
encontrado, o Visual Studio interromperá o processamento nos permitindo 
analisar o ponto a ponto. 
 
 
Criando detalhes mestre (tabela principal) 
Para aqueles que estão acostumados ao Dynamics AX 2012, esse estilo de 
formulário substitui a página Lista e separa o formulário Detalhes usado para 
tabelas principais, como Produtos e Clientes. Lista as páginas são efetivamente 
obsoletas para essa finalidade. Pode parecer um pouco confuso no início, como 
Estamos desenvolvendo duas visões de um formulário ao mesmo tempo. No 
entanto, uma vez que tenhamos feito isso algumas vezes, torna-se mais 
automático. 
 
 
 62 
O painel de padrões será o nosso guia nesta receita, ajudando-nos a simplificar o 
processo e lembrando-nos quando nos esquecemos de um passo fundamental. 
Estamos continuando o design do formulário para a tabela principal, 
ConWHSVehicleTable. No entanto, esta receita pode ser usada como um padrão 
para qualquer tabela principal. 
 
Para criar o formulário principal de detalhes, siga estas etapas: 
1. Escolha para adicionar um novo item ao projeto. 
2. Selecione Interface do Usuário no painel esquerdo e Forma no lado direito 
painel. 
3. Nomeie o formulário conforme o nome da tabela; nesse caso, 
ConWHSVehicleTable. 
4. Arraste a tabela ConWHSVehicleTable do projeto para as origens de dados 
nó do designer de formulários. 
5. Selecione o Data Source ConWHSVehicleServiceTable e defina a 
propriedades Insert If Empty e Insert At End para No. 
6. Use o mesmo rótulo como a tabela para a propriedadeCaption do nó Design. 
7. Defina as propriedades Source Data Source e Data Sources para o nome da 
tabela, ConWHSVehicleTable. 
8. Aplique o padrão Details Master ao Design. 
9. Conforme exigido pelo padrão, adicione um controle do Painel de Ação 
chamado FormActionPane. 
10. Adicione um controle de grupo chamado NavigationListGroup. Esta seção é 
usada na visualização de detalhes para que o usuário possa alterar os 
registros sem voltar para a lista Visão. 
11. Sob o controle NavigationListGroup, crie um controle de Filtro Rápido e 
nomeie-o como NavgationQuickFilter. 
12. Em seguida, crie um controle de grade chamado NavigationGrid. 
13. Defina a propriedade Data Source do controle de grade como 
ConWHSVehicleTable e adicione os campos VehicleId e Description 
arrastando-os dos campos nó da fonte de dados. 
14. Complete o controle de filtro rápido com Target Control como controle de 
grade e coluna Padrão conforme desejado. 
15. Verificando os nós no e sob o nó Design, agora precisaremos criar um 
Controle de tabulação para a guia Painel. Crie um controle de tabulação da 
seguinte maneira: 
 
 
 
 
Propriedade Valor 
Name PanelTab 
Arrange Method Vertical 
 
 
 63 
16. Adicione uma ficha de registro chamada DetailsPanelTabPage primeiro e 
depois ListPanelTabPage. 
17. Vamos concluir o controle ListPanelTabPage primeiro. Conforme exigido 
pelo padrão, sob esse controle, adicione um controle de grupo chamado 
ListQuickFilterGroup e um Controle de grade chamado ListGrid. 
18. Preencha a propriedade Data Source do controle de grade e use o campo 
Visão geral grupo para a propriedade Grupo de Dados. 
19. Vamos completar ListQuickFilterGroup da mesma forma que fizemos para o 
padrão de lista simples. Aplique o padrão Personalizado e Filtros rápidos ao 
ao controle. Em seguida, adicione um controle de Filtro rápido e nomeie-o 
como ListQuickFilter. Complete o controle referenciando-o ao controle de 
grade chamado de ListGrid. 
20. O padrão agora afirma que precisaremos da Ação Padrão da Rede Principal, 
que é um Controle de botão de comando. Adicionar botão de comando ao 
ListPanelTabPage, definindo as propriedades, conforme mostrado na tabela 
a seguir: 
 
 
 
 
21. No controle ListGrid, insira ListGridDefaultButton como Default Action 
property. 
22. Passando para o elemento padrão Details Panel, selecione novamente 
DetailsPanelTabControle de página e adicione um controle de grupo 
chamado DetailsTitleGroup. 
23. Adicione um controle de seqüência de caracteres para os títulos de 
cabeçalho, conforme mostrado aqui: 
 
Propriedade Valor 
Name DetailsHeaderTitle 
Data Source ConWHSVehicleTable 
Data Method TitleFields 
View Edit Mode View 
Skip Yes 
 
24. Verificando nosso progresso no painel padrão, veremos que precisamos 
adicionar o elemento padrão da guia Detalhes (TAB). Adicione um novo 
controle Tab ao Controle da página da guia DetailPanelTabPage, definindo as 
propriedades da seguinte maneira: 
 
 
 
 
 
 
Propriedade Valor 
Name ListGridDefaultButton 
Command DetailsView 
Propriedade Valor 
Name DetailsTab 
Arrange Method Vertical 
 
 
 64 
25. Adicione um novo nome de página de aba DetailsTabGeneral e aplique os 
campos e campo Padrão de grupos. 
 
A primeira ficha de registro é geralmente uma ficha de registro rotulada como 
Geral. 
 
26. Nesse caso, podemos simplesmente arrastar o grupo de campos Detalhes da 
Fonte de dados ConWHSVehicleTable, mas sinta-se à vontade para 
reorganizar os campos grupos mais apropriados. 
 
27. Vamos precisar criar o item de menu usando o mesmo rótulo da tabela, mas 
nós precisaremos usar a opção de visualização de formulário como Grade 
para que possamos obter a visualização de lista quando o formulário é 
aberto. 
28. Em seguida, preencha a propriedade FormRef da tabela 
ConWHVehicleTable. 
29. Finalmente, adicione o item de menu ao nosso menu. 
 
O conceito é o mesmo de qualquer forma, só temos mais recursos. A parte 
peculiar de esta forma é que temos duas visões - uma para a visualização de lista 
e outra para editar ou visualizar detalhes do formulário. 
 
 
 
Criando uma transação de detalhes (formato de entrada de pedido) 
 
Esses formulários de planilhas ou GRID são os mais complicados em termos das 
etapas necessárias, como agora tem três estados para projetar: exibições de lista, 
cabeçalho e linhas. Para se familiarizar com o resultado, abra e use o formulário 
Todas as ordens de compra de Contas a Pagar | Compra encomendas | Todos os 
pedidos de compra. 
A primeira parte do padrão é muito semelhante ao padrão mestre de detalhes, 
então vamos resumir um pouco. Continuaremos a tabela de pedidos de serviço 
do veículo, mas, novamente, a atividade é escrita para que possa ser aplicado a 
qualquer tabela de planilha ou GRID. 
 
Para criar o formulário, siga estas etapas: 
 
1. Escolha para adicionar um novo item ao projeto. 
2. Selecione Interface do Usuário no painel esquerdo e Forma no lado direito do 
painel. 
3. Nomeie o formulário conforme o nome da tabela, nesse caso, 
ConWHSVehicleServiceTable. 
4. Arraste a tabela ConWHSVehicleServiceTable do projeto para o Data Nó de 
origens do designer de formulário. 
5. Selecione a fonte de dados ConWHSVehicleServiceTable e defina as 
propriedades Insert e Insert if Empty para NO. 
6. Arraste a tabela ConWHSVehicleServiceLine para o nó Origens de dados. 
 
 
 65 
7. Selecione a fonte de dados ConWHSVehicleServiceLine e defina a Origem da 
associação. propriedade para ConWHSVehicleServiceTable. 
8. Substitua o método initValue no ConWHSVehicleServiceLine para que pode 
definir o campo ServiceId, pois isso não está definido para nós. Use o seguinte 
código: 
 
public void initValue() 
{ 
super(); 
ConWHSVehicleServiceLine.ServiceId = 
ConWHSVehicleServiceTable.ServiceId; 
} 
9. Feche o editor de código e volte para a guia design criada. 
10. Defina as propriedades da seguinte forma: 
 
 
Propriedade Valor 
Caption Use the label from the table 
Data Source ConWHSVehicleServiceTable 
Title Data Source ConWHSVehicleServiceTable 
 
11. Aplique o padrão Transação de Detalhes ao nó Design. 
12. Adicione um controle de painel de ação chamado HeaderActionPane e, em 
seguida, um grupo controle chamado NavigationListGroup sob o nó Design. 
13. Adicione um controle de Filtro Rápido ao controle NavigationListGroup 
chamado NavgationQuickFilter. 
14. Em seguida, crie um controle de grade chamado NavigationGrid. 
15. Defina a propriedade Data Source do controle de grade para 
ConWHSVehicleServiceTable e adicione o ServiceId e Descrição campos da 
fonte de dados ConWHSVehicleServiceTable. 
16. Complete o controle de filtro rápido com Target Control como controle de 
grade e Coluna Padrão conforme desejado. 
17. Sob o nó Design, crie um controle Tab para a guia Painel. Crie uma nova guia 
controle e nomeie-o MainTab. Defina Organizar Propriedade como vertical. 
18. Adicione uma ficha de registro chamada DetailsPanelTabPage primeiro e 
depois GridPanelTabPage. 
19. Nós completaremos o controle GridPanelTabPage primeiro. Sob esse 
controle, adicione um Controle de grupo chamado 
GridPanelQuickFilterGroup e um controle de grade chamado ListGrid. 
20. Preencha a propriedade Data Source do controle de grade e use o campo 
Visão geral grupo para a propriedade Grupo de Dados. 
21. Para GridPanelQuickFilterGroup, aplique os Filtros Personalizados e Rápidos 
padrão para o controle. Em seguida, adicione um controle de Filtro rápido e 
nomeie-o ListQuickFilter. Complete o controle referenciando-o ao controle 
de grade que nós chamado ListGrid. 
22. O padrão agora afirma que precisamos da ação padrão da grade principal, 
que é um comando Controle de botão. Adicionar botão de comando ao 
GridPanelTabPage chamado MainGridDefaultAction. 
23. Defina a propriedade Command como DetailsView. 
 
 
 66 
24. No controle MainGrid,insira MainGridDefaultAction para a ação padrão 
propriedade. 
25. Para concluir o elemento padrão do Painel de Detalhes (TabPage), selecione 
novamente o DetailsPanelTabControle de página e adicione um controle de 
grupo chamado DetailsPanelTitleGroup. 
26. Adicione um controle String, definindo as propriedades da seguinte maneira: 
 
Propriedade Valor 
Name DetailsPanelHeaderTitle 
Data Source ConWHSVehicleServiceLine 
Data Method titleFields 
View Edit Mode View 
Skip Yes 
27. Agora precisaremos completar o padrão Header and Line Panels (Tab) 
elemento. Adicione um novo controle Tab ao DetailPanelTabPage, da 
seguinte maneira: 
 
Propriedade Valor 
Name HeaderAndLinePanelTab 
Arrange Method Vertial 
 
28. Adicione uma nova aba para o Painel de Linhas usando as seguintes 
propriedades: 
 
Propriedade Valor 
Name LinesPanelTabPage 
Style DetailsFormDetails 
 
29. Adicione um segundo controle de página de guia, mostrado da seguinte 
maneira: HeaderPanelTabPage. 
 
Propriedade Valor 
Name HeaderPanelTabPage 
Style DetailsFormDetails 
 
30. Adicione um novo controle Tab ao controle LinePanelTabPage chamado 
LineViewTab. 
31. Vamos agora adicionar três fichas de registro a este controle. 
32. Adicione o elemento de padrão Line View Header Details (TabPage) usando 
as seguintes propriedades: 
 
Propriedade Valor 
Name LineViewHeaderTabPage 
Label Vehicle service order header 
Pattern Apply the Field and Field Groups 
pattern 
 
 
 
 67 
33. Adicione o elemento padrão Line View Lines (TabPage) usando as seguintes 
propriedades: 
 
Propriedade Valor 
Name LineViewLines 
Label SYS9664 
 
34. Adicione o elemento de padrão Line View Line Details (TabPage) usando as 
seguintes propriedades: 
 
Propriedade Valor 
Name LineViewLineDetailsTabPage 
Label Vehicle Service order lines 
Data Source ConWHSVehicleServiceLine 
 
35. Adicione um controle de painel de ação ao controle LineViewLinesTabPage 
chamado LinesActionPane e, abaixo disso, um controle da guia Painel de 
Ações chamado LineActionRecordActions. 
36. Clique com o botão direito do mouse no novo controle 
LineActionRecordActions e selecione o Controle de grupo de botões sob este 
chamado LineActionRecordActionsGroup. 
37. Sob o grupo de botões LineActionRecordActionsGroup, adicione um 
comando botão chamado LineActionAddLine. 
38. Isso é para permitir que o usuário adicione linhas à grade de linhas. Defina as 
seguintes propriedades: 
 
Propriedade Valor Descrição 
Normal Image Delete Adiciona um símbolo de lixeira 
Label @SYS135131 Remove 
Command New Dispara a nova tarefa de registro para o 
Data Source 
 
39. Em seguida, adicione um segundo botão de comando chamado 
LineActionRemove, definindo propriedades da seguinte forma: 
 
Propriedade Valor Descrição 
Normal Image Add This adds a simple plus symbol 
Label @SYS319116 Add line 
Command DeleteRecord Dispara a tarefa de registro de exclusão 
Save Record NO Permitir que registros que ainda não 
foram salvos sejam deletado 
 
40. Sob este grupo de botões, precisaremos de uma grade para as linhas. 
Adicionar uma nova grade controle, definindo as seguintes propriedades: 
 
Propriedade Valor 
Name LinesGrid 
Data Source @ConWHSVehicleServiceLine 
 
 
 68 
Data Group Overview 
 
41. Crie um controle de tabulação em LineViewLineDetailsTabPage e defina 
seguintes propriedades: 
 
Propriedade Valor 
Name LineViewDetailsTab 
Label @SYS23823 
Data Source ConWHSVehicleServiceLine 
Arrange Method Vertical 
 
42. Adicionaríamos uma ou mais fichas, mas, no nosso caso, precisaríamos 
apenas de uma. 
43. Adicione um controle de página de guia chamado LineViewDetailsTabDetails 
e defina a propriedade Label para @ConWHS: Details. 
44. Arraste Identificação e Detalhes do Data Source 
ConWHSVehicleServiceLines. 
45. Agora, precisaremos concluir a visualização do cabeçalho do formulário, que 
é regido por o elemento padrão do painel de cabeçalho. Clique com o botão 
direito em HeaderPanelTabPage e escolha Novo | Tab e complete da seguinte 
forma: 
 
Propriedade Valor 
Name HeaderDetailsTab 
Arrange Method Vertical 
Data Source ConWHSVehicleServiceTable 
 
46. Normalmente teríamos muitos grupos de campo para adicionar, mas, neste 
caso, apenas preciso de um. Crie um novo controle de página de guia 
chamado HeaderDetailsTabDetails. Defina a propriedade Caption como 
@ConWHS: Details. 
47. Arraste os grupos de campos Details e ServiceDates do campo Fonte de dados 
ConWHSVehicleServiceTable, mas renomeie-os, prefixados com 
HeaderDetailsTabDetails. 
48. Vamos precisar criar o item de menu usando o mesmo rótulo da tabela, mas 
nós precisaremos usar a opção de visualização de formulário como Grade 
para que possamos obter a visualização de lista quando o formulário é 
aberto. 
49. Em seguida, preencha a propriedade FormRef do 
ConWHVehicleServiceTable mesa. 
50. Finalmente, adicione o item de menu ao nosso menu. 
 
 
Entendendo nosso desenvolvimento: 
 
O processo, embora estendido, é o mesmo que o padrão Mestre de Detalhes. Há 
algumas propriedades adicionais para definir nesse caso para ajudar com o 
comportamento do formulário. Há muitos passos, e é fácil se perder e 
 
 
 69 
potencialmente definir a propriedade errada. É por isso que nomeamos os 
controles após o nome do elemento padrão. Este padrão de forma foi 
deliberadamente tão simples quanto possível, e uma vez que estamos 
confortáveis com o processo, deve ser simples expandir isso para dados mais 
complicados estruturas. 
 
 
 
 
 
 
 
 
 
 
 
 
 
Criando um arquivo de etiqueta (Label) 
 
A maioria dos projetos tem algum tipo de interface de usuário e, portanto, 
precisamos exibir o texto no usuário diferente dos nomes de campo. O método 
de melhor prática para fazer isso é usar um arquivo de rótulo. O arquivo de 
etiqueta contém um dicionário específico de idioma de IDs de rótulo e a 
tradução. Os elementos padrão tendem a ter os IDs de legenda herdados de um 
símbolo @, seguido por um trio de caracteres ID da etiqueta e um número. Este 
formato funcionou bem nos últimos 15 anos, mas o prefixo foi potencialmente 
limitante, especialmente para ajudar ISVs. Os rótulos não estão mais restritos a 
três dígitos, o que ajuda a Microsoft a atingir um de seus objetivos de tornar os 
complementos de ISV mais fáceis de escrever, manter e adotar. 
A escolha de quantos e quais pacotes precisam de um arquivo de rótulo depende 
de a solução desenhar. 
Não é uma ideia terrível para uma solução de cliente usuário final ter um pacote 
apenas para rótulos que são reutilizados por cada pacote. Isso significa que 
corremos o risco de usar um rótulo contexto. Você pode optar por usar um rótulo 
padrão para Nome no registro pessoal, somente para o rótulo a ser alterado pelo 
desenvolvedor original para algo específico ao contexto original, por exemplo, 
nome do produto. 
Nós tendemos a criar um arquivo de etiqueta para cada pacote, pois isso garante 
que o pacote possa corrigir e altere os rótulos sem se preocupar com a regressão 
em outros Modelos. 
 
Para começar, abra o Visual Studio e o projeto em questão. No nosso caso, 
continuaremos com o projeto ConWHSGeneralExtensions. 
 
Para criar o arquivo de etiqueta, siga estas etapas: 
 
 
 
 70 
1. Clique com o botão direito do mouse no projeto e selecione Adicionar | Novo 
item ... ou use o teclado atalho, Ctrl + Shift + A. 
2. Escolha Rótulos e Recursos na lista de Artefatos de Operações. 
3. Na lista à esquerda, selecione Arquivo de Rótulo. 
4. No campo Nome, insira um nome de rótulo curto, mas único, no nosso caso 
ConWHS. Queremos que seja o mais curto possível, mas esteja 
completamente certo de que será globalmente único, independentemente de 
qualquer futuro add-on, podemos optar por instalar. 
5. Pressione Adicionar. 
6. No assistente de arquivo Label, deixe o ID do arquivo Label como padrão. 
7. Pressione Próximo. 
8. Naseleção de idioma, mova os idiomas da lista à esquerda para a lista à 
direita usando os botões. Apenas deixe os idiomas selecionados que você irá 
manter. Isso envolve a criação de um rótulo em cada arquivo de idioma. 
9. Pressione Próximo. 
10. Verifique se a página Resumo está correta e pressione Concluir. 
 
 
 
 
A criação é direta. O processo cria um arquivo de texto no disco que contém um 
lista separada por tabulações de IDs e traduções de rótulos. 
Quando um rótulo é selecionado em relação a um controle, ele receberá um ID 
de arquivo de rótulo que garante que ele seja único. Em nosso exemplo, o ID do 
arquivo de etiqueta era ConWHS. Quando criamos um rótulo, ele será dado os 
IDs na sequência @ConWHS: ConWHS1, @ConWHS: ConWHS2 e assim por 
diante. 
Em nosso exemplo, os IDs de rótulo fornecidos ao controle serão @ConWHS: 
ConWHS1. Isto parece desnecessariamente longo. Como, na verdade, podemos 
especificar o ID do rótulo manualmente, podemos optar por inserir um ID menor 
por rótulo, gerando um rótulo como @ConWHS: L001, ou digite um memorável 
nome como um ID, onde o ID se tornaria @ConWHS: ItemNotExists. 
 
 
Nota: 
 
Para projetos em andamento deve-se seguir a mesma regra de extensibilidade 
do D365FO. 
 
 
 
 
 
 
 
 
 
 
 
 
 71 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Segurança 
 
Neste tópico, vamos cobrir os seguintes quesitos: 
 
 Criar privilégios 
 Criar deveres 
 Criar funções de segurança 
 Criar Políticas 
 
Ao projetar o modelo de segurança, existem três métodos, dependendo da solução. 
Para Soluções ISV, a segurança deve ser projetada no pacote principal e enviados 
juntos. 
Isso também vale para soluções de parceiros para novas implementações de clientes 
quando o pacote é um pacote discreto de funcionalidade. Às vezes, os clientes 
precisam de papéis personalizados para suas próprias necessidades, e essas funções 
podem abranger privilégios tanto para os novos como para as funcionalidades. 
Neste caso, um novo pacote deve ser desenvolvido. Ter um pacote separado também 
ajuda na eficiência do planejamento de trabalho. 
Se o cliente usuário final desenvolver seu próprio modelo de segurança, isso deve 
sempre novo pacote; embora, a mesma funcionalidade possa ser obtida dentro do 
aplicativo. 
 
O modelo de segurança no D365FO é dividido na seguinte estrutura: 
 Papéis (Roles) 
 Deveres (Duties) 
 Privilégios (Privileges) 
 
 
 72 
 Políticas (Polices) 
 
A estrutura principal do modelo de segurança inclui Ciclos de processo, Funções, 
Tarefas e Privilégios Vamos explorá-las primeiro antes de dar uma olhada em 
Políticas e Permissões de Código. 
Os pontos de entrada definem o nível de acesso concedido aos métodos de entrada 
nas funcionalidades D365FO, como itens de menu e serviços. 
As permissões definem o acesso a tabelas e campos, métodos de servidor (como uma 
chamada de serviço o código não será executado no contexto de segurança do 
usuário) e controles de formulário (botões, campos ou outros controles colocados 
em um formulário). 
Como parte da definição dos requisitos funcionais, os processos de negócios são 
analisados, junto com os papéis que os executam. Os processos de negócios serão 
então mapeados para o Processos do sistema de operações. Isso é usado para muitos 
propósitos, incluindo o nível de ajuste de lacuna, planos de treinamento, planos de 
teste e assim por diante. Este método de analisar papéis e processos também se 
encaixa perfeitamente no modelo de segurança de Operações, permitindo que o 
modelo de segurança seja projetado com base nisso. 
O modelo de segurança que projetamos e implementamos deve ser sempre simples 
de usar, seguindo o padrão das funções padrão fornecidas pela Microsoft. Um 
projeto importante princípio é pensar nos papéis do usuário, e não pensar em 
usuários específicos. 
Com isso se deve resultar nos seguintes resultados: 
 
 Número reduzido de papéis 
 Atribuição menos complicada de usuários a funções 
 Os papéis são mais fáceis de manter, com risco reduzido de erros, como o uso 
não intencional 
 atribuição de um privilégio a um usuário 
 
 
Criando privilégios (Privileges) 
 
Privilégios normalmente são criados para cada item de menu (exibição, saída ou 
ação) para um acesso nível. Cada item de menu deve estar em um privilégio, mas 
você pode adicionar mais de um item de menu a um privilégio se nunca devem 
receber permissões diferentes, como itens de menu que aponte para o mesmo 
formulário. Este é o nível mais granular, e será agrupado em deveres e papéis mais 
tarde. 
Como o privilégio atribui o nível de acesso, normalmente temos dois - para fornecer 
apenas a visualização, e manter direitos de acesso (completos). 
 
Vamos apenas precisar de um projeto D365FO aberto no Visual Studio. 
 
Para criar um privilégio para fornecer acesso de exibição ao formulário do veículo, 
siga estas etapas: 
 
1. Escolha para adicionar um novo item ao projeto. 
 
 
 73 
2. Na caixa de diálogo Adicionar novo item, selecione Segurança na lista à esquerda 
e Segurança Privilégio da direita. 
3. Digite ConWHSVehicleTableView no campo Nome e clique em Adicionar. 
4. Preencha a propriedade Descrição; isso deve descrever para a segurança 
administrador a que este privilégio concede acesso. 
5. Preencha a propriedade Rótulo dando uma breve descrição para a segurança 
administrador, como Exibir registros do veículo. 
6. No designer, arraste o item de menu ConWHSVehicleTable para os Pontos de 
Entrada do nó. 
7. Altere propriedade de nível de acesso do ponto de entrada para leitura. 
8. Para criar o privilégio para manter a tabela de veículos, crie um novo privilégio 
chamado ConWHSVehicleTableMaintain. 
9. Preencha a propriedade Descrição. 
10. Preencha a propriedade Label. Por exemplo, mantenha registros do veículo. 
11. No designer, arraste o item de menu ConWHSVehicleTable para os pontos de 
entrada do nó. 
12. Altere a propriedade Nível de Acesso do ponto de entrada para Excluir. 
13. O formulário deve ter quaisquer entidades de dados associadas, como aquelas 
que nos permitem editar os dados do formulário no Excel, eles também devem 
ser adicionados ao privilégio sob o Nó Permissões de Entidade de Dados com o 
nível de acesso apropriado. 
Os privilégios são simplesmente uma forma de conceder permissões a um ponto de 
entrada, que pode ser serviços, para um dever, função ou mesmo diretamente para 
um usuário. Normalmente, adicionamos apenas pontos de entrada a um privilégio, 
como itens de menu. Para conceder acesso ao usuário, o sistema aplica o nível de 
acesso para formar controles e fontes de dados. Quando definimos a permissão 
necessária propriedade em controles de formulário, pode ter o efeito de ocultar o 
controle se o privilégio não conceder a permissão necessária. 
Como não podemos estender os privilégios de segurança, sempre criamos um 
privilégio. Isto é não é uma restrição real e ajuda a impor boas práticas; nós não 
podemos ficar mais granular do que um privilégio, em termos de atribuir 
permissões a um usuário. Nunca devemos sobrepor (personalizar) um privilégio de 
segurança existente, já que não há necessidade de tarefas e funções extensível. 
 
 
Criando deveres (Duties) 
 
Um dever é uma coleção de um ou mais privilégios. O paradigma é que estamos 
criando uma lista funções que a função desempenhará e, portanto, adicionar o 
privilégio necessário para que o papel de ser capaz de executar esse dever. 
É comum ter apenas um privilégio em um dever, mas mais pode ser adicionado, por 
exemplo, os formulários configurados podem ser adicionados a um dever. 
Os nomes de serviço são sufixados com um verbo para denotar a ação que o dever 
permitirá ao papel executar; sufixos comuns são Manter, Consultar e Aprovar. Para 
determinar o corrija o sufixo, observe os deveres padrão e sufixe seus deveres 
usando a mesma nomenclatura convenção. 
 
Para criar um dever, siga estes passos:74 
 
1. Escolha para adicionar um novo item ao projeto. 
2. Na caixa de diálogo Adicionar novo item, selecione Segurança na lista à esquerda e 
Segurança Dever da direita. 
3. Digite ConWHSVehicleTableInquire no campo Nome e clique em Adicionar. 
4. Preencha a propriedade Descrição; isso deve descrever para a segurança 
administrador o que este dever faz, como "Responde a perguntas no veículo 
registros ". 
5. Preencha a propriedade Rótulo, fornecendo uma breve descrição da segurança 
1. administrador, como Informe-se nos registros do veículo. 
6. No designer, arraste o privilégio de segurança ConWHSVehicleTableView para o 
Nó de privilégios. 
7. Repita isto para todas as tarefas exigidas, por exemplo, 
ConWHSVehicleTableMaintain duty que terá o ConWHSVehicleTableMaintain 
privilégio. 
 
 
Você pode considerar que um dever é uma coleção de privilégios de segurança, o 
que é, contudo, ao projetar o modelo de segurança, faríamos isso ao contrário - 
projetamos o com os deveres requeridos e, em seguida, adicione o privilégio de 
segurança necessário para dever. 
 
 
 
Criando funções de segurança (Roles) 
 
Um papel é uma coleção de deveres e privilégios. O papel é o que associamos a um 
usuário, que pode ser feito automaticamente com base nas informações do 
funcionário, como posição na empresa. As funções de segurança devem ser pensadas 
em termos das pessoas que apareceu pela primeira vez com o Dynamics AX 2012. A 
mudança destina-se a mover o pensamento longe de criar grupos de funcionalidade 
para projetar os papéis com base em como a organização é estruturada. Por 
exemplo, um gerente de vendas estaria em uma função de gerente de vendas, que 
terá deveres atribuídos. As funções têm privilégios, que por sua vez dão acesso ao 
gerente de vendas para desempenhar esse papel. 
No nosso caso, poderíamos considerar que eles têm três funções: supervisor de 
gerenciamento de veículos, supervisor de serviço de veículo e funcionário de 
entrada de serviço de veículo. Ao definir as funções, fazemos assim, definindo os 
deveres que cada papel terá. A convenção de nomenclatura é semelhante a outra 
objetos e sufixados com o tipo de função. Estes tipos incluem Supervisor, Gerente, 
Clerk, ou outros, caso não se encaixem no papel requerido; por exemplo, 
ConWHSVehicleManager teria os deveres de manutenção dos dados mestre do 
veículo. 
Podemos adicionar privilégios diretamente a uma função, mas devemos ser rígidos 
e apenas adicionar tarefas diretamente para um papel. Isso ajuda na manutenção e, 
além disso, é uma boa prática verificar se todos os privilégios em um ou mais 
deveres, e todos os deveres devem estar em um ou mais papéis. Também podemos 
adicionar funções como sub-função. Isso pode ajudar em casos raros, mas, 
 
 
 75 
novamente, tente evitar isso. Isso torna a manutenção um pouco mais restritiva para 
o gerente de segurança. Eles podem querer conceder ou restringir o acesso à sub-
função sem alterar os direitos da função pai. 
 
Para criar uma função, siga estas etapas: 
1. Escolha para adicionar um novo item ao projeto. 
2. Na caixa de diálogo Adicionar novo item, selecione Segurança na lista à esquerda 
e Segurança Papel da direita. 
3. Digite ConWHSVehicleManager no campo Nome e clique em Adicionar. 
4. Preencha a propriedade Descrição; isso deve descrever para a segurança 
Administrador o que esse dever faz, como dados mestre do veículo dos 
Gerentes. 
5. Preencha a propriedade Rótulo dando uma breve descrição para a segurança 
administrador, como Responsável pela manutenção do veículo registros e dados 
de configuração associados. 
6. No designer, arraste as tarefas que fornecem direitos completos para o veículo 
e configure itens de menu no nó Tarefas. 
7. Repita isso para todas as funções necessárias. 
 
Tecnicamente, isso é simples. A parte complicada é projetar o modelo de segurança 
com o cliente, a fim de ter uma visão comum de segurança de um recurso humano 
perspectiva. Quando as funções de segurança são sincronizadas com a hierarquia 
organizacional, a segurança se torna mais um processo de gerenciamento de 
recursos humanos do que um administrador de TI. 
 
Criando Políticas (Policies) 
 
O termo "Políticas de segurança" é um ligeiro erro. Também é conhecido sob um 
mais preciso prazo da Extensible Data Security (XDS). É uma evolução da segurança 
de nível recorde que foi depreciado do AX 2012: você ainda pode fazer isso, mas não 
era uma abordagem recomendada. 
Neste cenário, vamos criar uma política que permita apenas o acesso a veículos do 
tipo caminhão. Em Nesse cenário, temos uma equipe que só tem acesso a caminhões 
ao criar ordens de serviço. 
 
Para criar uma função, siga estas etapas: 
 
1. Escolha para adicionar um novo item ao projeto. 
2. Na caixa de diálogo Add New Item, selecione Data Model na lista à esquerda e 
Consulta da direita. 
3. Digite ConWHSVehicleTruckPolicy no campo Nome e clique em Adicionar. 
4. Em nossa nova consulta, arraste a tabela ConWHSVehicleTable para os nodes 
dos Data Sources. 
5. Adicione o campo VehicleType à lista Fields clicando com o botão direito do 
mouse no nó Fields e escolhendo Novo | Campo. 
6. Arraste o campo para o nó Intervalos. 
7. No novo intervalo VehicleType, altere a propriedade Value para Truck. 
8. Salve e feche o designer de consulta. 
 
 
 76 
9. Adicione um novo item ao projeto. 
11. Na caixa de diálogo Add New Item, selecione Security na lista à esquerda e 
Security Política da direita. 
12. Digite ConWHSVehicleTruckPolicy no campo Nome e clique em Adicionar. 
13. Defina o rótulo para a política de acesso à tabela do veículo do funcionário da 
gerência do veículo. 
14. Defina Texto de Ajuda para Restringir o acesso à tabela do veículo para que 
apenas caminhões podem ser selecionados. 
15. Defina Tabela Primária para ConWHSVehicleTable. Isso informa ao Operations o 
nome de tabela principal na propriedade Query. 
16. Digite ConWHSVehicleTruckPolicy na propriedade Query. 
17. Deixar Use Não Existir Como Núm. Caso contrário, isso teria o efeito de fazer 
18. a política permite apenas veículos inativos. Defina Tabela restrita como Sim. 
Deixe a operação como Select; estamos pretendendo que esta política entre em 
vigor ao selecionar registros. 
19. Usando o guia Criar papéis de segurança, crie uma função para um funcionário de 
entrada de serviço do Caminhão chamado ConWHSVehicleTruckServiceClerk. 
20. Defina o Tipo de Contexto como RoleName e insira 
ConWHSVehicleTruckServiceClerk na propriedade Nome da Função. 
21. Por fim, defina a propriedade Enabled como Yes. 
 
Quando o usuário na função da política abre um formulário ou quando uma lista 
suspensa é exibida, o sistema criará uma consulta que combina a fonte de dados do 
formulário com a consulta da política definição como Existente ou Não Existente. A 
consulta não pode ser alterada pelo usuário e é aplicado no nível do kernel.ou existem fora da caixa no explorador de 
aplicativos no Visual Studio, ou eles podem ser criados. Elementos são metadados e 
arquivos de origem, como enumerações de base e tabelas. Um projeto de Unified 
Operations é usado para organizar e gerenciar elementos dentro de um 
modelo. Modelos contêm zero ou mais elementos. Por exemplo, o modelo de 
gerenciamento de depósito é um grupo de elementos que compõem a solução de 
gerenciamento de depósito. 
 
 
Todos os modelos pertencem a pacotes, que podem ser empacotados juntos para 
criar um pacote implementável e, em seguida, implementados usando o LCS. Um 
pacote implementável contém um ou vários pacotes que são usados para ambientes 
de tempo de execução. Os assistentes no Visual Studio são usados para criar modelos 
e projetos, e a janela do designer é usada para personalizar elementos dentro de 
projetos e modelos. 
Pacotes implantáveis são implantados em ambientes de finanças e operações. Esses 
pacotes contêm modelos que, em muitos casos, representam os módulos visíveis na 
interface do usuário Finanças e Operações, como Contas a pagar. Os modelos contêm 
os elementos que representam todos os campos, menus e formulários encontrados 
na interface do usuário. Esses elementos são criados e gerenciados no Visual Studio. 
Portanto, o controle de origem é necessário para o desenvolvimento de finanças e 
operações. 
 
 
 10 
Conectando o Visual Studio ao Visual Studio Team Services 
 
Cada desenvolvedor tem sua própria VM de desenvolvimento, hospedada no Azure 
ou localmente. Isso é por projeto e faz parte do processo de ciclo de vida do 
aplicativo. Cada desenvolvedor receberia as últimas código do controle de origem e, 
em seguida, verifique suas alterações de acordo com as metodologias de 
desenvolvimento. Como parte desse check-in, eles podem vincular os check-ins. Isso 
permite uma construção para ser criada, e ganhamos um nível de rastreabilidade 
desde que cada item de trabalho (usuário história, recurso, bug e assim por diante.) 
está vinculado aos check-ins nessa compilação. Isso também permite teste projetos 
a serem executados automaticamente quando a compilação é gerada. 
 
Depois que a máquina virtual for iniciada, verifique se ela tem acesso à Internet e se 
você utilizou a ferramenta de aprovisionamento de usuários admin para associar 
sua conta do Dynamics 365 FO à conta de administrador de Operações. Antes de 
começar, especialmente ao trabalhar em equipe, devemos renomear a VM para fazer 
são únicos em toda a nossa equipe, veja a seção há mais ... para detalhes sobre isso. 
 
Para conectar o Visual Studio ao VSTS, siga estas etapas: 
 
1. Crie uma pasta para seus projetos e, abaixo de uma subpasta com suas 
iniciais, ou outros que tornam a pasta única, dentro de sua equipe; no meu 
exemplo, utilizaremos C: ProjectsTFS. 
2. Inicie o Visual Studio. 
3. Você será presenteado com a página de licenciamento. Use a página para 
fazer login na conta usada para criar o projeto dentro do VSTS. Qual poderia 
ser o seu Conta da Microsoft ou conta de trabalho (D365FO). 
4. Na barra de ferramentas superior, selecione Equipe e, em seguida, Gerenciar 
conexões. 
5. O Team Explorer será aberto, no layout padrão, no lado direito. Em neste 
painel, selecione Gerenciar Conexões | Conecte-se ao Team Project: 
 
 
 
6. Isso abrirá a caixa de diálogo conectar-se ao Team Foundation Server, no 
campo Selecione um Servidor Na lista suspensa Team Foundation Server e 
selecione o site do VSTS. 
 
 
 11 
7. Selecione seu projeto na parte inferior da caixa de diálogo, conforme 
mostrado a seguir na captura de tela: 
 
8. Depois de pressionar Connect, o Visual Studio está conectado ao seu projeto. 
9. Temos um último passo antes de continuarmos; temos que configurar nosso 
espaço de trabalho assim Visual Studio sabe quais pastas estão sob controle 
de origem e como eles mapeie para VSTS. No Team Explorer, clique em 
Configurar espaço de trabalho sob o Seção do projeto. Isso mostrará a seção 
Configure Workspace no topo da Team Explorer. 
10. Não pressione Map & Get. 
11. Pressione Avançado .... 
12. A caixa de diálogo Editar Área de Trabalho será semelhante à seguinte 
captura de tela: 
 
 
Para o desenvolvimento no D365FO, precisaremos mapear uma pasta de 
projetos e pasta de pacotes locais de operações (o código-fonte do aplicativo ou 
metadados muitas vezes é referido) para duas pastas diferentes no VSTS. A pasta 
Projects é o que criamos anteriormente, que foi C: ProjectsSB no meu caso. A 
pasta de pacotes locais de operações é C: AOSServicePackagesLocalDirectory. 
 
 
 
 12 
13. Pressione OK. 
14. Você será informado que o espaço de trabalho foi modificado e, se desejar 
obtenha o código mais recente. Qualquer opção não tem efeito se formos o 
primeiro desenvolvedor, mas é um bom hábito sempre pressionar Sim. 
 
O controle de origem nas D365FO já percorreu um longo caminho neste lançamento, 
principalmente porque ferramenta de desenvolvimento é agora Visual Studio e que 
os arquivos de origem são agora arquivos reais no sistema de arquivo. Operações 
não precisam mais de código especial para integrar com um Team Foundation 
Server. A razão pela qual temos duas pastas é que nossos projetos não contêm os 
arquivos que criamos ao escrever código. Quando criamos um arquivo, como uma 
nova classe, ele é criado dentro da local pasta de pacotes e referenciada no projeto. 
Isso também significa que não podemos simplesmente fechar um projeto e enviá-lo 
por e-mail para um colega de trabalho. Isso é feito conectando-se ao mesmo projeto 
VSTS ou usando um recurso de exportação de projeto. 
 
Criando um novo projeto, pacote e modelo 
Elementos no Dynamics 365 para Finanças e Operações representam cada elemento 
individual de AOT, como classe, tabela, formulário e assim por diante. 
Elementos no Dynamics 365 for Finance and Operations são armazenadas no disco 
como arquivos XML, esses arquivos contêm os metadados e o código-fonte para o 
elemento. Os arquivos XML são a unidade de controle de origem. 
Projetos funciona da mesma forma que AX2012, mas no D365 um elemento pode 
ser personalizado apenas uma vez eles são adicionados a um projeto específico do 
Visual Studio. O projeto só pode pertencer a um modelo. 
Um modelo do Dynamics 365 for Finance and Operations é um grupo de elementos. 
Padrão elementos fazem parte de um modelo padrão; você pode adicioná-los ao seu 
modelo e fazer customização. Um modelo é um conceito de tempo de design. Um 
exemplo de modelos: armazém modelo de gestão, um modelo de contabilidade de 
projeto e muito mais. Modelos podem ter um ou mais projetos. Modelos só podem 
pertencer a um pacote. 
Um pacote do Dynamics 365 for Finance and Operations é uma implantação e uma 
compilação unidade de um ou mais modelos. Inclui metadados de modelos, binários, 
cubos e outros recursos associados. Um ou mais pacotes D365 podem ser 
empacotados em uma implantação pacote, que é o veículo usado para implantação 
em ambientes de produção e UAT. 
Os pacotes são empacotados em um arquivo de pacote implementável para 
implantação no Sandbox ou ambientes de produção. Um pacote pode ter um ou mais 
 
 
 13 
modelos. Pacotes podem ter referências a outros pacotes, assim como os assemblies 
.NET, podem referenciar-se uns aos outros. 
 
Para criar um novo projeto, siga estas etapas: 
 
1. Abra o Visual Studio como administrador. 
2. No menu Ficheiro, aponte para Novo e clique em Project. 
3. Na lista de tipos de modelo, expanda o nó Instalado. 
4. Expanda o nó Modelos. 
5. Selecione a categoria do Microsoft Dynamics 365 for Operations. 
6. Selecione o modelo do projeto D365. 
7. Digite o nome e a localização do novo projeto. 
8. Selecione Criar diretório para solução se você quiser criar uma nova solução para 
este projeto, desmarque se quiser adicionar sua solução atual.Para criar um novo modelo, siga estas etapas: 
 
1. Abra o Visual Studio como administrador. 
2. No menu Dynamics 365, aponte para Gerenciamento de modelos e selecione Criar 
modelo. 
3. Dê um modelo, nome do editor e outros valores: 
 
 
 
 14 
 
 
4. Agora você pode criar um novo pacote ou selecionar qualquer pacote existente. 
Poderíamos crie um novo pacote e selecione o pacote necessário como pacotes 
referenciados: 
 
 
 
5. Verifique novamente o resumo com detalhes. Selecione Criar novo projeto se 
você quiser crie um novo projeto neste modelo, uma vez criado. Você pode marcar 
este modelo para todos seus novos projetos, selecionando opções: 
 
 
 
 15 
 
 
 
Como você viu, houve mais uma etapa ao criar um modelo, selecionar pacotes 
referenciados. Quando você cria seu próprio pacote, você pode selecionar um pacote 
existente para adicioná-lo como referências em seu novo pacote. Você pode precisar 
adicionar alguma referência de pacote padrão se você deseja adicioná-los à sua 
personalização. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 16 
 
Formulários do tipo Dialogs 
 
Neste tópico, vamos cobrir as seguintes personalizações: 
 
 Criando diálogos usando o framework RunBase 
 Manipulando o evento de diálogo 
 
Introdução 
 
Formulários no Dynamics 365 for Finance and Operations representam a interface 
do usuário e são usado principalmente para inserir ou modificar dados. Eles também 
são usados para executar relatórios, executar usuário comandos, validar dados e 
assim por diante. 
 
Normalmente, os formulários são criados usando o AOT produzindo um objeto de 
formulário e adicionando um formulário controles, como guias, guias, grades, 
grupos, campos de dados e imagens. O comportamento do formulário é controlado 
por suas propriedades ou pelo código em seus métodos membros. O 
comportamento e layout de controles de formulário também são controlados por 
suas propriedades e o código em seus membros métodos. Embora seja muito raro, 
formulários também podem ser criados dinamicamente a partir do código. 
 
Neste tópico, abordaremos vários aspectos do uso do Dynamics 365 for Finance e 
Formulários de operações. Começamos criando diálogos do Dynamics 365 for 
Finance and Operations, que são formas dinâmicas e depois explicam como lidar 
com seus eventos. Também será mostrado como criar formulários dinâmicos, como 
adicionar controles dinâmicos aos formulários existentes e como fazer formulários 
modais. 
 
 
 
Criando diálogos usando o RunBase framework: 
 
Diálogos são uma maneira de apresentar aos usuários um formulário de entrada 
simples. Eles são comumente usados para pequenas tarefas do usuário, como 
preencher valores de relatório, executar trabalhos em lote e apresentar apenas 
campos mais importantes para o usuário ao criar um registro. Diálogos são 
normalmente criados do código X ++ sem armazenar o layout real no AOT. 
 
A classe de aplicativo chamada Dialog é usada para construir diálogos. Outras 
classes de aplicativos, como DialogField, DialogGroup ou DialogTabPage, são 
usados para criar controles de diálogo. Esta é a maneira mais fácil de criar diálogos 
é usar o framework RunBase. Isso é porque o framework fornece um conjunto de 
métodos pré-definidos, que fazem a criação e manuseio de o diálogo bem 
estruturado, em oposição a ter todo o código em um único lugar. 
 
 
 
 17 
Neste exemplo, demonstraremos como construir um diálogo a partir do código 
usando a classe RunBase de estrutura. O diálogo conterá os campos da tabela de 
clientes mostrados em diferentes grupos e guias para criar um novo registro. Haverá 
duas páginas (Tab Page), Geral e Detalhes. A primeira página terá os controles de 
entrada de conta de cliente e nome a segunda página será dividida em dois grupos, 
Configuração e Pagamento, com campos relevantes dentro de cada grupo. O 
registro real não será criado, pois está além do escopo deste exemplo. No entanto, 
para fins de demonstração, as informações especificadas pelo usuário serão exibidas 
no Janela de um infolog. 
 
Siga os seguintes passos para completar esta atividade: 
 
1. Adicione um novo projeto Create Dialog 
2. Adicione uma nova classe Runnable e renomeie-a para MyDialog . Agora, adicione 
o seguinte trecho de código: 
 
Declare todos os seus objetos na classe, como mostrado a seguir: 
 
class MyDialog extends RunBase 
{ 
 DialogField fieldAccount; 
 DialogField fieldName; 
 DialogField fieldGroup; 
 DialogField fieldCurrency; 
 DialogField fieldPaymTermId; 
 DialogField fieldPaymMode; 
 CustAccount custAccount; 
 CustName custName; 
 CustGroupId custGroupId; 
 CurrencyCode currencyCode; 
 CustPaymTermId paymTermId; 
 CustPaymMode paymMode; 
 
public container pack() 
 { 
 return connull(); 
 } 
 
 
public boolean unpack(container packedClass) 
 { 
 return true; 
 } 
 
 Crie um método de diálogo para capturar entradas do usuário de tempo de 
execução para detalhes do cliente: 
 
Object dialog() 
{ 
 Dialog dialog; 
 DialogGroup groupCustomer; 
 DialogGroup groupPayment; 
 
 dialog = super(); 
 
 dialog.caption("Informações do Cliente"); 
 
 
 18 
 
 fieldAccount = dialog.addField(extendedTypeStr(CustAccount),"Conta do Cliente"); 
 fieldName = dialog.addField(extendedTypeStr(CustName),"Nome do Cliente"); 
 
 dialog.addTabPage("Detalhes"); 
 
 groupCustomer = dialog.addGroup("Configuração"); 
 fieldGroup = dialog.addField(extendedTypeStr(CustGroupId),"Grupo do Cliente"); 
 fieldCurrency =dialog.addField(extendedTypeStr(CurrencyCode),"Moeda 
Corrente"); 
 
 groupPayment = dialog.addGroup("Pagamento"); 
fieldPaymTermId= dialog.addField(extendedTypeStr(CustPaymTermId),"Condição de 
Pagamento"); 
fieldPaymMode = dialog.addField(extendedTypeStr(CustPaymMode),"Método de 
Pagamento"); 
 
 return dialog; 
} 
 
 
 
Agora, quando os usuários selecionam seus valores desejados, precisamos ler todos 
eles para mostrar no infolog. Use getFromDialog para ler o valor de um campo de 
diálogo: 
 
public boolean getFromDialog() 
{ 
 custAccount = fieldAccount.value(); 
 custName = fieldName.value(); 
 custGroupId = fieldGroup.value(); 
 currencyCode = fieldCurrency.value(); 
 paymTermId = fieldPaymTermId.value(); 
 paymMode = fieldPaymMode.value(); 
 return super(); 
} 
 
 
 
 
Use o método run para fazer instruções Infolog, como no código a seguir: 
 
 
public void run() 
{ 
 info("Você inseriu os seguintes dados de cliente:"); 
 info(strFmt("Conta: %1", custAccount)); 
 info(strFmt("Nome: %1", custName)); 
 info(strFmt("Grupo: %1", custGroupId)); 
 info(strFmt("Moeda Corrente: %1",currencyCode)); 
 info(strFmt("Condição de Pagamento: %1", paymTermId)); 
 info(strFmt("Método de Pagamento: %1", paymMode)); 
} 
 
 
public static void main(Args _args) 
{ 
 MyDialog myDialog = new MyDialog(); 
 
 
 
 19 
 if (myDialog.prompt()) 
 { 
 myDialog.run(); 
 } 
} 
3. Para testar a caixa de diálogo, clique com o botão direito do mouse nessa classe e 
defina como projeto de inicialização. 
4. Construa seu projeto. Agora, execute o projeto. O seguinte formulário aparecerá 
no navegador de internet: 
 
 
 
 
 
4. Clique na ficha de registro Detalhes; você verá uma tela semelhante à seguinte 
captura de tela: 
 
 
 
 
 
 20 
5. Digite as informações em todos os campos e clique em OK. Os resultados serão 
exibidos na guia Infolog na parte superior da janela do navegador. 
 
 
 
Entendendo nosso desenvolvimento: 
 
Primeiro criamos uma nova classe chamada MyDialog. Ao estendê-lo de RunBase, 
utilizamos uma abordagem padrão para desenvolver funções de manipulação de 
dados no Dynamics 365 for Operations. O RunBase Framework definirá uma 
estrutura comum e adicionará automaticamente controles, como os botõesOK e 
Cancelar, na caixa de diálogo. Em seguida, declaramos as variáveis dos membros da 
classe, que serão usadas posteriormente. A variável do tipo DialogField são campos 
entrada do usuário. O restante das variáveis é usado para armazenar os valores que 
retornaram da entrada do usuário. 
 
Os métodos pack() e unpack() são normalmente usados para converter um objeto 
em um contêiner e converter o contêiner de volta em um objeto, respectivamente. 
Um contêiner é um formato comum usado para armazenar objetos no cache do 
usuário (SysLastValue) ou para transferir o objeto entre camadas de servidor e 
cliente. O RunBase Framework precisa que esses dois métodos sejam 
implementados em todas as suas subclasses. Neste exemplo, não estamos usando os 
recursos do pack() ou unpack(), mas porque esses métodos são obrigatórios, 
retornamos um container vazio do pack() e retornamos true do unpack(). 
 
O layout da caixa de diálogo real é construído no método dialog(). Aqui nós 
definimos as variáveis locais para as páginas e grupos da própria guia de diálogo. 
Essas variáveis, ao contrário para os campos de diálogo, não armazenem nenhum 
valor para processamento adicional. O método super() cria o objeto de diálogo 
inicial para nós e adiciona automaticamente os controles relevantes, incluindo os 
botões OK e Cancelar. 
 
Controles de diálogo adicionais são adicionados ao diálogo usando os métodos 
addField(), addGroup() e addTabPage(). Existem mais métodos, como o 
addText(), addImage() e addMenuItemButton() aos quais são usados para 
adicionar diferentes tipos de controles. Todos controles devem ser adicionados ao 
objeto de diálogo diretamente. Adicionando um controle de entrada a grupos ou 
guias é feito chamando addField() logo após addGroup() ou addTabPage(). No 
exemplo anterior, incluímos guias, grupos e campos em uma sequência lógica de 
cima para baixo. Note que é suficiente apenas adicionar uma segunda página de 
tabulação; a primeira ficha de registro, chamada Geral a qual é adicionada 
automaticamente pelo framework. 
 
Valores dos controles de diálogo são atribuídos às variáveis chamando o método 
value() este membro de DialogField. Se um diálogo é usado dentro do RunBase 
framework, como é usado neste exemplo, o melhor lugar para atribuir valores de 
controle de diálogo a variáveis é o método getFromDialog(). O RunBase 
framework invoca este método logo após o usuário clicar em OK. 
 
 
 
 21 
O processamento principal é feito no método run(). Para fins de demonstração, esta 
classe mostra apenas a entrada do usuário na guia Infolog na parte superior da 
janela do navegador. 
 
Para tornar esta classe executável, o método main() estático deve ser criado. Aqui 
nós criamos um novo objeto do tipo CustCreate invoca o diálogo de usuário 
chamando o método prompt() Depois que o usuário terminar de inserir os detalhes 
do cliente, clicando em OK, o método run() é invocado para processar os dados. 
 
 
 
Manipulando eventos de diálogo 
 
Às vezes, na interface do usuário, é necessário alterar o status de um campo, 
dependendo sobre o status de outro campo. Por exemplo, se o usuário marcar a caixa 
de seleção Filtrar, outro campo, Filtrar, aparece ou fica ativado. Nos formulários 
AOT, isso pode ser feito usando o evento modified() de controle de entrada. No 
entanto, se esse recurso for necessário em diálogos de tempo de execução, lidar com 
eventos não é tão simples. 
 
Muitas vezes, os diálogos existentes precisam ser modificados para suportar 
eventos. A maneira mais fácil é converter um diálogo em um formulário AOT. No 
entanto, quando os o diálogo é bastante complexo, uma solução mais econômica 
provavelmente seria implementar manipulação de eventos de diálogo em vez de 
converter em um formulário AOT. A manipulação de eventos em diálogos é não 
flexível, como no caso de formulários AOT que na maioria dos casos faz o trabalho. 
 
Nesta atividade, vamos criar uma caixa de diálogo semelhante ao anterior, mas em 
vez de entrar o número do cliente, poderemos selecionar o número de uma lista 
semelhando a um combobox. Quando o cliente estiver selecionado, o restante dos 
campos será preenchido automaticamente pelo sistema a partir do cliente registro. 
 
 
 
Siga os seguintes passos para completar esta atividade: 
 
1. Adicione uma nova classe Runnable e renomeie-a para MyDialogSelect. 
 
Agora, adicione o seguinte trecho de código: 
 
class MyDialogSelect extends RunBase 
{ 
 DialogField fieldAccount; 
 DialogField fieldName; 
 DialogField fieldGroup; 
 DialogField fieldCurrency; 
 DialogField fieldPaymTermId; 
 DialogField fieldPaymMode; 
 
 public container pack() 
 { 
 return connull(); 
 
 
 22 
 } 
 
public boolean unpack(container packedClass) 
 { 
 return true; 
 } 
 
2. Crie um método de diálogo para capturar entradas do usuário de tempo de 
execução para detalhes do cliente: 
 
Object dialog() 
{ 
 Dialog dialog; 
 DialogGroup groupCustomer; 
 DialogGroup groupPayment; 
 
 dialog = super(); 
 
 dialog.caption("Informações do Cliente") 
 dialog.allowUpdateOnSelectCtrl(true); 
 
 fieldAccount = dialog.addField(extendedTypeStr(CustAccount),"Conta do Cliente"); 
 fieldName = dialog.addField(extendedTypeStr(CustName),"Nome do Cliente"); 
 fieldName.enabled(false); 
 
dialog.addTabPage("Detalhes"); 
 groupCustomer = dialog.addGroup("Configuração"); 
 fieldGroup = dialog.addField(extendedTypeStr(CustGroupId),"Grupo do Cliente"); 
 fieldCurrency =dialog.addField(extendedTypeStr(CurrencyCode),"Moeda 
Corrente"); 
 fieldGroup.enabled(false); 
 fieldCurrency.enabled(false); 
 groupPayment = dialog.addGroup("Pagamento"); 
fieldPaymeTermId= dialog.addField(extendedTypeStr(CustPaymTermId),"Condição de 
Pagamento"); 
fieldPaymMode = dialog.addField(extendedTypeStr(CustPaymMode),"Método de 
Pagamento"); 
fieldPaymeTermId.enabled(false); 
fieldPaymMode.enabled(false); 
 
 return dialog; 
} 
 
public void dialogSelectCtrl() 
{ 
 CustTable custTable; 
 
 custTable = CustTable::find(fieldAccount.value()); 
 fieldName.value(custTable.name()); 
 fieldGroup.value(custTable.CustGroup); 
 fieldCurrency.value(custTable.Currency); 
 fieldPaymTermId.value(custTable.PaymTermId); 
 fieldPamMode.value(custTable.PaymMode); 
} 
 
public stati void main(Args _args) 
{ 
 
 
 23 
 MyDialogSelect myDialogSelect = new MyDialogSelect(); 
 
 if (myDialogSelect.prompt()) 
 { 
 myDialogSelect.run(); 
 } 
} 
3. Defina esta classe como Set as Startup Object (Objeto de início) 
 
 
4. Salve todas as suas alterações e construa seu projeto. Agora execute o projeto. Os 
seguintes formulários serão exibidos no browser. 
5. Execute o projeto, selecione qualquer cliente da lista e mova o cursor para o 
próximo controle. Observe como o restante dos campos serão preenchidos 
automaticamente com as informações do cliente, conforme mostrado na captura 
de tela a seguir: 
 
 
 
 24 
 
 
6. Ao clicar na página da guia Detalhes, você verá mais informações sobre o cliente, 
conforme mostrado na captura de tela a seguir: 
 
 
 
Entendendo nosso desenvolvimento: 
 
A nova classe chamada MyDialogSelect é na verdade uma cópia da classe MyDialog 
da atividade anterior, com algumas mudanças. Em sua declaração de classe, 
deixamos todos os DialogField declarações e removendo o resto das variáveis. 
 
 
 
 25 
Os métodos pack() e unpack() permaneceram os mesmos, já que não estamos 
usando nenhum de seus recursos. 
 
No método dialog() invocamos o método allowUpdateOnSelectCtrl() com o 
argumento true para ativar o tratamento de eventos de controle de entrada. Nós 
também desabilitamos todos os controles, além da conta do Cliente, inovamos o 
método enblaed() com o parâmetro false para cada controle. 
 
O método dialogSelectCtrl() membro da classe RunBase e é invocado toda vez que 
o usuário modificaqualquer controle de entrada na caixa de diálogo. É o lugar onde 
temos que adicionar todo o código necessário para garantir que, no nosso caso, 
todos os controles sejam preenchidos com os dados corretos a partir do registro do 
cliente, uma vez que a conta do cliente é selecionada. 
 
O método main() garante que a classe seja executável. 
 
 
 
 
 
Gerenciamento de Dados 
 
Introdução 
 
O recurso de gerenciamento de dados no Dynamics 365 for Finance and Operations 
permite que você gerenciar e auditar seus dados eficientemente em sistemas. O 
excelente recurso fornecendo muitas ferramentas como importar, exportar, excluir 
dados em massa e detectar dados duplicados e assim por diante. Você pode também 
desenvolver entidades de dados personalizadas. A integração através da plataforma 
de gerenciamento de dados fornece mais recursos e maior taxa de transferência 
para inserir / extrair dados por meio de entidades. Normalmente, os dados passam 
por três fases neste cenário de integração: 
 
 Fonte (Source) - Esses são arquivos de dados de entrada ou mensagens na fila. 
Dados típicos os formatos incluem CSV, XML e delimitado por tabulações. 
 Cenário (Staging) - Estas são tabelas geradas automaticamente que mapeiam 
muito de perto entidade de dados. Quando o gerenciamento de dados ativado é 
verdadeiro, as tabelas de migração são geradas para fornecer armazenamento 
intermediário. Isso permite que a estrutura faça grandes volumes análise de 
arquivos, transformação e algumas validações. 
 Alvo (Target) - Esta é a entidade de dados onde os dados serão importados. 
 
Entidades de dados 
 
Na versão anterior do Dynamics 365 for Finance and Operations, há várias opções 
como DIXF, Excel Add-ins e AIF para gerenciamento de dados. Entidades de dados 
são introduzidos como parte do gerenciamento de dados para ser usado como uma 
camada de abstração para facilmente entender usando conceitos de negócios. O 
 
 
 26 
conceito de entidades de dados combina esses conceitos diferentes em um. Você 
pode reutilizar dados entidades para um Excel Suplementos, Integração ou 
Importação / Exportação. A tabela a seguir mostra os principais cenários de 
gerenciamento de dados: 
 
Data Migration Migrar dados de referência, mestre e documento de legado ou 
sistemas externos 
Setup and copy 
configuration 
Copiar configuração entre empresa / ambientes. 
Configurar processos ou módulos usando o Lifecycle Services 
Ambiente (LCS). 
Integration Integração baseada em serviços em tempo real. 
Integração assíncrona. 
 
O gerenciamento de dados usa entidades de dados sob uma camada abstrata de 
lógica de negócios implementação. Os dados são inseridos nas tabelas de preparação 
usando o SSIS (SQL Server Integration Services), que é validado e transformada para 
mapear para a entidade de destino. 
 
 
 
 
Criando uma entidade de dados 
 
Siga os seguintes passos para completar esta atividade: 
 
1. Crie um projeto do Dynamics 365 for Operations no Visual Studio. 
2. Vamos criar uma tabela de demonstração com alguns campos como segue, para 
usar neste Entidade de Dados: 
 
 
 
 27 
 
 
3. Adicione uma nova entidade de dados no projeto clicando com o botão direito do 
mouse no menu da seguinte maneira: 
 
 
 
4. Em seguida, você receberá uma tela do assistente, selecione PacktVendTable 
como a principal fonte de dados. Categoria da entidade como mestre e clique em 
Avançar: 
 
 
 
 28 
 
 
 
5. Na próxima etapa, você deve escolher todos os campos obrigatórios, para esta 
atividade vamos manter apenas alguns campos e marcá-los como é obrigatório 
também. Uma vez feito, clique em Finish: 
 
 
 
6. Salve seu projeto e construa-o. O projeto deve ter a seguinte aparência: 
 
 
 
 29 
 
 
7. Agora precisamos adicionar essa entidade no espaço de trabalho de 
gerenciamento de dados. Navegar para Espaço de trabalho | Gerenciamento de 
dados | Entidades de dados. 
 
 
Adicione um novo registro da seguinte maneira e salve-o. Agora clique em Validar: 
 
 
 
 
 
8. Vamos tentar importar dados para o PacktVendTable usando essa nova entidade 
de dados. Agora vá de volta ao espaço de trabalho de gerenciamento de dados. 
 
Clique em Importar tile. Preencha os detalhes do seguinte modo: 
 
 
 
 30 
 
 
 
 
Carregue o arquivo do Excel que contém dados. Agora clique no botão Importar. 
Você vai ter uma notificação assim que esta importação é feita. Para verificar, 
navegue na tabela e verifique os dados inseridos. 
 
Estruturas de dados 
 
Neste tópico, vamos cobrir os seguintes quesitos: 
 
 Tipos enumeradores 
 EDT (Extended Data Type) 
 Tabelas de configuração 
 Tabela de parâmetros 
 Tabelas de dados principais 
 
Abordaremos as tarefas necessárias para gravar os elementos do dicionário de 
dados utilizados no desenvolvimento das customizações. 
 
As estruturas de dados em Operações não são apenas tabelas e visualizações, mas 
também incluem a capacidade de defina um dicionário de dados. Isso agora é 
chamado de modelo de dados nas operações. O modelo de dados não mudou muito 
na estrutura desde o AX 2012, mas é muito mais refinado com muito mais recursos 
para auxiliar o desenvolvimento e minimizar a pegada ao estender as tabelas padrão 
 
 
 31 
e tipos. 
 
Este tópico não cobre a criação de extensões de tipos padrão, mas cobre como criar 
tipos que permitam que suas estruturas sejam extensíveis. 
 
A maioria dos desenvolvimentos em Dynamics 365 FO é baseada em padrões, 
mesmo que não tenhamos conhecimento disso. Por exemplo, as listas de 
fornecedores e clientes são muito semelhantes e são chamadas de tabelas principais. 
Ordens de compra e ordens de venda também são muito semelhantes. 
 
Tabelas em Dynamics 365 FO têm uma propriedade que define o tipo de tabela e 
cada tipo é associado a um estilo particular de formulário para a interface do 
usuário. Poderíamos, portanto, considerar esses tipos como padrões. Se pensarmos 
neles como padrões, é muito mais fácil aplicar as receitas para nosso próprio 
desenvolvimento. 
 
A lista a seguir é dos tipos de tabelas comuns, listados com o design de formulário 
usual e suas uso típico: 
 
Grupo de Tabelas Design de Form Utilização 
Miscellaneous Isso é essencialmente "indefinido" e 
não deve ser usado, diferente de tabelas 
temporárias. 
Parameter Índice Isso é usado para formulários de 
parâmetro de registro único. 
Group Lista simples Lista 
simples e Detalhes - 
grade da lista 
Isso é usado para a tabela de apoio para 
drop-down 
listas. O padrão de design de lista 
simples é adequado para 
quando apenas alguns campos são 
necessários; de outra forma, os padrões 
de lista simples e detalhes devem ser 
usado para que os campos sejam 
apresentados de uma maneira útil para 
o usuário. 
Main Mestre Detalhe Isso é usado para tabelas principais, 
como clientes, fornecedores e itens. 
Transaction 
Header 
Transaction Line 
Lista simples e 
Detalhes com Guias 
padrão 
Isso é usado para conjuntos de dados, 
como a fatura formulário de diário, que 
contém informações transacionais 
dados com cabeçalho e linhas. 
Transaction Lista simples e 
Detalhes com 
padrão guias 
Isso é usado para tabelas, como o 
Formulário de transação de Inventário, 
que contém dados transacionais, mas 
em um único nível. 
Worksheet header 
Worksheet line 
Detalhes Transação Isso é usado para conjuntos de dados de 
entrada de dados, como a ordem de 
compra, em que o conjunto de dados é 
 
 
 32 
composto tabelas de cabeçalho e linha. 
O padrão tem dois visualizações, uma 
exibição de lista de registros de 
cabeçalho e um detalhe veja onde o foco 
são as linhas. 
Worksheet Mestre Detalhe Este é um conjunto de dados de entrada 
de dados de nível único, que são 
raramente usados no Dynamics 365 FO. 
 
 
 
 
 
Tipos de enumeradores(Base ENUM) 
 
Tipos enumeradores são semelhantes aos tipos de enumeradores em C#. Eles são 
comumente referidos como Enums. É um inteiro referenciado como símbolo, que 
pode ser usado no código para controlar a lógica. Também pode ser usado como um 
campo em uma mesa que fornece uma lista suspensa fixa ao usuário. Quando usado 
como um campo, ele tem a capacidade de fornecer etiquetas fáceis de usar para cada 
símbolo. 
 
Todos os Enums devem ser definidos no modelo de dados antes de usá-los e não 
podem ser definidos dentro de uma classe ou método. 
 
Existem centenas de tipos enumeráveis que são construídos no aplicativo padrão. 
Por exemplo o Enum NoYes tem dois literais associados, onde No tem o valor 0 e 
Yes tem o valor 1. 
 
 
 
 
Adicionar valores a enums por meio de extensão: 
 
Para adicionar novos valores a um enum, você deve estender o enum. Qualquer 
enum que esteja marcado como Extensible ( IsExtensible = true ) pode ser estendido. 
Você pode encontrar as informações de extensibilidade na janela Propriedades no 
Microsoft Visual Studio, conforme mostrado na ilustração a seguir: 
 
 
 
 33 
 
 
Quando valores enum extensíveis são sincronizados, os valores inteiros de um enum 
da linha de base são determinantes, enquanto os valores inteiros dos valores enum 
da extensão não são determinantes. Os valores são gerados durante a sincronização. 
Portanto, você não pode ter lógica que depende do valor inteiro dos valores enum. 
aqui estão alguns exemplos: 
 
 Comparações alcance, tais como e.. 
 Intervalos modelados em visualizações e consultas 
 Intervalos de consulta criados a partir do código 
 
Normalmente, um enum extendido deve ter sua própria implementação onde quer 
que seja usado. Procure todos os usos do enum e aproveite a implementação onde 
for necessário. 
 
 
Estendendo um enum 
 
Existem duas maneiras de estender um enum: 
 
 Crie um projeto que tenha uma referência de modelo onde você deseja a nova 
extensão de enumeração. Clique com o botão direito do mouse no enum para 
estender e selecione Criar extensão. 
 
 
 
 
 34 
 
 
 Clique com o botão direito do mouse no enum para estender e selecione Criar 
extensão em novo projeto. Você é solicitado a selecionar o modelo no qual o enum 
de extensão deve ser criado. 
 
 
 
 
 
Usando Enums para comparação e status 
 
É muito comum usar um Enum para definir o status de um registro, e cobriremos o 
estado máquinas no Capítulo 15, Máquinas do Estado. Ao definir um Enum para 
status, vamos requisitar os elementos para que possamos compará-los no código. 
 
 
No caso do Enum SalesStatus, os elementos são os seguintes: 
 
Symbol Value 
None 0 
Backorder 1 
Delivered 2 
Invoiced 3 
 
 
 35 
Canceled 4 
Dessa forma, podemos selecionar todos os pedidos de vendas, que ainda não foram 
faturados, usando os seguintes linhas de código: 
 
 
select SalesId, SalesName from salesTable 
where salesTable.SalesStatuscoluna Método de pagamento com 
a pesquisa: 
 
 
 
 38 
 
O campo recém-criado é baseado no tipo de dados estendidos e portanto, herda 
automaticamente sua relação. Para seguir as melhores práticas, todas as relações 
devem estarem presentes. 
 
Nota: EDT não deve ser utilizado para aplicar regra de negócio em customizações. 
 
 
 
Criando tabelas de configuração 
 
Nesta seção, criaremos uma tabela de grupos. Uma tabela de grupo é usada como 
uma chave estrangeira na principal tabelas, como o grupo de clientes na tabela de 
clientes e o grupo de fornecedores na tabela de fornecedores; as tabelas de clientes 
e fornecedores são exemplos de tabelas principais. Tabelas de grupo tem pelo 
menos dois campos, um ID e um campo Descrição, mas pode conter mais conforme 
necessário. Nesse caso, para ajudar o fluxo, criaremos a tabela de grupos primeiro. 
 
Nós só precisamos de um projeto de Dynamics 365 FO aberto no Visual Studio. 
 
Vamos criar uma tabela de grupos de veículos. Nós não temos muita escolha sobre 
o nome neste tem que começar com nosso prefixo e terminar com Group portanto 
fica a sugestão ConWHSVehicleGroup. Para criar essa tabela, siga estas etapas: 
 
1. Iniciaremos criando os EDTs, crie um grupo de veículos EDT usando os 
parâmetros seguintes: 
 
Propriedade Valor 
Name ConWHSVehicleGroupId 
Label Vehicle group 
Help Text Id do grupo de veículos 
Extends SysGroup 
 
 
 
 39 
2. Salve o EDT, mas não feche o designer. 
3. De dentro do projeto, escolha criar um item. 
4. Escolha Data Model na lista à esquerda e selecione Tabela à direita. 
5. Digite ConWHSVehicleGroup no campo Nome e pressione Incluir. 
6. Abra o designer de tabela em uma nova guia. Do projeto, arraste o 
ConWHSVehicleGroupId EDT na parte superior do nó Fields em nossa tabela, 
conforme mostrado em a seguinte captura de tela: 
 
 
 
 
7. Isso cria o campo com o mesmo nome que o EDT. Como esta é a nossa mesa, 
devemos remover o prefixo e nomeá-lo como VehicleGroupId. 
8. Agora podemos concluir nosso EDT, abrir o ConWHSVehicleGroupId EDT ou 
selecione a guia se ela ainda estiver aberta) e insira ConWHSVehicleGroup na 
Referência Propriedade da tabela. 
9. Clique com o botão direito do mouse no nó Referências da Tabela e selecione Novo 
| Referência de tabela. 
10. Na folha de propriedades, selecione a propriedade Campo Relacionado e 
selecione VehicleGroupId na lista suspensa. 
11. Salve o EDT e feche seu designer. Isso deve tornar a guia ativa Designer de tabela 
ConWHSVehicleGroup; se não, selecione novamente. 
12. No Explorador de Aplicativos, que é aberto no menu Visualizar, expanda Tipos 
de Dados e, em seguida, expanda Tipos de dados estendidos. 
13. Localize o campo Descrição e arraste-o para o nó Campos de nossa tabela. 
 
 
 
Criando uma tabela de parâmetros 
Uma tabela de parâmetros contém apenas um registro por empresa. A tabela contém 
uma lista de campos, que podem ser padrões ou opções específicas da empresa 
 
 
 40 
usadas no código para determinar o que deve acontecer. A tabela de parâmetros 
geralmente é criada primeiro e os vários campos que atuam como parâmetros são 
adicionados à medida que criamos a solução. 
 
Isso segue diretamente do roteiro Criar tabelas de configuração. 
 
 
 
 
 
Para criar a tabela de parâmetros, siga estas etapas: 
 
1. Crie uma tabela denominada ConWHSVehiclePararameters, novamente, o 
prefixo e o sufixo são baseados nas boas práticas. Normalmente, o nome só será 
 + + Parâmetros. 
2. Defina os parâmetros da tabela da seguinte forma: 
 
Propriedade Valor 
Label Parâmetros de gerenciamento de veículos 
Cache lookup Encontrado 
Table Group Parameter 
Created By 
Created Date Time 
Modified By 
Modified Date Time 
Yes 
Developer 
Documentation 
A tabela ConWHSVehicleParameters armazena os 
parâmetros para a solução de gerenciamento de 
veículos 
 
3. Arraste o EDT ConWHSVehicleGroupId para o nó Campos e renomeie para 
DefaultVehicleGroupId. 
4. Arraste o EDT ParametersKey do Application Explorer para o nó Fields. 
5. Renomeie para Key e altere a propriedade Visible para No. 
6. Crie um grupo de campos chamado Padrões e defina a propriedade Rótulo. Use a 
pesquisa para localizar um rótulo adequado. 
7. Arraste o campo DefaultVehicleGroupId para o novo grupo de campos Padrões. 
8. Clique com o botão direito do mouse no nó Realtions e selecione Novo | Relação 
Chave Estrangeira. 
9. Preencha os parâmetros da seguinte maneira: 
 
Propriedade Valor Comentário 
Name ConWHSVehicleGroup O nome da relação é geralmente o 
nome da a tabela, a menos que 
tenhamos duas chaves estrangeiras 
para a mesma mesa. 
 
 
 41 
Related Table ConWHSVehicleGroup A tabela à qual nossa chave 
estrangeira se refere. 
Cardinality ZeroOne Haverá um ou nenhum registro de 
parâmetro relativo ao registo do 
grupo de veículos. Um relacionamento 
um-para-muitos usaria ZeroMore ou 
OneMore. 
Related Table 
Cardinality 
ZeroOne O valor não é obrigatório, então 
podemos, portanto, referem-se a zero 
registros de grupos de veículos, ou 
um. 
Relationship 
Type 
Association O registro de parâmetro está 
associado a um registro do veículo. A 
composição seria usada em conjuntos 
de dados de cabeçalho / linhas, em 
que Cabeçalho deve excluir os 
registros de linhas. 
On Delete Restricted Isso impedirá que um registro de 
grupo de veículos seja excluído, se for 
especificado nesta tabela. 
Role Este é o papel da relação, e deve ser 
único dentro desta tabela. Se 
UseUniqueRoleNames for Sim, 
somente precisa especificar isso se 
tivermos dois chave estrangeira 
relações com a mesma tabela. 
 
10. Clique com o botão direito em Relation e selecione New | Normal. 
11. Na propriedade Field, especifique a chave estrangeira (o campo nesta tabela), 
DefaultVehicleGroupId. 
12. Na propriedade Campo Relacionado, especifique a chave na tabela pai: 
VehicleGroupId. 
13. Crie um índice chamado KeyIdx e inclua o campo Key nele. É único por por 
padrão, ele age como um índice de restrição. 
14. Agora podemos criar o método Find and Exist. Há uma diferença para tabelas de 
parâmetros, em que o método Find cria um registro de uma maneira particular. 
Crie o método Find, conforme mostrado no seguinte trecho de código: 
public static ConWHSVehicleParameters Find(boolean _forupdate = false) 
{ 
ConWHSVehicleParameters parameter; 
parameter.selectForUpdate(_forupdate); 
select firstonly parameter index Key 
where parameter.Key == 0; 
 
 
 42 
if (!parameter && !parameter.isTmp()) 
{ 
// Create the parameter 
Company::createParameter(parameter); 
} 
return parameter; 
} 
 
 
15. Vamos usar uma declaração select ligeiramente diferente, onde podemos escrever o 
select declaração na linha, o que significa que não temos que declarar o tipo como uma 
variável, escreva o método Exist da seguinte forma: 
public static boolean Exist() 
{ 
return (select firstonly RecId 
from ConWHSVehicleParameters).RecId != 0; 
} 
 
16. Queremos garantir que o registro não possa ser excluído. Então, vamos 
substituir o Excluir o método. Pressione Return no início do método Find para criar 
um espaço em branco linha no topo. Clique com o botão direito do mouse nessa linha 
em branco e escolha Inserir Método de Substituição | Excluir. Altere o método para 
que ele leia da seguinte maneira: 
public void delete() 
{ 
throw error("@SYS23721"); 
} 
17. Nós definimos a propriedade Table Cache como EntireTable. Sempre que esta 
tabela é atualizado, precisaremos liberar o cache para que o sistema use a 
atualização valores. Substitua o método de atualização da seguinte maneira: 
public void update() 
{ 
super(); 
flush ConWHSVehicleParameters; 
} 
 
Fato relevante: 
A operação de compilação validará e compilará o pacote em uma DLL. Isso deve ser 
feito antes de sincronizarmos o banco de dados. Isso pode falhar, e nestafase, é 
normalmente devido a referências ausentes. No Explorador de Aplicativos, cada 
elemento mostra o pacote para qual pertence. Devemos garantir que nossas 
referências de modelo para todos os tipos que usamos dentro nosso projeto. Se não 
o fizermos, obteremos erros de construção como este: 
 
 
 43 
 
 
Para adicionar as referências necessárias, podemos seguir estas etapas: 
1. Localize o tipo com o erro no Explorador de Aplicativos. 
2. Observe o pacote em que está, entre colchetes. 
3. Navegue para o Dynamics 365 | Gestão de Modelos | Atualize os parâmetros do 
modelo .... 
4. Selecione o modelo ConWHSVehicleManagement. 
5. Clique em Next. 
6. Verifique se o pacote necessário está marcado e, em seguida, pressione Avançar. 
7. Pressione Concluir. 
8. Navegue para o Dynamics 365 | Modelo de gerenciamento e selecione Atualizar 
modelos. 
9. Tente a operação de construção novamente; você pode precisar repetir isso como 
um erro pode mascarar outro. 
 
 
Criando tabelas de dados principais 
Nesta seção, criaremos uma tabela principal, semelhante à tabela de clientes. Os 
passos são semelhantes ao grupo de veículos, e vamos abreviar alguns dos passos 
que já temos feito. O padrão descrito nesta receita pode ser aplicado a qualquer 
tabela principal usando seu próprio tipos de dados. A tabela neste exemplo será para 
armazenar detalhes do veículo. 
O design da tabela será o seguinte: 
Campo Tipo Tam EDT ( : indica extensão) 
VehicleId String 20 ConWHSVehicleId : Num 
VehicleGroupId String 10 ConWHSVehicleGroupId 
RegNum String 10 ConWHSVehRegNum 
AcquiredDate Date ConWHSAcquiredDate : TransDate 
 
Para seguir essas etapas, os elementos criados anteriormente neste capítulo devem 
ser criados. 
 
 
 44 
Para criar a tabela de veículos, siga estes passos: 
1. Crie o EDT ConWHSVehicleId com as seguintes propriedades: 
Propriedade Valor 
Name ConWHSVehicleId 
Extends Num 
Label Vehicle Id 
Help Text Id do Veículo 
 
 
2. Crie o EDT ConWHSVehRegNum com as seguintes propriedades: 
Propriedade Valor 
Name ConWHSVehRegNum 
Size 10 
Label Número de registro do veículo 
Help Text Número de registro do veículo 
Change case UpperCase 
 
3. Crie EDT ConWHSAcquiredDate EDT, lembrando que precisaremos cria-lo como 
uma data EDT. Use as seguintes propriedades: 
Propriedade Valor 
Name ConWHSAcquiredDate 
Extends TransDate 
Label Data de Aquisição 
Help Text A data em que o veículo foi adquirido 
 
4. Crie a tabela ConWHSVehicleTable. O nome da tabela deve iniciar com o nosso 
prefixo, seguido pelo nome da entidade como substantivo singular e sufixado com a 
tabela. 
5. Arraste os EDTs para a tabela nesta ordem: 
 ConWHSVehicleId 
 Description 
 ConWHSVehicleGroupId 
 ConWHSVehicleType 
 ConWHSVehRegNum 
 ConWHSAcquiredDate 
6. Remova o prefixo ConWHS dos campos como eles estão em nossa tabela. 
7. No campo VehRegNum, altere a propriedade AliasFor para VehicleId. 
 
 
 45 
8. Salve a tabela e abra o EDT ConWHSVehicleId. Complete Propriedade Reference 
Table no nó Referências da Tabela. 
9. Feche a tabela do designer para o EDT e volte para o designer de tabelas. 
10. Altere as propriedades dos campos VehicleId como um campo de ID da seguinte 
forma: 
Propriedade Valor 
Allow Edit No 
Allow Edit On Create Yes 
Mandatory Yes 
 
11. O campo GroupId de uma tabela principal geralmente tem um impacto na lógica, 
e é geralmente obrigatório. Mesmo que isso não aconteça, ainda devemos criar o 
campo VehicleGroupId obrigatório. 
12. Não torne obrigatório o campo VehicleType. 
13. Crie um índice exclusivo chamado VehicleIdx com o campo VehicleId. 
14. Os campos de grupo são frequentemente usados para consultas de agregação ou 
de pesquisa, portanto, devemos criar um índice chamado VehicleGroupIdx e 
adicione o campo VehicleGroupId a ele, o índice não deve ser exclusivo. 
15. Preencha as propriedades da tabela da seguinte forma: 
Propriedade Valor 
Label Vehicles 
Title Field 1 VehicleId 
Title Field 2 Description 
Cache lookup Found 
Clustered Index VehicleIdx 
Primary Index VehicleIdx 
Table Group Main 
Created By 
Created Date Time 
Modified By 
Modified Date Time 
Yes 
Developer 
Documentation 
ConWHSVehicleTable contains vehicle records 
Form Ref This is blank until we have created the form 
 
16. Crie uma Visão geral do grupo de campos, identificada apropriadamente e 
arraste nos campos deseja mostrar na grade da lista principal no formulário. 
 
 
 46 
17. Crie um grupo de campos, Detalhes e encontre um rótulo apropriado. Arraste 
nos campos que deve aparecer no cabeçalho do formulário ao visualizar os detalhes 
do veículo. 
18. As tabelas principais são geralmente referenciadas nas tabelas da planilha e as 
Operações crie uma pesquisa para nós com base na relação na tabela estrangeira. 
Para controlar os campos na pesquisa automática, arraste os campos que deseja ver 
na Grupo de campos AutoLookup verifique se VehicleId é o primeiro. 
19. Crie uma relação de chave estrangeira para o campo VehicleGroupId usando as 
seguintes propriedades: 
Parâmetro Valor 
Name ConWHSVehicleGroup 
Related Table ConWHSVehicleGroup 
Cardinality OneMore The field is mandatory 
Related Table Cardinality ZeroOne 
Relationship Type Association 
On Delete Restricted 
 
20. Adicione uma relação de campo normal à relação, conectando os campos 
GroupId. 
21. É comum inicializar tabelas principais a partir de padrões, mantidos em 
parâmetros. O método initValue é chamado quando o usuário cria um registro. 
Clique com o botão direito do mouse o nó Métodos e selecione Substituir | initValue. 
22. No editor de código, ajuste o código para que ele leia o seguinte: 
public void initValue() 
{ 
ConWHSVehicleParameters parm; 
parm = ConWHSVehicleParameters::Find(); 
super(); 
this.VehicleGroupId = parm.DefaultVehicleGroupId; 
} 
 
23. Em seguida, adicione os métodos Find e Exist usando o campo de chave primária 
da tabela como habitual. 
24. Finalmente, adicionaremos um método de validação de campo para garantir que 
a data de aquisição não é antes de hoje. Substitua o método validateField e adicione 
o seguinte código entre o código o ret = super (); linha e retorno ret ;: 
switch (ret) 
{ 
case fieldNum(ConWHSVehicleTable, AcquiredDate): 
Timezone clientTimeZone = DateTimeUtil::getClientMachineTimeZone(); 
TransDate today =DateTimeUtil::getSystemDate(clientTimeZone); 
 
 
 47 
if(this.AcquiredDateNo Dynamics 365 FO, os menus têm a mesma estrutura, mas são abertos a partir do 
menu 'burger' onde o botão logo abaixo do logotipo do Office 365 na parte superior 
esquerda da página, conforme mostrado captura de tela: 
 
 
 
 48 
 
 
 
 
 
 
 
 
 
 
 
 
 
Cada menu aparece na opção Módulos, conforme mostrado na captura de tela a 
seguir: 
 
 
 
 49 
 
 
 
Todos os itens de menu para formulários, relatórios e processos devem ser 
colocados na estrutura do menu, mesmo se depois criarmos um espaço de trabalho. 
A estrutura do menu pode parecer ter sido relaxada um pouco da estrutura rígida 
recomendado no Dynamics AX 2012. No Dynamics AX 2012, sempre temos os 
seguintes cabeçalhos principais em um menu: Comum, Consultas, Relatórios, 
Periódico e Configuração. Se nós olharmos o menu AccountsPayable no Explorador 
de Aplicativos, podemos ver que a estrutura antiga foi aplainada, conforme 
mostrado na seguinte captura de tela: 
 
 
 50 
 
 
 
A estrutura atual agora está organizada da seguinte maneira: 
 
 Workspaces: VendInvoiceWorkspace, VendPaymentWorkspaceTile. 
 Details Master (Main) tables: Vendors 
 Details Transaction (Worksheets): PurchaseOrders, VendorInvoices 
 Journals: Payments 
 Inquiries and Reports: VendPackingSlipJournal, VendTransList, 
 VendAccountStatementInt 
 Periodic tasks: PeriodicTasks 
 Set up and configuration: Setup, PolicySetup, and so on 
 
 
O menu ainda precisa de uma estrutura comum para facilitar a localização dos 
usuários opções mais facilmente, mas não estamos limitados a uma estrutura rígida. 
Você pode argumentar que o menu não tem um nó de espaço de trabalho, isso é 
porque isso foi adicionado através de um menu extensão, conforme mostrado na 
captura de tela a seguir: 
 
 
 
 
 51 
 
Vamos apenas precisar do nosso projeto aberto no Visual Studio: 
 
Para criar a estrutura de menus, siga estas etapas: 
1. Adicione um novo item ao projeto (selecione um nó de pasta e pressione Ctrl + 
Shift + A). 
2. Selecione Interface do usuário na lista à esquerda e depois Menu à direita. 
3. Digite ConWHSVehicleManagement no campo Nome e pressione OK. 
4. No designer, crie um rótulo para Gerenciamento de veículos e insira isso como 
a propriedade Label do menu. 
5. Clique com o botão direito do mouse no novo menu do designer e escolha Novo | 
Submenu 
6. Preencha da seguinte maneira para os seguintes submenus: 
 
Name Label 
Workspaces @SYS:Platform_Menu_ColHeading_Workspaces 
Vehicles Vehicles (new label) 
ServiceOrders Service orders (new label) 
PeriodicTasks @SYS76406 
InquiriesAndReports @SYS3850 
Setup @SYS333869 
 
7. Podemos adicionar mais submenus para ajudar a organizar a estrutura, se esta for 
requeridos. 
8. Salve e feche o designer de menu. 
9. Agora precisaremos estender o menu principal para que possamos navegar para 
o nosso menu. 
10. No Explorador de Aplicativos, navegue até AOT | Interface do usuário | Menus 
11. Clique com o botão direito do mouse em MainMenu e escolha Criar extensão. 
12. Renomeie o novo item em nosso projeto de MainMenu.Extension para 
MainMenu.ConWHSVehicleManagement. 
13. Abra MainMenu.ConWHSVehicleManagement. 
14. Clique com o botão direito do mouse no nó raiz e escolha Novo | Referência de 
menu. 
15. Defina as propriedades Name e Menu Name como ConWHSVehicleManagement. 
16. Salve e feche o designer. 
 
 
 
 
 
 
 52 
 
Criando um formulário de parâmetro 
Os formulários de parâmetros mostram as configurações em grupos de campos e 
guias usando um índice forma de estilo. Eles também são usados para mostrar as 
sequências numéricas configuradas para esse módulo. Estamos seguindo nossa 
solução de amostra de gerenciamento de veículos, mas esse padrão pode ser 
aplicado a qualquer tabela de parâmetros. 
 
Para criar o formulário de parâmetro, siga estas etapas: 
1. Arraste a tabela ConWHSVehicleParameters do projeto para o nó de Data 
Source no painel superior esquerdo do designer de formulários. 
2. Nomeie o formulário de acordo com o nome da tabela, nesse caso, 
ConWHSVehicleParameters. 
3. Selecione Interface do Usuário no painel esquerdo e Forma no lado direito 
painel. 
4. Escolha adicionar um novo item ao projeto. 
5. As fontes de dados fornecem opções adicionais de como essa tabela deve se 
comportar Formato. Não queremos que o usuário possa excluir e criar registros, 
portanto, altere as seguintes propriedades para Não: 
o Permitir criar 
o Permitir exclusão 
o Inserir no final 
o Inserir se vazio 
5. O designer de formulários está dividido em três áreas: O painel Formulário, o 
painel Design e Painel de conformidade de visualização / padrão, conforme 
mostrado na captura de tela a seguir: 
 
 
 
7. Vamos aplicar algumas propriedades básicas para o formulário, que são mantidas 
contra o Design nó, como mostrado aqui: 
 
 
 53 
 
Propriedade Valor Comentário 
Caption Parâmetros de gerenciamento 
de veículos 
Isso é mostrado no título do 
formulário e geralmente é o 
nome da mesa. 
Data Source ConWHSVehicleParameters Os nós filhos no formulário 
usarão isso como a 
propriedade padrão Data 
Source. 
Title Data Source ConWHSVehicleParameters Este formulário usará o 
campo de título propriedades 
da tabela e exibição no 
formulário. 
 
8. O nó Design indica que um padrão não está especificado, o que devemos fazer. 
Para aplique o padrão de formulário principal, clique com o botão direito do mouse 
no nó Design e escolha Aplicar Padrão | Índice. 
9. O painel inferior muda para a guia Padrão e mostra o padrão requerido estrutura, 
como mostrado na captura de tela a seguir: 
 
Vamos nos referir a cada nó na estrutura padrão como um elemento padrão e, para 
facilitar o design, nomeie os controles com base no nome do elemento padrão. 
10. Isso nos permite adicionar um controle Tab, então clique com o botão direito do 
mouse no nó Design e escolha Novo | Aba. 
11. O erro é removido do painel Padrão, mas mostra que não temos páginas de guias 
dentro do elemento padrão TOC Tabs (Tab). 
12. Primeiro, renomeie o novo controle para ParameterTab e adicione uma nova 
Página de guia por Clique com o botão direito do mouse sobre ele no painel Design 
e selecione Nova página de guia. 
13. A primeira guia geralmente é uma guia de configurações gerais, portanto, nomeie 
esse novo controle GeneralTabPage. 
14. Encontre um rótulo adequado para Geral e insira-o na propriedade Rótulo. 
15. À medida que alteramos o design, o designer verificará continuamente se somos 
em conformidade com o padrão. Encontrou os seguintes problemas com a ficha de 
registro ao controle: 
 
 
 54 
 
16. Devemos adicionar dois controles de Grupo, um para campos de título que 
fornecem ajuda ao usuário, e o outro para os campos que desejamos mostrar nesta 
página. 
17. Clique com o botão direito do mouse no controle GeneralTabPage e selecione 
New | Grupo. 
18. Renomeie o novo controle de grupo para GeneralTitleGroup. 
19. O painel de conformidade de padrão mostra que devemos ter um controle 
StaticText para o título principal e 0 ou 1 controles StaticText para um título 
secundário. Clique com o botão direito do mouse GeneralTitleGroup e escolha Novo 
| Texto estático. 
20. Mude o nome do novo controlo StaticText para GeneralTitleText. 
21. Crie um novo rótulo para o texto Parâmetros gerais e insira o ID no Propriedade 
de texto. 
22. Selecione novamente o controle GeneralTitleGroup e verifique se os erros de 
padrão desapareceram. 
23. Selecione novamente o GeneralTabPage, pois agora temos um erro de padrão 
para um grupo ausente. Adicione um novo controle de grupo. 
24. O novo grupo de controle sabe que também deve ter um padrão aplicado, 
indicado pelo padrão: texto após o nome do controle. Clique com 
o botão direito do mouse controle e escolha

Mais conteúdos dessa disciplina