Linguagem Senior SQL 2 dentro das regras
A linguagem Senior SQL 2 pode ser utilizada nas regras dos geradores de informação (gerador de relatórios e consultas), regras de cálculo (regras avulsas executadas diretamente pelo sistema) e importador/exportador de arquivos texto.
Esta linguagem é um padrão adotado pela Senior para que os comandos SQL possam ser escritos em um formato padrão que permita um melhor aprendizado e uma melhor tradução para os bancos de dados suportados pelos sistemas da Senior.
Abrangência da implementação
A implementação afeta todas as regras que tem comandos SQL em cursores ou em uso juntamente com o comando ExecSQL. Nestes casos a linguagem poderá ser usado como será visto mais adiante neste documento.
A ativação da linguagem é feita de várias maneiras, dependendo da ferramenta em questão. Estas maneiras são detalhadas a seguir.
Ativação da linguagem no gerador de relatórios
No gerador de relatórios a ativação é feita através do menu principal do gerador. No item diversos existe a opção Usar Senior SQL 2.
Esta ativação é referente a todas as regras do modelo selecionado, sendo relativa somente aos comandos SQL executados de dentro de uma regra do modelo selecionado, não interferindo no SQL gerado e executado diretamente pelo gerador de relatórios.
Ativação da linguagem dentro do importador/exportador de arquivos texto
A linguagem Senior SQL 2 dentro do importador/exportador de arquivos texto pode ser ativada através da opção Usar Senior SQL 2 na página Definições.
Ativação da linguagem dentro do gerador de consultas
Pode ser realizado através do opção Senior SQL 2 do tela principal de definição de modelos.
Ativação da linguagem nas regras
É feito através do editor de regras em Compilar > Usar Senior SQL 2 ou pela tecla de atalho Ctrl + F12.
Comandos SQL em cursores
Os comandos SQL Senior 2 executados dentro de cursores das regras não poderão mais usar comandos nativos do banco de dados, como TO_DATE ou CONVERT,por exemplo.
Estes comandos deverão ser substituídos por comandos da linguagem Senior SQL 2.
Funções de agregação
Funções tais como SUM, COUNT, MAX, por exemplo, não poderão ser usadas quando a regra estiver usando Senior SQL 2. Isto somente acontece dentro da cláusula SELECT do comando, sendo possível a utilização de funções da linguagem Senior SQL 2 dentro da cláusula WHERE.
O JOIN e UNION ainda não tem garantias de funcionamento dentro das regras, sendo o seu uso de responsabilidade dos programadores. Hoje a rotina poderá ser alterada sem levar em conta o uso destes recursos da linguagem SQL.
Macro __inserir nos Cursores Usados em Regras
__Inserir
Comando que permite inserir uma String no cursor.
Inserir( : <nome_variável> )
Onde <nome_variável> é o nome de uma variável alfanumérica definida dentro da regra.
Considerações:
- 1) Este comando é uma macro, portanto deve ser usado dentro do comando SQL do cursor. Somente neste caso ele será reconhecido e permite a inserção de valores no comando SQL do cursor em tempo de execução da regra.
- 2) Entre os parênteses deve ser inserido o nome de uma variável precedido por dois pontos. Se for necessário inserir valores constantes, o comando __Inserir não deve ser usado;
- 3) A variável deve estar declarada dentro da regra e deve ser do tipo ALFA (alfanumérico). Variáveis não declaradas na regra ou que não sejam do tipo ALFA ocasionarão um erro na execução da regra;
- 4) Os valores das variáveis a serem incluídas não devem conter o comando __Inserir. Isto pode ocasionar recursividade no tratamento do comando e instabilidade da regra. Tentativas neste sentido ocasionarão um erro na execução do modelo;
- 5) O comando não deve ser usado na lista de campos do comando SQL. Caso isto for feito a regra não poderá reconhecer os campos para a compilação. A inserção do valor da variável dentro do comando SQL somente pode ser feito durante a execução da regra.
- 6) Faz-se necessário a otimização do uso deste comando. O uso excessivo do mesmo poderá degradar a performance durante a execução da regra.
Se a regra estiver usando a linguagem Senior SQL 2, esta macro deve figurar no comando de maneira que os conectores não fiquem inválidos no SQL caso a macro seja substituída.
Dada a regra descrita a seguir:
definir cursor C;
definir alfa SQLTipCol;
definir alfa SQLNumCad;
ObtemWhereTipCol(SQLTipCol);
ObtemWhereNumCad(SQLNumCad);
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 __inserir(:SQLTipCol) and TipSex = 'M' __inserir(:SQLNumCad)";
C.AbrirCursor();
se (C.Achou)
inicio
...
...
fim;
C.FecharCursor();
O comando SQL contido no cursor acima funciona corretamente em Senior SQL 2. Isto acontece porque a macro __Inserir está disposta de maneira que seja opcional, ou seja, podem ser retirados sem que o comando SQL seja prejudicado.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and TipCol=__inserir(:SQLTipCol) and NumCad=__inserir(:SQLNumCad)"
Neste caso a macro __Inserir está sendo comparada com o valor do campo e se a macro for retirada não funcionará.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and __inserir(:SQLTipCol) TipSex = 'M' and __inserir(:SQLNumCad)"
Neste caso existem os conectores entre a expressão do NumEmp e entre as macros. Da mesma forma se a macro for retirada o comando ficará incompleto e não funcionará.
Importante
Se a macro puder ser removida e o comando ficar sem erros de sintaxe, a macro pode ser utilizada. Caso contrário, não pode ser utilizado.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 __inserir(:SQLTipCol) and TipSex = 'M' __inserir(:SQLNumCad)";
Uso sem problemas.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and TipSex = 'M'";
Note que neste caso o comando continua sintaticamente correto depois que a macro foi removida. Portanto, a macro pode ser utilizada neste lugar.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and TipCol=__inserir(:SQLTipCol) and NumCad=__inserir(:SQLNumCad)";
Se removida a macro o SQL fica incorreto e não irá compilar.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and TipCol= and NumCad=";
Note que a macro foi removida. Este comando não compilaria mais em Senior SQL 2. Neste caso a macro não poderá ser usada.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and __inserir(:SQLTipCol) and TipSex = 'M' and __inserir(:SQLNumCad)
Se removida a macro, o comando SQL fica incorreto e não irá compilar.
C.SQL "select NumEmp, TipCol, NumCad, NomFun, ValSal from R034FUN where NumEmp = 1 and and TipSex = 'M' and
Desta maneira a macro também não pode ser usada. A remoção da macro causa um erro de compilação neste comando SQL.
Macro __inserir na execução
Durante a execução da regra, o valor que estiver contido dentro da variável indicada pela macro, será inserido no comando SQL do cursor. Como uma boa parte dos cursores são executados dentro do gerador de relatórios e este somente utiliza Senior SQL 2, os valores inseridos no comando através da macro terão um tratamento adicional. Caso este valor contenha uma função existente na linguagem Senior SQL 2, este será convertido para o comando nativo caso a regra esteja utilizando comando SQL nativo.
Comandos SQL com ExecSQL
Este comando será compilado de acordo com a configuração da regra ou da ferramenta em questão. Não existe a macro __Inserir dentro do comando ExecSQL deixando a sua compilação e execução mais simples.
As funções nativas de banco de dados não poderão ser mais utilizadas caso a regra utilize a linguagem Senior SQL 2.
Implementações necessárias nos sistemas
Compilação de Regras
Durante a compilação de regras não é necessário a intervenção do sistema, nem nos geradores e nem nas regras cálculo. O responsável pela informação sobre a ativação ou não da linguagem Senior SQL 2 é de responsabilidade do editor de regras.
Execução
Para executar a regra com esta nova linguagem Senior SQL 2 é necessário realizar as seguintes implementações:
- Na execução das regras, é necessário obter a informação sobre a ativação ou não da linguagem Senior SQL 2 para a regra que deve ser executada. Para isto é necessário usar a função GetUseSQLSenior2Flag passando o diretório onde as regras estão, o sistema padrão e o código da regra a ser executada. O valor retornado por esta função deve ser passado no segundo parâmetro do método Execute da classe TSBinary. Como este parâmetro é default, não ocorrerá erro de compilação no sistema;
- Atribuir um método ao evento OnChangeRule. Este evento ocorre quando a execução passa para uma regra diferente da atual. Quando isto acontecer, é necessário informar ao objeto interpretador de regras qual é a configuração de ativação da linguagem Senior SQL 2. Para isto é necessário utilizar a função GetUseSQLSenior2Flag como descrito acima. E o retorno desta função deve-se atribuir a propriedade UseSQLSenior2 do objeto Sender (que deve ser promovido para TSBinary) passado como parâmetro para o evento.
Recompilação quando da mudança de versão
O gerenciamento da configuração de ativação da linguagem Senior SQL 2 referente a recompilação é de responsabilidade da rotina que compila as regras. Nenhuma alteração é necessário neste caso.