Poder alterar a conexão em consulta

Olá pessoal!

Estou com uma dúvida, pois nunca fiz isso:

Tenho uma aplicação que só existem consultas para os usuários:

Tenho que disponibilizar em duas bases de dados: Oracle e MySql.

Criei Views para serem criadas nas respectivas bases de dados.

O MySql está OK.
O Oracle está ocorrendo o seguinte erro ao filtrar as datas:
Erro ao acessar o banco de dados
ORA-01861: literal does not match format string
select count(*) from ss_estat_atendimento where (Data_atendimento >= ‘20100101’ And Data_atendimento <= ‘20100131’)

No SC, dentro do SQL estou fazendo um WHERE: WHERE (Data_atendimento >= ‘[glo_datainicial]’ And Data_atendimento <= ‘[glo_datafinal]’)

Na aplicação controle, estou enviando via sc_redir as datas:

[code]$i = {TipoRel};

switch ($i) {
case ‘1’:
sc_redir(grid_ss_estat_atendimento, glo_datainicial = {DataInicial}; glo_datafinal = {DataFinal});
break;
case ‘2’:
sc_redir(grid_ss_estat_historico, glo_datainicial = {DataInicial}; glo_datafinal = {DataFinal});
break;
case ‘3’:
sc_redir(grid_ss_estat_comp_fam_atendimento, glo_datainicial = {DataInicial}; glo_datafinal = {DataFinal});
break;
case ‘4’:
sc_redir(grid_ss_estat_comp_fam_historico, glo_datainicial = {DataInicial}; glo_datafinal = {DataFinal});
break;
}[/code]

Nas propriedades das datas estou definindo como data e o formato interno está: AAAAMMDD (feito por padrão).

Gostaria de saber como faria para funcionar tanto no Oracle, quanto no MySql sem precisar fazer duas consultas.

Obrigado desde já!

Troque o WHERE para:

WHERE (to_char(Data_atendimento,‘YYYYMMDD’) >= ‘[glo_datainicial]’ And to_char(Data_atendimento,‘YYYYMMDD’) <= ‘[glo_datafinal]’)

ou

WHERE (Data_atendimento >= to_date(’[glo_datainicial]’) And Data_atendimento <= to_date(’[glo_datafinal]’))

Certo, desta forma quando precisaria trocar para Mysql tenho que alterar ou fazer uma outra apllicação, certo?

Olá Kleyber;

Fiz com to_date na SQL, porém ocorre o erro:

ORA-01861: literal does not match format string
select count(*) from ss_estat_atendimento where (Data_atendimento >= to_date(‘20150101’, ‘yyyymmdd’) And Data_atendimento <= to_date(‘20150131’, ‘yyyymmdd’))

Dentro da View no Oracle, já estou formatando assim: TO_DATE(HISTORICO.HISTORICODATA, ‘DD/MM/YYYY’) AS DATA_ATENDIMENTO

Terias alguma ideia?

Tá errado o formato da função TO_DATE. Veja a minha sugestão:

WHERE (Data_atendimento >= to_date(’[glo_datainicial]’) And Data_atendimento <= to_date(’[glo_datafinal]’))

Devo estar fazendo algo de errado:
Está ocorrendo o erro ainda:

Atenção
Erro ao acessar o banco de dados
ORA-01861: literal does not match format string
select count(*) from ss_estat_atendimento where (Data_atendimento >= to_date(‘20150101’) And Data_atendimento <= to_date(‘20150131’))

Dentro da View no Oracle, já estou formatando assim: TO_DATE(HISTORICO.HISTORICODATA, ‘DD/MM/YYYY’) AS DATA_ATENDIMENTO

Será tem está tendo alguma influência?

Marlon,

Eu costumo usar o TO_CHAR mesmo. E no TO_CHAR preciso formatar a data na forma que quero que seja comparada. Como mostrei na primeira sugestão.

WHERE to_char(Data_atendimento,‘YYYYMMDD’) >= ‘[glo_datainicial]’ And to_char(Data_atendimento,‘YYYYMMDD’) <= ‘[glo_datafinal]’

Mas se você está lendo a partir dessa view, então a view tem que estar usando o mesmo formato para que tua pesquisa funcione.

Olá Kleyber;

Funcionou!

Na View não coloquei nenhuma formatação de data para o campo tipo data.

Na aplicação consulta fiz um WHERE Data_atendimento >= TO_DATE(’[glo_datainicial]’,‘DD/MM/YYYY’) And Data_atendimento <= TO_DATE(’[glo_datafinal]’,‘DD/MM/YYYY’)

Agora, gostaria de saber como faço para selecionar o WHERE conforme o banco de dados. Neste caso utilizo o Oracle e MySQL.

Você saberia dizer como faço para identificar a conexão?

Outra coisa:

Nas aplicações seleciono qual a conexão, isso pode ser alterado no momento da publicação?

É que estou bem cru nesta situação.

Obrigado!

Marlon,

Utilize a macro sc_glo_db_type para saber qual banco estás usando. Só não entendi a questão de selecionar a conexão no momento da publicação.

Como nunca trabalhei com o SC para mais de um banco, não sei como proceder no momento da publicação.
Sei que escolherei a conexão no momento da publicação.

Porém como as expressões SQL na cláusula WHERE irão mudar conforme o banco, não sei como proceder.

Não sei como tratar a cláusula WHERE na aplicação consulta para cada banco.

Crie uma variável global, tipo [c_where] e preencha com o código do where de cada banco. Assim, faça um IF com a macro que te passei, pra saber se é Oracle ou MySQL e coloque no OnScriptInit. Se for Oracle, passe o conteúdo do where para essa variável, então fica mais ou menos assim:

if sc_glo_db_type = “Oracle”
{
[c_where] = “Data_atendimento >= TO_DATE(’[glo_datainicial]’,‘DD/MM/YYYY’) And Data_atendimento <= TO_DATE(’[glo_datafinal]’,‘DD/MM/YYYY’)”
} else if sc_glo_db_type = “Mysql”
[c_where] = "Data_atendimento >= ‘[glo_datainicial]’ And Data_atendimento <= ‘[glo_datafinal]’
}

E no SQL da Consulta, coloque no WHERE assim:

WHERE [c_where]

Obrigado!

Vou testar!

Olá Kleyber;

Estou fazendo testes e está ocorrendo o seguinte erro:

Mas antes vou mostrar o que estou fazendo:
Na aplicação controle (onde peço as datas), no evento OnValidateSucess:

sc_redir(grid_ss_estat_atendimento, glo_datainicial = {DataInicial}; glo_datafinal = {DataFinal});

Na aplicação consulta no evento Onscriptinit:

[code]$datainicial = [glo_datainicial];
$datafinal = [glo_datafinal];

$tipoBanco = [sc_glo_db_type];

if $tipoBanco == “Oracle”
{
$where = “(Data_atendimento >= TO_DATE(’” . $DataInicial . “’,‘DD/MM/YYYY’) And Data_atendimento <= TO_DATE(’” . $DataFinal . “’,‘DD/MM/YYYY’))”;

} else if $tipoBanco == “Mysql”

$where = "(Data_atendimento >= '" . $DataInicial . "' And Data_atendimento <= '" . $DataFinal . "')";

}[/code]

Está ocorrendo o erro:
Parse error: syntax error, unexpected ‘$tipoBanco’ (T_VARIABLE), expecting ‘(’ in C:\Program Files (x86)\NetMake\v81\wwwroot\scriptcase\app\SocialServiceEstatistica\grid_ss_estat_atendimento\grid_ss_estat_atendimento_resumo_Equip_Serv_Atend.class.php on line 124

Marlon,

Eu escrevi errado o IF, mas tem uma coisinha aqui que deves mudar:

$tipoBanco = sc_glo_db_type;

if($tipoBanco == “Oracle”) {

Na verdade já tinha percebido isso.

Mas ainda está ocorrerendo o erro:

Conteúdo do where: (Data_atendimento >= TO_DATE(‘01/01/2015’,‘DD/MM/YYYY’) And Data_atendimento <= TO_DATE(‘31/12/1969’,‘DD/MM/YYYY’))
Conteúdo do tipo do banco: oci805
Conteúdo das variáveis data: 01/01/2015 e 31/01/2015
Conteúdo das variáveis globais data: 01/01/2015 e 31/01/2015

Atenção
Erro ao acessar o banco de dados
ORA-00920: invalid relational operator
select count(*) from ss_estat_atendimento where ‘(Data_atendimento >= TO_DATE(‘01/01/2015’,‘DD/MM/YYYY’) And Data_atendimento <= TO_DATE(‘31/01/2015’,‘DD/MM/YYYY’))’

Desde já quero lhe agradecer pela ajuda.

Marlon,

A variável global que vai receber a definição do teu WHERE deve ser pública, ou seja, criada entre colchetes ‘[]’, como te indiquei no post mais acima

No teu where deixe assim:

SELECT


WHERE [c_where]

Olá Kleyber;

Consegui resolver:

[code]
$datainicial = [glo_datainicial];
$datafinal = [glo_datafinal];

//Contém o tipo do banco (mssql, oracle, mysql, etc).
$db_type = [sc_glo_db_type];

switch ($db_type) {

case 'oci805':
    [glo_where] = "Data_atendimento >= TO_DATE('" . $datainicial . "','DD/MM/YYYY') And Data_atendimento <= TO_DATE('" . $datafinal . "','DD/MM/YYYY')";
    break;
case 'pdo_mysql':
    [glo_where] = "Data_atendimento >= '" . $datainicial . "' And Data_atendimento <= '" . $datafinal . "'";
    break;

}[/code]

No SQL coloquei WHERE [glo_where]. Estava colocando com aspas simples e por isso que dava erro.

O que estranhei foram os nomes dos tipos de bancos que o SC retornou.
Fico com certas ressalvas quando implementar no cliente.

Será que o nome vai mudar?

Tens alguma experiência nisso?

Obrigado desde já!

Realmente é uma boa pergunta… rsrsrsrs não sei te responder. Mas creio que não deva mudar. Mas se em uma nova versão isso mudar, antes de publicar o sistema com a nova versão, teste antes pra saber como deve ser o resultado e aí sim, coloque em produção.