Meta SQL %SelectAll

O que encontramos com bastante frequência, em códigos que precisam buscar dados no banco, é o CreateSQL utilizado da forma abaixo:

Local SQL &sql_busca;

Local String &str_sql;

Local String &var, &var1, &var2, &var3, &etc…;

 

/* disgraceira de SQL fixo com um monte de concatenação duzinfernu */

&str_sql = “SELECT CAMPO1, CAMPO2, CAMPO3, etc… ”;

&str_sql = &str_sql | “FROM TABELA A ”;

&str_sql = &str_sql | “WHERE A.CAMPO1 = :1 ”;

 

/* cria o SQL e passa o parâmetro de busca*/

&sql_busca = CreateSQL(&str_sql, &var);

 

/* lista remelenta de um bilhão de variáveis pra receber os valores encontrados */

While &sql_busca.Fetch(&var1, &var2, &var3, etc…)

 

End-while;

O problema de utilizarmos a solução acima é o trabalho de digitar todo o SELECT fixo, atribuí-lo a uma variável String e ainda ter que utilizar uma variável diferente para cada campo selecionado, ou seja, se estamos selecionando 30 campos temos que criar 30 variáveis.

 

Há uma maneira mais simples de realizar esta busca utilizando o Meta-SQL “%SelectAll” e um objeto da classe Record, conforme exemplo abaixo:

 

Local SQL &sql_busca;

Local Record &rec;

Local String &var;

 

/* criamos uma Record standalone que será passada como parâmetro (ou seja, define qual tabela será selecionada) para o Meta-SQL e também receberá os dados encontrados */

&rec = CreateRecord(Record.TABELA);

 

/* agora criamos o objeto SQL utilizando o Meta-SQL. Lembrando que o %SelectAll, no momento da execução, será substituído por “SELECT *TODOS_OS_CAMPOS* FROM TABELA” */

&sql_busca = CreateSQL(“SelectAll(:1) A WHERE A.CAMPO1 = :2”);

 

/* executamos o SQL passando como parâmetro a Record de onde os dados serão selecionados e quaisquer variáveis que sejam utilizadas no WHERE */

&sql_busca.Execute(&rec, &var);

 

/* agora processamos o que foi encontrado pelo statement passando o Objeto Record para que ele receba os dados. Caso tivéssemos certeza que o SELECT retornaria somente uma linha poderíamos utilizar um If ao invés de um While */

While &sql_busca.Fetch(&rec)

 /* uma vez dentro do While (ou If), podemos acessar os valores encontrados utilizando apenas &rec.CAMPO1.Value, ou qualquer outro campos da record normalmente */

End-while;

 

Outra vantagem quanto a esta abordagem é que, caso precisemos modificar a tabela para incluir campos e verificar outros dados, o SQL não precisará de qualquer alteração.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *