Pesquisa por:
A RAZONET contabilidade é confiável?

Se você está neste post é porque teve a mesma dúvida que eu: A RAZONET contabilidade é confiável?

Ao buscar por contabilidade digital a um preço acessível ( contabilidade barata ) eu me deparei com a RAZONET.

A empresa atende 100% de forma digital e a relação de confiança começou quando eu acessei uma palestra organizada pela empresa RAZONET e à partir daquele momento todas as minhas dúvidas foram sanadas.

O conteúdo educacional é bastante amplo e o atendimento é excelente, sem contar com os aplicativos que te informam sempre que há uma guia a ser paga. No meu caso eles fizeram uma análise do meu cenário e me deram todo o suporte necessário, respondendo todas as minhas dúvidas.

Além da contabilidade eles oferecem também serviços de folha de pagamento / retiradas de pró-labore.

Clique aqui e acesse o site da RAZONET, você não vai se arrepender.

Palavras Chave

Contabilidade digital

A melhor contabilidade digital

Contabilidade digital para analista de sistemas

Contabilidade digital para suporte em informática

Contador para MEI

Contador para desenvolvedor web design.

FLUIG – SQL Injection.

Utilizar datasets em formulários são situações que podem ser necessárias, e inclusive é uma abordagem que é implementada em soluções da própria totvs, como é o caso do processo padrão de aprovação de compras do FLUIG X RM.

Esta abordagem permite que o formulário esteja sempre atualizado com informações em tempo real.

Aparentemente os patchs das versões 1.7.0 e 1.7.1 do dia 25 de maio de 2021 apresentam inconsistências em acessos aos datasets realizados pelo frontend ( HTML ou javascript do formulário ).

Isso significa que se em seu processo o acesso ao webservice da plataforma é realizado diretamente pelo formulário, então o sistema poderá gerar um erro ao executar o acesso aos dados do dataset, resultando nas mensagens: “Error getting Dataset (nome do dataset): Invalid Value to parameter: _finalValue. Possible SQL Injection.”

De certa forma este erro nos dá um alerta, sobre a importância de um risco real, e pode até ser algum recurso de segurança implementado pela plataforma, entretanto ainda não consegui localizar nenhuma documentação que diz a respeito dessa situação, nem como contorna-la.

Como resolver

Aparentemente o erro só acontece quando há uma tentativa de acessar o dataset utilizando as propriedades do constraint.

Sabemos que o desenvolvimento de datasets customizados dependa de nós, Para desenvolvermos os recursos de constraint, fields e order by.

Muitas vezes é prático utilizar o constraint como forma de filtros, porém em outros são utilizadas abordagens mais diretas, como o envio de uma consulta SQL diretamente pelo dataset.

Uma alternativa para resolvermos problema é reajustar o dataset, enviando as informações pela opção dos valores em campos fields, em vez de constraint.

Isso porque o valor de fields teria o objetivo de retornar apenas os campos necessários para aquela consulta, mas dificilmente este recurso será implantado em datasets customizados, já que construimos datasets para retornar apenas aquilo que é necessário.

Outra abordagem que pode ser tentada é enviar as informações de consulta criptografada, por exemplo em base64.

Desta forma não haveria caracteres especiais enviados, como as aspas ou instruções select ( AND, OR) , o que possivelmente permitiria avançar na rotina, já que o sistema lê e permite avançar em testes que não há caracteres especiais nas informações que são enviadas em filtros pelas constraints.

Conclusão

Mesmo que haja uma solução alternativa, pode ser inviável aplicar as correções em todos os processos, já que várias empresas possuem diversos processos e integrações e deixaria o ambiente com inconsistências até que todas fossem resolvidas.

É interessante estudar cada caso e se necessário voltar uma versão do ambiente, mas sempre buscar uma resposta da empresa responsável pela plataforma.

Caso você descubra outra forma, deixe nos comentários.

Como importar Widgets do Fluig

A construção de Widgets no fluig é realizada quando se deseja fazer um desenvolvimento mais avançado na plataforma.

Aprenda aqui uma forma alternativa de dar manutenção em widgets do Fluig que você perdeu acesso ao código Original.

Pode ser comum você precisar ajustar um widget, porém não possui os códigos que foram compilados.

Por padrão, até a data de hoje, não é possível importar o Widget utilizando os recursos que a plataforma de desenvolvimento Eclipse + Plugins do fluig oferecem.

Uma forma alternativa é utilizar um software de extração de texto, como o 7-zip e copiar alguns arquivos do fluig.

De posse do software extrator de arquivos copie o arquivo que representa sua widget na pasta C:\fluig\appserver\apps

Este widget está no formato .WAR e você deverá ser capaz de identificar qual precisa trabalhar.

Copie este arquivo para uma área segura ( não é recomendado alterar nada dentro das pastas do fluig, a não ser que você saiba o que esteja fazendo.

Extraia o arquivo copiado e utilize os arquivos gerados para recriar a widget.

Como medir a velocidade da internet utilizando Python e armazenando seus dados em um backend nocode.

Acompanhei um post no LinkedIn, onde a autora Bárbara descreve como ela utilizou o Python para analisar a velocidade da internet de sua residência.

O código dela pode ser observado neste repositório: https://github.com/bguerbas

No mesmo repositório ela indica como instalar a solução.

Armazenando os dados em um backend nocode.

O Xano, como pode ser visto neste artigo , é um backend nocode que venho acompanhando nos últimos meses.

Pela simplicidade e pelo modelo entidade relacionamento, me identifiquei com a plataforma. Apesar de simples é uma plataforma também robusta.

Após testar o código da Bárbara fiz uma ramificação para meu GitHub e adaptei o projeto dela para comunicar ao servidor Xano.com.

Obs. Não foi necessário configurar autenticação a este projeto, por se tratar de um conteúdo educacional, busquei manter a simplicidade, mas futuramente será adicionado.

Criar as tabelas.

Acesse o Xano.com e crie uma tabela, clicando em Database > Add Table.

Criando uma tabela no Xano.com
Criando uma tabela no Xano.com

Preencha os campos conforme a imagem abaixo e mantenha a opção ADD BASIC CRUD ENDPOINTS marcado.

Adicionar Tabela no Xano.com

Defina agora os campos conforme exibidos abaixo ( Observação: Os campos id e created_at são criados automaticamente ) :

Clone o projeto do meu repositório: https://github.com/willianmascimiano/SpeedTest

Abra o arquivo XanoAPI.py e substitua a variável base_url pela disponível nesta tela abaixo (API ENDPOINTS)

No método POST clique em Copy Endpoint Link.

Tela de apis do Xano.com

Com o link base em mãos substitua a variável base_url dentro do arquivo XanoAPI.py

import requests



# Acessar https://xano.io/1zgzwnvj e criar uma instância. 
base_url= "https://my_url/speedtest"

def speedTestRecordSave(data_atual,hora_atual,velocidade):
    requests.post(base_url, data={'data':  data_atual, 
                                'hora':hora_atual, 
                                'velocidade' : velocidade
                                })

Resultado

Após configurado execute o aplicativo, com o comando python3 TestSpeed.py e acompanhe no painel do Xano.com os valores sendo preenchidos.

Palavras Chave

Medir internet com python

Medir velocidade da internet com Python

Xano
Conheça o XANO, um backend no-code perfeito para suas soluções de desenvolvimento.

Um backend é toda solução de software que tem como objetivo gerir a lógica do negócio [ lógicas, segurança e permissões, armazenamento em bancos de dados, etc. ] e é executada no lado do servidor.

Cada projeto de desenvolvimento de software envolve um estudo das mais variadas tecnologias do mercado. Desta forma é preciso estar sempre atento a novas tecnologias ou tendências – como o Xano, fundado em 2020.

O Xano é uma solução de back end com implementação rápida e prática e por sua simplicidade de uso o aprendizado é extremamente rápido.

Para soluções Backend é quase consenso entre todos o uso de soluções como node.js, pois possui uma comunidade bastante consolidada, além de possuir diversas bibliotecas que podem ser utilizadas para a aceleração do seu projeto.

Também é comum o uso de frameworks como Laravel (php) para criar aplicações ou até mesmo para ser usado como estrutura para backend.

Outro backend que está na ponta da lingua de qualquer desenvolvedor mobile é o firebase, da google.

Já o XANO, apesar de novo, ele implementa quase todos os recursos que um projeto necessita, de forma rápida e prática.

Instâncias

Ao criar sua conta na plataforma XANO a primeira configuração que você verá são as instâncias, que são projetos que você cria dentro da plataforma, ou seja, são ambientes.

XANO – Instances

Banco de dados Relacional.

Diferentemente das soluções no-sql ( como o firebase, por exemplo) , o XANO é um backend que utiliza tem uma abordagem mais tradicional com o uso de bancos de dados relacional.

Na imagem abaixo é possível visualizar a estrutura das tabelas. É possível definir o tipo de dados da tabela, conforme pode ser conferido na imagem.

XANO – Tables
XANO – Table relationships

Ao marcar o show table relationships, haverá uma mudança na apresentação das tabelas. Somente serão exibidos os relacionamentos.

API gerado automaticamente

Com o XANO é possível gerar API automaticamente, logo após a criação do banco de dados é possível gerar automaticamente os pontos de acesso da api.

Os métodos POST, GET, e DELETE são gerados automaticamente. É possível criar regras editando cada um destes endpoints.

api – backend xano

Também é possível configurar para que cada endpoint seja público ou utiliza a autenticação que a plataforma oferece.

XANO – Autenticação.

Autenticação – ativando a autenticação no XANO.

É possível utilizar a autenticação no XANO.

A autenticação é habilitada automaticamente ao criar uma nova instância, juntamente com uma tabela chamada user.

A autenticação fornece um endnpoint para criação de usuários, login e consultar dados do usuário que está autenticado.

XANO – Autenticação.

Ao acessar o endpoint /auth/login com credenciais válidas, o XANO irá gerar gerar um TOKEN, que servirá para acessar os demais endpoints do sistema.

Em todos os outros endpoints que você habilita a autenticação será necessário enviar um token de autenticação, e é possível recuperar as propriedades deste token como o user_id.

Autenticação – Restringir acesso ao usuário autenticado.

Aqui tenho um exemplo de como utilizar o módulo de cotação para travar uma edição.

Na API abaixo é permitido que o usuário edite um fórum, passando como parâmetro na requisição POST o id do fórum.

Então adicionamos um componente chamado Precondition , onde o user_id do parâmetro deve ser igual ao id de usuário da autenticação.

Isso fará com que seja aplicada uma restrição, permitindo que o registro de fórum só seja editado pelo usuário que está autenticado em sua instância naquele momento.

XANO – Permissões

Marketplace

A plataforma contém um marketplace, onde são listados diversos modelos de sistemas.

XANO – Marketplace

É possível, configurar – por exemplo – um sistema de compartilhamento de fotos, semelhante ao instagram apenas instalando o módulo Photo-Sharing Social Media Plataform.

XANO – PhotoSharingA

As tabelas e endpoint são criados automaticamente e estão prontos para serem implementados.

XANO – exemplo endpoints

Vídeo

Xano – Youtube

Conclusão.

Cada projeto de software exige uma implementação única, por isso é preciso estar antenado às novidades e tecnologias disponíveis no mercado.

Apesar de a empresa Xano ser uma empresa recém fundada, suas soluções surpreendem pela simplicidade e quantidades de recursos disponíveis.

É um ambiente completo, e implementação rápida.

Palavras Chave

Backend para aplicativos mobile

Backend rápidos

Backends para desenvolvimento mobile

Referências

https://www.crunchbase.com/organization/xano

https://xano.io/fi68nmde

https://www.linkedin.com/company/xano/about/

Trabalhando com datas no Fluig.

Este é um guia com as dúvidas recorrentes sobre o uso de datas durante o desenvolvimento na plataforma fluig, por isso esta página será dedicada à duvidas para indicar como trabalhar com datas no fluig.

Aprender javascript é um processo fundamental para sua evolução na plataforma.

Confira sempre as versões mais atualizadas da plataforma e sua documentação e recomendações da totvs.

Caso haja dúvidas entre em contato.

Consultar processos iniciados em um intervalo de datas no fluig

Em análises eu pude perceber que na consulta do dataset o sistema retorna o valor da data no formato timestamp, entretanto para consultar no dataset a entrada de dados é no formato descrito abaixo.

Obs. realize o teste e veja o comportamento no seu sistema.

var dt_inicio = "01/02/2021 00:00:00";
var dt_fim    = new Date().toLocaleString().split(" ")[0] + " 23:59:59" ;
c1 = DatasetFactory.createConstraint('startDateProcess', dt_inicio, dt_fim, ConstraintType.MUST);
var x =	DatasetFactory.getDataset('workflowProcess', null, [ c1 ] ,null);

Capturar a hora atual no fluig.

var time_stamp = new java.sql.Timestamp(data.getTime());
var format = new java.text.SimpleDateFormat("HH").format(time_stamp);
log.info(format);

NOTEBOOK
Inicie processos no Fluig a partir do Google Forms.

Inicie processos no fluig à partir do google forms.

Criar formulários públicos pode ser um problema no Fluig, já que a plataforma não permite que o formulário e o processo seja publicado sem a autenticação na plataforma, portanto para usá-los é necessário utilizar um login e senha.

Apesar de existirem soluções que podem ser desenvolvidas no Fluig, para exibir o formulário utilizando páginas públicas, tenho um certo receio de expor algum dataset ou ponto de entrada publicamente (veja aqui o porquê), por este motivo irei demonstrar neste artigo um passo a passo de como integrar o Google Forms ao Fluig.

Criar uma solução para entrada de dados como um sistema ou interface também é uma solução, mas dependendo do projeto uma integração utilizando o Google Forms pode ser mais que o suficiente, já que não há preocupações com infraestrutura.

Aliás, esta combinação é perfeita, já que o custo é zero e a solução atende aos requisitos de segurança, pois os dados do formulário estão protegidos pela infraestrutura do Google.

Outro ponto importante a ser destacado é a velocidade do desenvolvimento, dada a facilidade de criar formulários no Google.

Como será o processo.

Neste exemplo será tratado um processo de seleção, contendo três campos: Nome, Telefone e Pretensão salarial.

Após o preenchimento do formulário por parte do usuário, o próprio Google Forms irá buscar estas informações digitadas e irá conectar ao Fluig, utilizando webservices da plataforma, para iniciar o processo desejado.

As integrações Fluig

Há duas formas de integração com a plataforma fluig, neste exemplo irei demonstrar a integração utilizando REST. Assumindo que você já tenha criado o seu processo e o seu formulário, siga os passos abaixo.

Acesse este link e confira a documentação “Cadastrar Aplicativo no Fluig“. Você vai precisar configurar um usuário para autenticação OAuth pelo Fluig, como resultado deverá obter os seguintes dados: CUSTOMER_KEY, CUSTOMER_SECRET, ACCESS_TOKEN e TOKEN_SECRET.

Após realizar o procedimento acima você deverá terá os dados necessários para autenticação no fluig.

Em caso de dúvidas entre em contato.

O formulário do Google Forms.

Neste artigo você deverá ser capaz de construir um formulário do Google Forms. Para isso, clique aqui e crie um formulário semelhante ao criado abaixo.

Após criar o formulário e publicar, vá até as propriedades ( ícone de três pontos, exibido no canto superior direito da tela ) .

Após clicar no ícone vá até a opção Editor de Script.

Acionador / Gatilho – Google Forms – Integrando com o Fluig

Editor de Script do Google Forms.

A primeira coisa a ser feita é clicar em Bibliotecas e adicionar uma biblioteca para autenticação por OAuth1 , já que o Fluig não permite a autenticação por Auth2.

Em bibliotecas clique no botão para incluir.

Google Forms API – Incluir Biblioteca.

Na janela que é aberta insira o código abaixo:

1CXDCY5sqT9ph64fFwSzVtXnbjpSfWdRymafDrtIZ7Z_hwysTY7IIhi7s

Observação: O Google descontínuo o uso do OAuth1 em 2015, conforme pode ser conferido nesta documentação . Para utilizar o OAuth1 a google recomendou utilizar uma biblioteca opensource, que é biblioteca representada pelo script consultado na imagem acima e pode ser consultada neste repositório.

Na janela, vá na aba de codificação, conforme exibido na imagem abaixo, e renomeie o arquivo gerado para startProcess.gs.

Acionador / Gatilho – Google Forms – Integrando com o Fluig

Após criar o arquivo é necessário inserir o código Google Script.

Neste exemplo abaixo o código irá ler o último registro inserido e em seguida realiza a chamada do webservice do fluig responsável por iniciar a solicitação na plataforma.

/**
 * CONFIGURACOES DE INTEGRACAO FLUIG
 */
var FLUIG_BASE_URL = "http://minhaurl.com";
var PROCESS_NAME = 'selecionar_pessoa';


var CONSUMER_KEY = 'x';
var CONSUMER_SECRET = 'x';

var ACCESS_TOKEN = 'x';
var TOKEN_SECRET = 'x';




function startProcess() {

var form = FormApp.getActiveForm();
var formResponses = form.getResponses();
var formResponseslength = formResponses.length;

/**
 * Obter o último registro do formulário.
 */
var nome = formResponses[formResponseslength-1].getItemResponses()[0].getResponse();
var telefone = formResponses[formResponseslength-1].getItemResponses()[1].getResponse();
var salario = formResponses[formResponseslength-1].getItemResponses()[2].getResponse();


var service = getFluigService();
  var url = FLUIG_BASE_URL  + '/process-management/api/v2/processes/' + PROCESS_NAME + '/start';

/**
 * Conteúdo para inserir no formulário do processo.
 */
var data = {
  'targetAssignee': 'academy.aluno',
  'subProcessTargetState': "0",
  'comment': "",
  'formFields': {
     "nome" : nome,
     "telefone" : telefone,
     "salario": salario
  }

};



var options = {
  'method' : 'post',
  'contentType': 'application/json',
  'payload' : JSON.stringify(data)
};

  var response = service.fetch(url, options);
  var result = JSON.parse(response.getContentText());

  Logger.log(JSON.stringify(result, null, 2));



Logger.log(nome);Logger.log(telefone);Logger.log(salario)

MailApp.sendEmail("[email protected]","STATUS INTEGRACAO", "SATUS DA INTEGRACAO");

 
}



function getFluigService() {
  return OAuth1.createService('fluig')
      .setConsumerKey(CONSUMER_KEY)
      .setConsumerSecret(CONSUMER_SECRET)
      .setAccessToken(ACCESS_TOKEN, TOKEN_SECRET);
}

O resultado final deve se parecer com a imagem abaixo.

Acionadores ( Gatilhos ) do Google Forms.

Os acionadores do Google Forms nada mais são que gatilhos, que irá executar alguma ação em determinado momento.

Neste exemplo será demonstrado a execução do script logo após a inserção de uma nova resposta do formulário.

Google Forms – Acionadores

Na tela de acionadores clique em adicionar acionador – botão azul no canto inferior direito da tela.

Ao abrir a tela preencha o Acionador conforme imagem abaixo.

Acionador / Gatilho – Google Forms – Integrando com o Fluig

O resultado esperado é este.

Acionador / Gatilho – Google Forms – Integrando com o Fluig

Resultado

Após o preenchimento dos dados clique em salvar.

Google Forms

Abaixo o processo inicializado automaticamente pelo aplicativo do Google Forms.

Formulário – Fluig

Erros

O próprio Google Script disparou um erro assim que eu forcei uma conexão inexistente, entretanto será necessário realizar mais testes e controles.

Repositório

Acesse aqui o repositório que contém o processo e o formulário deste projeto.

Conclusão

Este é um modelo de integração entre o Google Forms e o Fluig, utilizando a autenticação OAuth1 do Fluig.

Uma sugestão de melhoria é construir alertas por e-mail para avisar de possíveis inconsistências.

Referências

https://stackoverflow.com/questions/50491535/how-to-call-web-service-on-google-app-script

https://developers.google.com/apps-script/reference/forms/form

https://github.com/googleworkspace/apps-script-oauth2

https://github.com/googleworkspace/apps-script-oauth1

https://github.com/googleworkspace/apps-script-oauth1/blob/master/samples/Yelp.gs

O guia completo sobre dataset do fluig.

Clique aqui e faça um treinamento, ou orçamento.

Me siga no instagram.

Deixe seus comentários no final da página.

*Artigo ainda incompleto. =)

Introdução

O dataset é como se fosse uma ‘camada’ de acesso a dados no fluig. Neste artigo vou explicar como assimilar o uso dos datasets e as consultas SQL.

Este recurso abstrai as conexões a serviços ou bases de dados – uma vez que os dados estão disponíveis – sendo necessário que o desenvolvedor apenas saiba realizar a chamada deste dataset.

Um exemplo disso é que você pode chamar os usuários do fluig sem conhecer sua implementação, até mesmo construir e publicar um formulário e a própria plataforma vai criar e gerenciar o dataset para você.

É possível acessar dados do próprio fluig, através de webservices da plataforma, ou datasets que a própria plataforma disponibiliza.

Observação: nem sempre é necessário criar um dataset para acessar webservices.

Como criar um dataset.

Um dataset pode se criado da forma simples, ou complexa. Ambos podem ser feitos diretamente pela plataforma do Fluig, através do menu Painel de controle > Desenvolvimento > Datasets.

Dataset Simples

O dataset simples é criado em uma tela que facilita a criação de datasets.

Após acessar a tela de dataset clique em novo dataset > simples.

Após a abertura da tela será necessário preencher os campos:

Código: é o código do dataset.
Descrição: o nome do dataset
Serviço: Selecione o serviço que deseja se conectar, que podem ser Soap, Rest e JDBC.
Operação: Cada serviço irá solicitar (ou não) uma operação específica. A operação nada mais é que parâmetros que o serviço possa solicitar.

Veja mais detalhes aqui sobre serviços.

Dataset Complexo

A TOTVS diz em sua documentação que a criação de dataset’s completos é feito em javascript, essa afirmação é contraditória. Apesar da sintaxe ser semelhante ao javascript é possível executar códigos java dentro de datasets, como o uso da das classes java String, Base64 do java e outras.

O desenvolvimento do dataset complexo no fluig pode ser feito de duas formas, a primeira dela é por codificação em uma IDE de desenvolvimento (como o eclipse) em seguida exportando para o servidor. A segunda forma é utilizar o editor de datasets dentro da própria plataforma do fluig.

Para criar um dataset avançado é preciso acessar a tela de dataset , clicar em novo dataset > avançado.

Abaixo um exemplo de código de dataset, com os devidos comentários.

function createDataset(fields, constraints, sortFields) {
    var ds = DatasetBuilder.newDataset();
    
    //Colunas
    ds.addColumn("Usuário");
    ds.addColumn("E-Mail");
      
    //Linhas
    ds.addRow(new Array("Willian", "[email protected]"));
 
     
    return ds;
}

Ao criar um novo dataset, por uma IDE ou pelo próprio fluig é gerado uma função createDataset. O código dentro desta função é o que será chamado durante o uso do dataset.

Esta função espera um retorno do tipo dataset, por isso é realizado uma chamada do método newDataset.

Este construtor de dataset (DatasetBuilder)

Como consultar um dataset de tabela pai x filho?

Para consultar um dataset de uma tabela pai x filho é interessante observarmos alguns fatores, que são: Ao criar o formulário e inserir uma tabela pai x filho, o sistema FLUIG irá gerar toda a estrutura necessária para armazenar os dados, entretanto não irá gerar um dataset para aqueles dados.

A documentação oficial indica então consultarmos o dataset principal, aplicando algumas constraints no dataset, para que seja retornado elementos do dataset.

O estranho é que os elementos que aplicamos se refere aos nomes das tabelas, entretanto estes campos ficam meio que ‘ocultos’, não sendo possível vê-los nos elementos no dataset principal do formulário.

Faça este exercício: crei um formulário e acrescente um elemento pai x filho, logo em seguida consulte os valores do dataset deste formulário. Você verá as informações somente do formulário. Logo em seguida, se seguir os passos abaixos e criar um dataset próprio para os elementos desta tabela pai x filho, verá que o mesmo dataset que você utilizou no início deste exercício, apenas enviando a constraint tablename, desta forma serão retornados os elementos da tabela. Ainda fiquei sem entender como a plataforma faz isso, mas o objetivo aparenta ser abstrair essas complexidades facilitando o desenvolvimento e a entrega dos projetos.

O primeiro passo é criar um novo dataset, se seu formulário chama ds_meu_formulario e sua tabela pai x filho chama boletos eu sugiro que este novo dataset tenha um nome parecido com ds_meu_formulario_boletos

O segundo passo é copiar o código abaixo e colar neste novo dataset e atente-se para alterar as linhas 4, 17 , 27.

function createDataset(fields, constraints, sortFields) {
 
 
 var dataset_principal = DatasetFactory.getDataset("ds_meu_formulario", null, constraints, null);
 var resultados = [];
 for (var i = 0; i < dataset_principal.rowsCount; i++) {
 var documentId = datasetPrincipal.getValue(i, "metadata#id");
 var documentVersion = datasetPrincipal.getValue(i, "metadata#version");
  
 /***
  * 
  * Criar as constraints para consultar os datasets para consultar os itens da tabela do formulário pai x filho.
  * 
  * */
 var c1 = DatasetFactory.createConstraint("tablename", "nome_da_tabela_do_html", "nome_da_tabela_do_html", ConstraintType.MUST);
 var c2 = DatasetFactory.createConstraint("metadata#id", documentId, documentId, ConstraintType.MUST);
 var c3 = DatasetFactory.createConstraint("metadata#version", documentVersion, documentVersion, ConstraintType.MUST);
 var constraintsFilhos = new Array(c1, c2, c3);
 

 /**
  * Consultar no dataset do formulário os dados referentes à tabela de itens do configurador
  * 
  * */
 var datasetFilhos = DatasetFactory.getDataset("ds_meu_formulario", null, constraintsFilhos, null);
 return datasetFilhos;

 }
 

 }

O terceiro passo é consultar alterar os valores ds_meu_formulario pelo nome do dataset que você escolheu ao criar o formulário. Também altere o conteúdo de nome_da_tabela_do_html -> aqui você irá informar qual é o nome do elemento table (tabela pai x filho ) que você escolheu ao criar o formulário.

O quarto passo é consultar os dados do formulário.

Dica: uma forma de agilizar os testes de dataset é utilizando o console do navegador para completar as atividades de teste. Se não sabe como fazer veja o tópico abaixo.

A melhor forma para testar dataset na plataforma fluig.

Uma das melhores formas de testar datasets no fluig é através do console do navegador, para isso faça os seguintes passos.

Para este procedimento é importante observarmos que precisaremos forçar o carregamento da biblioteca de acesso aos datasets pelo frontend da plataforma, para isso basta acessar alguma página que contenha algum widget que acessa algum dataset.

Ao abrir o widget, a plataforma está fazendo a implementação dos arquivos necessários para carregar o dataset.

Se você está em dúvidas de qual página seguir, ou não tem nenhum widget siga estes passos abaixo. ( Tanto faz, funcionará na tela de Widgets, ou na tela abaixo).

Primeiro passo é Abrir o navegador, de preferência google chrome ou firefox, e apertar a tecla F12.

Navegue até a página painel de controle > datasets > escolha um dataset qualquer e execute a opção de Consultar dataset.

Sistema fluig – tela DataSets

Ao fazer isso o sistema irá carregar as bibliotecas necessárias para nossos testes.

Na aba console do navegador digite o comando. Ao dar enter o resultado esperado é uma lista com todos os datasets do seu sistema.

Este procedimento indica que deu certo, caso dê alguma inconsistência tente os passos acima novamente.

Console navegador firefox

Para avançarmos neste teste preciso só orientar que o desenvolvimento vai ser um pouco diferenciado nesta tela se comparado aos processos de consulta de dataset dos eventos de processo, pois nos eventos de processos utiliza-se uma biblioteca que provavelmente está mais vinculado ao java, enquanto que no frontend / console do navegador utilizamos javascript puro.

Um exemplo destas diferenças é o método de contagem de um elemento Array, que no frontend / javascript é lenght, enquanto que no fluig será o rowsCount.

Leve em consideração esta informação, pois ela é importante caso dê certo utilizar componentes ou funções no javascript / console, mas pode não dar certo se usar no backend ( eventos de formulários / processos ) .

Agora você pode utilizar o console e buscar um dataset qualquer, já que o resultado esperado é que o dataset seja carregado.

var dataset_principal = DatasetFactory.getDataset("ds_meu_formulario", null, constraints, null);

Consulta intervalos de valores em datasets no Fluig

A consulta de intervalos de valores no SQL pode ser também pesquisada como “Consultar BETWEEN em datasets no Fluig”.

No código abaixo o colleague representa o dataset que lista todos os usuários do Fluig e estamos passando como parâmetro a variável c1, que representa a constraint.

var c1 = DatasetFactory.createConstraint("colleagueName", "a", "d", ConstraintType.SHOULD);
usuarios_fluig = DatasetFactory.getDataset("colleague", null, [c1])

Na variável C1 criamos uma constraint colleagueName com intervalo entre os valores A e D, que são os valores de início e fim desta consulta no dataset. O fluig – internamente – vai executar uma consulta semelhante a esta abaixo:

SELECT * FROM tabela_usuario WHERE nome>='a' and nome<='d'

Conclusão

Esta é uma documentação de apoio aos desenvolvedores, que complementa as informações da documentação oficial da plataforma.

O conteúdo deste artigo será extenso e portanto será revisado frequentemente.

Deixe nos comentários suas dúvidas e navegue no site em busca de outras dicas.

problemas comuns fluig
Problemas comuns em desenvolvimento Fluig.

Neste guia irei abordar o que denominei: problemas comuns em desenvolvimentos na plataforma fluig, que nada mais são que problemas que eu experimentei durante o desenvolvimento de alguns projetos na plataforma.

O uso desses componentes faz com que, ao ser renderizados em tela, as características do seu desenvolvimento sofram algumas alterações e você poderá passar por alguns problemas.

Vamos aos problemas, em caso de dúvida deixe nos comentários.

Se você deseja uma consultoria acesse este link.

1 – Como esconder campos do tipo ZOOM no Fluig?

Se em algum momento você precisar esconder campos ZOOM no fluig você poderá ter problemas.

Ao inserir no código <input type=’zoom’ /> o fluig irá interpretar aquele campo e aplicará algumas modificações, que irão formar a solução ZOOM, por este motivo você não conseguirá ocultar este campo diretamente.

Até este momento eu não consegui achar uma solução para o ZOOM, por este motivo a minha sugestão é criar um campo do tipo select – mas só funcionará para seleções de dados pré-definidos e com pouca quantidade.

Caso você tenha esta resposta, por favor deixe nos comentários.

2 – Como esconder campos no Fluig.

2.1 – Show / Hide

Para esconder campos do tipo SELECT no fluig, basta utilizar o evento de formulário displayFields, entretanto você poderá utilizar como alternativas também o jQuery, para tratar situações dinâmicas no próprio formulário.

$('#sel_campo').hide();
$('#sel_campo').show();

Se optar por utilizar jQuery / Javascript no formulário, você poderá ter algumas dificuldades, que listo abaixo.

2.2 – Formulários Fluig: Os comportamentos da visão e edição.

Ao movimentar o processo você poderá perceber que os comandos SHOW / HIDE não irão funcionar, pois existem duas diferenças no comportamento do fluig, o primeiro deles é o formulário de edição, enquanto que o segundo é o formulário que lista os dados.

Saber dessa diferenciação é importante, mas o que é mais importante é entender o comportamento do software ao armazenar os dados, por este motivo sugiro que seja estudado as principais tabelas de bancos de dados do fluig, disponíveis neste link, para acompanhar e entender o comportamento do software.

Durante a tela de exibição você não conseguirá acessar as propriedades dos campos do tipo INPUT, pois eles são alterados.

2.3.1 – Tela de Edição.

Exibir campos na tabela de edição é a forma mais simples, pois o comportamento do software é aquele que esperamos durante o desenvolvimento. O Formulário real é renderizados em tela e o acessamos de forma direta.

simples assim.
$('#meucampo').hide();

2.3.2 – Tela de Exibição.

Os problemas começam aqui, durante a exibição em tela o formulário é renderizados de outra forma, onde o sistema omite os campos do tipo INPUT e substituem por tags SPAN e/ou DIV.

Uma forma de verificar em qual tela está é utilizar os eventos de formulários para descobrir modo do formulário, se é Edição ou Exibição, e em seguida enviar esta informação para o formulário.

// logo será acrescentado algum exemplo.

Apesar da plataforma sugerir utilizar eventos de formulários como displayFields e enableFields esta solução pode não ser a suficiente para alguns casos.

Partindo do pressuposto que o desenvolvedor passe por uma situação que o formulário precise ser dinâmico – ou seja – enquanto o usuário manipula as informações o formulário em tela precisa ser reestruturado, irei abordar a manipulação dos elementos html utilizando javascript.

O exemplo abaixo é de um código que analisa os elementos HTML do formulário, acessando suas propriedades através do seu ID, desta forma é possível assumir a forma do elemento e manipular este elemento de acordo com sua forma.

arquivo.js

var meucampo = $('#meucampo');
var no = $(meucampo)[0].nodeName ;
	
if(no=="SELECT" && meucampo.val()=='VALOR_ESPERADO')   {
	
console.log('Ao verificar que o nó é do tipo SELECT, já é possível assumir que estamos na tela de edição. ');

}else if(regime[0].innerText=="VALOR_ESPERADO" && no=="SPAN") ){
   console.log("Foi verificado que a tag do HTML utilizada para renderizar a tela é do tipo SPAN, logo posso assumir que esta é a tela de exibição.') ; 
	  
	  }

3 – Como utilizar o readonly em INPUT SELECT no Fluig

Por alguma forma o campo do tipo SELECT no fluig, quando alimentado por dados de dataset, perde a manipulação dos elementos readonly.

Uma forma alternativa de contornar este problema é desabilitar os eventos de mouse do campo, aplicando a propriedade style=’pointer-events:none‘.

Infelizmente, aplicar este recurso diretamente ao SELECT não surtirá nenhum efeito, por isso a abordagem é inserir o seu campo SELECT dentro de uma DIV e em seguida manipular as propriedades desta DIV.

Obs: este recurso só irá permitir desabilitar o mouse, o teclado permanece inalterado.

	$('#div_sel_meucampo' + linha).prop('style', 'pointer-events:none');