Translate Error. Value out of bounds.
Olá pessoal,
Delphi 2010 + Sql Server 2000 ( via BDE )...
Tenho que gerar um relatório através de uma stored procedure que contém diversos parâmetros, inclusive alguns DateTime.
Faço a declaração do parâmetro normalmente :
Mas quando executo a procedure, aparece esse maldito erro : Translate Error. Value out of bounds.
Duas questões :
> Já isolei os demais parâmetros da procedure e o erro ocorre SEMPRE nos campos data dessa mesma rotina
> Tenho outros 40 relatórios que usam procedure no mesmo sistema e em nenhum dele esse erro ocorre
Alguma ideia ?
Abraços,
Delphi 2010 + Sql Server 2000 ( via BDE )...
Tenho que gerar um relatório através de uma stored procedure que contém diversos parâmetros, inclusive alguns DateTime.
Faço a declaração do parâmetro normalmente :
stRelatorio.ParamByName('@DataInif').asDateTime := strtodatetime(DataInif.Text + ' 00:00')
Mas quando executo a procedure, aparece esse maldito erro : Translate Error. Value out of bounds.
Duas questões :
> Já isolei os demais parâmetros da procedure e o erro ocorre SEMPRE nos campos data dessa mesma rotina
> Tenho outros 40 relatórios que usam procedure no mesmo sistema e em nenhum dele esse erro ocorre
Alguma ideia ?
Abraços,
Marcos P
Curtidas 0
Melhor post
Cauê Nishijima
13/02/2015
Marcos tenta o seguinte:
ou
Att.Cauê Nishijima
stRelatorio.ParamByName('@DataInif').asDateTime := StrToDate(DataInif.Text);
ou
stRelatorio.ParamByName('@DataInif').asDateTime := StrToDateTime(DataInif.Text + ' 00:00:00');
Att.Cauê Nishijima
GOSTEI 1
Mais Respostas
Marcos P
13/02/2015
Cauê,
Muito obrigado por sua resposta !
Nenhuma das duas formas funcionou ( na verdade, já tinha tentando ambas... ) !
Assim como já tentei com FormatDateTime, sem sucesso...
Com o erro ocorre no Open da procedure e no trace do Sql Server nem existe a chamada à procedure, o erro parece ser algo interno no momento do Delphi preparar a execução...
Tá osso !!!
Muito obrigado por sua resposta !
Nenhuma das duas formas funcionou ( na verdade, já tinha tentando ambas... ) !
Assim como já tentei com FormatDateTime, sem sucesso...
Com o erro ocorre no Open da procedure e no trace do Sql Server nem existe a chamada à procedure, o erro parece ser algo interno no momento do Delphi preparar a execução...
Tá osso !!!
GOSTEI 0
Renato Rubinho
13/02/2015
Buenas,
Tenta assim:
ou
ou
Tenta assim:
stRelatorio.ParamByName('@DataInif').asDateTime := Trunc(DT1.Date) + StrToTime('00:00:00');
ou
stRelatorio.ParamByName('@DataInif').asDateTime := EncodeDateTime(YearOf(DT1.Date), MonthOf(DT1.Date), DayOf(DT1.Date),0,0,0,0);
ou
stRelatorio.ParamByName('@DataInif').asSTRING := '13/02/2015'; //Não sei qual formato texto que o Sql Server pode interpretar a data
GOSTEI 1
Marcos P
13/02/2015
rrubinho,
As boas novas : Com nenhuma das três sintaxes ocorre o erro "Valeu Out of Bounds" e a procedure é chamada no Sql Server.
As más notícias : Das três formas que você mencionou é passado "NULL" em DataInif para a procedure, mesmo com uma data válida no form !
Melhorou, mas não resolveu...
As boas novas : Com nenhuma das três sintaxes ocorre o erro "Valeu Out of Bounds" e a procedure é chamada no Sql Server.
As más notícias : Das três formas que você mencionou é passado "NULL" em DataInif para a procedure, mesmo com uma data válida no form !
Melhorou, mas não resolveu...
GOSTEI 0
Emerson Nascimento
13/02/2015
tente com .AsSQLTimeStamp
GOSTEI 1
Emerson Nascimento
13/02/2015
tente com .AsSQLTimeStamp juntamente com a função DateTimeToSQLTimeStamp() (SqlTimSt.pas)
GOSTEI 1
Renato Rubinho
13/02/2015
Marcos,
Conseguiu resolver?
Muito estranho mesmo.
Uma alternativa é mudar o tipo do parâmetro para string, receber a data como string e converter na procedure.
Conseguiu resolver?
Muito estranho mesmo.
Uma alternativa é mudar o tipo do parâmetro para string, receber a data como string e converter na procedure.
GOSTEI 1
Marcos P
13/02/2015
Estou retomando o assunto hoje... aviso na sequencia !
Obrigado pela ajuda de todos !
Obrigado pela ajuda de todos !
GOSTEI 0
Marcos P
13/02/2015
"AsSQLTimeStamp", assim como as demais formas indicadas pelo rrubinho, chegam como NULL no Sql Server.
Vou testar a conversão para string via procedure, embora precisasse resolver isso do lado do Delphi, sem alterar a estrutura no banco.
Aviso na sequencia....
Vou testar a conversão para string via procedure, embora precisasse resolver isso do lado do Delphi, sem alterar a estrutura no banco.
Aviso na sequencia....
GOSTEI 0
Marcos P
13/02/2015
"AsSQLTimeStamp", assim como as demais formas indicadas pelo rrubinho, chegam como NULL no Sql Server.
Vou testar a conversão para string via procedure, embora precisasse resolver isso do lado do Delphi, sem alterar a estrutura no banco.
Aviso na sequencia....
Vou testar a conversão para string via procedure, embora precisasse resolver isso do lado do Delphi, sem alterar a estrutura no banco.
Aviso na sequencia....
GOSTEI 0
Marcos P
13/02/2015
Nem como string estou conseguindo passar esse parâmetro !
Fiz, apenas para testar : stRelatorio.ParamByName('@DataIni').AsString := 'ABC';
No debug, tudo certo : stRelatorio.ParamByName('@DataIni').AsString | 'ABC';
No trace do Sql Server o parâmetro é passado como NULL : exec dbo.sprelelatorio @Situacao = 0, @Cidade = 0, ..., @DataIni = NULL, @Vendedor = 'ABC'
Já recriei a procedure no form, mudei a ordem e os tipos do parâmetro e... nada acontece !
Alguém tem alguma ideia ?
Fiz, apenas para testar : stRelatorio.ParamByName('@DataIni').AsString := 'ABC';
No debug, tudo certo : stRelatorio.ParamByName('@DataIni').AsString | 'ABC';
No trace do Sql Server o parâmetro é passado como NULL : exec dbo.sprelelatorio @Situacao = 0, @Cidade = 0, ..., @DataIni = NULL, @Vendedor = 'ABC'
Já recriei a procedure no form, mudei a ordem e os tipos do parâmetro e... nada acontece !
Alguém tem alguma ideia ?
GOSTEI 0
Renato Rubinho
13/02/2015
Você alterou o tipo do campo na procedure também para receber como string ?
Posta seu código para tentar caçar algum detalhe.
Posta seu código para tentar caçar algum detalhe.
GOSTEI 1
Marcos P
13/02/2015
Já achei o "detalhe" aqui... são quatro reports / procedures na mesma unit e, na hora de passar os parâmetros, acabei trocando a chamada.
Já resolvi e agora o tratamento está correto... mas o valeu out of bounds, persiste !
Estou revisando mais uma vez, porque agora, com as datas iniciais ( Time = 00:00:00 ), parece que está funcionando.
Já aviso...
Já resolvi e agora o tratamento está correto... mas o valeu out of bounds, persiste !
Estou revisando mais uma vez, porque agora, com as datas iniciais ( Time = 00:00:00 ), parece que está funcionando.
Já aviso...
GOSTEI 0
Marcos P
13/02/2015
Segue o código e o debug, tentei todas as formas indicadas por vocês e nenhuma delas funciona.
O sintoma é o mesmo do exemplo abaixo... os parâmetros são corretamente preparados no Delphi, mas no Open da procedure ocorre o erro ( sendo que o trace do sql server nem mesmo recebe a chamada ao objeto no banco ).
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150218-130110%20%281%29.png[/img]
O sintoma é o mesmo do exemplo abaixo... os parâmetros são corretamente preparados no Delphi, mas no Open da procedure ocorre o erro ( sendo que o trace do sql server nem mesmo recebe a chamada ao objeto no banco ).
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150218-130110%20%281%29.png[/img]
GOSTEI 0
Renato Rubinho
13/02/2015
Que novela, hein?... rsrs
Seu campo é DateTime mesmo?
Tenta passar só date :
ou
ou
ou
Seu campo é DateTime mesmo?
Tenta passar só date :
stRelatorio.ParamByName('@DataInif').asDate := DT1.Date;
ou
stRelatorio.ParamByName('@DataInif').Value := DT1.Date;
ou
stRelatorio.ParamByName('@DataInif').asDate := Trunc(DT1.Date);
ou
stRelatorio.ParamByName('@DataInif').Value := Trunc(DT1.Date);
GOSTEI 1
Marcos P
13/02/2015
rrubinho,
Sim, na procedure os campos são todos DateTime :
Tentei com as quatro variações que você sugeriu e nas quatro ocorreu o Value out of Bounds !
( a última tentativa ficou... )
Sim, na procedure os campos são todos DateTime :
CREATE PROCEDURE spRel024_faixa ( @Situacao int, @Cidade int, @AdsPerc smallint, @AdsPtoAdic float, @AdsPtoRest float, @Vendedor char(5), @pDataIni datetime, @pDataFim datetime, @pDataInif datetime, @pDataFimf datetime) AS
Tentei com as quatro variações que você sugeriu e nas quatro ocorreu o Value out of Bounds !
( a última tentativa ficou... )
// Value out of bounds na conversao desses campos data !!! stRelatorioFaixas.ParamByName('@pDataIni').Clear; stRelatorioFaixas.ParamByName('@pDataIni').Value := Trunc(DataIni.Date); stRelatorioFaixas.ParamByName('@pDataFim').Clear; stRelatorioFaixas.ParamByName('@pDataFim').Value := Trunc(DataFim.Date); stRelatorioFaixas.ParamByName('@pDataInif').Clear; stRelatorioFaixas.ParamByName('@pDataInif').Value := Trunc(DataInif.Date); stRelatorioFaixas.ParamByName('@pDataFimf').Clear; stRelatorioFaixas.ParamByName('@pDataFimf').Value := Trunc(DataFimf.Date);
GOSTEI 0
Marcos P
13/02/2015
Consegui passar corretamente, com :
Agora, por incrível que pareça, quando tento passar a segunda data com a mesma estrutura :
Chega assim no Sql Server :
Ou seja : o Delphi CONCATENOU indevidamente as duas datas no primeiro campo e colocou um caracter de controle qualquer no segundo campo !
É mole ?!?
stRelatorioFaixas.ParamByName('@pDataIni').Clear; stRelatorioFaixas.ParamByName('@pDataIni').asString := FormatDateTime('yyyy-mm-dd hh:nn:ss', (DataIni.Date) + strtotime('00:00:00'));
Agora, por incrível que pareça, quando tento passar a segunda data com a mesma estrutura :
stRelatorioFaixas.ParamByName('@pDataIni').Clear; stRelatorioFaixas.ParamByName('@pDataIni').asString := FormatDateTime('yyyy-mm-dd hh:nn:ss', (DataIni.Date) + strtotime('00:00:00')); stRelatorioFaixas.ParamByName('@pDataFim').Clear; stRelatorioFaixas.ParamByName('@pDataFim').asString := FormatDateTime('yyyy-mm-dd hh:nn:ss', (DataFim.Date) + strtotime('23:59:00'));
Chega assim no Sql Server :
exec dbo.sprel024_faixa @Situacao = 0, @Cidade = 0, ..., @pDataIni = '2014-01-01 00:00:002014-01-15 23:59:00', @pDataFim = '', @Vendedor = NULL
Ou seja : o Delphi CONCATENOU indevidamente as duas datas no primeiro campo e colocou um caracter de controle qualquer no segundo campo !
É mole ?!?
GOSTEI 0
Renato Rubinho
13/02/2015
Opa,
Último teste, então.
Tenta passar com o QuotedStr:
Último teste, então.
Tenta passar com o QuotedStr:
stRelatorioFaixas.ParamByName('@pDataIni').Clear; stRelatorioFaixas.ParamByName('@pDataIni').asString := QuotedStr(FormatDateTime('yyyy-mm-dd hh:nn:ss', (DataIni.Date) + strtotime('00:00:00'))); stRelatorioFaixas.ParamByName('@pDataFim').Clear; stRelatorioFaixas.ParamByName('@pDataFim').asString := QuotedStr(FormatDateTime('yyyy-mm-dd hh:nn:ss', (DataFim.Date) + strtotime('23:59:00')));
GOSTEI 1
Marcos P
13/02/2015
rrubinho,
Resolvi com :
E por incrível que pareça, só funciona se o último parâmetro passado para a SP for do tipo "char" ( Código do Vendedor... no meu caso ! ).
Agradeço muito sua atenção e ajuda !
Assim como aos demais que participaram dessa "estória", afinal, não consigo imaginar nenhuma explicação que justifique uma "volta" tão grande para resolver um problema tão banal, com os tipos de sintoma que encontrei.
Abraços e até a próxima...
Resolvi com :
stRelatorioFaixas.ParamByName('@pDataIni').Clear; stRelatorioFaixas.ParamByName('@pDataIni').AsDateTime := StrToDateTime(FormatDateTime('dd/mm/yyyy hh:nn:ss', DataIni.Date + strtotime('00:00:00'))); stRelatorioFaixas.ParamByName('@pDataFim').Clear; stRelatorioFaixas.ParamByName('@pDataFim').asDateTime := StrToDateTime(FormatDateTime('dd/mm/yyyy hh:nn:ss', DataFim.Date + strtotime('23:59:00'))); stRelatorioFaixas.ParamByName('@pDataInif').Clear; stRelatorioFaixas.ParamByName('@pDataInif').AsDateTime := StrToDateTime(FormatDateTime('dd/mm/yyyy hh:nn:ss', DataInif.Date + strtotime('00:00:00'))); stRelatorioFaixas.ParamByName('@pDataFimf').Clear; stRelatorioFaixas.ParamByName('@pDataFimf').asDateTime := StrToDateTime(FormatDateTime('dd/mm/yyyy hh:nn:ss', DataFimf.Date + strtotime('23:59:00')));
E por incrível que pareça, só funciona se o último parâmetro passado para a SP for do tipo "char" ( Código do Vendedor... no meu caso ! ).
Agradeço muito sua atenção e ajuda !
Assim como aos demais que participaram dessa "estória", afinal, não consigo imaginar nenhuma explicação que justifique uma "volta" tão grande para resolver um problema tão banal, com os tipos de sintoma que encontrei.
Abraços e até a próxima...
GOSTEI 0
Jonatas Alves
13/02/2015
Olá,
sei que esse tópico é bem antigo e tals, mas mesmo assim, só para deixar registrado.
Esse problema reportado pelo @Marcos P, é comum quando existe divergência na tipologia de dados.
Por exemplo: no banco de dados o tipo de dado do campo é DateTime, mas dentro da aplicação Delphi, esse mesmo campo é tratado como Date.
A melhor forma de confirmar isso é realizando o input no campo em questão, e então analisar como foi gravado o dado. Se for "DD/MM/YYYY HH:MM:SS", então o campo realmente é Datetime, mas se for gravado apenas "DD/MM/YYYY", então o campo é Date.
Recentemente tive um problema similar, e de fato esse era o problema, o tipo do dado era DateTime (No banco de dados), mas na aplicação, esse mesmo campo era tratado como Date, e quando ocorria Input, era retornada exceção "Values out of bound".
Obs: Na situação que vivenciei, o banco de dados era Firebird 2.5 e a aplicação feita em Delphi 7.
Vlw Flw!
sei que esse tópico é bem antigo e tals, mas mesmo assim, só para deixar registrado.
Esse problema reportado pelo @Marcos P, é comum quando existe divergência na tipologia de dados.
Por exemplo: no banco de dados o tipo de dado do campo é DateTime, mas dentro da aplicação Delphi, esse mesmo campo é tratado como Date.
A melhor forma de confirmar isso é realizando o input no campo em questão, e então analisar como foi gravado o dado. Se for "DD/MM/YYYY HH:MM:SS", então o campo realmente é Datetime, mas se for gravado apenas "DD/MM/YYYY", então o campo é Date.
Recentemente tive um problema similar, e de fato esse era o problema, o tipo do dado era DateTime (No banco de dados), mas na aplicação, esse mesmo campo era tratado como Date, e quando ocorria Input, era retornada exceção "Values out of bound".
Obs: Na situação que vivenciei, o banco de dados era Firebird 2.5 e a aplicação feita em Delphi 7.
Vlw Flw!
GOSTEI 0