📚 addTable() - Guia Completo

Como criar tabelas interativas no sistema OndeVou

📋 295 tabelas 🔗 Relacionamentos 🎮 Controles 📱 QR Code 📊 Dashboard 📈 Gráficos 🗺️ Mapa 📋 42 principais

📚 Introdução

A função addTable() é o coração do sistema de tabelas do OndeVou.

Ela transforma uma configuração JSON em uma tabela HTML interativa com:

🔍 Busca e filtros
➕ Inserção/Edição
📱 QR Code
📊 Dashboard
📈 Gráficos
🗺️ Mapa
📤 Exportação
🔄 Relacionamentos

🏗️ Arquitetura de Funções

O sistema OndeVou segue um padrão consistente de nomenclatura e organização de funções para tabelas.

📋 Padrão de Nomenclatura

Tipo Nome Exemplo O que faz
Configuração addTable{tabela}() addTableCilindros_tipos() Define o JSON da tabela
Lista get{tabela}() (plural) getCilindros_tipos() Exibe lista/tabela com múltiplos registros
Formulário get{tabela_singular}() getCilindro() Exibe formulário de um único registro
Rotina ondevou_{numero}() ondevou_25() Configura setups específicos para uma rotina

📋 Exemplos Reais

1. Tabela com Nome Composto (Cilindros_tipos)

// 1. CONFIGURAÇÃO (JSON)
function addTableCilindros_tipos(elemPai, setups) {
    var parameters = {
        'table-id': 'cilindros_tipos',
        'data-table-ondevou': 'cilindros_tipos',
        // ...
    };
    var el = addTable(parameters, elemPai, setups);
    return (el);
}

// 2. LISTA (Múltiplos registros) - USANDO PLURAL
function getCilindros_tipos() {
    var painel = globais.dados_pagina.visivel.painel;
    var slide = globais.dados_pagina.visivel.slide;
    
    // 🔥 Obtém o JSON via getParameters
    var parametersTable = addTableCilindros_tipos('getParameters');
    var parametersFormSearch = parametersTable['formsearch'];
    globais.dados_pagina.paineis[painel][slide]['formsearch'] = parametersFormSearch;
    
    // Cria a tabela
    var elemFormTable = addForm({});
    var elemTable = addTableCilindros_tipos(elemFormTable);
    
    // Vincula todos os elementos
    document.getElementById(slide).querySelectorAll('FORM, .btn, .painel-slide-taskbar').forEach(element => {
        element.setAttribute('id-table', elemTable.id);
    });
    
    elemFormTable.style.width = "100%";
}

// 3. FORMULÁRIO (Registro único) - USANDO SINGULAR
function getCilindro(parameters) {
    // ... estrutura de 3 colunas, formulário, etc
    var setups = parameters['setups'] || {};
    var elemTable = addTableCilindros(elemForm, setups);
    // ...
}

2. Tabela Simples (Veiculos)

// 1. CONFIGURAÇÃO
function addTableVeiculos(elemPai, setups) {
    var parameters = {
        'table-id': 'veiculos',
        'data-table-ondevou': 'veiculos',
        // ...
    };
    return addTable(parameters, elemPai, setups);
}

// 2. LISTA - USANDO PLURAL
function getVeiculos() {
    var parametersTable = addTableVeiculos('getParameters');
    var parametersFormSearch = parametersTable['formsearch'];
    globais.dados_pagina.paineis[painel][slide]['formsearch'] = parametersFormSearch;
    
    var setups = { 
        'search': 'nao', 
        'html': 'nao',
        'controls': ['edit', 'qrcode']
    };
    
    var elemTable = addTableVeiculos(elemFormTable, setups);
    // ...
}

// 3. FORMULÁRIO - USANDO SINGULAR
function getVeiculo(parameters) {
    // ... estrutura de 3 colunas
    var setups = parameters['setups'] || {};
    var elemTable = addTableVeiculos(elemForm, setups);
    // ...
}

📱 data-view - Modos de Exibição

O parâmetro data-view define o modo de exibição da tabela. Cada modo tem comportamentos e estruturas diferentes.

📋 Tipos de data-view

Valor Descrição Uso Exemplo
'table' Modo lista/tabela padrão Listar múltiplos registros getCilindros()
'form' Modo formulário Editar/Incluir um registro getCilindro()
'page' Modo página com cards Visualização em cards getViewPage()
'dashboard' Modo dashboard Resumos e métricas getViewDashboard()

📊 Comparação de Modos

Configuração 'table' 'form' 'page' 'dashboard'
Taskbar ✅ Visível ❌ Oculta ❌ Oculta ❌ Oculta
Busca ✅ Sim ✅ Sim (se search='sim') ❌ Não ❌ Não
Controles ✅ Todos ✅ Apenas 'save' ❌ Nenhum ❌ Nenhum
Botão Salvar ❌ Não ✅ Sim ❌ Não ❌ Não
Cards ❌ Não ❌ Não ✅ Sim ❌ Não
Gráficos ❌ Não ❌ Não ❌ Não ✅ Sim
Resumo ❌ Não ❌ Não ❌ Não ✅ Sim
Estrutura Tabela Formulário Cards Dashboard

📋 Exemplo: data-view='form'

// Rotina de INCLUSÃO
function ondevou_25(parameters) {
    var setups = {};
    setups['data-view'] = 'form';  // ← Modo formulário
    setups['controls'] = ['copy', 'save', 'qrcode'];
    // ...
    getCilindro(parameters);
}

// Rotina de EDIÇÃO
function ondevou_26(parameters) {
    var setups = {};
    setups['data-view'] = 'form';  // ← Modo formulário
    setups['controls'] = ['save', 'qrcode'];
    setups['inputs'] = {
        'Id': { 'required': 'required' },
        'Tipo': { 'readonly': 'readonly' }
    };
    // ...
    getCilindro(parameters);
}

📌 Fonte: ondevou-app-0006.js

🏗️ Estrutura Básica

Uma tabela é definida por uma função que retorna a configuração:

function addTableCilindros(elemPai, setups) {
    var parameters = {
        'table-id': 'cilindros',
        'data-table-ondevou': 'cilindros',
        'controls': ['add', 'edit', 'save', 'delete', 'remove'],
        'headers': { ... },
        'columns': { ... },
        'formsearch': { ... }
    };
    
    var el = addTable(parameters, elemPai, setups);
    return el;
}

📌 Exemplo baseado na tabela principal cilindros

📚 Veja a documentação completa: ondevou-db-cilindros.html

⚙️ Parâmetros da addTable()

📋 Parâmetros Principais

Parâmetro Obrigatório Descrição Exemplo
table-id✅ SimID único da tabela'minha_tabela'
data-table-ondevou✅ SimNome da tabela no banco'minha_tabela'
controls❌ NãoBotões disponíveis['add', 'edit', 'save']
readonly❌ NãoTabela só leitura'sim' / 'nao'
data-view❌ NãoTipo de visualização'table' / 'form' / 'page' / 'dashboard'
data-table-auditor❌ NãoTabela de auditoria'auditor_minha_tabela'
data-table-erplinux❌ NãoTabela no ErpLinux'scsccli'

📋 Headers - Cabeçalho

Definição das colunas da tabela.

Exemplo Real da Tabela apps

{
  "Id": {
    "width": "10%"
  },
  "Ordem": {
    "width": "10%"
  },
  "Ativo": {
    "width": "10%"
  },
  "Nome": {
    "width": "30%"
  },
  "Descrição": {
    "width": "30%"
  },
  "Icone": {
    "width": "20%"
  }
}

📋 Propriedades do Header

Propriedade Descrição Valores
widthLargura da coluna'70px' / '10%'
alignAlinhamento'left' / 'right' / 'center'
typeTipo especial'hidden' / 'textarea'
sumTotalizar coluna'sum' / 'count' / 'avg'
classClasse CSS'qrcode'

📝 Columns - Definição de Campos

A seção columns define cada campo da tabela. Cada coluna pode ter diferentes tipos e comportamentos.

1. Campo Simples (text)

O tipo mais comum. Aceita entrada de texto simples.

'Campo': {
    'input': {
        'required': 'required',
        'data-type-ondevou': 'text',
        'data-field-ondevou': 'campo',
        'data-table-ondevou': 'minha_tabela',
        'placeholder': 'Digite o valor...',
        'maxlength': '100',
        'formsearch': { 'required': '' }
    }
}
📋 Propriedades do tipo text
Propriedade Descrição Exemplo
data-type-ondevouTipo de dado'text'
data-field-ondevouCampo no banco'nome'
requiredCampo obrigatório'required'
placeholderTexto de exemplo'Digite...'
maxlengthMáximo de caracteres'100'
minlengthMínimo de caracteres'3'

2. Campo Número (number)

Para valores numéricos com formatação automática.

'Valor': {
    'input': {
        'required': 'required',
        'data-type-ondevou': 'number',
        'data-field-ondevou': 'valor',
        'data-table-ondevou': 'minha_tabela',
        'onkeyup': 'setInputFormatNumber(this,`2`)',
        'onblur': 'setInputFormatNumberFull(this, 2)',
        'onfocus': 'setInputNumberOnFocus(this)'
    }
}
📋 Propriedades do tipo number
Propriedade Descrição Exemplo
data-type-ondevouTipo de dado'number'
onkeyupFormata enquanto digita'setInputFormatNumber(this,`2`)'
onblurFormata ao sair do campo'setInputFormatNumberFull(this, 2)'
onfocusPrepara para edição'setInputNumberOnFocus(this)'

3. Campo Data (date)

Para datas com seletor de calendário.

'Data': {
    'input': {
        'data-type-ondevou': 'date',
        'data-field-ondevou': 'data_emissao',
        'data-table-ondevou': 'minha_tabela',
        'type': 'date',
        'class': 'datepicker',
        'placeholder': 'DD/MM/YYYY'
    }
}
📋 Propriedades do tipo date
Propriedade Descrição Exemplo
data-type-ondevouTipo de dado'date'
typeTipo de input HTML'date'
classClasse para datepicker'datepicker'
formatFormato da data'dd/mm/yyyy'

4. Campo Checkbox

Para valores booleanos (Sim/Não).

'Ativo': {
    'input': {
        'data-type-ondevou': 'text',
        'type': 'checkbox',
        'checkbox-options': JSON.stringify({ 
            'Sim': ['S', 'N'] 
        }),
        'data-field-ondevou': 'ativo'
    }
}
📋 Propriedades do checkbox
Propriedade Descrição Exemplo
typeTipo de input'checkbox'
checkbox-optionsMapeamento Sim/NãoJSON.stringify({'Sim': ['S', 'N']})
checkedValor padrão'checked'

5. Campo ID (Primary Key)

Chave primária da tabela. Gerada automaticamente.

'Id': {
    'input': {
        'readonly': 'readonly',
        'data-type-ondevou': 'number',
        'data-field-ondevou': 'id',
        'data-field-alias-ondevou': 'id_campo',
        'data-table-ondevou': 'minha_tabela,auditor_minha_tabela'
    }
}
📋 Propriedades do ID
Propriedade Descrição Exemplo
readonlyNão editável'readonly'
data-type-ondevouTipo de dado'number'
data-field-ondevouCampo no banco'id'
data-field-alias-ondevouAlias na VIEW'id_campo'
data-table-ondevouTabelas (inclui auditoria)'minha_tabela,auditor_minha_tabela'

6. Campo com Getdata (Relacionamento)

Busca dados de outra tabela (relacionamento).

'Tipo': {
    'input': {
        'data-type-ondevou': 'number',
        'data-id-field-ondevou': 'id_tipo',
        'data-field-ondevou': 'nome_tipo',
        'data-table-ondevou': 'minha_tabela',
        'getdata': JSON.stringify(addInputParametersGetDataTipos())
    }
}
📋 Propriedades com getdata
Propriedade Descrição Exemplo
data-id-field-ondevouCampo ID da relação'id_tipo'
data-field-ondevouCampo exibido'nome_tipo'
getdataConfiguração da buscaJSON.stringify(addInputParametersGetDataTipos())

7. Campo QR Code (canvas)

Geração automática de QR Code.

'qrcode': {
    'input': {
        'readonly': 'readonly',
        'type': 'canvas',
        'qrcode-type': 'cl',
        'qrcode-text-fields': 'referencia',
        'data-type-ondevou': 'text',
        'data-field-ondevou': 'qrcode',
        'data-table-ondevou': 'qrcode'
    }
}
📋 Propriedades do QR Code
Propriedade Descrição Exemplo
typeTipo de input'canvas'
qrcode-typeTipo de QR Code'cl' (cilindro)
qrcode-text-fieldsCampos para o texto'referencia'
data-field-ondevouCampo no banco'qrcode'

8. Campo com Eventos

Eventos JavaScript para interação.

'Campo': {
    'input': {
        'data-type-ondevou': 'text',
        'data-field-ondevou': 'campo',
        'onclick': 'minhaFuncao(this)',
        'onchange': 'outraFuncao(this)',
        'onkeyup': 'setInputFormatNumber(this,`2`)',
        'onblur': 'setInputFormatNumberFull(this, 2)',
        'onfocus': 'setInputNumberOnFocus(this)'
    }
}
📋 Eventos Disponíveis
Evento Descrição Uso comum
onclickCliqueAbrir modal, executar ação
onchangeAlteraçãoAtualizar outros campos
onkeyupTecla soltaFormatação em tempo real
onkeydownTecla pressionadaValidar entrada
onblurPerda de focoFinalizar formatação
onfocusGanho de focoPreparar para edição
onpasteColarLimpar formatação ao colar
oninputEntrada de dadosValidação em tempo real
ondblclickDuplo cliqueAbrir modal de edição

📋 Resumo: Todas as Propriedades do Input

Categoria Propriedade Descrição Exemplo
Básicas readonlySomente leitura'readonly'
requiredObrigatório'required'
data-type-ondevouTipo de dado'text', 'number', 'date'
typeTipo de input HTML'text', 'checkbox', 'canvas'
Dados data-field-ondevouCampo no banco'nome'
data-field-alias-ondevouAlias para exibição'nome_view'
data-table-ondevouTabela OndeVou'minha_tabela'
data-id-field-ondevouID no OndeVou'id_campo'
Formatação placeholderTexto de exemplo'Digite...'
maxlengthMáximo de caracteres'100'
minlengthMínimo de caracteres'3'
classClasse CSS'datepicker'
Comportamento valueValor padrão'valor'
autofocusFoco automático'autofocus'
autocompleteAuto completar'off'
multipleMúltipla seleção'multiple'
Integração getdataBusca dados relacionadosJSON.stringify({...})
putdataGrava dadosJSON.stringify({...})
launchAbri documentoJSON.stringify({...})
Especiais qrcode-typeTipo de QR Code'cl', 'pr'
qrcode-text-fieldsCampos para o QR'referencia'
checkbox-optionsOpções do checkboxJSON.stringify({'Sim':['S','N']})
Eventos onclickClique'minhaFuncao(this)'
onchangeAlteração'outraFuncao(this)'
onkeyupTecla solta'setInputFormatNumber(this,`2`)'

📝 Putdata - Gravação de Dados

Configuração para gravação de dados em tabelas relacionadas.

📝 Putdata - Gravação de Dados Gravação de Dados
Tabela: cidades_bairros💾 Escrita
📌 Configuração JSON (expandida)
{
  "tabela": "bairros",
  "unique": "nome",
  "fields": {
    "nome": "nome_bairro"
  }
}
💡 Configuração para gravação de dados em tabelas relacionadas.
Propriedade Descrição Exemplo
tabela Tabela de destino 'minha_tabela'
unique Campos únicos 'participante,nome'
fields Mapeamento de campos {'nome': 'nome_campo'}
trigger Função após gravar 'setTableFromPutData()'
inputsExtras Campos extras 'participante,ip'

🔗 Getdata - Busca de Dados

Configuração para busca de dados relacionados de outras tabelas.

🔗 Getdata - Busca de Dados Busca de Dados
Campo: App🔍 Leitura
📌 Configuração JSON (expandida)
{
  "view": "view_apps",
  "data": "view_apps",
  "text-empty-search": "sim",
  "campo-data-id": "id_app",
  "campo-data-value-input": "nome_app",
  "campo-data-input-select-view": "nome_app",
  "query": {
    "select": "* from view_apps",
    "where": {
      "and": {
        "texto_digitado": {
          "left": "(unaccent(LOWER(nome_app)) ilike `%",
          "right": "%`)"
        }
      }
    }
  }
}
💡 Configuração para busca de dados relacionados de outras tabelas.
Propriedade Descrição Exemplo
view View para consulta 'view_minha_tabela'
campo-data-id Campo ID 'id_minha_tabela'
campo-data-value-input Campos para exibir 'id,nome'
text-empty-search Buscar vazio 'sim' / 'nao'
data-update-full-fields Atualizar todos 'sim' / 'nao'
reset-form Resetar formulário 'sim' / 'nao'

📱 GetCollector - Coleta de Dados

Configuração de coleta de dados via QR Code e dispositivos móveis.

📱 GetCollector - Coleta de Dados Coleta de Dados
📱 ColetaQR: cont
📌 Configuração JSON (expandida)
{
  "qrcode": {
    "qrcode-type": [
      "cont"
    ]
  },
  "table-setups": {
    "search": "nao",
    "html": "nao",
    "controls": [
      "info",
      "remove"
    ]
  }
}
💡 Configuração de coleta de dados via QR Code e dispositivos móveis.
Propriedade Descrição Exemplo
modal Abrir em modal 'sim' / 'nao'
qrcode Tipos de QR Code permitidos {'qrcode-type': ['cl', 'pr']}
table-add Tabela de coleta 'addTableColetar_dados_leituras'
table-setups Configurações da tabela {'search':'nao','html':'nao'}
id-origem-getcollector ID de origem 'id_tabela'

⚙️ Setups - Personalizando a Tabela

A função addTable() aceita um segundo parâmetro setups que permite personalizar o comportamento, visualização e funcionalidades da tabela.

📋 Como os Setups Funcionam

Quando você passa setups para a função, eles substituem as configurações padrão da tabela:

// Configuração padrão da tabela (no parameters)
var parameters = {
    'table-id': 'cilindros',
    'data-table-ondevou': 'cilindros',
    'readonly': 'sim',
    'controls': ['info', 'add', 'edit', 'save', 'delete'],
    'headers': {
        'Id': {'width': '70px'},
        'Nome': {'width': '200px'}
    }
}

// setups substitui configurações
var setups = {
    'readonly': 'nao',           // ← Sobrescreve
    'controls': ['save', 'qrcode'], // ← Sobrescreve
    'headers': ['Id', 'Nome'],   // ← Filtra colunas
    'inputs': {
        'Nome': {'readonly': ''} // ← Modifica input específico
    }
}

// Resultado: tabela editável, apenas botões save/qrcode, apenas colunas Id/Nome
var tabela = addTableCilindros(elemPai, setups)

💡 Dica: setups é um objeto opcional. Se não for passado, a tabela usa todas as configurações padrão do parameters.

📋 Lista Completa de Setups

Setup Tipo Descrição Valores Padrão
top-controls string Mostrar controles no topo 'sim' / 'nao' 'sim'
responsive string Tabela responsiva 'sim' / 'nao' 'sim'
search string Mostrar busca na tabela 'sim' / 'nao' 'sim'
launch string Habilitar launch (abrir documentos) 'sim' / 'nao' 'sim'
html string Usar HTML do parameters 'sim' / 'nao' 'nao'
before string Mostrar conteúdo before 'sim' / 'nao' 'sim'
after string Mostrar conteúdo after 'sim' / 'nao' 'sim'
data-view string Modo de exibição da tabela 'table' / 'form' / 'page' / 'dashboard' 'table'
controls array Botões disponíveis na tabela ['add','edit','save',...] ['add','edit','save','delete','remove']
headers array Colunas visíveis (ordem e filtro) ['Id','Nome',...] Todas do JSON
headers-search array Campos de busca visíveis ['Id','Nome',...] Todos
headers-remove array Colunas removidas da exibição ['Participante','Ativo'] []
controls-remove array Botões removidos da tabela ['info','cloud_sync','edit','clone','delete','marker'] []
controls-title object Personalizar títulos dos botões {'save':'Salvar','delete':'Excluir'} {}
readonly string Tabela apenas leitura 'sim' / 'nao' 'nao'
table-class string Classe CSS da tabela 'highlight' / 'striped' / 'bordered' 'responsive-table'
table-sum-top string Exibir totais no topo 'sim' / 'nao' 'sim'
table-rows-limit number Limite de linhas na tabela 100, 500, 1000 Ilimitado
table-launch-filter string Filtrar launch 'sim' / 'nao' 'sim'
data-table-delete string Permitir exclusão de registros 'sim' / 'nao' 'sim'
data-table-sync string Permitir sincronização 'sim' / 'nao' 'sim'
data-table-getdata string Validar dados existentes 'sim' / 'nao' 'sim'
data-table-update string Permitir atualização 'sim' / 'nao' 'sim'
putdata object Configuração de gravação {'trigger':'funcao()','inputsExtras':'participante,ip'} {}
getpage object Configuração de página {'page':'cilindro','campo':'id'} {}
pdf object Configuração de PDF {'format':'a3','orientation':'landscape'} {}
graficos object Configuração de gráficos {'1':{'data':{'x':'data','y':'valor'}}} {}
dashboard object Configuração de dashboard {'enabled':true,'theme':'modern'} {}
formsearch object Filtros da busca {'input':{'campo':{'type':'text'}}} {}
inputs object Substituir configurações de inputs {'Nome':{'readonly':'readonly'}} {}
startmenu object Menu inicial {'role':'view-table'} {}
role string Visualização inicial 'view-table' / 'view-plotly' / 'view-summary' / 'view-page' / 'view-dashboard' 'view-table'
routines object Rotinas associadas {'add':'25','edit':'26','summary':'getResumo'} {}

📥 getParameters - Obtendo o JSON da Tabela

A função addTable() pode ser chamada com 'getParameters' como primeiro argumento para retornar o JSON puro da configuração.

📋 Como Funciona

Quando você passa 'getParameters' como elemPai:

// Obtém o JSON da tabela
var jsonConfig = addTableCilindros('getParameters');

// jsonConfig contém:
// {
//   'table-id': 'cilindros',
//   'data-table-ondevou': 'cilindros',
//   'controls': ['info', 'add', 'edit', 'save', ...],
//   'headers': { 'Id': {'width':'70px'}, ... },
//   'columns': { 'Id': { 'input': {...} }, ... },
//   'formsearch': { ... },
//   ...
// }

// Útil para:
// - Debug
// - Documentação
// - Integração com outras ferramentas
// - Reutilização de configurações

Observação: O JSON retornado contém TODAS as configurações da tabela, incluindo colunas, headers, controles, filtros, etc.

📋 Exemplo: Usando getParameters em uma Rotina

function getCilindros() {{
    var painel = globais.dados_pagina.visivel.painel;
    var slide = globais.dados_pagina.visivel.slide;
    
    // 🔥 Obtém o JSON da tabela
    var parametersTable = addTableCilindros('getParameters');
    
    // Extrai os filtros de busca
    var parametersFormSearch = parametersTable['formsearch'];
    globais.dados_pagina.paineis[painel][slide]['formsearch'] = parametersFormSearch;
    
    // Cria a tabela com setups específicos
    var setups = {{ 'search': 'nao' }};
    var elemTable = addTableCilindros(elemFormTable, setups);
    
    // ... resto da rotina
}}

📌 Fonte: ondevou-app-0006.js (getCilindros)

🏗️ Fluxo de Renderização

Entenda como a tabela é construída no DOM passo a passo.

📋 Estrutura DOM Gerada

addTable(parameters, elemPai, setups)
    ↓
1. Processa setups (substitui configurações padrão)
    ↓
2. Cria a estrutura DOM:
   div[idTable-pai]
   ├── div[idTable-top-controls]     // Barra de ferramentas
   ├── div[idTable-before]           // Conteúdo antes
   ├── div[idTable-search]           // Campos de busca
   ├── div[idTable-table]            // Tabela principal
   │   └── fieldset
   │       └── table[idTable]
   │           ├── thead
   │           │   └── tr (cabeçalho)
   │           │       ├── th (controles)
   │           │       └── th (colunas)
   │           └── tbody
   │               └── tr (linhas)
   ├── div[idTable-auxiliar]         // Tabelas relacionadas
   ├── div[idTable-auxiliar2]        // Tabelas relacionadas
   ├── div[idTable-auxiliar3]        // Tabelas relacionadas
   ├── div[idTable-btns]             // Botões adicionais
   ├── div[idTable-after]            // Conteúdo depois
   ├── div[idTable-plotly]           // Gráficos
   ├── div[idTable-summary]          // Resumo
   ├── div[idTable-dashboard]        // Dashboard
   ├── div[idTable-pdf]              // PDF
   └── div[idTable-page]             // Página (cards)
    ↓
3. Inicializa taskbar, controles, etc
    ↓
4. Retorna o elemento table

📋 Exemplo: Tabela com Tabela Auxiliar

No caso do Romaneio, uma tabela auxiliar (romaneios_destinos) é criada:

function getRomaneio(parameters) {{
    // ... cria a tabela principal ...
    var elemTable = document.getElementById(addTableRomaneios(elemForm, setups).id);
    
    // 🔥 Cria a tabela auxiliar
    var elemTableAuxiliar = document.getElementById(elemTable.id + '-auxiliar');
    
    var setupsUnidades = {{
        'search': 'nao',
        'html': 'nao',
        'responsive': 'nao',
        'launch': 'nao',
        'data-table-sync': 'nao',
        'data-table-delete': 'nao',
        'table-launch-filter': 'nao',
        'headers': ['Id', 'Romaneio', 'Unidade', 'Motivo', 'Lat destino', 'Lng destino', 'Distância (km)'],
        'controls-remove': ['info', 'cloud_sync', 'edit', 'clone', 'delete', 'marker']
    }};
    
    var elemTableItens = document.getElementById(
        addTableRomaneios_destinos(elemTableAuxiliar, setupsUnidades).id
    );
    
    // Carrega os dados da tabela auxiliar
    if (parameters['romaneio-id'] != '') {{
        var dados_retorno = getData({{
            'query': `SELECT * FROM view_romaneios_destinos WHERE id_romaneio='${{parameters['romaneio-id']}}'`,
            'view': 'view_romaneios_destinos'
        }});
        setTableControlsSetValue(elemTableItens.id, dados_retorno);
    }}
}}

📌 Fonte: ondevou-app-0017.js (getRomaneio)

📋 Exemplos Reais do Código Fonte

Exemplos extraídos diretamente dos arquivos JavaScript do sistema, mostrando como as tabelas são configuradas em diferentes cenários.

📋 Padrão de Funções Observado

Função Nome Uso Chama
Configuração addTable{tabela}() Define JSON -
Lista get{tabela}() (plural) Exibe tabela addTable{tabela}('getParameters') + addTable{tabela}(elemFormTable, setups)
Formulário get{tabela_singular}() (singular) Exibe formulário addTable{tabela}(elemForm, setups)
Rotina ondevou_{numero}() Configura setups get{tabela_singular}(parameters)

🔹 Rotina 25 - Incluir Cilindro

cilindros data-view: form readonly: nao 3 controles 16 colunas

Formulário de inclusão de cilindro

📌 Função de Lista (plural): getCilindros()  |  📌 Função de Formulário (singular): getCilindro()

function ondevou_25(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "search": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "copy",
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Validade",
        "Descrição",
        "Referência",
        "Situação",
        "Localização",
        "Endereço",
        "Tipo",
        "Aplicação",
        "Capacidade",
        "Unidade",
        "Fabricante",
        "Propriedade",
        "Proprietário"
    ],
    "inputs": {
        "Id": {
            "launch": ""
        },
        "Descrição": {
            "texto_label": "Descrição do cilindro"
        }
    }
};
    parameters['setups'] = setups;
    getCilindro(parameters);
}
📌 Headers: Id, qrcode, Participante, Validade, Descrição... 🎮 Controles: copy, save, qrcode

🔹 Rotina 26 - Editar Cilindro

cilindros data-view: form readonly: nao 2 controles 16 colunas

Formulário de edição de cilindro

📌 Função de Lista (plural): getCilindros()  |  📌 Função de Formulário (singular): getCilindro()

function ondevou_26(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "search": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Validade",
        "Descrição",
        "Referência",
        "Situação",
        "Localização",
        "Endereço",
        "Tipo",
        "Aplicação",
        "Capacidade",
        "Unidade",
        "Fabricante",
        "Propriedade",
        "Proprietário"
    ],
    "inputs": {
        "Id": {
            "launch": "",
            "required": "required"
        },
        "Validade": {
            "readonly": "readonly"
        },
        "Tipo": {
            "readonly": "readonly"
        },
        "Aplicação": {
            "readonly": "readonly"
        },
        "Capacidade": {
            "readonly": "readonly"
        },
        "Unidade": {
            "readonly": "readonly"
        },
        "Descrição": {
            "texto_label": "Descrição do cilindro"
        }
    }
};
    parameters['setups'] = setups;
    getCilindro(parameters);
}
📌 Headers: Id, qrcode, Participante, Validade, Descrição... 🎮 Controles: save, qrcode

🔹 Rotina 271 - Editar Cilindro (outro contexto)

cilindros data-view: form readonly: nao 2 controles 16 colunas

Edição com menos campos bloqueados

📌 Função de Lista (plural): getCilindros()  |  📌 Função de Formulário (singular): getCilindro()

function ondevou_271(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "search": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Validade",
        "Descrição",
        "Referência",
        "Situação",
        "Localização",
        "Endereço",
        "Tipo",
        "Aplicação",
        "Capacidade",
        "Unidade",
        "Fabricante",
        "Propriedade",
        "Proprietário"
    ],
    "inputs": {
        "Id": {
            "launch": "",
            "required": "required"
        },
        "Validade": {
            "readonly": "readonly"
        },
        "Descrição": {
            "texto_label": "Descrição do cilindro"
        }
    }
};
    parameters['setups'] = setups;
    getCilindro(parameters);
}
📌 Headers: Id, qrcode, Participante, Validade, Descrição... 🎮 Controles: save, qrcode

🔹 Rotina 32 - Incluir Romaneio

romaneios data-view: form readonly: nao 3 controles 23 colunas

Formulário de inclusão de romaneio

📌 Função de Lista (plural): getRomaneios()  |  📌 Função de Formulário (singular): getRomaneio()

function ondevou_32(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "search": "nao",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "copy",
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Descrição",
        "Observação",
        "Permitir cilindros vazios no carregamento",
        "Permitir cilindros vencidos no carregamento",
        "Situação",
        "Rota",
        "Vendedor",
        "Romaneio erplinux",
        "Motorista",
        "Veículo",
        "Monitoramento da viagem está ativa",
        "Início da viagem",
        "Fim da viagem",
        "Data do acerto",
        "KM inicial",
        "KM final",
        "Latitude inicial",
        "Longitude inicial",
        "Latitude final",
        "Longitude final"
    ],
    "inputs": {
        "Descrição": {
            "texto_label": "Descrição do romaneio",
            "launch": ""
        },
        "Permitir cilindros vazios no carregamento": {
            "readonly": ""
        },
        "Permitir cilindros vencidos no carregamento": {
            "readonly": ""
        },
        "Rota": {
            "launch": ""
        },
        "Motorista": {
            "launch": ""
        },
        "Veículo": {
            "launch": ""
        }
    }
};
    parameters['setups'] = setups;
    getRomaneio(parameters);
}
📌 Headers: Id, qrcode, Participante, Descrição, Observação... 🎮 Controles: copy, save, qrcode

🔹 Rotina 33 - Editar Romaneio

romaneios data-view: form readonly: nao 2 controles 23 colunas

Formulário de edição de romaneio

📌 Função de Lista (plural): getRomaneios()  |  📌 Função de Formulário (singular): getRomaneio()

function ondevou_33(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Descrição",
        "Observação",
        "Permitir cilindros vazios no carregamento",
        "Permitir cilindros vencidos no carregamento",
        "Situação",
        "Rota",
        "Vendedor",
        "Romaneio erplinux",
        "Motorista",
        "Veículo",
        "Monitoramento da viagem está ativa",
        "Início da viagem",
        "Fim da viagem",
        "Data do acerto",
        "KM inicial",
        "KM final",
        "Latitude inicial",
        "Longitude inicial",
        "Latitude final",
        "Longitude final"
    ],
    "inputs": {
        "Id": {
            "required": "required"
        },
        "Descrição": {
            "texto_label": "Descrição do romaneio",
            "launch": ""
        },
        "Permitir cilindros vazios no carregamento": {
            "readonly": ""
        },
        "Permitir cilindros vencidos no carregamento": {
            "readonly": ""
        },
        "Situação": {
            "readonly": "readonly"
        },
        "Rota": {
            "launch": ""
        },
        "Motorista": {
            "launch": ""
        },
        "Veículo": {
            "launch": ""
        }
    }
};
    parameters['setups'] = setups;
    getRomaneio(parameters);
}
📌 Headers: Id, qrcode, Participante, Descrição, Observação... 🎮 Controles: save, qrcode

🔹 Rotina 40 - Alterar Situação Romaneio

romaneios data-view: form readonly: nao 2 controles 13 colunas

Alteração apenas da situação

📌 Função de Lista (plural): getRomaneios()  |  📌 Função de Formulário (singular): getRomaneio()

function ondevou_40(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Descrição",
        "Observação",
        "Permitir cilindros vazios no carregamento",
        "Permitir cilindros vencidos no carregamento",
        "Situação",
        "Rota",
        "Vendedor",
        "Romaneio erplinux",
        "Motorista",
        "Veículo"
    ],
    "inputs": {
        "Id": {
            "required": "required"
        },
        "Descrição": {
            "texto_label": "Descrição do romaneio",
            "readonly": "readonly",
            "launch": ""
        },
        "Rota": {
            "readonly": "readonly",
            "launch": ""
        },
        "Motorista": {
            "readonly": "readonly",
            "launch": ""
        },
        "Veículo": {
            "readonly": "readonly",
            "launch": ""
        }
    }
};
    parameters['setups'] = setups;
    getRomaneio(parameters);
}
📌 Headers: Id, qrcode, Participante, Descrição, Observação... 🎮 Controles: save, qrcode

🔹 Rotina 626 - Iniciar Viagem

romaneios data-view: form readonly: nao 2 controles 15 colunas

Início de viagem com campos específicos

📌 Função de Lista (plural): getRomaneios()  |  📌 Função de Formulário (singular): getRomaneio()

function ondevou_626(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Descrição",
        "Situação",
        "Rota",
        "Vendedor",
        "Motorista",
        "Veículo",
        "Monitoramento da viagem está ativa",
        "Início da viagem",
        "Fim da viagem",
        "Data do acerto",
        "KM inicial",
        "KM final"
    ],
    "inputs": {
        "Id": {
            "required": "required"
        },
        "Descrição": {
            "texto_label": "Descrição do romaneio",
            "readonly": "readonly",
            "launch": ""
        },
        "Situação": {
            "readonly": "readonly",
            "launch": ""
        },
        "Rota": {
            "readonly": "readonly",
            "launch": ""
        },
        "Motorista": {
            "readonly": "readonly",
            "launch": ""
        },
        "Veículo": {
            "readonly": "readonly",
            "launch": ""
        },
        "Monitoramento da viagem está ativa": {
            "readonly": "readonly",
            "launch": ""
        },
        "KM inicial": {
            "required": "required",
            "launch": ""
        }
    }
};
    parameters['setups'] = setups;
    getRomaneio(parameters);
}
📌 Headers: Id, qrcode, Participante, Descrição, Situação... 🎮 Controles: save, qrcode

🔹 Rotina 627 - Parar Viagem

romaneios data-view: form readonly: nao 2 controles 15 colunas

Finalização de viagem

📌 Função de Lista (plural): getRomaneios()  |  📌 Função de Formulário (singular): getRomaneio()

function ondevou_627(parameters) {
    if (parameters == undefined) {
        parameters = {};
    }
    var setups = {
    "data-table-update": "sim",
    "html": "nao",
    "readonly": "nao",
    "data-view": "form",
    "controls": [
        "save",
        "qrcode"
    ],
    "headers": [
        "Id",
        "qrcode",
        "Participante",
        "Descrição",
        "Situação",
        "Rota",
        "Vendedor",
        "Motorista",
        "Veículo",
        "Monitoramento da viagem está ativa",
        "Início da viagem",
        "Fim da viagem",
        "Data do acerto",
        "KM inicial",
        "KM final"
    ],
    "inputs": {
        "Id": {
            "required": "required"
        },
        "Descrição": {
            "texto_label": "Descrição do romaneio",
            "readonly": "readonly",
            "launch": ""
        },
        "Monitoramento da viagem está ativa": {
            "readonly": "readonly",
            "launch": ""
        },
        "Início da viagem": {
            "readonly": "readonly",
            "launch": ""
        },
        "Situação": {
            "readonly": "readonly",
            "launch": ""
        },
        "Rota": {
            "readonly": "readonly",
            "launch": ""
        },
        "Motorista": {
            "readonly": "readonly",
            "launch": ""
        },
        "Veículo": {
            "readonly": "readonly",
            "launch": ""
        }
    }
};
    parameters['setups'] = setups;
    getRomaneio(parameters);
}
📌 Headers: Id, qrcode, Participante, Descrição, Situação... 🎮 Controles: save, qrcode

📊 Matriz Comparativa de Rotinas

Comparação das configurações entre as diferentes rotinas de Cilindros e Romaneios.

Configuração Cilindros (25)
Incluir
Cilindros (26)
Editar
Romaneios (32)
Incluir
Romaneios (33)
Editar
Romaneios (40)
Alterar Situação
Romaneios (626)
Iniciar Viagem
data-view 'form' 'form' 'form' 'form' 'form' 'form'
readonly 'nao' 'nao' 'nao' 'nao' 'nao' 'nao'
controls ['copy','save','qrcode'] ['save','qrcode'] ['copy','save','qrcode'] ['save','qrcode'] ['save','qrcode'] ['save','qrcode']
search 'sim' 'sim' 'nao'
Id.required
Situação.readonly
Descrição.readonly
Tipo.readonly
Aplicação.readonly
Capacidade.readonly
Unidade.readonly
Rota.readonly
Motorista.readonly
Veículo.readonly
KM inicial ✅ required
Monitoramento.readonly
Início viagem.readonly

📌 Legenda: = Habilitado | = Desabilitado | = Não se aplica

📊 Taskbar - Barra de Ferramentas

A Taskbar é a barra de ferramentas que aparece no topo da tabela, fornecendo acesso rápido a todas as funcionalidades.

🔍 Buscar
setTableFormSearchPreload()
📋 Filtros
showId()
⏳ Atualizar
setTableFromGetViewPagePreload()
📋 Tabela
getViewTable()
🌐 Página
getViewPage()
📊 Resumo
getViewSummary()
📈 Gráficos
getViewPlotly()
📊 Dashboard
getViewDashboard()
🗺️ Mapa
getViewMapa()
📧 Email
getViewEmail()
🖨️ Imprimir
putPrintFromSlide()
📄 PDF
putPdfFromSlide()
📊 Excel
putExcelFromSlide()
◀️ Anterior
getViewLeftRight()
▶️ Próximo
getViewLeftRight()

🎮 Controles Disponíveis

Ações que o usuário pode realizar na tabela.

➕ add
Adicionar nova linha
📋 copy
Copiar linha
✏️ edit
Editar linha
💾 save
Salvar dados
🗑️ delete
Remover conteúdo
❌ remove
Excluir lançamento
📱 qrcode
Gerar QR Code
🗺️ map
Ver mapa
ℹ️ info
Informações do registro
⏳ timeline
Linha do tempo
🔄 sync
Sincronizar
📋 formulas
Fórmulas do produto
📝 edit_note
Editar nota
🔍 find
Buscar na tabela

📱 Modos de Uso

A tabela pode ser utilizada em dois modos principais.

📋 Modo Lista (Tabela)

Utilizado para exibir e gerenciar múltiplos registros, com taskbar, busca, filtros, navegação e ações.

function getCilindros() {
        var painel = globais.dados_pagina.visivel.painel;
        var slide = globais.dados_pagina.visivel.slide;

        var parametersTable =
            addTableCilindros('getParameters');

        var parametersFormSearch =
            parametersTable['formsearch'];

        globais.dados_pagina.paineis[painel][slide]['formsearch'] =
            parametersFormSearch;

        var setups = {
            'search': 'nao',
            'html': 'nao',
            'controls': ['edit', 'qrcode']
        };

        var elemFormTable = addForm({});

        var elemTable =
            addTableCilindros(
                elemFormTable,
                setups
            );

        document
            .getElementById(slide)
            .querySelectorAll(
                'FORM, .btn, .painel-slide-taskbar'
            )
            .forEach(element => {
                element.setAttribute(
                    'id-table',
                    elemTable.id
                );
            });

        elemFormTable.style.width = "100%";
    }
✅ Taskbar visível
✅ Busca e filtros
✅ Navegação
✅ Visualizações
✅ Exportações

📝 Modo Formulário (Edição)

Utilizado para inclusão, consulta e edição de um único registro.

function getCilindrosForm(parameters) {
        return new Promise((resolve, reject) => {

            if (parameters == undefined) {
                parameters = {};
            }

            if (parameters['cilindros-id'] == undefined) {
                parameters['cilindros-id'] = '';
            }

            var setups = parameters['setups'] || {};

            var elemSlide = document.getElementById(
                globais.dados_pagina.visivel.slide
            );

            elemSlide.innerHTML = `
                
`; var elemContent = document.getElementById( elemSlide.id + '-card-center' ); var elemForm = addForm( { 'name': 'cilindros', 'class': 'scrollspy' }, elemContent ); var elemTable = document.getElementById( addTableCilindros( elemForm, setups ).id ); setTableControlsInit(elemTable.id); setTableControlsInitForm(elemTable.id); if (parameters['cilindros-id'] != '') { var dados_retorno = getData({ 'query': `SELECT * FROM view_cilindros WHERE id_cilindros = '${parameters['cilindros-id']}'` }); setTableControlsSetValue( elemTable.id, dados_retorno ); } resolve(); }); }
❌ Taskbar de lista oculta
✅ Formulário organizado
✅ Inclusão e edição
✅ Botão Salvar
✅ Cards / Perfil

🚀 Funções de Inicialização

Funções responsáveis por inicializar e transformar a tabela.

setTableControlsInit()

Inicializa a tabela para edição, limpando campos e ativando a primeira linha.

setTableControlsInit('cilindros');

Fluxo: Reset → Localiza 'edit' → Ativa edição

setTableControlsInitForm()

Transforma a tabela em um formulário, reorganizando labels e inputs.

setTableControlsInitForm('cilindros');

Fluxo: Reorganiza TD → Adiciona botão Salvar → Configura rodapé

setTableControlsReset()

Remove todas as linhas e limpa os campos da tabela.

setTableControlsReset('cilindros');

Fluxo: Remove linhas → Reseta contadores → Limpa campos

setTableControlsSetValue()

Preenche a tabela com dados recebidos do banco.

setTableControlsSetValue('cilindros', dados_retorno);

Fluxo: Limpa dados → Cria linhas → Preenche campos → Atualiza taskbar

💡 Exemplos Práticos

📋 Fluxo Completo Padrão

// 1. Buscar dados com getData
var dados_retorno = getData({
    'query': `SELECT * FROM view_cilindros WHERE participante = ${globais.dados_fixo.participante}`,
    'view': 'view_cilindros'
});

// 2. Definir painel e slide
var painel = globais.dados_pagina.visivel.painel;
var slide = globais.dados_pagina.visivel.slide;

// 3. Encontrar a tabela no DOM
var idTable = getIdTableFromSlide({ 'table-id': 'cilindros' });

// 4. Resetar a tabela
setTableControlsReset(idTable);

// 5. Popular a tabela
setTableControlsSetValue(idTable, dados_retorno);

📝 Exemplo: Tabela Simples

function addTableCilindros(elemPai, setups) {
    var parameters = {
        'table-id': 'cilindros',
        'data-table-ondevou': 'cilindros',
        'controls': ['add', 'edit', 'save', 'delete', 'remove'],
        'headers': {
            'Id': { 'width': '70px' },
            'Nome': { 'width': '100%' }
        },
        'columns': {
            'Id': {
                'input': {
                    'readonly': 'readonly',
                    'data-type-ondevou': 'number',
                    'data-field-ondevou': 'id',
                    'data-table-ondevou': 'cilindros'
                }
            },
            'Nome': {
                'input': {
                    'required': 'required',
                    'data-type-ondevou': 'text',
                    'data-field-ondevou': 'nome',
                    'data-table-ondevou': 'cilindros'
                }
            }
        }
    };
    
    parameters['formsearch'] = {
        'data-table-ondevou': 'view_cilindros',
        'data-where-order': 'order by id desc'
    };
    
    addParametersFormSearch(parameters);
    var el = addTable(parameters, elemPai, setups);
    return el;
}

📱 Exemplo: Com QR Code

function addTableCilindrosComQRCode(elemPai, setups) {
    var parameters = {
        'table-id': 'cilindros',
        'data-table-ondevou': 'cilindros',
        'controls': ['add', 'edit', 'save', 'qrcode'],
        'headers': {
            'Id': { 'width': '70px' },
            'qrcode': { 'width': '100px', 'class': 'qrcode' },
            'Nome': { 'width': '200px' }
        },
        'columns': {
            'Id': {
                'input': {
                    'readonly': 'readonly',
                    'data-type-ondevou': 'number',
                    'data-field-ondevou': 'id',
                    'data-table-ondevou': 'cilindros'
                }
            },
            'qrcode': {
                'input': {
                    'readonly': 'readonly',
                    'type': 'canvas',
                    'qrcode-type': 'cl',
                    'qrcode-text-fields': 'nome',
                    'data-type-ondevou': 'text',
                    'data-field-ondevou': 'qrcode',
                    'data-table-ondevou': 'qrcode'
                }
            },
            'Nome': {
                'input': {
                    'required': 'required',
                    'data-type-ondevou': 'text',
                    'data-field-ondevou': 'nome',
                    'data-table-ondevou': 'cilindros'
                }
            }
        }
    };
    
    parameters['formsearch'] = {
        'data-table-ondevou': 'view_cilindros',
        'data-where-order': 'order by id desc'
    };
    
    addParametersFormSearch(parameters);
    var el = addTable(parameters, elemPai, setups);
    return el;
}

🔗 Exemplo: Com Getdata e Putdata

function addTableCilindrosComRelacionamento(elemPai, setups) {
    var parameters = {
        'table-id': 'cilindros',
        'data-table-ondevou': 'cilindros',
        'controls': ['add', 'edit', 'save'],
        'headers': {
            'Id': { 'width': '70px' },
            'Tipo': { 'width': '200px' },
            'Valor': { 'width': '10%', 'align': 'right', 'sum': 'sum' }
        },
        'columns': {
            'Id': {
                'input': {
                    'readonly': 'readonly',
                    'data-type-ondevou': 'number',
                    'data-field-ondevou': 'id',
                    'data-table-ondevou': 'cilindros'
                }
            },
            'Tipo': {
                'input': {
                    'required': 'required',
                    'data-type-ondevou': 'number',
                    'data-id-field-ondevou': 'id_tipo',
                    'data-field-ondevou': 'nome_tipo',
                    'data-table-ondevou': 'cilindros_tipos',
                    'getdata': JSON.stringify(addInputParametersGetDataCilindrosTipos()),
                    'putdata': JSON.stringify({
                        'tabela': 'cilindros_tipos',
                        'unique': 'participante,nome',
                        'fields': {
                            'participante': 'participante',
                            'nome': 'nome_tipo'
                        }
                    })
                }
            },
            'Valor': {
                'input': {
                    'required': 'required',
                    'data-type-ondevou': 'number',
                    'data-field-ondevou': 'valor',
                    'data-table-ondevou': 'cilindros',
                    'onkeyup': 'setInputFormatNumber(this,`2`)',
                    'onblur': 'setInputFormatNumberFull(this, 2)',
                    'onfocus': 'setInputNumberOnFocus(this)'
                }
            }
        }
    };
    
    parameters['formsearch'] = {
        'data-table-ondevou': 'view_cilindros',
        'data-where-fixed': 'participante=1',
        'data-where-order': 'order by id desc'
    };
    
    addParametersFormSearch(parameters);
    var el = addTable(parameters, elemPai, setups);
    return el;
}