Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com o Comando SELECT no Access


Thiago B.

Pergunta

Olá pessoal

Estou com um probleminha na hora de execultar o ADOQUERY, a mensagem de erro é a Seguinte.

"Qbjeto Parameter definido incorretamente.As informações são incosistentes ou incompletas".

"isso ocorre quando na hora de excultas o AdoQuery".

Segue logo abaixo o fonte a linguagem q estou usando e á C++ .

AnsiString DataInicialSTC,DataFinalSTC;

AnsiString DataInicialSTC2008,DataFinalSTC2008;

AnsiString HoraInicialSTC2008,HoraFinalSTC2008;

AnsiString Localizador;

AnsiString usuarios, dataHoraInicial, dataHoraFinal;

int indice;

indice = CBoxConsumidoresSTC2008->ItemIndex;

usuarios = CBoxConsumidoresSTC2008->Items->Strings[indice];

DataInicialSTC2008 = DTPickeDataInicialSTC2008->Date.DateString();

HoraInicialSTC2008 = DTPickeHoraInicialSTC2008->Time.TimeString();

DataFinalSTC2008 = DTPickeDataFinalSTC2008->Date.DateString();

HoraFinalSTC2008 = DTPickeHoraFinalSTC2008->Time.TimeString();

dataHoraInicial = DataInicialSTC2008 + " " + HoraInicialSTC2008;

dataHoraFinal = DataFinalSTC2008 + " " + HoraFinalSTC2008;

Localizador = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = " + usuarios + " AND DATA_HORA_INTEGRACAO >= #" + dataHoraInicial + "# AND DATA_HORA_INTEGRACAO <= #" + dataHoraFinal + "#";

ADOQuerySTC2008->Close();

ADOQuerySTC2008->SQL->Clear();

ADOQuerySTC2008->SQL->Add(Localizador);

ADOQuerySTC2008->ExecSQL();

Vlw ae galera, se alguém puder me ajudar

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

tente assim:

Localizador = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = " & usuarios & " AND DATA_HORA_INTEGRACAO >= #" & dataHoraInicial & "# AND DATA_HORA_INTEGRACAO <= #" & dataHoraFinal & "#";

Link para o comentário
Compartilhar em outros sites

  • 0
tente assim:

Localizador = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = " & usuarios & " AND DATA_HORA_INTEGRACAO >= #" & dataHoraInicial & "# AND DATA_HORA_INTEGRACAO <= #" & dataHoraFinal & "#";

Muito Obrigado pela ajuda mas, não funciono. Deu erro na hora de compilar, estou usando o C++ Builder 6.0.

Tem outra opção que possa me ajudar ???

Link para o comentário
Compartilhar em outros sites

  • 0

Thiago B., não vejo esse problema como uma questão necessariamente de SQL em si, mas é coisa do MS Access mesmo.

O access consegue ser chato com o fato de usar delimitadores de data diferentes do padrão (que poderia ser aspas duplas). Então, entra outra questão que, esta sim, é comum em outros bancos: a data usada no formato inverso.

Parece-me que esta é a origem do seu problema. Assim, ela deve ser concatenada no formato: yyyy/mm/dd hh:mm:ss.

O filtrar apenas data, no MS Access, não ocorre erro na consulta se você pensar em utilizar o formato dd/mm/yyyy - mas a data pode ser tratada no formato mm/dd/yyyy.

Por exemplo, uma data gravada com este valor: 9/11/2008 04:04:49 (hoje), se for filtrada a tabela deste modo - supondo dd/mm/yyyy:

select *
from Tabela1 where data_hora between #01/11/2008# and #10/11/2008#
o resultado é vazio, porque na verdade foi interpretado como mm/dd/yyyy. No entanto, uma salada de formatos também é aceita. Note que pelos valores passados, a data inicial estaria no formato mm/dd/yyyy e a data final no formato dd/mm/yyyy.
select *
from Tabela1 where data_hora between #10/20/2008# and #30/11/2008#

e o resultado é retornado corretamente.

Então, para não ter erro, é mais seguro que use o formato yyyy/mm/dd.

Na sessão Delphi, eu costumo recomendar que não seja feita a concatenação, mas sim a parametrizaçao, justamente para evitar esta situação e pelo fato de que, se você mudar de banco de dados, o código não vai ter que ser ajustado.

Não programo em C++, mas por analogia da classe apresentada, imagino que você possa usar o recurso de parametros de forma similar. Caso você já não o conheça, procure verificar na documentação sobre a classe ADOQuery - deve haver uma propriedade Parameters

A título de informação: Jet: Date, Time, and Timestamp Literals

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

mas q banco você ta usando?? sql ou access??

se for access não tem nd a ver com essa sala aqui.

e otra coisa, o erro é na hora de compilar ou é em tempo de execucao??

se for na hora de compilar tb não tem nd a ver com a query.

mas tenta por a data no formato YYYY-MM-DD com tracinho no lugar de barra.

se não conseguir resolver, em vez de executar o codigo, imprime a query pra ver o q aparece.

tipo, veja o conteudo q esta sendo executado q ta na variavel Localizador, e se não tira nenhuma conclusao, posta esse conteudo ai pra gente ver.

otra coisa, a mensagem de erro fala sobre o Objeto Parameter. essa mensagem seria erro do banco de dados ou do codigo?? ele estaria se referindo ou parametro da query ou esse objeto Parameter é alguma coisa relacionada com essa classe do ado q você ta usando (dentro do c)??

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado Micheus, sua explicação foi ótimo deu pra clarear muitas coisas obrigado mesmo.

Pena que não funcional o Builder me retorna no mesmo erro com essas modificações no formato da data.

kuroi o banco de dados q estou usando é access mas estou usando comandos SQL pra fazer as consultas, primeiro eu tinha colocado este post na sala de Access mas foi movido pra SQL, acredito que é porque estou usando os comandos sql.

O erro da no tempo de execução, na hora de compilar tudo ok mas na hora de execultar a query da o erro !

Bom, vou tentar fazer novos testes !

Obrigado...

Link para o comentário
Compartilhar em outros sites

  • 0

Bom fiz alguns teste e segui a dica que o Micheus me deu em relação ao formato da data

se for neste formato yyyy/mm/dd funciona beleza mas se colocar as horas da o erro.

Por exemplo: LocalizadorSTC = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = 0 AND DATA_HORA_INTEGRACAO >= #2008/11/3 00:30:00# AND DATA_HORA_INTEGRACAO <= #2008/11/5 13:00:00#"; ======> Este da erro.

LocalizadorSTC = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = 0 AND DATA_HORA_INTEGRACAO >= #2008/11/3# AND DATA_HORA_INTEGRACAO <= #2008/11/5#"; =======> este não da erro. funciona beleza !

então eu preciso de uma Seleção com precisao, ou seja com Data e Hora :S.

Bom quem souber o que pode ser estou precisando com urgencia ! OBrigado !

Editado por Thiago B.
Link para o comentário
Compartilhar em outros sites

  • 0

Thaigo você seguiu o conselho do Kuroi em colocar YYYY-MM-DD HH:MM:SS

mas tenta por a data no formato YYYY-MM-DD com tracinho no lugar de barra.

se não conseguir resolver, em vez de executar o codigo, imprime a query pra ver o q aparece.

tipo, veja o conteudo q esta sendo executado q ta na variavel Localizador, e se não tira nenhuma conclusao, posta esse conteudo ai pra gente ver.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom Pessoal eu agradeço a todos pela ajuda, muito obrigado mesmo, meu problema esta resolvido.

vocês não vao acreditar o q tive q fazer pra funcionar o SELECT com a DATA e HORA

A Data tem q ser no formato yyyy-mm-dd

e a hora tem de ser no formato hh.mm.ss

então concatena

data_hora = "2008-11-3" + " " + 00.15.00 +";

Exemplo: LocalizadorSTC = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = 0 AND DATA_HORA_INTEGRACAO >= #2008-11-3 00.15.00# AND DATA_HORA_INTEGRACAO <= #2008-11-5 23.00.00#";

RESOLVIDO ! OBRIGADO

Link para o comentário
Compartilhar em outros sites

  • 0

raphael_suporte, trocar a "/" por "-" na formatação da data não deverá mudar o resultado. Citei deste modo, justo por ter testado:

access01qm4.png

access02rp1.png

By micheus at 2008-11-11

Na verdade, estamos com o foco na coisa errada. Vamos voltar a mensagem de erro citada incialmente pelo colega Thiago B.:

Estou com um probleminha na hora de execultar o ADOQUERY, a mensagem de erro é a Seguinte.

"Qbjeto Parameter definido incorretamente.As informações são incosistentes ou incompletas".

Como não é muito comum passarmos horas junto com datas na cláusula where, acaba-se por não perceber que este erro possa acontecer.

se for neste formato yyyy/mm/dd funciona beleza mas se colocar as horas da o erro.

Por exemplo: LocalizadorSTC = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = 0 AND DATA_HORA_INTEGRACAO >= #2008/11/3 00:30:00# AND DATA_HORA_INTEGRACAO <= #2008/11/5 13:00:00#"; ======> Este da erro.

Na verdade, isto é fruto da forma como o componente é implementado, ou seja, é previsto que a definição de parâmetro (parameter) ocorra através da colocação do caracter ":" a frente (e junto) de um identificador. Logo, o que está ocorrendo é que o componente está tentando tratar a hora como sendo um parâmetro e, em geral, um identificador não deve começar com número - provável motivo da mensagem informar: definido incorretamente.

Assim, caímos naquela situação que sugeri anteriormente:

Na sessão Delphi, eu costumo recomendar que não seja feita a concatenação, mas sim a parametrizaçao, justamente para evitar esta situação e pelo fato de que, se você mudar de banco de dados, o código não vai ter que ser ajustado.

Não programo em C++, mas por analogia da classe apresentada, imagino que você possa usar o recurso de parametros de forma similar. Caso você já não o conheça, procure verificar na documentação sobre a classe ADOQuery - deve haver uma propriedade Parameters

...
Localizador = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = " + usuarios + " AND DATA_HORA_INTEGRACAO >= :dataHoraInicial AND DATA_HORA_INTEGRACAO <= :dataHoraFinal";

ADOQuerySTC2008->Close();
ADOQuerySTC2008->SQL->Clear();

ADOQuerySTC2008->SQL->Add(Localizador);
ADOQuerySTC2008->Parameters->ParamByName('dataHoraInicial').Value := StrToDateTime(dataHoraInicial);
ADOQuerySTC2008->Parameters->ParamByName('dataHoraFinal').Value := StrToDateTime(dataHoraFinal);
ADOQuerySTC2008->Open();

Dê uma verificada, pois deve haver uma função para transformação da data-hora string em um TDateTime (é o que faz a função StrToDateTime e neste caso, ela usa o formato: MM/DD/YY HH:MM:SS - veja help)

Eu também troquei no exemplo a chamada ao método ExecSQL() por Open(), porque em princípio a primeira é utilizada para execução de SQL's que não retornam linhas (resultados), como é o caso de INSERT, UPDATE, DELETE e outras.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...