Criado em: 29/1/2010 1:52:14 PM
Status deste chamado: em andamento
Última ação ref. este chamado: Chamado resp. pelo usuario
Ver histórico do chamado
Caros colegas,
Estou com uma bronca e preciso de ajuda, vou tentar resumir:
Estou desenvolvendo uma aplicação em Delphi7 e inicialmente estava usando o Firebird como base de dados local.
Para uma das telas tenho um DM com as seguintes tabelas:
tAuxProtocolo -> tAuxProtocoloEdicao -> tAuxEdicao -> tAuxPagina -> tAuxPaginaDefeito
todas relacionadas como mestre-detalhe, uma embaixo da outra
utilizando TSQLQuery e ClientDataset para cada tabela, us DataSource para cada tabela que será mestre de outra e com um unico componente DataSetProvider ligado a tabela tAuxProtocolo, que é a mestre de todas:
Os campos de ligação das tabelas são a chave primaria do tipo "Integer Not Null"
Até então estava tudo rodando direito no Firebird.
Agora passei o banco de dados da rede que é o SQLServer 2005 e ao migrar a conexão começei a ter algumas incompatibilidades.
OBS: A estrutura das tabelas tanto no Firebird como no SQLServer é a mesma.
1) O primeiro problema diz respeito a executar uma SQL com parâmetro de tipo integer. Ex:
A tabela tAuxEdicao esta relacionada com a tabela tAuxProtocoloEdicao pelo campo aedcCodigo que é do tipo integer not null, a instrução SQL é:
select * from tAuxEdicao where (aedcCodigo=:aedcCodigo) order by aedcData
As propriedade do parametro :aedcCodigo são:
DataType = ftInteger
ParamType = ptInput
O problema surge quando quero abrir o qrytAuxEdicao (Active:=True) ou ao tentar incluir os campos no Fields Editor.
As mensagens de erro são as seguintes:
"EDatabaseError with message 'SQL state: HY000, SQL Error Code: 0'
Valores de parametros de entrada inválidos
Verifique os detalhes dos valores de status"
e depois:
"dbExpress Error: [0x0009]: Invalid parameter"
Para resolver o problema instalei as atualizações do Delphi7: d7_ent_upd1.exe e d7_ent_upd1_1.exe, mas o problema continua.
2) O outro problema esta em executar uma SQL com o parâmetro do tipo Data num campo da tabela do Tipo TimeStamp no FB e DateTime no SQLServer. Ex:
Num TSQLQuery tenho o seguinte:
select * from tAuxProtocolo where
(aptcData Between :vDataIni and :vDataFim)
order by aptcData
Os parametros são:
- Name = vDataIni
DataType = ftDateTime
ParamType = ptInput
- Name = vDataFim
DataType = ftDateTime
ParamType = ptInput
Ao tentar abrir o SQLQuery, o erro: "dbExpress Error: [0x0003]: Invalid field type" aparece.
Para resolver o problema mudei o DataType dos parâmetros vDataIni e vDataFim para ftTimeStamp e depois para ftDate mas a mesma mensagem de erro aparece. As vezes consegue executar com o parametro do tipo ftTimeStamp mas a query não traz nada.
Ao executar a mesma query com o parametro ftDate no Firebird recebo os registros esperados.
Já pesquisei na internet e as soluções que encontrei foram as que tentei acima, sem nenhum resultado.
Ja trabalhei neste projeto mais de um mês e cheguei a um ponto da implementação que não consigo continuar.
Se alguém souber qual o problema por favor poste aqui.
Grato pela atenção,
Nelsonhm
Ex:
a data no banco de dados está: 2009-12-22 00:00:00.000
a instrução SQL do SQLQuery1 é:
select * from tPedido
where (Data Between :vDataIni and :vDataFim)
paso o valor dos parametros assim:
with SQLQuery1 do
begin
Close;
Params.ParamByName('vDataIni').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit1.Text);
Params.ParamByName('vDataFim').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit2.Text);
Open;
end;
22/12/2009 00:00:00.000 <== da mensagem de erro "Could not parse SQL TimeStamp string"
22/12/2009 00:00:00 <== não apresenta erro mas não retorna nada
22/12/2009 <== não apresenta erro mas não retorna nada
Já tentei também mudando o DataType dos parametros para ftDate e ftDateTime mas a query continua sem retornar nada.
with SQLQuery1 do
begin
Close;
Params.ParamByName('vDataIni').AsDate := StrToDate(MaskEdit1.Text);
Params.ParamByName('vDataFim').AsDate := StrToDate(MaskEdit2.Text);
Open;
end;
parâmetros:
Name = vDataIni
DataType = ftTimeStamp
ParamType = ptInput
Name = vDataFim
DataType = ftTimeStamp
ParamType = ptInput
(na verdade, nem precisa configurar o tipo do parâmetro, pois você pode fazê-lo na passagem dos valores, usando o .AsXXXXX)
with SQLQuery1 do
begin
Close;
Params.ParamByName('vDataIni').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit1.Text);
Params.ParamByName('vDataFim').AsSQLTimeStamp := StrToSQLTimeStamp(MaskEdit2.Text);
Open;
end;








