Fórum Parâmetros com DBExpress #395160
07/02/2011
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
Curtir tópico
+ 0Posts
07/02/2011
Marco Salles
Gostei + 0
08/02/2011
Marcos Barbosa
dta_ini e dta_fim, ambos como ftDateTime.
Gostei + 0
08/02/2011
Marco Salles
dta_ini e dta_fim, ambos como ftDateTime.
Gostei + 0
08/02/2011
Marcos Barbosa
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
08/02/2011
Marco Salles
Esta instrução esta errada .. ou no minimo muito estranha. Qual o objetivo dela neste evento ??? Nunca vi , nunca fiz
Gostei + 0
09/02/2011
Marcos Barbosa
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
09/02/2011
Marcos Barbosa
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
09/02/2011
Marco Salles
Pelo que vi em pesquisas na net, isso significa que ñ está conseguindo acessar a tabela.
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);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
10/02/2011
Marcos Barbosa
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
10/02/2011
Marco Salles
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
Gostei + 0
15/02/2011
Marcos Barbosa
Gostei + 0
18/02/2013
Renato Silva*
Como estás utilizando DBExpress, tens que utilizar o tipo SQLTimeStamp.
Não esqueça de adicionar na Uses o SqlTimst.
Gostei + 0
18/02/2013
Perivaldo Martins
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
Clique aqui para fazer login e interagir na Comunidade :)