RESOLVIDO - incluir clausula no WHERE com SC_select_where

Bom dia

Criei um campo manualmente no filtro para data. Tratei ele no evento onValidate. Registrei o valor em uma variável Global.

No evento onScriptIni da consulta, coloquei o seguinte código:
if (!empty([cond_data])){
sc_select_where(add) = " and [cond_data]";
}

Porém, quando uso o filtro, o script case está colocando um parêntese no inicio do SQL e no final, e o parâmetro do where fica fora. Em outra aplicação fiz da mesma forma e funcionou certo. Alguém sabe o por que que que acontece isso???
Segue abaixo o erro:
ERRO
Erro ao acessar o banco de dados
Incorrect syntax near the keyword ‘and’.
select count(*) from (SELECT OPR.NumeroProducao, OPR.CodFormula, OPR.CodLinha, CF.CodProd, CP.CodGrupoProd, OPR.Controle, OprB.DataInicioBatelada, OprB.NumeroBatelada, OPR.QuantBatPV, (cast(OprB.NumeroBatelada as varchar(5))+ ‘/’+ cast(OPR.QuantBatPV as varchar(5))) AS TotBat, OPR.NumeroLotePA, OprB.CodSiloDestino, (cast(OprB.TempoMistSeco as varchar(5))+’ s’) as TempoMistSeco, (cast(OprB.TempoMistUmido as varchar(5))+’ s’) as TempoMistUmido, (cast(OprB.TempoMistTotal as varchar(5))+’ s’) as TempoMistTotal, (select sum(PesoDosado) from OPR_Producao_Reg_Bat_Item OprBI2 WHERE OprBI2.NumeroProducao = OPR.NumeroProducao and OprBI2.NumeroBatelada = OprB.NumeroBatelada) as PesoDosado FROM dbo.Opr_Producao_Reg OPR Left Join Opr_Producao_Reg_Bat OprB on (OprB.NumeroProducao=OPR.NumeroProducao) Left Join Cad_Formula CF on (OPR.CodFormula = CF.CodFormula) Left Join Cad_Produto CP on (CF.CodProd = CP.CodProd) left join OPR_Producao_Reg_Bat_Item BatRI on (BatRI.NumeroProducao = OPR.NumeroProducao and BatRI.NumeroBatelada = OprB.NumeroBatelada) WHERE OPR.CodFormula is not null ) nm_sel_esp and convert(varchar(19), BatRI.DataInicioDosagem, 121) = convert(varchar(19), ‘2014-08-27 16:13:59’, 121)

Faz assim:

Para variáveis global para padronizar use sempre [glo_ no inicio = [glo_cond_data]

$cond_data_x=[glo_cond_data];

Ai faça um ECHO 'SQL = '.$cond_data_x, para ver se é um valor válido, se tem aspas ’ simples no lugar certo.

break;

if (!empty($cond_data_x)) {
sc_select_where(add) = " AND $cond_data_x";
}

no meu caso o cond_data está com a seguinte string :
and convert(varchar(19), BatRI.DataInicioDosagem, 121) = convert(varchar(19), ‘2014-08-27 16:13:59’, 121)

está correto…

Náo sei pq o SC coloca um parêntese depois do parâmetro do where padrão… daí esse q quero concatenar dá erro…

Faz outro teste:

se tiver evento ou tratamento de variável no filtro, tire e deixe apenas no onScriptIni da grid:

convert(varchar(19), BatRI.DataInicioDosagem, 121) = convert(varchar(19), ‘2014-08-27 16:13:59’
if (!empty({nome_campo_criado_no_filtro})){
sc_select_where(add) = " and convert(varchar(19), BatRI.DataInicioDosagem, 121) = ‘{nome_campo_criado_no_filtro}’ ";
}

No campo nome_campo_criado_no_filtro deixe o formato interno da data igual ao esperado pelo campo no bd.

Continua fechando um parêntese antes no where… náo sei o pq… Já tentei deixar sem o where no padrão do SQL, e colocar nos filtros… mas não funcionou

no echo da minha variável aparece o seguinte:
convert(varchar(10), BatRI.DataInicioDosagem, 121) = convert(varchar(10), ‘2014-08-27 00:00:00’, 121)

O tratamento que faço no onScriptIni da consulta é o seguinte:
if (!empty([cond_data])){
sc_select_where(add) = [cond_data];
}

e no evento onValidate do filtro, uso o seguinte:
if (!empty({datainicial}) and ({datainicial} != “0000-00-00 00:00:00”)){
if (empty({datainicial_hor}) and empty({datainicial_min}) and empty({datainicial_seg})){
switch ({datainicial_cond}){
case “eq”: {
[cond_data] = " convert(varchar(10), BatRI.DataInicioDosagem, 121) = convert(varchar(10), ‘{datainicial}’, 121)";
break;
}
case “df”: {
[cond_data] = " convert(varchar(10), BatRI.DataInicioDosagem, 121) <> convert(varchar(10), ‘{datainicial}’, 121)";
break;
}
case “gt”: {
[cond_data] = " convert(varchar(10), BatRI.DataInicioDosagem, 121) > convert(varchar(10), ‘{datainicial}’, 121)";
break;
}
case “lt”: {
[cond_data] = " convert(varchar(10), BatRI.DataInicioDosagem, 121) < convert(varchar(10), ‘{datainicial}’, 121)";
break;
}
case “bw”:{
if (empty({datainicial_input_2_hor}) and empty({datainicial_input_2_min}) and empty({datainicial_input_2_seg})){
[cond_data] = " convert(varchar(10), BatRI.DataInicioDosagem, 121) between convert(varchar(10), ‘{datainicial}’, 121) and convert(varchar(10), ‘{datainicial_input_2}’, 121)";
} else{
[cond_data] = " convert(varchar(10), BatRI.DataInicioDosagem, 121) between convert(varchar(10), ‘{datainicial}’, 121) and convert(varchar(19), ‘{datainicial_input_2}’, 121)";
}
break;
}
}
}
else {
switch ({datainicial_cond}){
case “eq”: {
[cond_data] = " convert(varchar(19), BatRI.DataInicioDosagem, 121) = convert(varchar(19), ‘{datainicial}’, 121)";
break;
}
case “df”: {
[cond_data] = " convert(varchar(19), BatRI.DataInicioDosagem, 121) <> convert(varchar(19), ‘{datainicial}’, 121)";
break;
}
case “gt”: {
[cond_data] = " convert(varchar(19), BatRI.DataInicioDosagem, 121) > convert(varchar(19), ‘{datainicial}’, 121)";
break;
}
case “lt”: {
[cond_data] = " convert(varchar(19), BatRI.DataInicioDosagem, 121) < convert(varchar(19), ‘{datainicial}’, 121)";
break;
}
case “bw”:{
if (empty({datainicial_input_2_hor}) and empty({datainicial_input_2_min}) and empty({datainicial_input_2_seg})){
[cond_data] = " convert(varchar(19), BatRI.DataInicioDosagem, 121) between convert(varchar(19), ‘{datainicial}’, 121) and convert(varchar(10), ‘{datainicial_input_2}’, 121)";
} else {
[cond_data] = " convert(varchar(19), BatRI.DataInicioDosagem, 121) between convert(varchar(19), ‘{datainicial}’, 121) and convert(varchar(19), ‘{datainicial_input_2}’, 121)";
}
break;
}
}
}
}

Coloquei no evento da consulta o seguinte comando e deu certo :slight_smile:

if (!empty([cond_data])){
if (empty({sc_where_current})){
sc_select_where(add) = " where [cond_data]";
} else {
sc_select_where(add) = " and [cond_data]";
}
}