Fórum Parâmetros com DBExpress #395160

07/02/2011

0

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

Marcos Barbosa

Responder

Posts

07/02/2011

Marco Salles

Mas como esta a propriedade PARAMS do SqlConnection ????
Responder

Gostei + 0

08/02/2011

Marcos Barbosa

No TsqlConnection eu ñ fiz nada, só coloquei no campos no params da propriedade TSQLQuery, onde coloquei:
dta_ini e dta_fim, ambos como ftDateTime.

Responder

Gostei + 0

08/02/2011

Marco Salles

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 ????
Responder

Gostei + 0

08/02/2011

Marcos Barbosa

Ñ 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


Responder

Gostei + 0

08/02/2011

Marco Salles

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
Responder

Gostei + 0

09/02/2011

Marcos Barbosa

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).
Responder

Gostei + 0

09/02/2011

Marcos Barbosa

Fiz o seguinte:
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


Responder

Gostei + 0

09/02/2011

Marco Salles

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  
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;
  Por :  
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);
  É isto mesmo ?????? Com isto vc resolveu o problema de "unknown ISC erro 0." ????  
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 TClientDataSet

   
 
Responder

Gostei + 0

10/02/2011

Marcos Barbosa

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  ?

Responder

Gostei + 0

10/02/2011

Marco Salles

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.

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 .
Responder

Gostei + 0

15/02/2011

Marcos Barbosa

Brigadão por colocar essas observações, serão muito utéis para todos nós q estamos iniciando a vida de desenvolvimento.

Responder

Gostei + 0

18/02/2013

Renato Silva*

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.
Responder

Gostei + 0

18/02/2013

Perivaldo Martins

Assim também não funciona?
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!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar