Agrupamento e Ordenação:
#GROUP
Definição: Em consultas onde o agrupamento não pôde ser feito pela consulta este macro instrui ao broker para agrupar o resultado pelos campos informados nos parâmetros.
Exemplo:#CALL millenium.clientes.lista(); #GROUP(bairro);
#ORDER
Definição: Em consultas onde a ordenação não pôde ser feita pela consulta esta macro instrui ao broker para ordenar o resultado pelos campos informados nos parâmetros.
Exemplo:#CALL millenim.acoes.lista(); #ORDER(codigo);
#PJMASTER
Definição: Serve para fazer várias consultas que tem uma chave em comum mantendo as consultas relacionadas entre si com esta chave devolvendo ao cliente como se fosse uma única consulta, deve ser sempre usada com o #PJSLAVE e o campo usado como parâmetro deve estar em todas as consultas. Será exibido apenas um item para cada chave do #PJSLAVE.
Exemplo: #PJMASTER(produto) SELECT produto, cod_produto, descricao1 FROM produtos;
#PJSLAVE(produto) SELECT produto, foto FROM fotos;
#PJSLAVE
Definição: Veja #PJMASTER.
#ROWSET
Definição: Esta macro tem como função agregar uma sub-consulta para cada ocorrência da consulta à que a mesma se refere, tendo como obrigatório o nome desta consulta para constar nos resultados do método. Seu uso pode ser encadeado tendo a estrutura definida como registro no editor de métodos. Como parâmetro recebe a nova consulta nomeada ou uma chamada de outro método usando a macro #CALL.
Exemplos: SELECT:main cliente, gerador, nome #ROWSET(“SELECT:CONTATOS nome
FROM contatos_cliente WHERE cliente=:main.CLIENTE”)
#ROWSET(#CALL:ENDERECO Millennium.enderecos_cadastro.consulta( gerador=:main.gerador) FROM CLIENTES;
Aritmética
#ABS
Definição: Este macro é usado para substituir pela função correspondente à retornar o número absoluto sem sinal. Recebe como parâmetro o número que se deseja tirar o sinal.
Exemplo: SELECT #ABS(valor_inicial) FROM lancamentos;
#CEIL
Definição: Este macro é usado para substituir pela função correspondente a retornar um número inteiro arredondado sempre para cima de um número real. Recebe como parâmetro a real.
Exemplo: SELECT #CEIL(valor_inicial) FROM lancamentos;
#DIV
Definição: Este macro é usado para substituir pela função correspondente à fazer uma divisão de inteiros ou seja retorna apenas a parte inteira da divisão. Recebe como parâmetros o dividendo e o divisor.
Exemplo: SELECT #DIV(7,2) as valor FROM DUAL;
#FLOOR
Definição: Este macro é usado para substituir pela função correspondente a retornar um número inteiro arredondado sempre para baixo de um número real. Recebe como parâmetro o número real.
Exemplo: SELECT #FLOOR(valor_inicial) FROM lancamentos;
#MAX_NUM
Definição: Este macro é usado para substituir pela função correspondente a retornar o maior entre dois valores. Recebe como parâmetros as expressões que serão comparadas.
Exemplo: SELECT #MAX_NUM(numero1, numero2) as valor FROM DUAL;
#MIN_NUM
Definição: Este macro é usado para substituir pela função correspondente a retornar o menor entre dois valores. Recebe como parâmetros as expressões que serão comparadas.
Exemplo: SELECT #MIN_NUM(numero1, numero2) as valor FROM DUAL;
#MOD
Definição: Este macro é usado para substituir pela função correspondente à retornar o resto de uma divisão de inteiros. Recebe como parâmetros o dividendo e o divisor.
Exemplo: SELECT #MOD(7,2) as valor FROM DUAL;
#ROUND
Definição: Este macro é usado para substituir pela função correspondente a retornar um número inteiro arredondado de um número real. Recebe como parâmetro o número real.
Exemplo: SELECT #ROUND(valor_inicial) FROM lancamentos;
#SIGN
Definição: Este macro é usado para substituir pela função correspondente à retornar o sinal de um determinado número. Recebe como parâmetro o número que se deseja obter o sinal.
Exemplo: SELECT #SIGN(valor_inicial) FROM lancamentos;
#SQRT
Definição: Essa macro é usada para substituir pela função correspondente de se obter a raiz quadrada de um número. Recebe como parâmetro apenas o númeto
Exemplo: SELECT #SQRT(valor_inicial) FROM lancamentos;
Controle e sub-rotinas
#CALL
Definição: Esta macro tem como função chamar um outro método que pode ser usado como uma consulta em outros métodos. Recebe como parâmetros um nome e o método a ser executado com seus respectivos parâmetros.
Exemplo: #CALL:param Millennium.configurações.consulta();
#CHECK
Definição: Este macro tem como função fazer validações e retornar um erro caso a condição seja atendida. Recebe como parâmetros uma consulta, uma expressão de condição e a mensagem de erro que será retornada ao Client.
Exemplo: #CHECK(“SELECT COUNT(*) as N FROM DUAL”,n>0,”Quantidade inválida”);
#EACH
Definição: Usado com relação de registros para executar uma ação para cada item da mesma, pode ser usados os itens nomeados da relação na ação seguinte e só será executada uma ação. A Relação pode ser proveniente de um parâmetro do método ou mesmo o resultado de um comando. Não tem parâmetro formal, mas após a declaração coloca-se o comando ou o nome do parâmetro podendo ainda re-nomear, no caso de parâmetro com a cláusula AS.
Exemplo:
#EACH() SELECT:c cor FROM cores; INSERT INTO cor_prod (cor, produto) VALUES (:c.COR, :produto) #NO
Definição: Este macro apenas é substituído pela data e hora atual no formato exigido pelo SGDB em uso, Não existem parâmetros.
Exemplo: SELECT #NOW() FROM DUAL;
#RETURN(cor_prod);
#FETCHALL
Definição: Por padrão quando é feita uma consulta, os registros são retornados por demanda do servidor de banco de dados, ou seja conforme são acessados, entretanto, existem casos especiais onde se faz necessário processar todos os registros de uma única vez, e é aí que se usa esta macro antes destas consultas. Não existem parâmetros.
Exemplo:#FETCHALL() SELECT produto FROM produtos;
#NOERROR
Definição: Este macro tem como função ignorar qualquer erro que acontecer no comando seguinte. Não é necessário nenhum parâmetro.
#NOFILTER
Definição: Usado em conjunto com o recurso de filtros de usuários. Em algumas consultas é necessário que mesmo configurado algum filtro de usuário (Loja, Conta, etc..) não seja respeitado o filtro devendo retornar todos os registros. Para isto antes da consulta coloca-se este macro sem nenhum parâmetro requerido.
#NOFILTER_SESSION
Definição: Este macro funciona de maneira semelhante ao #NOFILTER, com a diferença de manter o comando por todo o script e não apenas na consulta seguinte. Nenhum parâmetro é requerido.
#NOPROTECT
Definição: Este macro desabilita a proteção de segurança não aplicando os filtros padrão no servidor. Não existem parâmetros.
Exemplo: #NOPROTECT() SELECT * FROM FILIAIS;
#PRIVATE
Definição: por padrão os resultados das consultas dentro do método são retornados, mas existem casos em que estes atrapalham. Se for feita uma consulta para buscar um dado que será usado como parâmetro para a consulta principal e a mesma tem resultado nulo, e o método terá um resultado não nulo. Então se coloca este macro antes da consulta para informar que este resultado não faz parte do resultado.
#TOP
Definição: Este macro tem como objetivo trazer as N primeiras linhas do resultado de um método do broker, não funciona igual ao comando FIRST, porque ele vai processar todos os registros e retornar apenas os n primeiros registros da consulta. Recebe como parâmetro o número de linhas que se deseja.
Exemplo: #TOP(5) SELECT nome FROM CLIENTES;
Dados Temporários
#CREATETABLE
Definição: Este macro é usado para criar uma tabela temporária que será destruída logo após o término da execução do script. Recebe como parâmetros as definições dos campos, pode-se ser usado em conjunto com o #SET para guardar o nome da tabela criada em uma variável..
Exemplo:
#SET(TBL, ${#CREATETABLE(cliente INT, cont INT)}) ;
SELECT * FROM #REPLACE(TBL);
#CREATEVIEW
Definição: Usado para se criar uma Visão SQL temporária que será usada durante toda a transação e destruída após. Recebe como parâmetro a consulta SQL desejada e retorna o nome da visão para usar em outros lugares, alternativamente pode-se definir o nome da visão usando : (dois pontos) após a cláusula SELECT.
Exemplo:
#CREATEVIEW(SELECT:CLIENTES_SP * FROM clientes WHERE UFIE=”SP”);
SELECT * FROM #REPLACE(CLIENTES_SP);
Nota: comando mantido por compatibilidade, pode-se usar o sub-select
#VIEW
Definição, semelhante ao #CREATEVIEW só que é para ser usado como um sub-select, e o broker reaproveita a view ou mesmo usa um subselect na transformação
Excemplo SELECT * FROM #VIEW(SELECT * FROM clientes WHERE ufie='SP');
Nota: comando mantido por compatibilidade, pode-se usar o sub-select
Formatação
#NULL_TO_N
Definição: Este macro é usado para substituir pela função correspondente à transformação de campos do tipo numérico com valor nulo em um valor padrão prédefinido. Recebe como parâmetros o nome do campo e o valor padrão para o caso de valor nulo.
Exemplo: SELECT #NULL_TO_N(numero,1) as valor FROM DUAL;
#NULL_TO_S
Definição: Este macro é usado para substituir pela função correspondente à transformação de campos do tipo caractere com valor nulo ou vazio em um valor padrão pré-definido. Recebe como parâmetros o nome do campo e o valor padrão para o caso de valor nulo.
Exemplo: SELECT #NULL_TO_S(nome,”ZE”) as nome FROM DUAL;
#NULL_TO_Z
Definição: Este macro é usado para substituir pela função correspondente à transformação de campos do tipo numérico com valor nulo em 0. Recebe como parâmetro o nome do campo.
Exemplo: SELECT #IIF_N(numero) as valor FROM DUAL;
#REPLACE
Definição: Coloca fixo no comando o valor da variável atribuída. Pode ser utilizado em qualquer lugar do comando.
Exemplos: SELECT * FROM #REPLACE(tabela);
SELECT * FROM produtos WHERE produto = #REPLACE (produto);
SELECT #REPLACE (campos) FROM produtos;
#REPLACETR
Definição: Parecido com o #REPLACE, a diferença é que ele formata a cadeia de caracteres para ser usado com o comando LIKE do SQL colocando o caractere % no inicio e no final da mesma.
Exemplo: SELECT * FROM clientes WHERE nome LIKE #REPLACETR(nome); #REPLACEUFMT(CPF),”###.###.###-##”) as cpf FROM GERADORES;
#REPLACET
Definição: Parecido com o #REPLACE, a única diferença é que ele coloca o valor da variável formatado usando aspas para cadeias de caracteres (Strings) e datas (assim como coloca as datas em formato correto para o Broker utilizar). Exemplo: SELECT * FROM clientes WHERE nome =
#REPLACEFMT
Definição: Este macro é usado para substituir o valor retornado por um valor formatado por uma determinada mascara de formatação. Recebe como parâmetros o nome do campo e a máscara para a formatação.
Exemplo: SELECT #REPLACEFMT(CPF),”###.###.###-##”) as cpf FROM GERADORES;
#REPLACEUFMT
Definição: Este macro é usado para substituir o valor retornado por um valor onde se é removido toda a formatação ficando apenas os números. Recebe como parâmetro o nome do campo.
Exemplo: SELECT #REPLACEUFMT(CPF) FROM GERADORES;
#TRANSLATE
Definição: Este macro é usado para substituir pela função correspondente à transformação de campos em um valor condicional ou tradução de valores. Recebe como parâmetros o nome do campo, os valores que serão recebidos e os valores convertidos separados por dois pontos e opcionalmente um ELSE no final para os valores não encontrados, se o ELSE não for estabelecido e for encontrado um valor não definido será gerado um erro.
Exemplo: SELECT #TRANSLATE(tipo_sexo,'M':'Masculino','F':'Feminino',else:'Indefinido') from geradores
#SELECT
Definição: Este macro tem como objetivo trazer um valor condicional para um campo, na verdade ele converte a expressão para a função Natural do SGDB em uso. No caso do Firebird, a partir da versão 2.1, será convertido para CASE WHEN. Recebe como parâmetro a expressão que deverá ser usada e os parâmetros conseguintes devem ter o valor referido seguido de dois pontos mais o resultado que se espera como resultado, paliativamente no último deles pode ser usado um else para informar que qualquer outro resultado usará este valor, sugerido para evitar erros.
Exemplo: SELECT #SELECT(tipo_sexo, ”M”:”Homem”, ”F”:”Mulher”, ELSE:”Indeterminado”) as Sexo FROM CLIENTES;
Neste caso o comando será traduzido para :
SELECT nome, CASE WHEN tipo_sexo=”M” THEN “Homem” WHEN tipo_sexo=”F” THEN “Mulher” ELSE “Indetermiado” END as Sexo FROM CLIENTES;
Manipulação de Datas
#DATEDIFF
Definição: Este macro é usado para substituir pela função correspondente a retornar a diferença entre duas datas. Recebe como parâmetros as datas desejadas.
Exemplo: SELECT #DATEDIFF(data_vencimento,data_pagamento) FROM lancamentos;
#DAY
Definição: Este macro é usado para substituir pela função correspondente a retornar o dia de uma determinada data. Recebe como parâmetro a data desejada.
Exemplo: SELECT #DAY(data_vencimento) FROM lancamentos;
#MONTH
Definição: Este macro é usado para substituir pela função correspondente a retornar o dia de uma determinada data. Recebe como parâmetro a data desejada.
Exemplo: SELECT #DAY(data_vencimento) FROM lancamentos;
#WEEK
Definição: Este macro apenas é substituído pela semana atual. Não existem parâmetros.
Exemplo: SELECT #WEEK () FROM DUAL;
#WEEKDAY
Definição: Este macro é usado para substituir pela função correspondente à retornar o dia da semana de uma determinada data. Recebe como parâmetro a data.
Exemplo: SELECT #SELECT(#WEEKDAY(data_pagamento),’1’:’Dom’,’2’:’Seg’,’3’:’Ter’,’4’:’Qua’,’5’:’Qui’,’6’:’Sex’,’7’:’Sab’) FROM lancamentos;
#YEAR
Definição: Este macro é usado para substituir pela função correspondente a retornar o dia de uma determinada data. Recebe como parâmetro a data desejada.
Exemplo: SELECT #DAY(data_vencimento) FROM lancamentos;
Manipulação de Strings
#LPAD
Definição: Este macro é usado para substituir pela função correspondente à concatenar uma cadeia de caracteres com espaços à esquerda até formar o tamanho desejado. Recebe como parâmetros a cadeia de caracteres e o tamanho desejado.
Exemplo: SELECT #LPAD(“ABC”,10) FROM dual;
#MAKELIST
Definição: Converte um parâmetro de conjunto de registros em uma estrutura de valores separados por vírgula, geralmente usado em cláusula IN do SELECT. Recebe como parâmetros o nome do campo parâmetro e o nome do campo que será usado para convertê-lo em lista.
Exemplo: SELECT * FROM filiais WHERE filial IN #MAKELIST (FILIAIS,ITEM);
#RPAD
Definição: Este macro é usado para substituir pela função correspondente à concatenar uma cadeia de caracteres com espaços à direita até formar o tamanho desejado. Recebe como parâmetros a cadeia de caracteres e o tamanho desejado.
Exemplo: SELECT #RPAD(“ABC”,10) FROM dual;
#STR_LEN
Definição: Este macro é usado para substituir pela função correspondente à retornar o tamanho de uma determinada cadeia de caracteres (String). Recebe como parâmetro a cadeia de caracteres e retorna o seu tamanho.
Exemplo: SELECT #STR_LEN(nome) FROM clientes
#SUBSTR
Definição: Este macro é usado para substituir pela função correspondente à retornar uma parte de uma cadeia de caracteres. Recebe como parâmetros a cadeia de caracteres, o caractere de inicio e o tamanho desejado.
Exemplo: SELECT #SUBSTR(“ABCDEF”,2,3) FROM dual;
Tabulação de dados
Tabulação de dados é quando temos uma grade de dados que são armazenados no banco de forma normalizada e dependendo de um cadastro queremos que apareça como se fossem o mesmo registro, um exemplo de uso é para a grade de tamanhos e cores e desejamos mostrar o estoque. Para esta finalidade usamos o recurso criado pelo #CROSSDATA em conjunto com o #PIVOT (que define o cabeçalho). Os retornos destas funções são cadeias de caracteres formadas de outras cadeias separadas por aspas e vírgulas. Os componentes de relatórios e algumas funções de tela, entendem esta formatação montando a grade final para o usuário. Vejamos as funções.
#CROSSDATA
Definição: Com auxílio de algumas funções de agrupamento e do #PIVOT, faz uma grade de valores tabulados. É usado, por exemplo, para montar um relatório com grade de tamanhos no cabeçalho. O #PIVOT determina o cabeçalho da tabulação. Recebe como parâmetro o nome das colunas (podem ser várias) que receberão os dados agrupados, estas devem ser definidas no layout como String e com um tamanho razoável, pois irão conter os valores tabulados com aspas e vírgulas, depois uma lista dos campos que definem o agrupamento entre parênteses como penúltimo parâmetro, e por fim se os valores não encontrados no cabeçalho serão omitidos (true) ou não (false).
Exemplo: #CROSSDATA(quantidade,(cod_produto),true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_COUNT(e.cor as numero_cores) FROM produtos p INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade)
SELECT tamanho as tamanhos, tamanho FROM tamanhos
WHERE grade = :data.grade;
#CROSS_AVG
Definição: Auxiliar do #CROSSDATA serve para tirar a média simples de valor em uma determinada coluna respeitando o agrupamento definido anteriormente. Recebe como parâmetro a coluna onde deve ser tirada a média.
Exemplo: #CROSSDATA(quantidade,(cod_produto),true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_AVG(e.saldo as saldo_medio) FROM produtos p INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade)
SELECT tamanho as tamanhos, tamanho FROM tamanhos
WHERE grade = :data.grade;
#CROSS_COUNT
Definição: Auxiliar do #CROSSDATA serve para contar a quantidade de ocorrências de valor de uma determinada coluna respeitando o agrupamento definido anteriormente. Recebe como parâmetro a coluna onde devem ser contados os valores.
Exemplo: #CROSSDATA(quantidade,(cod_produto),true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_COUNT(e.cor as numero_cores) FROM produtos p INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade)
SELECT tamanho as tamanhos, tamanho FROM tamanhos
WHERE grade = :data.grade;
#CROSS_FIRST
Definição: Auxiliar do #CROSSDATA serve para pegar a primeira ocorrência de valor em uma determinada coluna respeitando o agrupamento definido anteriormente. Recebe como parâmetro a coluna que se quer usar.
Exemplo: #CROSSDATA(quantidade,(cod_produto),true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_FIRST(e.obs)
FROM produtos p INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade)
SELECT tamanho as tamanhos, tamanho FROM tamanhos
WHERE grade = :data.grade;
#CROSS_SUM
Definição: Auxiliar do #CROSSDATA serve para somar uma determinada coluna respeitando o agrupamento definido anteriormente. Recebe como parâmetro a coluna que deve ser agrupada.
Exemplo: #CROSSDATA(quantidade,(cod_produto),true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_SUM(e.saldo)
FROM produtos p INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade)
SELECT tamanho as tamanhos, tamanho FROM tamanhos
WHERE grade = :data.grade;
#CROSS_SUM_FLD, #CROSS_COUNT_FLD, #CROSS_AVG_FLD e #CROSS_FIRST_FLD
Definição: Funcionam de forma semelhante aos seus originais, veja a definição acima.
#PIVOT
Definição: Auxiliar mandatório do #CROSSDATA serve para definir o cabeçalho da tabulação desejada. Recebe como parâmetro a coluna que será usada como cabeçalho, esta deve ser definida no layout com um tamanho razoável, pois irá conter os valores tabulados com aspas e vírgulas, o nome da coluna chave da consulta principal, o nome da coluna chave da consulta secundária, e opcionalmente o nome da coluna de quebra, esta se o cabeçalho não for fixo.
Exemplo: #CROSSDATA(quantidade,(cod_produto),true);
SELECT:data p.cod_produto, p.grade, e.tamanho, #CROSS_FIRST(e.obs)
FROM produtos p INNER JOIN estoques e ON p.produto = e.produto;
#PIVOT(tamanhos, tamanho, tamanho, grade)
SELECT tamanho as tamanhos, tamanho FROM tamanhos
WHERE grade = :data.grade;
Variáveis
#DATE
Definição: Este macro apenas é substituído pela data atual no formato exigido pelo SGDB em uso, Não existem parâmetros.
Exemplo: SELECT#DATE() FROM DUAL;
#NOW
Definição: Este macro apenas é substituído pela data e hora atual no formato exigido pelo SGDB em uso, Não existem parâmetros.
Exemplo: SELECT #NOW() FROM DUAL;
#RETURN
Definição: Esta macro serve para informar ao Broker qual é o campo que será utilizado como contador dentro de um INSERT utilizando o counters.nsu e retornando o valor no resultado do método se a variável for definida no resultado do mesmo.
Exemplo: INSERT INTO COR_PROD (produto, cor) VALUES (:produto, :cor) #NOW
Definição: Este macro apenas é substituído pela data e hora atual no formato exigido pelo SGDB em uso, Não existem parâmetros.
Exemplo: SELECT #NOW() FROM DUAL;
#RETURN(cor_prod);
#SET
Definição: Este macro é usado para armazenar valores em variáveis. Os parâmetros são o nome da variável e o valor que se quer atribuir. Se utilizado no segundo parâmetro o símbolo $ o valor atribuído será o resultado do comando e não o seu conteúdo literal.
Exemplo: #SET(nome,”Arlindo”)
SELECT #REPLACET(nome) from dual;
#SET(TBL, ${#CREATETABLE(cliente INT, cont INT)}) SELECT * FROM #REPLACE(TBL);
#TIME
Definição: Este macro apenas é substituído pela hora atual no formato exigido pelo SGDB em uso, Não existem parâmetros.
Exemplo: SELECT #TIME() FROM DUAL;
#USER
Definição: Este macro apenas é substituído pelo nome do usuário atual. Não existem parâmetros.
Exemplo: SELECT#USER() FROM DUAL;
#USERGROUP
Definição: Este macro retorna o nome do grupo ao qual o usuário que está logado pertence. Não existem parâmetros.
Exemplo: SELECT #USERGROUP() FROM DUAL;