Administração do sistema
Telescope Script Engine
RT.FAQ-51266
O Telescope Script Engine é um linguagem de script baseada no SQL integrada ao sistema. O principal objetivo desta linguagem é de permitir aos usuários consultar e interagir com os dados do sistema:
- Consultar dados
- Exportar informações
- Montar relatórios personalizados
- Montar consultas personalizadas
- Criar operações customizados
Os scripts podem ser executados dinamicamente através da interface Executor de SQL e DML e/ou armazenados como Operações customizadas. Neste caso, eles também poderão ser agendados para serem executados periodicamente através de Agendamento de tarefas.
Segue um breve resumo da linguagem de script:
Regras gerais
- A linguagem é organizada em comandos.
- O comando é sempre iniciado por uma palavra-chave e encerrado com um ";"
- Linhas que não são encerradas com ";" são automaticamente continuadas pela linha seguinte.
SELECT - Apresentação de consultas SQL em forma de tabela
A linguagem aceita a execução de SQL nativo do banco. Qualquer comando iniciado com a palavra reservada SELECT será automaticamente executada no banco de dados e seu resultado será apresentado em uma tabela. Para formatar os valores das colunas apresentadas, basta definir antes os itens com os mesmos nomes destas colunas (ver comando ITEM).
Exemplo:
SELECT login, nome_completo
from usuarios
order by login;
Este comando suporta Regras de inferência de propriedades e características por expressão
DISPLAY - Apresentação de consultas SQL em forma de formulário
O comando DISPLAY utiliza a mesma sintaxe do comando SELECT mas apresenta os registros em forma de formulário ao invés de uma tabela.
Exemplo:
DISPLAY login, nome_completo
from usuarios
order by login;
Este comando suporta Regras de inferência de propriedades e características por expressão
TRANSPOSE - Apresentação de consultas SQL em forma de uma matriz transposta
Este comando funciona exatamente igual ao SELECT mas transpõe (operação matricial) a apresentação da tabela resultante. Desta forma, a tabela resultante terá o número de linhas igual ao número de campos retornados pela expressão e uma coluna para cada registro encontrado no SQL.
Exemplo:
Ao invés de apresentar
Pedido | Data | Valor |
|
---|
123 | 19/08/2015 | 234,50 |
|
124 | 20/08/2015 | 160,99 |
|
125 | 20/08/2015 | 85,00 |
|
Apresenta:
Pedido | 123 | 124 | 125 |
|
---|
Data | 19/08/2015 | 20/08/2015 | 20/08/2015 |
|
Valor | 234,50 | 160,99 | 85,00 |
|
PIVOT - Apresentação de consultas SQL em uma matriz
Uma PIVOT permite apresentar o resultado de uma consulta do banco de dados em forma de matriz. As linhas e as colunas apresentadas são chaves agrupadoras e os resultados agregados são apresentados na célula alinhada às respectivas chaves.
Sintaxe:
PIVOT coluna1 [, coluna2 ...]
BY coluna
USING SELECT ...
GROUP BY coluna1 [, coluna2...]
ORDER BY coluna, coluna1 [, coluna2...];
Exemplo:
pivot codigo, projeto
by data
using select p.titulo as projeto
, p.atividade as codigo
, a.data
, sum(tempo) as tempo
from apropriacao_horas a
join atividades o on o.id = a.atividade_id
join atividades p on p.id = o.pai_id
where a.data > now()::date - 3
group by a.data, p.titulo, p.atividade
order by a.data, p.atividade::numeric, p.titulo ;
O resultado desta consulta apresentará algo como:
Código | Projeto | 2018-03-02 | 2018-03-03 | 2018-03-04 | 2018-03-04 |
|
---|
1030 | ACME Consultoria | 22,1 | | 1,5 | 12,0 |
|
1047 | TESTE Implantação | 107,9 | 44,5 | 24,3 | 2,0 |
|
1065 | ACME Desing | | | 6,0 | 9,1 |
|
Para atualizar as colunas/linhas basta incluir as propriedades a baixo:
set pivot-column-summary true;
set pivot-row-summary true;
Observações:
EXPORT - Exportar dados
O comando EXPORT utiliza a mesma sintaxe do comando SELECT mas gera um arquivo CSV para ser baixado.
Exemplo:
EXPORT * from tipos_pedidos;
Caso seja necessário quebrar o arquivo CSV em vários arquivos de no máximo X linhas, deve-se primeiro definir a variável SPLIT_LINES. Exemplo:
set SPLIT_LINES 500;
export * from usuarios;
Neste caso, o arquivo baixado será é um ZIP contendo todos os arquivos gerados (os arquivos são nomeados com part-0001, part-0002, ...).
PREPARE - Repetição de comandos
O comando "prepare" pode ser utilizado quando se deseja executar o mesmo comando várias vezes com diferentes parâmetro. Os parâmetros são numerados com ${1}, ${2}, ${3} e assim sucessivamente. Para executar o comando com diferentes parâmetros, inicie a linha com um "+" seguido da relação de parâmetros.
Exemplo:
prepare ins preferencias set preferencia = ${1}, valor = ${2};
+ 'ABC.PT001', 'S';
+ 'ABC.PT002', 'B';
+ 'ABC.PT003', 'N';
+ 'ABC.PT004', 'M';
+ 'ABC.PT005', '40';
ITEM - Definir item
O comando ITEM permite definir e configurar itens que serão utilizados automaticamente em comandos como SELECT, DISPLAY, CHART, etc.
A sintaxe do comando é
ITEM nome dominio [, propriedade = valor , propriedade = valor ... ] ;
As propriedades aceitas são:
- label
- format
- prefix
- suffix
- height
- width
- null-text
- options
- style
Exemplos:
ITEM valor decimal_value, label='Valor total', width=12, prefix='R$', null-text='Não informado';
ITEM situacao opcao, label='Situação', options='C=Cancelado,E=Entregue,M=Manutenção,P=Pendente';
ITEMS - Definir conjunto de items conforme entidade
Permite capturar a definição de itens conforme estabelecido em uma determinada entidade do sistema.
Sintaxe:
ITEMS entidade [, entidade ...] ;
Exemplo:
ITEMS pedidos, itens_pedidos;
FOR ... LOOP ... END-LOOP
Permite processar um bloco para cada registro encontrado em um conjunto de registros
Sintaxe:
FOR variavel IN comando-sql LOOP
...
... ${variavel.coluna} ...
...
END-LOOP;
Exemplo:
FOR rec IN
select *
from pedidos
order by data_emissao desc
limit 20
LOOP
display '<h1>Pedido ${rec.pedido}</h1>';
display tipo.tipo_pedido
, cli.pessoa || ' - ' || cli.nome_completo as cliente
, ped.data_emissao
from pedidos ped
join pessoas cli on cli.id = ped.cliente_id
join tipos_pedidos tipo on tipo.id = ped.tipo_pedido_id
where ped.id = ${rec.id};
select sequencia, quantidade, p.produto, p.descricao
from itens_pedidos i
join produtos p on p.id = i.produto_id
where pedido_id = ${rec.id}
order by sequencia;
END-LOOP;
IF ... THEN ... [ELSE ...] END-IF
Este comando permite criar um bloco a ser executado apenas se uma condição for encontradas.
A condição pode ser qualquer expressão que pudesse ser utilizada em uma expressão WHERE do SQL.
Exemplo 1:
IF ${valor} < 0 THEN
...
END-IF;
Exemplo 2:
IF exists (select 1 from usuarios where login = 'admin') THEN
...
ELSE
...
END-IF;
Geração de gráficos
Ver Geração de gráficos utilizando o Telescope Script Engine.
Manipulação de planilhas
Ver Manipulação de planilhas com o Telescope Script Engine.
INS, UPD e DEL - Operações com entidades
O script permite executar operações diretamente com o banco de dados utilizando os comandos tradicionais INSERT, UPDATE e DELETE. Este comandos, no entanto, ignoram qualquer regra implementada na camada de persistência das entidades.
Como alternativa direta, existem os comandos INS, UPD e DEL que fazem as operações utilizando as entidades.
As sintaxes são:
INS - Inclusão
INS nome-da-entidade
[SET] coluna = expressao
[, coluna = expressao ...]
[FROM tabela
[JOIN ...]
[WHERE ...]];
O uso do FROM permite estabelecer os valores dos atributos com o resultado de uma consulta SQL qualquer. As expressões das colunas serão resultados da respectiva consulta. Para efeito de entendimento, os valores a serem utilizados nas inclusão são equivalentes ao resultado da consulta:
SELECT expressao as coluna
[, expressao as coluna ...]
FROM ...
JOIN ...
WHERE ...
[ GROUP BY ...]
[ ORDER BY ...]
Exemplo:
INS atividades
set titulo = 'Alterar senha'
, tipo_atividade_id = t.id
, responsavel_id = u.pessoa_id
from usuarios u
join tipos_atividades t on t.tipo_atividade = 'Tarefa'
where u.ativo = 'S';
UPD - Alteraçao
UPD nome-da-entidade
[SET] coluna = expressao
[, coluna = expressao ...]
[FROM tabela
[JOIN ...][
[WHERE ...];
Caso seja utilizada a clausula FROM, é obrigatório a inclusão de uma expressão ID=expressao que define o ID do registro a ser alterado.
Exemplo:
UPD atividades
set tempo_executado = sum(a.tempo)
, id = a.atividade_id
FROM apropriacao_horas a
GROUP BY a.atividade_id;
DEL - Exclusão
DEL nome-da-entidade
WHERE condicao
[ORDER BY ...]
[LIMIT ...];
Atenção
Note que quando necessário, a cláusula ORDER BY poderá ser utilizada para determinar a ordem com que as entidades serão processadas.
Comentários --
Qualquer linha que iniciar com "--" é considerada um comentário e será ignorada na execução.
CONNECT - Conexão a outros bancos de dados
Permite que o script passe a utilizar outros bancos de dados para extrair dados.
Sintaxe:
CONNECT nome-do-banco;
ou
CONNECT propriedades-de-conexão;
Existem duas forma de conectar. Na primeira opção, o banco já está configurado no sistema e basta informar o seu nome.
Exemplo:
CONNECT firebird;
Na segunda forma, não existe uma conexão pré-configurada. Neste caso, todas as propriedades de conexão são informadas.
Exemplo:
connect driver=org.firebirdsql.jdbc.FBDriver
, url=jdbc:firebirdsql://localhost:3050/C:/tmp/togni.fdb
, user=sysdba
, password=masterkey
, encoding=ISO8859_1
, charset=ISO8859_1
, lc_ctype=ISO8859_1;
CREATE-COPY - Copiar dados de outros bancos (ou não)
O comando CREATE-COPY permite montar uma tabela local com os dados resultantes de um SQL executado na mesma base de dados ou em outra:
CREATE-COPY tabela-local
[CONNECT nome-banco]
[KEYS coluna [, coluna] ]
AS SELECT expressao as coluna [, expressao as coluna] ...
FROM tabela
[JOIN ... ]
[WHERE ... ]
[GROUP BY ...]
;
A tabela local estará no banco definido no comando CONNECT.
Se usar KEYS, os dados da tabela local serão alterados quando já existir um registro com as chaves indicadas, caso contrário serão excluídos. Esta opção deixa a operação mais lenta.
A palavra DB indica o nome do banco onde os dados externos serão pesquisados.
A partir da "expressao", segue toda a sintaxe de um comando SELECT a ser executado na conexão indicada.
Os aliases das colunas devem ser o nome das colunas na tabela a ser atualizada.
O usuário pode fazer um TRUNCATE antes de executar o CREATE-COPY.
Atenção
A versão atual deste comando não replica os dados copiados, ou seja, a tabela resultante estará presente apenas na base da instância onde o comando foi executado.
SUM - Definir somatórios
Permite estabelecer itens que deverão ser totalizados no final de consultas tipo SELECT.
Sintaxe:
SUM [item [, item ...]] ;
Exemplo:
SUM valor_total;
SELECT pedido, valor_total
from pedidos
where tipo_pedido_id = 27634;
Quando se usa o comando SUM, o objeto ${sum.item} fica automaticamente preenchido com o resultado do somatório apresentado.
Somente os valores listados serão somados, por isso, recomenda-se ter cuidado com o "limit" estabelecido.
Se ocorrerem comandos SELECTs consecutivos, os totais serão acumulados a não ser que se repita o comando SUM entre estes SELECTs. Cada comando SUM redefine quais colunas serão somadas e reinicia os totais acumulados.
Um comando SUM sem parâmetros, define que nenhuma coluna será totalizada.
SUM;
DML - Execuçao e geração de scripts DML
- CREATE TABLE
- ALTER TABLE
- ...
COMMIT - Confirma as alterações realizadas
Por padrão, a execução dos comandos que alteram dados são mantidos em uma transação. O encerramento do script executa um commit implícito, porém, se a lógica do script exigir este commit em algum ponto antes do final do script, basta chamar este comando.
commit;
ROLLBACK - Descarta a transação
Ao ser chamado, todas as alterações realizadas são descartadas.
CONFIG pref=valor, pref=valor, ...
Permite configurar preferencias
LET
Permite definir uma variável com um valor.
Caso a segunda variável ser um record, cria um novo record com os mesmos atributos.
Ex:
let user = last;
PLAY-SOUND - Emitir um sinal sonoro
Permite emitir um som.
Exemplos:
play-sound error;
- Emitir um som de advertência:
play-sound warning;
- Emitir um som de sucesso:
play-sound success;
play-sound https://file-examples.com/wp-content/uploads/2017/11/file_example_MP3_700KB.mp3;
Execução de blocos
SERVICE e RUN
Os comandos SERVICE e RUN permitem executar blocos de interface.
Exemplo:
service CAD_USUARIOS;
run LIST;
SLEEP - Aguardar um tempo
Utilizado para fazer a interface aguardar alguns milissegundos antes de prosseguir.
Exemplos:
sleep 1000;
sleep 5s;
sleep 1min;
PARMS item=valor, item=valor, ... ;
Define parâmetros a serem utilizados no comando RUN.
Exemplo:
service CAD_USUARIOS;
parms q_login=R%;
run LIST;
SHOW
Este comando permite consultar as propriedades de configuração do ambiente. Estas propriedades são consultadas diretamente no mapa de configurações. A sintaxe de uso é:
show [chave] [,chave...];
As chaves são formadas pelo nome global da propriedade. Cada chave pode iniciar ou terminar com "*" para visualizar grupos de parâmetros.
Exemplos:
Listar uma determinada propriedade específica:
show RT.UI.CUSTOM_CSS;
Listar todas as customizações de CSS:
show *.CSS;
Listar todas as configurações de uma determinada interface:
show PROJET.CAD_OCORRENCIAS.*
Listar as configurações de DB:
show CONFIG.DB.*;
FORMAT-SQL
Este comando apenas formata um comando SQL (select) quebrando as linhas conforme padrão.
DML-INSERT e DML-UPDATE
Estes comandos permitem gerar scripts contendo comandos de INSERT ou UPDATE com os mesmos dados que estão atualmente na base.
A sintaxe é a seguinte:
DML-INSERT|DML-UPDATE TABELA [WHERE ...] [ORDER BY ...] [LIMIT] [OFFSET]
Onde:
- TABELA - Nome da tabela a ser utilizada. Esta tabela deverá ter obrigatoriamente uma coluna nome ID e que deve ser chave primária.
- WHERE - Condição de filtro dos registros atuais
- ORDERS BY - Ordenação com a qual deseja gerar os comandos
- LIMIT, OFFSET - Paginação dos registros desejados.
Exemplos:
dml-insert preferencias where preferencia like 'APP.%';
dml-update atividades where id=2878487;
Comando SET
Permite definir uma variável em tempo de execução:
SET variavel [AS] expressão;
A expressão pode ser uma expressão simples bem como uma expressão SQL (sem o comando select).
Se a expressão for o resultado de um SQL (sem o comando select), a variável será do tipo RECORD.
Exemplos:
set id as id from colecoes where colecao = 'PADRAO';
select * from itens_colecoes where colecao_id = ${id};
set lista as * from colecoes where colecao = 'PADRAO';
display '<h1>${lista.colecao}</h1>';
As variáveis que começarem com "db." serão automaticamente enviadas também como parâmetros do banco (ver https://www.postgresql.org/docs/9.3/runtime-config.html). Isso permite, por exemplo, alterar o idioma que o bando utiliza nas formatações de números:
set db.lc_numeric to 'pt_BR';
Para usar essa opção, a máscara do comando to_char deverá usar 'D' como separados decimal no lugar da ','.
Exemplo:
set db.lc_numeric 'pt_br';
echo to_char(12.35876, '9990D00');
Irá apresentar
12,36
Comando ASSIGN
Assim como o comando SET permite definir uma variável específica, o comando ASSIGN permite definir várias variáveis a partir de uma expressão SQL.
Exemplo:
ASSIGN * from usuarios where login = 'admin';
echo '${nome_completo}';
Comando FIND
O comando FIND permite criar uma variável do tipo entidade.
Sintaxe:
FIND nome-variavel nome-entidade WHERE condicao;
Exemplo:
FIND usr usuarios where login = 'admin';
Comando IF-NOT-FOUND
Executa comando apenas se o comando anterior não achou registros
if-not-found comando
Exemplo:
update ... where id=...;
if-not-found insert into ...;
Comando DML-SAVE
Combina os comandos DML-UPDATE, DML-INSERT e IF-NOT-FOUND e permite copiar (alterando ou inserindo) um conjunto de registros de um BD para outro.
Faz um update seguido de um insert que é executado apenas caso não encontrar o registro.
Exemplo: Criar script para atualizar todas as naturezas de operação
dml-save naturezas_operacoes;
Irá gerar várias linhas tipo:
update ... where id=...;
if-not-found insert into ...;
Comando ERROR
Permite gerar um erro e encerrar a execução do script.
Este comando pode ser utilizado, por exemplo, em scripts de validação:
ERROR mensagem [ FROM tabela ] [ WHERE condicao ];
Exemplos:
error 'Não pode continuar';
error 'Usuário ' || login || ' já é super-usuário!'
from usuarios
where ativo = 'S'
and super_usuario = 'S';
error 'Já existem ' || count(1) || ' super-usuários ativos!'
from usuarios where ativo = 'S' and super_usuario = 'S';
Se for utilizada a clausula FROM e não retornar nenhum registro, então o erro não é lançado!
Comando FILE-UPLOAD
Permite forçar o envio de um arquivo local para o servidor MASTER.
file-upload nome-arquivo
Exemplo:
file-upload /2018/03/08/cba5b8de-1aaa-4fb9-a682-5881249c1a19.jpg
Comando FILE-DOWNLOAD
Permite baixar um arquivo do MASTER para o servidor local.
file-download nome-arquivo
Exemplo:
file-download /2018/03/08/cba5b8de-1aaa-4fb9-a682-5881249c1a19.jpg
Comando RETURN
Permite encerrar o script e opcionalmente retornar um valor
return [ expressao ];
Comandos para testes unitários
Ver Testes unitários com o Telescope Script Engine
Uso de macros
Dentro de qualquer comando informado, pode-se utilizar variáveis (macros) representando as variáveis de contexto. Estas variáveis respeitam a sintaxe linguagem VTL utilizado pelo Velcity.
Qualquer comando SELECT executado, define automaticamente a variável "last" com os dados do último registro resultante na query. Desta forma, podemos utilizar o valor de qualquer uma destas colunas através da macro ${last.coluna}.
Exemplo:
select * from usuarios where login = 'admin';
select * from pedidos where usuario_inclusao_id = ${last.id};
As seguintes variáveis de contexto estão disponíveis:
${config}
Permite acesso às configurações do sistema. Como a maioria dos nomes das preferencias tem "." para separar os diversos contextos, elas deverão ser consultadas através do método GET ou os pontos deverão ser substituídos por "-".
${config.get("ADSRT.PHONE.DEFAULT_FORMAT")}
${config.ADSRT-PHONE-DEFAULT_FORMAT}
${user}
Permite acesso ao usuário da sessão.
Exemplos:
${user.id}
${user.loginName}
${session}
Permite acesso a sessão:
${session.USER_ID}
${session.PERSON_ID}
${session.ESTABELECIMENTO}
${sum}
Totais apresentados no ultimo comando SELECT.
Exemplo:
sum valor, quantidade;
select quantidade, valor, ...
from ...
where ...;
display 'Listado ${sum.quantidade} produtos totalizando ${sum.valor}.';
Parâmetros utilizados na interpretação dos comandos
Durante a execução do script, alguns parâmetros podem ser utilizados para alterar alguns comportamentos.
Estes parâmetros pode ser modificados pelo comanto "set":
- info on/off: Gera informações sobre a execução do comando, tais como o tempo que levou para executar e o número de registros processados.
- table on/off: Indica que a saída de comandos como SELECT devem ser apresentadas como tabela.
- heading on/off: Indica que as saídas geradas devem ou não gerar os cabeçalhos das colunas (comandos select e chart).
- line-break on/off: Utilizado em casos como o comando SELECT com "set table off". Indica se cada registro deve ser em uma linha separada.
- table-title: Indica que a próxima tabela deverá ser precedida de um título. O título somente é apresentado se a tabela não for vazia.
- column-separator: Indica um separador de colunas utilizado no caso de "set table off".
- transpose-align left/center/right: Usado no comando TRANSPOSE e indica o alinhamento
- warnings on/off: Permite apresentar avisos sobre a execução de comandos. Ex: analyze verbose;
- label-width: Largura do label dos campos de um formulário em um comando DISPLAY usando um render de texto.
- label-align: Alinhamento dos labels em um comando DISPLAY (left ou right)
- label-separator: Padrão ": "
Exemplo:
set table off;
set column-separator '|';
select * from interfaces_sistemas limit 10;
Resultado:
246217|OCORRENCIAS.CAD_FAQ|Cadastro de FAQs|U
246656|ADS.ENG_REVERSA|Interface para execução de engenharia reversa|U
268261|SCRUM.CAD_REQUISITOS|Administração do backlog|U
268268|PROJ.CAD_HODI|Horários disponíveis|U
268273|PROJ.HOME|Tela de entrada para a gestão de projetos|U
268275|PROJ.SETUP|Interface de configuração do sistema|U
268283|PROJ.CAD_ATIV|Cadastro de atividades|U
268290|SCRUM.CAD_PROJETOS|Cadastro de projetos|U
268297|PROJ.REP_ATIV|Tela de controle para envio de e-mails|U
268299|PROJ.CAD_TATI|Cadastro dos tipos de atividades|U
FILTER coluna [WITH item] [OPTIONAL]
Este comando programa um filtro que será automaticamente inserido no próximo comando SELECT a ser executado. O filtro é realizado "por fora", ou seja, é realizado sobre os aliases produzidos no resultado do SELECT. Este comando funciona de forma semelhante aos filtros utilizados nas operações de QUERY/LIST das aplicações T2, ou seja, obedece às operações de filtro (query-operators):
- coluna: Nome da coluna a ser filtrada.
- item: Nome do item que contém os dados do filtro. Quando não informado, o engine considera que o nome do item é igual ao nome da coluna. Caso não exista um item com este nome, o engine gera um erro ou ignora o filtro caso informado OPTIONAL.
Exemplo:
item tipo upper, value="Atendimento";
filter tipo_atividade with tipo;
select base.atividade
, base.titulo
, tipo.tipo_atividade as tipo
from atividades base
join tipos_atividades tipo on tipo.id = base.tipo_atividade_id;
No exemplo acima, caso o tipo venha registrado de um formulário onde o usuário informou "é um destes: Atendimento, Suporte", então o SQL a ser executado será:
select * from (
select base.atividade
, base.titulo
, tipo.tipo_atividade as tipo
from atividades base
join tipos_atividades tipo on tipo.id = base.tipo_atividade_id
) where tipo in ('Atendimento', 'Suporte');
Outros
- CONNECT [nome] - Conecta com outra base de dados. Caso não informado, volta a conectar com a base DEFAULT.
- SERVICE nome-global-serviço - Carrega um serviço para executar funcionalidades dele;
- PARMS nome=valor, nome=valor, ... - Define valores para serem utilizados na execução das funcionalidades de um service a seguir.
- RUN [feature [action]] - Executa uma função do service carregado.
- IF-NOT-FOUND - Executa o comando apenas se o ultimo comando não encontrou registros.
Ver também: