Parâmetros com DBExpress
Tenho uma consulta que funcionava quando eu estava usando o ACCESS, agora estou migrando para o firebird e está dando o erro: unknown ISC erro 0.
Pelo que vi em pesquisas na net, isso significa que ñ está conseguindo acessar a tabela.
No data module eu tenho :
Sqlquery (Propriedades)
SQL -> SELEECT * FROM telemedicina
Params -> dta_ini e dta_fim, e em seu DataType : ftDateTime
DataSource
DataSetProvider
ClienteDataSet
O Código da consulta é :
Pelo que vi em pesquisas na net, isso significa que ñ está conseguindo acessar a tabela.
No data module eu tenho :
Sqlquery (Propriedades)
SQL -> SELEECT * FROM telemedicina
Params -> dta_ini e dta_fim, e em seu DataType : ftDateTime
DataSource
DataSetProvider
ClienteDataSet
O Código da consulta é :
begin
DTP_data_fim.DateTime:=Now;
DM.QRY_telemedicina.Close;
DM.QRY_telemedicina.SQL.Clear;
DM.QRY_telemedicina.SQL.Add('SELECT t.* FROM telemedicina t');
DM.QRY_telemedicina.SQL.Add('WHERE EXISTS(SELECT COUNT(*), x.assunto FROM telemedicina x');
DM.QRY_telemedicina.SQL.Add('where x.assunto = t.assunto');
DM.QRY_telemedicina.SQL.Add('AND data BETWEEN :_dta_ini and :_dta_fim');
DM.QRY_telemedicina.SQL.Add('GROUP BY x.assunto');
DM.QRY_telemedicina.SQL.Add('HAVING COUNT(*) > 1 )');
DM.QRY_telemedicina.SQL.Add('ORDER BY assunto,data');
DM.QRY_telemedicina.Params.ParamByName('_dta_ini').Value := dtp_Data_ini.DateTime;
DM.QRY_telemedicina.Params.ParamByName('_dta_fim').Value := dtp_Data_fim.DateTime;
DM.QRY_telemedicina.Open;
end;
Marcos Barbosa
Curtidas 0
Respostas
Marco Salles
07/02/2011
Mas como esta a propriedade PARAMS do SqlConnection ????
GOSTEI 0
Marcos Barbosa
07/02/2011
No TsqlConnection eu ñ fiz nada, só coloquei no campos no params da propriedade TSQLQuery, onde coloquei:
dta_ini e dta_fim, ambos como ftDateTime.
dta_ini e dta_fim, ambos como ftDateTime.
GOSTEI 0
Marco Salles
07/02/2011
No TsqlConnection eu ñ fiz nada, só coloquei no campos no params da propriedade TSQLQuery, onde coloquei:
dta_ini e dta_fim, ambos como ftDateTime.
Mas como esta ??? entre nela e coloque aqui
Ou vc carrega este paremetro atraves de um Arquivo Ini ???
Se for como esta o arquivo Ini ????
dta_ini e dta_fim, ambos como ftDateTime.
GOSTEI 0
Marcos Barbosa
07/02/2011
Ñ eu ñ carrego por arquivo .INI.
Acho que ñ entendi bem seu questionamento, mas tentarei explicar melhor como está feito.
Em TSQLConnection eu fiz a ligação com o BD, dentro da sua propriedade params estão dos dados de conexão, tipo:
DriverName - Interbase
DataBase - Caminho onde está meu BD
Dialeto - 3
Em TSQLQuery:
SQLConcection - liguei ao TSQLConnection
SQL - SELECT * FROM TELEMEDICINA
PARAMS - dta_ini -> DataType -> ftDateTime
Dta_Fim -> DataType -> ftDateTime
ACTIVE - False
Em TDataSource :
DataSet -> TClienteDataSet
Em TDataSetProvider :
DataSet -> TSQLQuery
Em TclientDataSet :
ProviderName -> TDataSetProvider
Params -> deixei vazio.
No evento BeforeRefresh -> TClientDataSet.ApplyUpdates(-1);
Acho que isso é tudo.
Se ñ expliquei o q vc precisa, me desculpe, mas faço novamente..rsrsr
Acho que ñ entendi bem seu questionamento, mas tentarei explicar melhor como está feito.
Em TSQLConnection eu fiz a ligação com o BD, dentro da sua propriedade params estão dos dados de conexão, tipo:
DriverName - Interbase
DataBase - Caminho onde está meu BD
Dialeto - 3
Em TSQLQuery:
SQLConcection - liguei ao TSQLConnection
SQL - SELECT * FROM TELEMEDICINA
PARAMS - dta_ini -> DataType -> ftDateTime
Dta_Fim -> DataType -> ftDateTime
ACTIVE - False
Em TDataSource :
DataSet -> TClienteDataSet
Em TDataSetProvider :
DataSet -> TSQLQuery
Em TclientDataSet :
ProviderName -> TDataSetProvider
Params -> deixei vazio.
No evento BeforeRefresh -> TClientDataSet.ApplyUpdates(-1);
Acho que isso é tudo.
Se ñ expliquei o q vc precisa, me desculpe, mas faço novamente..rsrsr
GOSTEI 0
Marco Salles
07/02/2011
Em TSQLConnection eu fiz a ligação com o BD, dentro da sua propriedade params estão dos dados de conexão, tipo
Gostaira de ver como esta esta propriedade. É fscil é so entre nela tem um botão abaixo (code Editor). click nele e Copie aqui
No evento BeforeRefresh -> TClientDataSet.ApplyUpdates(-1);
Esta instrução esta errada .. ou no minimo muito estranha. Qual o objetivo dela neste evento ??? Nunca vi , nunca fiz
Esta instrução esta errada .. ou no minimo muito estranha. Qual o objetivo dela neste evento ??? Nunca vi , nunca fiz
GOSTEI 0
Marcos Barbosa
07/02/2011
Aki estão os dados do TSQLConnection.
DriverName=Interbase
Database=C:\Projetos\Integração1\BD\telemedicina.FDB
RoleName=RoleName
User_Name=SYSDBA
Password=masterkey
ServerCharSet=
SQLDialect=3
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
ErrorResourceFile=
LocaleCode=0000
Interbase TransIsolation=ReadCommited
Trim Char=False
Quanto ao BeforeRefresh, como disse antes de começar a utlizar esses componentes eu pesquisei um pouco na net, e achei uma explicação de como aplica-lo no final da explicação tem esse aviso:
Observação:
Não se esqueça de colocar no evento BeforeRefresh do componente ClientDataSet, o seguinte código: ClientDataSet1.ApplyUpdates(-1);
Caso você não coloque, aparentemente (na tela), os dados são alterados, mas o banco de dados não sofrerá alteração alguma (por exemplo, se vocÊ adicionar um registro, na tela ele aparecerá adicionado, mas no banco de dados ele não irá aparecer).
DriverName=Interbase
Database=C:\Projetos\Integração1\BD\telemedicina.FDB
RoleName=RoleName
User_Name=SYSDBA
Password=masterkey
ServerCharSet=
SQLDialect=3
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
ErrorResourceFile=
LocaleCode=0000
Interbase TransIsolation=ReadCommited
Trim Char=False
Quanto ao BeforeRefresh, como disse antes de começar a utlizar esses componentes eu pesquisei um pouco na net, e achei uma explicação de como aplica-lo no final da explicação tem esse aviso:
Observação:
Não se esqueça de colocar no evento BeforeRefresh do componente ClientDataSet, o seguinte código: ClientDataSet1.ApplyUpdates(-1);
Caso você não coloque, aparentemente (na tela), os dados são alterados, mas o banco de dados não sofrerá alteração alguma (por exemplo, se vocÊ adicionar um registro, na tela ele aparecerá adicionado, mas no banco de dados ele não irá aparecer).
GOSTEI 0
Marcos Barbosa
07/02/2011
Fiz o seguinte:
No DM.TsqlQuery na propriedade params, coloquei em DataType como ftDate.
Na consulta:
Agora ñ dá mais erro.
Resolvido
No DM.TsqlQuery na propriedade params, coloquei em DataType como ftDate.
Na consulta:
DM.qry_telemedicina.Params.ParamByName('_dta_ini').AsString := FormatDateTime('MM/DD/YYYY', dtp_Data_ini.Date);
DM.qry_telemedicina.Params.ParamByName('_dta_fim').AsString := FormatDateTime('MM/DD/YYYY', dtp_Data_fim.Date);
Agora ñ dá mais erro.
Resolvido
GOSTEI 0
Marco Salles
07/02/2011
Tenho uma consulta que funcionava quando eu estava usando o ACCESS, agora estou migrando para o firebird e está dando o erro: unknown ISC erro 0.
Pelo que vi em pesquisas na net, isso significa que ñ está conseguindo acessar a tabela.
Eu não tinha visto o seu código. Segui o que vc disse .. Não acessar a tabela geralmente é erro de conexão .
E Erro de Conexão é erro de Parametros e depois analizamos prováveis erros de Sql
Pelo que vi em pesquisas na net, isso significa que ñ está conseguindo acessar a tabela.
No DM.TsqlQuery na propriedade params, coloquei em DataType como ftDate
Vc ja tinha repostado esta condição desde oprimeiro tópico
Pelo que eu entendi vc trocou a instrução:
DM.QRY_telemedicina.Params.ParamByName('_dta_ini').Value := dtp_Data_ini.DateTime;
DM.QRY_telemedicina.Params.ParamByName('_dta_fim').Value := dtp_Data_fim.DateTime;DM.qry_telemedicina.Params.ParamByName('_dta_ini').AsString := FormatDateTime('MM/DD/YYYY', dtp_Data_ini.Date);
DM.qry_telemedicina.Params.ParamByName('_dta_fim').AsString := FormatDateTime('MM/DD/YYYY', dtp_Data_fim.Date);Quanto ao BeforeRefresh, como disse antes de começar a utlizar esses componentes eu pesquisei um pouco na net, e achei uma explicação de como aplica-lo no final da explicação tem esse aviso:
Observação:
Não se esqueça de colocar no evento BeforeRefresh do componente ClientDataSet, o seguinte código: ClientDataSet1.ApplyUpdates(-1);
Caso você não coloque, aparentemente (na tela), os dados são alterados, mas o banco de dados não sofrerá alteração alguma (por exemplo, se vocÊ adicionar um registro, na tela ele aparecerá adicionado, mas no banco de dados ele não irá aparecer).
Esta afirmação ou este conselho esta MEIO certo e MEIO errado . Certo porque vc so aplica as atualizaçoes no Banco dando um ApplayUpdates . Errado porque este evento não é o mais indicado ( alias , evento nenhum ,mas dos males o menor ) para se aplicar Atualizaçoes .. Vc sabe por exemplo qnd é disparado este evento ??? Este evento é disparado qnd se movimenta o cursor dos dados . Agora imagine a situação . Usuario entra , insere um Dados , salva e Sai .
Faça um teste utilizando um DbEdit
Conclusão> Não executa o BeforeRefresh , Não atualiza é os Dados não são aplicadas e ficam perdidos
ps) O salvar não Movimenta o cursor dos dados
O Outro ponto é que ao utilizar evento para aplicar atualizaçoes , vc consome muitos recursos de rede e vai de contra mão a que o que de melhor o DataSnap te oferece , que é a facilidade de trabalhar desconectado
Outro ponto negativo nesta estrutura é que vai de contra_mão a OO. Responsabilidade a mais para a classe TClientDataSetObservação:
Não se esqueça de colocar no evento BeforeRefresh do componente ClientDataSet, o seguinte código: ClientDataSet1.ApplyUpdates(-1);
Caso você não coloque, aparentemente (na tela), os dados são alterados, mas o banco de dados não sofrerá alteração alguma (por exemplo, se vocÊ adicionar um registro, na tela ele aparecerá adicionado, mas no banco de dados ele não irá aparecer).
GOSTEI 0
Marcos Barbosa
07/02/2011
Então, o erro "unknown ISC erro 0." ????" parou de acontecer quando troquei o ftDateTime por ftDate.
Troquei a opção value por Asstring e coloquei o FormatDateTime pq mesmo depois q coloquei na propriedade ftDate, dava um erro de conversão, então comecei a fazer alguns testes e cheguei a este FormatDateTime e funcionou.
Quanto ao ApplayUpdates , se entendi o que vc explicou, a forma q apliquei ele, a atualização na tabela ñ acontece de imediato, se for isso mesmo que vc quis dizer, eu já tinha percebido isto e iria perguntar o motivo. Qual o melhor lugar para aplicar o ApplayUpdates ?
Troquei a opção value por Asstring e coloquei o FormatDateTime pq mesmo depois q coloquei na propriedade ftDate, dava um erro de conversão, então comecei a fazer alguns testes e cheguei a este FormatDateTime e funcionou.
Quanto ao ApplayUpdates , se entendi o que vc explicou, a forma q apliquei ele, a atualização na tabela ñ acontece de imediato, se for isso mesmo que vc quis dizer, eu já tinha percebido isto e iria perguntar o motivo. Qual o melhor lugar para aplicar o ApplayUpdates ?
GOSTEI 0
Marco Salles
07/02/2011
Então, o erro "unknown ISC erro 0." ????" parou de acontecer quando troquei o ftDateTime por ftDate.
Troquei a opção value por Asstring e coloquei o FormatDateTime pq mesmo depois q coloquei na propriedade ftDate, dava um erro de conversão, então comecei a fazer alguns testes e cheguei a este FormatDateTime e funcionou.
Troquei a opção value por Asstring e coloquei o FormatDateTime pq mesmo depois q coloquei na propriedade ftDate, dava um erro de conversão, então comecei a fazer alguns testes e cheguei a este FormatDateTime e funcionou.
Ta certo .. Ok
Quanto ao ApplayUpdates , se entendi o que vc explicou, a forma q apliquei ele, a atualização na tabela ñ acontece de imediato, se for isso mesmo que vc quis dizer, eu já tinha percebido isto e iria perguntar o motivo. Qual o melhor lugar para aplicar o ApplayUpdates ?
O Motivo vc entendeu .. Não é toda hora que dispara o evento BeforeOnRefresh
Qual o melhor lugar para colocar no Aplicativo ... Sem dúvida é num botão a parte .. Se vc fizer muitas alteraçoes, inserçoes , deletar , enfim muitas movimentaçoes , o RAD do Delphi armazena tudo no Delta do ClientDataSet
Então vcpode ir fazendo , trabalhando , sem mesmo ter a presença fisica do Banco ( procure por KeepConnection)
que no momento oportuno vc se comunica com o banco , trafegando todas essas informaçoes (alteraçoes) que ficam
armazendas no delta do clientDataSet e serão resolvidas pelo TDataSetProvider , ser vai ou não persitir cada uma delas no Banco ..Neste ponto dois detalhes : O parametro que vc coloca no ApplayUpdates é muito importante
veja
clientDataSet.ApplayUpdates(-1) ;
Significa que se vc fizer 100 Alteraçoes e dessas somente um Estiver correta , ele Grava essa unica alteração e
descarta as outras 99
clientDataSet.ApplayUpdates(0) ;
Significa que se vc fizer 100 Alteraçoes e dessas somente um Estiver correta , ele não ira gravar nenhuma pois o
zero significa que não pode ter nenhum registro errado
clientDataSet.ApplayUpdates(1) ;
Significa que se vc fizer 100 Alteraçoes e dessas somente um Estiver correta , ele não ira gravar nenhuma pois o
um significa que so é admitido uma Operação com Registro Errado e neste caso vc tem 99 ERROS
clientDataSet.ApplayUpdates(99) ;
Significa que se vc fizer 100 Alteraçoes e dessas somente um Estiver correta , ele Grava essa unica alteração e descarta as outras 99 . Ja que foi passado pelo parametro que ate 99 ERROS serão permitidos ( Isto não significa que ira gravar os Registros errados , mas sim desconsidera-los )
Outroponto que vc precisa tomar muita atenção é as configuraçoes do providers Flags e do UpdateMode do TDataSetProvider .
GOSTEI 0
Marcos Barbosa
07/02/2011
Brigadão por colocar essas observações, serão muito utéis para todos nós q estamos iniciando a vida de desenvolvimento.
GOSTEI 0
Renato Silva*
07/02/2011
Amigo o problema é com relação ao seu campo DateTime.
Como estás utilizando DBExpress, tens que utilizar o tipo SQLTimeStamp.
Não esqueça de adicionar na Uses o SqlTimst.
Como estás utilizando DBExpress, tens que utilizar o tipo SQLTimeStamp.
Não esqueça de adicionar na Uses o SqlTimst.
GOSTEI 0
Perivaldo Martins
07/02/2011
Assim também não funciona?
Quanto ao ApplyUpdates, o seu uso vai depender muito de como vai funcionar seu cadastro por exemplo, se for inserir informações que devem estar logo na base de dados, estando assim disponíveis para outros usuários consultarem, vc pode colocá-lo logo após dar Post.
Ex:
Mas vale lembrar q como este metodo é silencioso, vc terá q capturar a exceção no evento OnReconcileError.
Se as informações não forem compartilhadas, vc pode aplicar o ApplyUpdates só no final.
Boa sorte e bons códigos!
DM.qry_telemedicina.Params.ParamByName(_dta_ini).AsDate := dtp_Data_ini.Date; //Levando em conta que se trata de um DM.qry_telemedicina.Params.ParamByName(_dta_fim).AsDate := dtp_Data_fim.Date; //Componente TDateTimePicker
Quanto ao ApplyUpdates, o seu uso vai depender muito de como vai funcionar seu cadastro por exemplo, se for inserir informações que devem estar logo na base de dados, estando assim disponíveis para outros usuários consultarem, vc pode colocá-lo logo após dar Post.
Ex:
Cds1.Post; If Cds1.ApplyUpdates(0) > 0 then ShowMessage(Houve um erro ao gravar os dados!) else ShowMessage(Dados gravados com sucesso!);
Mas vale lembrar q como este metodo é silencioso, vc terá q capturar a exceção no evento OnReconcileError.
Se as informações não forem compartilhadas, vc pode aplicar o ApplyUpdates só no final.
Boa sorte e bons códigos!
GOSTEI 0