Pesquisa por:
Dicas para reduzir impactos em manutenção de códigos no Fluig.

Uma das principais características do Fluig é a gestão de versão, seja em: documentos; formulários ou processos. Esta característica da plataforma faz com que seja necessário uma atenção especial na hora de alterar a estrutura de processos, documentos ou formulários, principalmente para que a manutenção não afete os processos históricos.

É comum as empresas possuírem uma grande quantidade de processos, ou mesmo que seja uma quantidade pequena a complexidade pode gerar transtornos na hora de realizar manutenções nos códigos.

Um dos exemplos é a necessidade de ajustar um elemento de integração de um processo, como por exemplo uma chave de acesso (senhas, APIS, ETC) , desta forma você vai precisar identificar onde este elemento está no Fluig.

O Ideal é que se crie na plataforma uma forma de acesso único a estes elementos, como por exemplo um dataset para unificar todas as senhas de integração.

Mas, ao escolher uma abordagem é necessário estudar todos os cenários e efetuar testes para garantir que esta senha não esteja visível para um usuário comum.

De toda forma cada projeto tem sua característica e poderá haver necessidades de incluir as credenciais diretamente no código ou qualquer outra informação que poderá eventualmente ser necessário atualizar em algum momento.

Primeira Etapa

A primeira etapa é buscar nos locais mais prováveis e mapear o código QUE será atualizado.

No exemplo abaixo iremos listar todos os datasets que contém uma informação que estamos procurando, pode ser um usuário / senha.

SELECT COD_DATASET, *
FROM SERV_DATASET
WHERE TYPE='CUSTOM' 
AND DSL_DATASET LIKE '%USUARIO / OU / SENHA%'

Podemos fazer também a consulta em eventos de formulários e processos.

SELECT * FROM EVENT_PROCES
WHERE DSL_EVENT LIKE '%USUARIO OU SENHA%'

SELECT * FROM EVENT_FICHA
WHERE DSL_EVENT LIKE '%USUARIO OU SENHA%'

Segunda Etapa

A segunda etapa é buscar nos eventos de processo e eventos de formulário se existe algum destes que estão utilizando o processo em questão.

SELECT * FROM EVENT_PROCES
WHERE DSL_EVENT LIKE '%NOME DO MEU DATASET%'

SELECT * FROM EVENT_FICHA
WHERE DSL_EVENT LIKE '%NOME DO MEU DATASET%'

Terceira etapa

A terceira etapa é verificar quais versões deste(s) processo(s) que você localizou que contém atividades ATIVAS, que podem sofrer o impacto com esta atualização. Pra isso precisaremos consultar se há alguma atividade que ainda não foi finalizada no que estamos analisando.



SELECT DISTINCT NUM_PROCES, NUM_VERS,  *
FROM PROCES_WORKFLOW
WHERE 
    COD_DEF_PROCES = 'Código do meu processo'
	AND LOG_ATIV=1


Etapa final

Após realizar este levantamento será necessário executar um plano de ação.

A alteração de DATASET tem efeito imediato, já a alteração de PROCESSOS e FORMULÁRIOS podem gerar um trabalho adicional, pois será preciso identificar as versões que serão afetadas.

Para os processos uma alternativa é fazer o ajuste criando uma nova versão e utilizando a ferramenta de conversão de processos para mover os processos em aberto para esta última versão.

É importante lembramos que (pelo fluig) não conseguimos editar a versão histórica de eventos de processos e formulários ( este último até que tem como, mas não de uma versão específica).

Em caso de dúvidas consulte o suporte oficial da plataforma. Caso tenha interesse participe de nossa comunidade através do nosso link de WhatsApp.

Leitura recomendada.

Como atualizar o script de processos dentro do Fluig?

Eventos de processos fluig [FLUXOGRAMA]

Tabelas do Banco de dados do Fluig

Palavras Chave

Como alterar códigos no fluig

Métodos para facilitar a alteração de códigos no fluig

Alterar usuário de integração no fluig.

Importando listas no Fluig.

O fluig possui um recurso chamado Listas, que fica dentro de painel de controle.

Esta lista pode ser útil para certos tipos de cadastros, assim não haverá a necessidade de criar um formulário para armazenar determinados dados, como por exemplo uma lista de CBO.

Para importar uma lista XML no Fluig é preciso definir a formatação da lista e sua estrutura.

Uma boa forma de obter o esquema XML a ser utilizado é você criar uma lista (no FLUIG) com os campos que deseja importar, em seguida clicar em exportar, desta forma terá acesso à estrutura do arquivo principal.

Recomendo que durante a geração do arquivo de estrutura você insira pelo menos dois registros na lista, assim não terá problemas para gerar a estrutura de dados no próximo passo.

Ao preencher a lista no FLUIG, abra o Excel e siga os passos descritos neste vídeo. Com isso você irá utilizar a estrutura exportada do fluig como estrutura de apoio para gerar um outro arquivo XML contendo a estrutura e os dados que deseja importar.

Em caso de dúvidas partícipe de nossos grupos whatsapp.

Como acessar as APIs de uma Lista no Fluig?

Em testes realizados até a versão da data de dezembro de 2021, as listas do fluig não implementavam o dataset de forma automática, porém o fluig disponibiliza uma forma de acesso às listas, que são através das API’s.

 /ecm/api/rest/ecm/metaList/findColumnNames/{ID_LISTA} (GET)
 /ecm/api/rest/ecm/metaList/findAllListRecords/{ID_LISTA} (GET)
 /ecm/api/rest/ecm/metaList/saveNewRecord (POST)
 /ecm/api/rest/ecm/metaList/deleteRecord/ (POST) 
 /ecm/api/rest/ecm/metaList/findRecord/{ID_LISTA}/{metaListRecordId}
 /ecm/api/rest/ecm/metaList/updateRecord

Veja mais detalhes da api neste link.

Importar lista de CBO no fluig.

Veja abaixo um exemplo de listas para serem importadas no FLUIG

O CBO é um código utilizado nacionalmente para definir e padronizar as funções e estes códigos são disponibilizados publicamente pelo Ministério do Trabalho, conforme link à seguir. Acessar WebSite Ministério do Trabalho.

Veja um exemplo de como importar uma lista de CBO no fluig. neste repositório GIT.

Referências

Evaldo. Fórum Fluig : consumir lista ( metalista ) como um dataset. Disponível em: < https://forum.fluig.com/1507-consumir-lista-metalist-como-um-dataset >. Acesso em 07 de Dez de 2021.

Cleberson. Fluig TDN : Plataformas Listas. Disponível em: < https://tdn.totvs.com/pages/releaseview.action?pageId=234455493 > . Acesso em 06 de Dez de 2021.

ALVES Laeender. Como Gerar Arquivos XML Usando o Excel. Disponível em: < https://www.youtube.com/watch?v=J98Ovx__vRM > . Acesso em 06 de Dez de 2021.

Tudo sobre formulários do Fluig.

Este artigo é recomendado à comunidade de desenvolvedores e analistas.

Disclaimer

Este é um estudo realizado em ambiente de testes, portanto serve de apoio ao entendimento dos recursos que a plataforma fluig disponibiliza.

As ações executadas são de responsabilidades do usuário.

Este artigo é independente, não tendo qualquer relação com a empresa que provê o sistema Fluig.

Os testes foram executados na versão 1.7.1.

Participe de nossa comunidade no WhatsApp. Em caso de dúvidas, ou se encontrar erros neste artigo, entre em contato comigo.

O que são formulários no Fluig?

O que são formulários no fluig? De forma simples um formulário é uma tela em HTML, composta por componentes básicos de input, como caixas de texto, checklist, radio, botões entre outros.

Além dos componentes HTML padrão, podemos definir também uma Tabela que é um componente avançado, que é chamado de PAI X FILHO.

Um PAI X FILHO no Fluig é uma tabela HTML com algumas propriedades específicas nas tags <table>, que se assemelham a um relacionamento 1 para N, isto significa que você tem uma estrutura principal que armazena um registro único, já na estrutura da tabela PAI X FILHO você permite que a estrutura de dados se repita.

Um exemplo de uso de pai x filho é: imagine que você possui um formulário com os dados de um compra. Na estrutura principal você registrará dados únicos como: nome do cliente, data de compra, endereço de entrega e etc. A tabela pai x filho , por sua vez, é o recurso que você irá precisar para registrar os itens daquela compra, ou seja, nele serão armazenados um conjunto de registros que por necessidade irão repetir os seus tipos de dados, que podem ser: nome do produto, quantidade e preço unitário.

Veja mais detalhes da implementação do pai x filho na documentação oficial da TOTVS.

Em caso de dúvidas você pode também fazer parte da nossa comunidade pelo WhatsApp.

Os tipos de formulários do fluig.

A primeira coisa que precisaremos separar aqui é o FORMULÁRIO DESENVOLVIDO e o FORMULÁRIO UTILIZADO. Lembrando que este não é um conceito oficial e sim uma separação que eu fiz aqui para explicar que desenvolvemos uma estrutura de formulários em HTML, e em seguidas utilizamos esta mesma estrutura para armazenar dados.

Formulário Desenvolvido.

Conforme dito anteriormente, ao criar um formulário no fluig (dentro da plataforma, ou nos ambientes de desenvolvimento avançado) o sistema fluig irá interpretar estes campos e salva-los no banco de dados, especificando corretamente os campos do tipo INPUT que desenvolvemos e seus respectivos nomes.

Por que salvar os dados em estruturas, em vez de simplesmente salvar somente o HTML? Porque ao gerar um formulário o fluig cria datasets internos, portanto o dataset precisa saber os dados que irá responder.

As tabelas do banco de dados utilizadas para armazenar são: FICHEIRO, e FICHEIRO_CAMPO, onde FICHEIRO é a tabela que lista os componentes do tipo PAI X FILHO.

Já a tabela FICHEIRO_CAMPO especifica, tanto na estrutura principal, quanto na estrutura de PAI X FILHO, a estrutura de armazenamento, que são todos os campos de HTML do tipo INPUT.

Também é utilizada a tabela chamada DOCUMENTO, que salva o documento de fato, é como se fosse uma representação de um documento físico.

Quando criamos um formulário o sistema armazena a sua estrutura mantendo os nomes que inserimos na TAG NAME do HTML do formulário, porém se porventura removermos este campo e enviar uma versão mais atualizada, o sistema fluig irá mantê-lo em seus registros das tabelas citadas acima,, pois aquele campo já existiu em uma versão antiga daquele formulário. Desta forma é possível acessar informações deste campo, mesmo que ele já não esteja mais disponível para uso.

Formulário Utilizado.

Vamos entender como formulário utilizado aquele formulário que já está disponível na plataforma, seja na tela GED ( Documentos ) , ou o formulário utilizado em um determinado processo.

Ao preencher dados em um formulário já desenvolvido no fluig os registros serão armazenados em uma tabela chamada DOCUMENTO.

Alterando a versão de um formulário no fluig.

Verifique o disclaimer.

A plataforma não tem uma função nativa para ajustar formulários, portanto o recomendado é testar bastante antes de enviar a versão para o servidor de produção.

Quando identificamos falha em um formulário do fluig, podemos avaliar se é falha na estrutura dos campos inputs, ou se são falhas de layout / javascript ou css.

É possível enviar um ajuste de formulário para o fluig mantendo a versão atual, porém o sistema fluig compara a versão que está sendo enviada para o sistema com a versão vigente da plataforma para aquele formulário, caso haja alguma diferença nos campos inputs (nome de inputs alterados ou inclusos) o sistema rejeita o envio do formulário mantendo a mesma versão, sendo possível então enviar apenas criando uma nova versão.

Quando os registros são salvos em formulários (também se aplica a processos), ele salva em modelo de histórico, o que significa que cada alteração ou inclusão de dados possui uma versão específica e esta versão é exibida em tela, ou seja, mesmo que você envia uma versão de um formulário novo ele não se aplicará aos formulários já registrados.

Sabendo de tudo isso podemos entender que cada formulário utilizado no fluig utiliza uma estrutura de dados previamente registradas e controladas por uma versão.

Havendo a necessidade de ajustar um formulário você pode realizar o procedimento indicado abaixo. Lembre-se analise em seu ambiente de testes.

A primeira ação a ser feita é ajustar o formulário e enviar a versão corrigida. Após realizar este procedimento você irá localizar os documentos que você precisa ajustar, para isso identifique o código do formulário em seu sistema.

Agora precisamos localizar o ID do formulário que desenvolvemos e enviamos para o ambiente fluig, a forma mais fácil é acessar a pasta que enviamos o formulário e localizar o ID do mesmo.

Para localizar, pode ser feito nas propriedades do formulário disponíveis na aba DOCUMENTO e conferir o ID do formulário, ou pode buscar também pela consulta SQL Abaixo.

SELECT DS_PRINCIPAL_DOCUMENTO, COD_EMPRESA, NR_DOCUMENTO, *
FROM DOCUMENTO
WHERE
         DOCUMENTO.COD_EMPRESA=1
     AND DOCUMENTO.DS_PRINCIPAL_DOCUMENTO LIKE '%Teste%'
     AND TP_DOCUMENTO=4

Após localizar o código do documento você pode conferir na tabela FICHARIO qual é a última versão deste documento que está estruturada.

SELECT * 
FROM FICHARIO 
WHERE 
           COD_EMPRESA = 1 
  AND NRO_DOCUMENTO='60'
ORDER BY NRO_VERSAO DESC

A consulta SQL acima irá listar a estrutura principal do formulário, com o resultado localizamos todas as versões existentes do formulário, iremos obter aquela que desejamos ajustar, geralmente a última versão.

Imagina que temos um formulário na versão 1 e queremos ajustar ele para a versão 2, uma das formas é ajustando o campo NUM_VERS_PROPRIED , da tabela DOCUMENTO ajustando para a versão desejada.

No exemplo abaixo estamos ajustando um registro de FORMULÁRIO_UTILIZADO de código 1234, onde o FORMULARIO_DESENVOLVIDO tem o código 60.

   SELECT    * 
FROM DOCUMENTO 
WHERE 
   NR_DOCUMENTO = '1234'
AND NUM_DOCTO_PROPRIED=60
AND VERSAO_ATIVA=1

Referencias

TOTVS FLUIG. Tabelas Pai x Filho. Disponível em: < https://tdn.totvs.com/pages/viewpage.action?pageId=75270483 > : Acessado em 23 Nov. 2021.

Palavras Chave

Como funciona um formulário no fluig

Quais as tabelas de formulário do fluig

Como modificar uma versão de formulário no fluig.

Capturar erros em webservices de Fórmulas Visuais.

Ao criar datasets é comum que gerem erros, pois podem acontecer situações de gerar exceções como por exemplo falhas de comunicação com o webservice, autenticação, entre outros.

Quando há a comunicação com fórmulas visuais o erro pode ser customizado, que é no momento onde geramos uma atividade de excessão.

Após diversos testes identifiquei que o código abaixo retorna a estrutura da Tag DataSetXML

   var result = authService.execute(codcoligada, idformulavisual, contexto, '',  xml, '');    		

Quando gera-se uma exceção em fórmula visual o conteúdo da mensagem é explícito na tag ErrorMessage

Para entender o funcionamento foi feita a seguinte análise, veja o código abaixo.

 

var servico = ServiceManager.getServiceInstance(NOME_SERVICO);
		            var serviceHelper = servico.getBean();
		            var instancia = servico.instantiate(CAMINHO_SERVICO);
		            var ws = instancia.getRMIwsFormulaVisual();
		            var instanciaError = instancia.getRMIwsFormulaVisual();
		            
		            
		            var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsFormulaVisual", 'mestre', 'senha');
		            
		            var xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tot="http://www.totvs.com/"> ' +
		            '<soapenv:Header/> ' +
		            '<soapenv:Body> ' +
		            '   <tot:Execute> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:codColigada>1</tot:codColigada> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:idFormula>9</tot:idFormula> ' +
		            '      <!--Optional:--> ' +
		            '      <tot:context>codusuario="mestre";codcoligada=1</tot:context> ' +
		            '   </tot:Execute> ' +
		           ' </soapenv:Body>' +
		         ' </soapenv:Envelope> ' ;
		            
		            
		            
		            var contexto = 'CODCOILIGADA=1;CODFILIAL=1;CODUSUARIO=Usuario;CODSISTEMA=G';
		            var result = authService.execute(codcoligada, idformulavisual, contexto, '',  xml, '');    	

Instanciamos uma variável chamada authService, nesta variável definimos qual objeto iremos acessar, neste caso é o ‘com.totvs.IwsFormulaVisual’.

 var authService = serviceHelper.getBasicAuthenticatedClient(ws, "com.totvs.IwsFormulaVisual", 'mestre', 'senha');

Após isso, foi observado dentro do Eclipse todos os métodos que compõem esta Interface.

Logo em seguida chamamos o método result = authService.execute , este método retorna um objeto do tipo ConWSFormulaVisualResult .

Ao analisar a classe ConWSFormulaVisualResult verifiquei que existe um método do tipo getErrorType() e getErrorMessage() , ambas retornam objeto do tipo java.xml.bind.JAXBElement<String>

Por fim, em um contexto que a fórmula visual gera uma exceção, podemos perceber os valores destas duas tags abaixo: 

O método getValue é o gerado pela classe JAXBElement, que pode ser visto neste link.

log.info('getErrorMessage() ' + result.getErrorMessage().getValue());
//Gera o resultado 
//ERRO - Fórmula Visual: 'TESTE FORMULA VISUAL'.



log.info('getErrorMessage() ' + result.getErrorType().getValue());
//RM.Lib.Workflow.RMSWorkflowException




Referências

https://docs.oracle.com/javaee/7/api/javax/xml/bind/JAXBElement.html

Validar data no fluig em datasets e eventos de processos e formulários.

Uma forma básica para validar se uma variável é do tipo DATA é tentar converter esta variável utilizando o DateTimeFormatter e LocalDate do Java.

Segue abaixo um exemplo de erro ao tentar converter data no fluig e em seguida um exemplo de sucesso na verificação da data.

Exemplo – Erro.
Exemplo – sucesso.

/**
*  Exemplo de uso
*  if(isValidDate("dd/MM/yyyy", "Data Nascimento", "18/12/1991"))
*
**/
function isValidDate(date_format, field_name, date){	
	try{
	  var df = java.time.format.DateTimeFormatter.ofPattern(date_format);
	  var convert = java.time.LocalDate.parse(date, df);
	}catch(e){
		throw "erro ao validar o campo " + field_name + ". Detalhes - " + e;
	}
	return true;
}
Enviando e-mail pelo Fluig.

Objetivo

Iremos construir um template que seja possível enviar lista de dados para melhor otimizar nosso template e código.

O artigo oficial de envio de e-mail pelo Fluig está disponível neste link, portanto o que irei destacar abaixo foram resultados de observações e estudos.

O objetivo deste estudo é entender quais tecnologias o Fluig utiliza para entregar a solução de E-mail e do Template de E-MAIL e estudar uma forma mais limpa de construir os templates.

Utilize estas informações para agregar em seus estudos, porém sempre que houver dúvidas consulte o suporte e documentação oficial do Fluig.

Disclaimer: as ações são responsabilidades dos usuários.

Caso seu fluig não dispare os e-mails consulte a documentação: fluig não dispara e-mail.

Freemarker

O freemarker é uma tecnologia em java para construção de templates, é bem utilizado nas construções de widgets.

Fazer um bom uso do FreeMarker com certeza gera ganhos em produtividade e manutenção de códigos.

Recomendo a leitura neste link: https://freemarker.apache.org/docs/ref_directive_list.html

Enviar o E-mail pelo Fluig

Para enviar o E-mail pelo Fluig é necessário utilizar o recurso onNotify, confira de forma detalhada neste link: https://tdn.totvs.com/display/public/fluig/Templates+de+e-mail+personalizado

Resultado Final

Ao executar o passo a passo abaixo você deverá ter um resultado semelhante a este:


Passo a Passo

Evento de Processo

Crie um processo e acrescente o código abaixo em um evento de processo, como por exemplo: o BeforeStateEntry

Veja abaixo que estamos utilizando a variável UFS e a variável CarrosList, desta forma enviamos a lista de objetos que será lida pelo FreeMarker.

try{
	    //Monta mapa com parâmetros do template
	    var parametros = new java.util.HashMap();
	    
	  
	    
	    //Veja mais detalhes em: 
	    parametros.put("NOME_USUARIO", "UsuarioFluig");
	    parametros.put("CODIGO_USUARIO", "UsuarioFluig");
	    parametros.put("calculo", 1+1);
	    parametros.put("SERVER_URL",    fluigAPI.getPageService().getServerURL()  ) ;
	    
//E-mail
	    parametros.put("subject", "Assunto do E-mail");
	     
	     var ufs = new java.util.ArrayList();
	     ufs.add("GO");
	     ufs.add("SP");
	     ufs.add("AC");
	     
	     
	     var carrosList = new java.util.ArrayList();
	     
	     var carro = new java.util.HashMap();
		   
	     carro.put("modelo", "GOL");
	     carro.put("cor", "BRANCO");
	     carro.put("motor", "1.0");
	     
	     carrosList.add(carro);
	     
	     var carro = new java.util.HashMap();
	     
	     carro.put("modelo", "Civic");
	     carro.put("cor", "cinza");
	     carro.put("motor", "5.0");
	     
	     carrosList.add(carro);
	     
	     var carro = new java.util.HashMap();
	     
	     carro.put("modelo", "PALIO");
	     carro.put("cor", "verde");
	     carro.put("motor", "1.5");
	     
	     carrosList.add(carro);
	     
	     var carro = new java.util.HashMap();
	     
	      
	    
	    parametros.put("estados", ufs);
	    parametros.put("carros", carrosList);
	 
	    //Monta lista de destinatários
	   
	    
	    var destinatarios = new java.util.ArrayList();
	    
	    
	    destinatarios.add("[email protected]");
	    
	    	//Envia e-mail
	    	notifier.notify("UsuarioFluig", "template_teste", parametros, destinatarios, "text/html");
	    
	     
	} catch(e){
		throw e;
	    log.info(e);
	}

Após criar o processo crie um novo arquivo html chamado template_teste.html e salve ele em seu computador, em seguida acesse o fluig > Painel de Controle > Templates de E-mail e crie um template importando este arquivo html.

HTML – Template de E-mail Fluig

Veja que as variáveis são passadas dentro deste bloco ${estado} , onde neste exemplo o estado é o nome do meu objeto no evento de processo, que foi recebido na variável de parametros.

Eu recomendo que teste utilizar da seguinte forma, ${estado!”}, pois assim a variável estado se não existir irá imprimir um valor em branco.

Este tipo de situação acontece, onde a variável pode não ter sido gerada corretamente, principalmente em elementos do tipo lista e geração dinâmica.

Utilizar este modelo onde substitui a inexistência da variável por um valor em branco pode suprimir erros, pois no primeiro exemplo, caso a variável estado não exista poderá haver erros na geração e disparo do e-mail.



Este é um exemplo de envio de e-mail  <br/> <br/>

A soma de 1 + 1 é ${calculo}  <br/> <br/>

A url do fluig é: <a href="${SERVER_URL!''}"  <br/> <br/>



<html>
	<#if estados??> 
	<tr>
		<td>UF ( Estado )</td>
	</tr>

	<#list estados as estado>
	<tr>		
       <td>
		  ${estado!''}
	    <td>
	</tr>
		</#list>
	</#if>
</html>

-------------------------------------------

LISTA DE CARROS

-------------------------------------------

<#if carros??> 
<html>
	<tr>
		<td>Marca</td>
		<td>Cor</td>
		<td>Motor</td>
	</tr>
	<#list carros as carro>
	<tr>
		<td>${carro.modelo!''}</td>
		<td>${carro.cor!''}</td>
		<td>${carro.motor!''}</td>
	</tr>
	</#list>
	</tr>
</html>
</#if>

Referências

Acessos em: 10 de ago. 2021.

https://freemarker.apache.org/docs/ref_directive_list.html
https://api.fluig.com/old/sdk/com/fluig/sdk/service/PageService.html
https://fluiggers.com.br/t/como-pegar-url-do-ambiente-fluig-que-estou/157/7

Pai x Filho Fluig – Dicas de Uso.

Como somar números dentro do pai x filho do fluig

Exemplo de como somar itens dentro da tabela pai x filho do fluig.


/**
 * 
 * Criar três campos do tipo input chamados n1, n2 e total em uma tabela pai x filho
 * Opção 01 - Criar um botão para calcular e chamar o evento onclick='calcular(this);'
 * Opção 02 - Nos campos n1 e n2 adicionar um evento onchange='calcular(this);'
 */



function calcular(obj){
    var util = new Util();
    var i = util.IndicePaiFilho(obj);

    var n1 = util.ItensPaiFilho("input","n1", i).val();
    var n2 = util.ItensPaiFilho("input","n2", i).val();

    util.ItensPaiFilho("input","total", i).val(n1 + n2);


}



//Classe Utilidade
class Util {


     // Obter os campos pai x filho do formulário.
     ItensFormulario(field_type,field_name){
        return $(`${field_type}[name='${field_name}']`) ;
      }

    //Envia o campo e ele retorna o indice do campo.
    IndicePaiFilho(obj){
     return  $(obj).attr('name').split("___")[1] ;
    
    }
    
    // Obter os campos pai x filho do formulário.
    ItensPaiFilho(field_type,field_name,field_index){
      return $(`${field_type}[name='${field_name}___${field_index}']`) ;
    }
    
    
    
    }

Como manipular um elemento do tipo select dentro do pai x filho do fluig com javascript?



 window.onload = function(){
 
 
    //varrer todo campo com o ID abaixo
   select=$("select[id*='sel_campo___'] ");

   //Quebrar todos os campos em um array.
   select.toArray().forEach((k,v)=>{
       
     //imprimir o objeto K
    console.log(k);

    //analisar o valor do campo.
    if(k.value=='sim'){  
       //para cada campo analisar a opção do campo select.   
       for(i=0;i<k.options.length;i++){
        
       //imprimir o objeto K que é o principal
       console.log(k[i]); 

       // obter o Index da tabela pai x filho daquele elemento
       var i = $(k).attr('id').split("___")[1];
       
       // acessar outro campo qualquer do campo pai x filho
       console.log($("input[name="campoQualquer___" + i).val() ); 

       
        if(k[i].value!='conforme'){
         k[i].disabled='disabled';
    }
   }
     }else if(k.value=='nap'){     
   for(i=0;i<k.options.length;i++){
      console.log(k[i]); 
      if(k[i].value!='tratado'){
         k[i].disabled='disabled'       
     }
   }
 }
 

 });
 }
 }
Campo Pai X Filho do fluig não carrega os valores nos itens.

Ao tentar carregar na tela os resultados do valor de um campo pai x filho de alguma forma os campos não são preenchidos. Isso pode ser algum erro na estrutura do seu HTML.

O erro acontece quando você salva o formulário e tenta abri-lo, o sistema não preenche todos os campos INPUTS para a apresentação.

Internamente o fluig armazena as informações, mas durante o carregamento da tela ele não gera os IDS dos campos, por isso ele não acha as referências para gerar a informação na tela, resultando assim em um campo vazio.

Este erro impacta na geração do atributo ID dos campos subsequentes, ocasionando em falhas para acesso do atributo do objeto tanto em codificações javascript ou codificações nos eventos de processo e formulário.

Para corrigir basta conferir todos os campos se eles tem a tag de fechamento.

Em meus testes, outro campo que foi fator para ocasionar inconsistências no carregamento do pai x filho foi o uso de aspas simples no atributo name do campo html.

Ao utilizar aspas simples no HTML gerou um erro ao carregar os dados no formulário, ao alterar para aspas duplas deu certo.

Não consegui localizar o fator, portanto não sei dizer se é um erro do meu arquivo HTML ou se é da plataforma, de todo caso vale a análise.

<input type="text" name="campo1" class="form-control"
 readonly="readonly" >

<input type="text" name="campo1" class="form-control"
 readonly="readonly" >

<textarea name='campo3'></textarea>

antes
<input name='campo' >

depois
<input name="campo" />

Palavras Chave

O campo fluig não carrega as telas do formulário

Os itens do pai x filho não carregam os dados do item

Consultar id do formulário na tela do ECM ou na tela de Processos por javascript.

Consulta

O objetivo deste documento é auxiliar na manipulação dos elementos da página do fluig para buscar informações do HTML e reforçar o estudo de HTML e javascript.

Para obter os dados do formulário que estão associados em um formulário do ECM, ou em um formulário da tela de processos basta usar o código abaixo.

O teste pode ser realizado copiando o código abaixo e na barra do navegador escrever javascript: e em seguida colar o código, ou colando o código no console do navegador.

Obs: o processo não pode estar na atividade início, no ged o formulário deve estar aberto.

var dados="";
 ecm = 'ecm-documentview-docframe';
 wcm = 'workflowView-cardViewer';
 el = (e)=>document.getElementById(e);
 (el(ecm)==null ?  el(wcm):  el(ecm)).src
 .split("?")[1]
 .split("&")
 .forEach((k,v)=>{
   dados+= k + "\n" 
 }); 
 alert(dados);
Alterar texto de complemento de atividade de decisão

Ao utilizar uma atividade de decisão, o fluig gera um complemento.

O Complemento gerado é baseado em uma nomenclatura específica da tarefa, que pode ser por exemplo: Tarefa automática: Decisão tomada conforme condições 1 Atividade Detino: Aprovação do Diretor.

A numeração da condição vai depender de qual foi o fluxo escolhido e não fica amigável.

Uma alternativa é utilizar o hAPI.setTaskComments para criar um comentário customizado na tarefa, logo após a execução da atividade de decisão.

Veja no exemplo abaixo, temos o seguinte fluxo:

fluxo – software: eclipse / fluig

Neste exemplo vemos uma atividade de decisão que direciona o fluxo para duas possíveis atividades.

Vamos criar um evento de processo chamado afterTaskComplete ( veja o fluxograma dos eventos de processo ) e em seguida executar o código toda vez que uma tarefa é completada.

No código iremos validar qual é o ID da próxima atividade. Se considerarmos o fluxo de exemplo a atividade “Aprovação do Diretor” tem código 9, enquanto que a atividade “Aprovação do Gestor” tem código 15.

O teste gerou o resultado abaixo:

software : eclipse / fluig
function afterTaskComplete(colleagueId,nextSequenceId,userList){
 
 
 /*
  * 
  * Variáveis principais
  * 
  * */
 
 var num_processo = getValue ("WKNumProces");     
     var usuario = getValue ("WKUser");     
     //var sequenceId = getValue("WKNumState");
     
     
   
     
     //  Atividade Aprovado pela diretoria
 if(nextSequenceId==9){     
 hAPI.setTaskComments(usuario, num_processo, 0, "Aguardando aprovação do diretor."); 
 } 
 
 
 
 //  Atividade Aprovado pela diretoria
 if(nextSequenceId==15){     
 hAPI.setTaskComments(usuario, processId, 0, "Aguardando aprovação do gerente."); 
 }
 
 
 
 }

Referências

https://tdn.totvs.com/display/public/fluig/hAPI