Função numa cláusula JOIN

(jovitomelo) #1

BUG 0002

Criei uma função no DB (Mysql) e quando aplico esta função dentro de uma cláusula WHERE na aplicação (GRID) gerada pelo SC, funciona perfeitamente… porém quando aplico a mesma função no FROM (LEFT JOIN, RIGHT, …) dá pau. Certamente que é um BUG (porque testei exaustivamente a query diretamente no DB e está ok), o que não me impede de encontrar outros caminhos para a solução do problema… inclusive alterar manualmente os fontes (já fiz e resolveu).

Detalhe: essa função recebe 2 parâmetros:

a) [sm_global_login];
b) um campo de uma tabela que faz parte da aplicação.

O ERRO ocorre na passagem da variável sm_global_login, porque as aspas (’’) são substituídas na geração dos fontes. Vejam a seguir…

QUERY:

SELECT
f.funcoes_id as funcoes_id,
f.funcoes_descricao as funcoes_descricao,
ga.grupo_acesso_descricao as owner,
COUNT(u.funcoes_id) as nr_usuarios
FROM
sgci.sgci_grupo_acesso as ga,
sgci.sgci_funcoes as f
LEFT JOIN sgci.sgci_usuarios as u ON f.funcoes_id = u.funcoes_id
and PermiteAcesso(’[sm_global_login]’,u.owner) = ‘Sim’
WHERE
f.owner = ga.grupo_acesso_id
GROUP BY
f.funcoes_id
ORDER BY
f.funcoes_descricao

ERRO:

Parse error: syntax error, unexpected T_BAD_CHARACTER, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\Program Files\NetMake\v5\wwwroot\scriptcase\app\ci\ci_grid_funcoes\ci_grid_funcoes.php on line 552

Se eu colocar a função na cláusula WHERE o erro não aparece, porém o resultado não é correto, uma vez que os campos da tabela sgci.sgci_funcoes que não tem correspondência na tabela sgci.sgci_usuarios não são mostrados (deveria ser mostrado como ZERO). Exemplo abaixo.

SELECT
f.funcoes_id as funcoes_id,
f.funcoes_descricao as funcoes_descricao,
ga.grupo_acesso_descricao as owner,
COUNT(u.funcoes_id) as nr_usuarios
FROM
sgci.sgci_grupo_acesso as ga,
sgci.sgci_funcoes as f
LEFT JOIN sgci.sgci_usuarios as u ON f.funcoes_id = u.funcoes_id
WHERE
f.owner = ga.grupo_acesso_id
and PermiteAcesso(’[sm_global_login]’,u.owner) = ‘Sim’
GROUP BY
f.funcoes_id
ORDER BY
f.funcoes_descricao

O exemplo acima não retorna erro, mas o resultado não é satisfatório.

CÓDIGO FONTE:

545| if (isset($_SESSION[‘scriptcase’][‘glo_use_schema’]))
546| {
547| $this->nm_con_use_schema = $_SESSION[‘scriptcase’][‘glo_use_schema’];
548| }
549| if (empty($this->nm_tabela))
550| {
551| $this->nm_tabela = “sgci.sgci_grupo_acesso as ga, sgci.sgci_funcoes as f LEFT JOIN sgci.sgci_usuarios as u ON f.funcoes_id = u.funcoes_id and PermiteAcesso([color=red]’" . $_SESSION[‘sm_global_login’] . "’[/color],u.owner) = ‘Sim’”;
552| }
553| //
554| if (!empty($this->nm_falta_var) || !empty($this->nm_falta_var_db) || $nm_crit_perfil)
555| {
556| echo “<style type=“text/css”>”;
557| echo “.scButton_default { font-family: Tahoma, Arial, sans-serif; font-size: 11px; color: #000000; font-weight: normal; background-color: #DEE7DE; border-left-color: #DEE7DE; border-right-color: #DEE7DE; border-top-color: #DEE7DE; border-bottom-color: #DEE7DE; border-style: solid; border-width: 1; padding: 1px; background-image: url(…/…/img/scriptcase__NM__MS_Money_bg_button.gif); }”;

NOTA:

A parte grifada no código fonte é de minha autoria… refere-se à aspas que são colocadas indevidamente… quando eu altero este código, tirando as aspas a aplicação roda normalmente com o resultado desejado.

SOLUÇÕES TABAJARA:

  1. Substituir -> PermiteAcesso(’[sm_global_login]’,u.owner) = ‘Sim’ por PermiteAcesso("$this->global_login",d.owner) = ‘Sim’

  2. Trazer o código da Função para dentro da query (se você tiver um uso muito intenso desta função, vc tá fud…, vai ter que reescrevê-la n-vezes).

  3. Altere o FONTE manualmente… e não re-gere esta aplicação novamente.

Observei que qualquer variável dentro de um JOIN, que precisar ser passada entre aspas (’’) gera o mesmo problema. Na cláusula WHERE não ocorre o problema.

Abraço a todos.