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:

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


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:

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


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;
play-sound warning;
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:

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


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

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




Ver também: