# Tipos de Dados Compostos no Formulário

**URL:** <https://community.latromi.com.br/t/tipos-de-dados-compostos-no-formulario/1699>\
**Category:** Backlog\
**Tags:** form, 2026-q3\
**Created:** [Dezembro 31, 2025, 1:58am UTC](https://community.latromi.com.br/t/tipos-de-dados-compostos-no-formulario/1699 "2025-12-31T01:58:34Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Dezembro 31, 2025, 1:58am UTC](https://community.latromi.com.br/t/tipos-de-dados-compostos-no-formulario/1699/1 "2025-12-31T01:58:34Z")

</div>

## Visão Geral

O Latromi possui **4 tipos de dados primitivos** , que são usados em parâmetros, variáveis e campos:

- Text
- Number
- Date/Time
- Boolean

Embora esses tipos de dados suportem a grande maioria das operações, não temos uma forma “_no-code_” de deserializar dados estruturados, como `JSON` e `XML`. A única maneira de ler essas informações, é usando um pouco de código C#, JavaScript ou SQL.

Além disso, apesar da plataforma oferecer a ação “ **Carregar Registro** ” (Record) nos Procedimentos, que permite ler as colunas de uma linha retornada do banco de dados, não temos uma forma de persistir esses dados entre procedimentos, e nem mesmo percorrer várias linhas de uma Query.

## Solução

Para permitir a deserialização de dados, bem como a leitura dessas informações, vamos implementar o suporte a **tipos de dados compostos** (e personalizados) no Formulário.

### Tipos de Dados Compostos

Será adicionado um recurso que permite **criar tipos de dados compostos** , semelhante à criação de uma tabela. Cada tipo receberá um nome e um conjunto de propriedades com tipos de dados primitivos. Uma vez que o tipo composto for cadastrado, ele se torna um novo tipo de dado, que pode ser usado em variáveis e propriedades de outros tipos de compostos.

Exemplos:

> **Tipo composto 'endereco'**
>
> Aqui temos um exemplo da criação de um tipo capaz de armazenar os dados de um endereço:
> 
> | Propriedade | Tipo | Descrição |
> | --- | --- | --- |
> | rua | Text | Nome da rua ou logradouro |
> | numero | Number | Número do endereço |
> | complemento | Text | Complemento de endereço |
> | bairro | Text | Nome do bairro |
> | cep | Text | Código postal |
> | cidade | Text | Nome da cidade |
> | uf | Text | Sigla da UF |
> | pais | Text | Nome do país |

> **Tipo composto 'cliente'**
>
> Aqui temos um exemplo da criação de um tipo capaz de armazenar os dados do cadastro de um cliente, reaproveitando o tipo composto “endereco”:
> 
> | Propriedade | Tipo | Descrição |
> | --- | --- | --- |
> | id | Number | Identificador único do cliente |
> | nome | Text | Nome do cliente |
> | fone | Text | Telefone do cliente |
> | email | Text | Endereço de e-mail do cliente |
> | endereco | **endereco** | Conjunto de dados do endereço |

Seguindo a estrutura dos exemplos acima, seria possível deserializar o `JSON` abaixo em uma variável definida com o tipo composto “cliente”:

```json
{
    "id": 568145,
    "nome": "LATROMI",
    "fone": "5130778002",
    "email": "contato@latromi.com.br",
    "endereco": {
        "rua": "Rua Liberdade",
        "numero": 33,
        "complemento": "Sala 405",
        "bairro": "Marechal Rondon",
        "cep": "92020-240",
        "cidade": "Canoas",
        "uf": "RS",
        "pais": "Brasil"
    }
}

```

### Type Builder

Para gerenciar a criação e edição dos tipos compostos, será implementado um novo componente (interno) no Latromi Client chamado **Type Builder**.

Abaixo, um protótipo de como seria a interface visual do componente:

 ![image](https://community.latromi.com.br/uploads/default/original/2X/9/96a34c358397e75ce5f235c68e6f4aac325c756c.jpeg "Protótipo do componente Type Builder")

A interface deste componente será dividida em dois painéis principais:

#### Painel de Navegação (Esquerda)

Ocupando aproximadamente **20% da largura** da janela, este painel será usado para gerenciar a lista de tipos existentes.

- **Filtro Rápido:** Um campo de texto no topo para filtrar os tipos pelo nome em tempo real.
- **Lista de Tipos:** Um _ListView_ exibindo os nomes dos Tipos Compostos cadastrados no escopo.
- **Ações:** Botões (ou Menu de Contexto) para **Adicionar** um novo tipo ou **Remover** o tipo selecionado.

#### Painel de Definição (Direita)

Ocupando o restante da largura ( **80%** ), este painel será usado para exibir a estrutura do tipo selecionado à esquerda. A edição será feita através de uma **Grid** editável contendo as seguintes colunas:

| Coluna | Componente de Edição | Descrição |
| --- | --- | --- |
| **Propriedade** | _TextBox_ | Nome da propriedade (ex: `rua`, `id`). Deve ser único dentro do tipo. |
| **Tipo** | _ComboBox_ | Seleção do tipo de dado. Listará os **4 Tipos Primitivos** + Todos os **Tipos Compostos** já criados. |
| **Lista?** | _CheckBox_ | Define se a propriedade é uma coleção/array daquele tipo (ex: `List<Text>` ou `List<endereco>`). |
| **Descrição** | _TextBox_ | Texto breve descrevendo a finalidade da propriedade (para documentação). |

Essa Grid deve oferecer a capacidade do desenvolvedor arrastar as linhas para trocar a ordem das propriedades ( **Drag and Drop** ).

### Type Builder na árvore do Formulário

O novo componente deve ser chamado através de uma opção chamada “Tipos Personalizados” na árvore do editor de Formulários.

 ![image](https://community.latromi.com.br/uploads/default/original/2X/c/c809cb86d4f2eb44408a85ba88d82eb40450b681.png)

### Declaração de Variáveis

O campo “Tipo de Dados” na declaração de variáveis deve ser atualizado para listar após todos os tipos primitivos, os tipos compostos (personalizados):

 ![image](https://community.latromi.com.br/uploads/default/original/2X/e/e7eea0732bae5e8696646d452103e3a6f34d9866.png "Declaração de variáveis do Latromi")

### Tipos compostos como marcações

Todos os locais onde o uso de variáveis é suportado, devem ser atualizados para apresentar variáveis com o tipo composto de forma hierarquica, permitindo que o desenvolvedor use qualquer nível da estrutura:

 ![image](https://community.latromi.com.br/uploads/default/original/2X/0/0ec3f0f33c9e2f7b9503c97e4ebe3a9c30d3ccbb.png)

A representação da marcação deve seguir estes modelos:

- Na composição de textos e comandos: `{?VAR.cliente.endereco.rua}`
- Em instruções de passagem de parâmetros: `VAR.cliente.endereco.rua` ou `{VAR.cliente.endereco.rua}`

Quando um segmento composto for usado (exemplo `VAR.cliente.endereco.rua`) o sistema deve retorna a representação `JSON` deste segmento.

### Ação “Popular Campos e Variáveis”

Na ação “Popular Campos e Variáveis”, só será possível atribuir valor à propriedades com tipos primitivos.

Na tela de preenchimento, serão listadas apenas as propriedades que poderão ser alteradas.

Exemplo:

- `cliente.id`
- `cliente.nome`
- `cliente.endereco.rua`

### Ação “Popular Estrutura (Deserializar)”

Deve ser criada uma nova ação para permitir que o desenvolvedor _deserialize_ dados em formato `JSON` ou `XML` para as variáveis com tipos compostos. Também deve ser possível deserializar um registro (Record) ou conjunto de registros (RecordSet) do banco de dados.

Essa ação será a contraparte da ação “Converter para `JSON` ou `XML` (Serializar)”, que foi adicionada recentemente.

### Ação “Percorrer Lista (ForEach)”

Para permitir a leitura de listas, deve ser criada uma nova ação do tipo **laço de repetição**. Essa nova ação deve permitir ao desenvolvedor selecionar uma variável (ou propriedade de variável) do tipo “Lista” (array) e declarar de uma variável para receber o item da iteração, que terá o seu tipo **inferido** a partir da lista.

Por exemplo, se o desenvolvedor estiver percorrendo uma lista do tipo “endereco”, a variável declarada para receber o item da lista deve ser considerada automaticamente como um “endereco”, oferecendo acessores para todas as propriedades deste tipo nas ações onde houver suporte, dentro do escopo do laço de repetição.

Essa ação também deve suportar o laço de repetição de **conjuntos de registros** (RecordSet), com o tipo inferido a partir da estrutura de dados retornada (colunas da Query).

---

_[View the full topic](https://community.latromi.com.br/t/tipos-de-dados-compostos-no-formulario/1699)._
