Tipos de Dados Compostos no Formulário

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”:

{
    "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:

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.

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):

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:

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).