Translate Error. Value out of bounds.

Delphi

13/02/2015

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 :
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

Marcos P

Curtidas 0

Melhor post

Cauê Nishijima

Cauê Nishijima

13/02/2015

Marcos tenta o seguinte:

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

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 !!!
GOSTEI 0
Renato Rubinho

Renato Rubinho

13/02/2015

Buenas,

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

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...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/02/2015

tente com .AsSQLTimeStamp
GOSTEI 1
Emerson Nascimento

Emerson Nascimento

13/02/2015

tente com .AsSQLTimeStamp juntamente com a função DateTimeToSQLTimeStamp() (SqlTimSt.pas)
GOSTEI 1
Renato Rubinho

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.
GOSTEI 1
Marcos P

Marcos P

13/02/2015

Estou retomando o assunto hoje... aviso na sequencia !

Obrigado pela ajuda de todos !
GOSTEI 0
Marcos P

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....
GOSTEI 0
Marcos P

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....
GOSTEI 0
Marcos P

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 ?
GOSTEI 0
Renato Rubinho

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.
GOSTEI 1
Marcos P

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...
GOSTEI 0
Marcos P

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]
GOSTEI 0
Renato Rubinho

Renato Rubinho

13/02/2015

Que novela, hein?... rsrs
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

Marcos P

13/02/2015

rrubinho,

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

Marcos P

13/02/2015

Consegui passar corretamente, com :
      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

Renato Rubinho

13/02/2015

Opa,

Ú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

Marcos P

13/02/2015

rrubinho,

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

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!
GOSTEI 0
POSTAR