sr._neves Posted June 4, 2012 at 08:26 PM Report Share #460380 Posted June 4, 2012 at 08:26 PM Eu estou a desenvolver uma pequena agenda em delphi, e para conseguir gerar "avisos" dos compromissos preciso de percorrer uma das minhas tabelas da base de dados e comparar com data e hora de sistema. Alguém tem uma solução para o meu problema ? desde já obrigado ! Neves 🙂 Link to comment Share on other sites More sharing options...
nunopicado Posted June 4, 2012 at 08:39 PM Report Share #460382 Posted June 4, 2012 at 08:39 PM Que tipo de base de dados é? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
sr._neves Posted June 4, 2012 at 09:47 PM Author Report Share #460405 Posted June 4, 2012 at 09:47 PM Acess ! Link to comment Share on other sites More sharing options...
nunopicado Posted June 4, 2012 at 09:58 PM Report Share #460412 Posted June 4, 2012 at 09:58 PM Com a BDE (ou similar)? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
bsccara Posted June 4, 2012 at 11:00 PM Report Share #460423 Posted June 4, 2012 at 11:00 PM Indexa por um campo que tenha a data do compromisso; as datas anteriores ficarão como primeiros registos. Basta percorrer os registos até que a data de compromisso do registo seja posterior à data do sistema. Ou se o acesso fôr por SQL usa o campo de data do compromisso numa cláusula ORDER BY. Depois apaga os registos de compromissos expirados. Link to comment Share on other sites More sharing options...
sr._neves Posted June 5, 2012 at 08:26 AM Author Report Share #460454 Posted June 5, 2012 at 08:26 AM Com a BDE (ou similar)? Sim com BDE. bsccara Podes te explicar melhor ? Link to comment Share on other sites More sharing options...
nunopicado Posted June 5, 2012 at 12:56 PM Report Share #460528 Posted June 5, 2012 at 12:56 PM A ideia do bsccara é percorreres o dataset para pesquisares a base de dados. Não dá pra te dar o código completo, pois não sei exactamente como está desse lado, mas é algo do género: for i:=0 to dsBDados.recordcount - 1 do begin dsBDados.RecNo:=i; if DaysBetween(StrToDate(dsBDados.FieldByName('Data').AsString),Date)<2 then ShowMessage(dsBDados.FieldByName('Descrição').AsString + ' a concluir em ' + dsBDados.FieldByName('Data').AsString); end; Algo deste genero... "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
passarito Posted June 5, 2012 at 02:26 PM Report Share #460561 Posted June 5, 2012 at 02:26 PM Boas, vou tentar meter a foice em seara alheia..... @Nuno, porque não corres a BD com um while? Algo do género: while not dsBDados.eof do begin .... end; - Se isto for um erro crasso, estou pronto para levar na cabeça! 🙂 ) Link to comment Share on other sites More sharing options...
nunopicado Posted June 5, 2012 at 02:33 PM Report Share #460563 Posted June 5, 2012 at 02:33 PM Não é erro nenhum, é só mais uma maneira de "esfolar o gato"! Eu é que gosto muito do FOR! 😄 "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
sr._neves Posted June 5, 2012 at 04:44 PM Author Report Share #460601 Posted June 5, 2012 at 04:44 PM A ideia do bsccara é percorreres o dataset para pesquisares a base de dados. Não dá pra te dar o código completo, pois não sei exactamente como está desse lado, mas é algo do género: for i:=0 to dsBDados.recordcount - 1 do begin dsBDados.RecNo:=i; if DaysBetween(StrToDate(dsBDados.FieldByName('Data').AsString),Date)<2 then ShowMessage(dsBDados.FieldByName('Descrição').AsString + ' a concluir em ' + dsBDados.FieldByName('Data').AsString); end; Algo deste genero... Estou a ver, mas fiquei aqui um bocado confuso com esta parte do codigo: if DaysBetween(StrToDate(dsBDados.FieldByName('Data').AsString),Date)<2 podias explicar-me melhor 😁 Link to comment Share on other sites More sharing options...
nunopicado Posted June 5, 2012 at 05:08 PM Report Share #460613 Posted June 5, 2012 at 05:08 PM heheheh DaysBetween é uma função que devolve quandos dias há de diferença entre as duas datas passadas por parametro (no exemplo, a data da base de dados e a data actual). Assim, ele iria alertar caso faltassem menos de 2 dias para atingir aquela data. Isto foi só um exemplo, nesse if podes usar a comparação que achares mais adequada. Se a ideia é ele avisar só se as datas forem iguais, bastava uma comparação directa ( = ), depois é claro de estarem ambos os lados convertidos num mesmo tipo de dados (Ex. if StrToDate(dsBDados.FieldByName('Data').AsString)=Date then ...) "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
bsccara Posted June 5, 2012 at 08:16 PM Report Share #460679 Posted June 5, 2012 at 08:16 PM Se estás a usar componentes TTable (de nome tabela) : tabela.IndexName := 'PorDataCompromisso'; tabela.SetRange([EncodeDate(1,1,1)],[Date]); try while not tabela.EOF do begin tabela.Next; end; finally tabela.CancelRange; tabela.IndexName := ''; end; Link to comment Share on other sites More sharing options...
sr._neves Posted June 6, 2012 at 08:27 AM Author Report Share #460792 Posted June 6, 2012 at 08:27 AM (edited) Estou a fazer assim : while not ds_compromissos.DataSet.Eof do begin begin if (ds_compromissos.DataSet.FieldByName('data')=date) and (ds_compromissos.DataSet.FieldByName('hora')=time) then ShowMessage(ds_compromissos.DataSet.FieldByName('assunto').AsString); end; end; mas dá-me erro: [DCC Error] u_principal.pas(579): E2015 Operator not applicable to this operand type Sugestões ? Edited June 6, 2012 at 08:36 AM by sr._neves Link to comment Share on other sites More sharing options...
nunopicado Posted June 6, 2012 at 08:31 AM Report Share #460794 Posted June 6, 2012 at 08:31 AM Estranho... Qual o componente que estás a usar? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
sr._neves Posted June 6, 2012 at 08:48 AM Author Report Share #460800 Posted June 6, 2012 at 08:48 AM Um ttimer ! Para estar sempre a ver se já chegou a hora. Link to comment Share on other sites More sharing options...
nunopicado Posted June 6, 2012 at 09:47 AM Report Share #460813 Posted June 6, 2012 at 09:47 AM Refiro-me ao componente usado para a propria base de dados. É um TTable, TDataSet ou outro? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
sr._neves Posted June 6, 2012 at 10:36 AM Author Report Share #460826 Posted June 6, 2012 at 10:36 AM é um TdataSource o objecto Link to comment Share on other sites More sharing options...
nunopicado Posted June 6, 2012 at 11:58 AM Report Share #460842 Posted June 6, 2012 at 11:58 AM (edited) O RecordCount e o RecNo são propriedades dos DataSet's e não dos DataSource's. Por isso, é necessário uma pequena alteração ao que eu tinha falado: ds_compromissos.DataSet.RecordCount e ds_compromissos.DataSet.RecNo Edited June 6, 2012 at 11:59 AM by nunopicado "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
sr._neves Posted June 6, 2012 at 12:04 PM Author Report Share #460844 Posted June 6, 2012 at 12:04 PM O RecordCount e o RecNo são propriedades dos DataSet's e não dos DataSource's. Por isso, é necessário uma pequena alteração ao que eu tinha falado: ds_compromissos.DataSet.RecordCount e ds_compromissos.DataSet.RecNo Sim , mas isso era se eu tivesse a correr a base de dados com um for certo ? O erro está no if: if (ds_compromissos.DataSet.FieldByName('data')=date) and (ds_compromissos.DataSet.FieldByName('hora')=time) then ShowMessage(ds_compromissos.DataSet.FieldByName('assunto').AsString); Ele não me deixa é fazer este If Link to comment Share on other sites More sharing options...
nunopicado Posted June 6, 2012 at 12:27 PM Report Share #460848 Posted June 6, 2012 at 12:27 PM Está-te a faltar o tipo de dados com que ele devolve a data... Algo tipo: if (ds_compromissos.DataSet.FieldByName('data').AsString=DateToStr(date)) and (ds_compromissos.DataSet.FieldByName('hora').AsString=TimeToStr(time)) then ShowMessage(ds_compromissos.DataSet.FieldByName('assunto').AsString); É preciso indicar o tipo de saida de dados (no caso, .AsString para o valor devolvido ser do tipo String) e também converter um dos valores para que tenham os dois o mesmo tipo. No caso, usei o DateToStr e o TimeToStr para converter a data e hora no formato String. A proposito, convém ver se a data e hora na base de dados estão no mesmo formato da data e hora devolvidas pelo Delphi. Se não estiverem, tem de se converter. Exemplo: Se A data na base de dados estiver AAAA/MM/DD e o Delphi está a devolver DD-MM-AAAA, é preciso corrigir... "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now