Ir para conteúdo
Fórum Script Brasil

renanbg

Membros
  • Total de itens

    67
  • Registro em

  • Última visita

Tudo que renanbg postou

  1. Pois é, duvida cruel pois com ele na tabela, cada vez que eu marcar ou desmarcar um registro, precisaria dar um EDIT e um POST. Daí pensei na situação de fechamento de convenio, onde o select vai me trazer cerca de 1.000 registros. Então fiquei na duvida.
  2. Eu tinha pensado nessa solução, mas meu campo MARCADO é virtual, crio ele no momento do select. Por esse motivo não consigo usar Update.
  3. Bom dia Jhonas. Obrigado pela dica. Não entendi como aplicar isso na minha situação atual. Vou tentar explicar. Tenho um checkbox para cada registro do dbgrid. Ao dar um duplo clique no registro, seto um campo chamado MARCADO para S e caso desmarque, para N Imagine que eu tenha selecionado 800 registros. Como aplicar essa técnica do bookmark para atualizar o campo PAGO de não para SIM, em todos eles? Um amigo de outro forum me sugeriu um while: var TotValor: Double; TotRegistros: Integer; begin TotValor := 0; TotRegistros := 0; with FrmDm.cdsContasReceber do begin First; while not eof do begin if FieldByName('MARCADO').AsString = 'S' then begin TotValor := TotValor + FieldByName('TOTAL').AsFloat; TotRegistros := TotRegistros + 1; end; Next; end; ShowMessage(Format('%m', [TotValor])); ShowMessage(IntToStr(TotRegistros)); end; O que acha? Depois vou precisar atualizar o campo PAGO para SIM, daí pensei em usar o mesmo while with FrmDm.cdsContasReceber do begin First; while not eof do begin if FieldByName('MARCADO').AsString = 'S' then begin Edit; FieldByName('PAGO').AsString = 'SIM'; Post; end; Next; end; ShowMessage('ok'); end; Só tenho duvidas se isso pode implicar na performance, caso tenha muitos registros em memória
  4. Tenho um select que traz os dados da tabela contas a receber. Nesse select adicionei um campo virtual chamado MARCADO. A finalidade desse campo é marcar os registros no dbgrid, via checkbox. Imagine que o select trouxe 10 contas para o dbgrid, mas o cliente deseja pagar apenas 3. Preciso obter o somatorio dessas 3 contas e atualizar o status para pago. Como poderia fazer isso?
  5. O campo calculado não serve neste caso, pois preciso pegar o historico de lançamentos. Imagina que a tabela tem dados de 2001 até 2017 e você vai selecionar apenas um dia em 2015? Terei que pegar todos valores desde o inicio para ir calculando o saldo anterior e o atual. Por isso pensei na stored procedure.
  6. Não precisa salvar no banco, apenas fazer o calculo dos saldos e mostrar no dbgrid, em colunas, ao exemplo de como está no primeiro tópico.
  7. Bom dia Jhonas, tudo bem? Vou ter num formulario um combobox com o nome dos bancos, dois datetimepicker para dataini e datafim e um button para pesquisar. O resultado sairá num dbgrid. Não é necessário que tenha uma coluna com o saldo anterior calculado a cada linha. Ele poderia ser mostrado apenas na primeira linha. Segue um espelho da minha tabela
  8. Amigos, estou tentando montar uma pequena procedure que me traga os dados de uma tabela chamada movimentacao. No formulario, vou selecionar o nome do banco e o periodo A estrutura da tabela é: CODIGO COD_BANCO //nome banco. ex BB, bradesco, itau DATA LANCAMENTO TIPO //SE É CREDITO OU DEBITO. VALOR Achei essa procedure, mas não consegui entender como adaptar para pesquisar na minha tabela. Ao que entendi, essa SP seleciona os dados de duas tabelas e eu preciso de apenas 1 CREATE PROCEDURE SALDO_CONTA ( conta varchar(15), datainicial date) returns ( data date, contamovimentada varchar(15), saldoanterior numeric(15,2), credito numeric(15,2), debito numeric(15,2), saldoatual numeric(15,2)) as declare variable valorcredito numeric(15,2); declare variable valordebito numeric(15,2); declare variable datafinal date; begin data = datainicial; contamovimentada = conta; -- datafinal será sempre a data atual do sistema -- datafinal = current_date; -- ************************************************************** -- estas linhas estão fora do while para que sejam -- * -- executadas apenas 1 vez, aumentando a performance. -- * -- depois apenas faço a soma dos valores obtidos dia a dia -- * -- para sempre obter o saldo anterior correto -- * -- ************************************************************** select coalesce(sum(valor),0) -- * from credito -- * where conta_c = :conta and data < :data into :valorcredito; -- * -- * select coalesce(sum(valor),0) -- * from debito -- * where conta_d = :conta and data < :data into :valordebito; -- * -- * -- obtenho o saldo anterior subtraindo o débito do crédito -- * saldoanterior = valorcredito - valordebito; -- * -- ************************************************************** -- verifico o movimento dia a dia, até o dia anterior à data atual while (data <datafinal> 0) or (debito > 0)) then suspend; data = data + 1; saldoanterior = saldoanterior + (credito - debito); end -- somo os créditos da data atual select coalesce(sum(valor),0) from credito where conta_c = :conta and data = :data into :credito; -- somo os débitos da data atual select coalesce(sum(valor),0) from debito where conta_d = :conta and data = :data into :debito; saldoatual = saldoanterior + (credito - debito); -- exibe o registro com o saldo do dia atual suspend; end O resultado da procedure acima, seria algo assim data |conta |saldo anterior | debito | credito | saldo atual 31/01/06 6 0,00 0,00 60,00 60,00 28/02/06 6 60,00 0,00 30,00 90,00 31/03/06 6 90,00 40,00 0,00 50,00 30/04/06 6 50,00 60,00 0,00 -10,00 19/01/07 6 -10,00 0,00 0,00 -10,00 Alguma sugestão?
  9. Obrigado Jhonas. Realmente a pesquisa só se dá de forma automática se eu usar um dbedit, porém para isso devo usar o campo codigo chave, se fizer com outro campo aí só via select mesmo.
  10. Por padrão, ListField mostra o Nome e KeyField o codigo. Então com um DBEdit o caso está resolvido. Minha situação é um pouco diferente, pois no meu cadastro de aplicações, preciso cadastrar o codigo que a empresa conveniada me passa. Isso já elimina um campo autoincremento. Lembrando que alguns registros não possuem codigo e por isso decidi não usar o campo chave para este fim, mas um novo campo chamado ID. Logo, a busca como citei na primeira linha não funciona. Existe outra forma?
  11. Beleza, então removi o open da abertura do projeto e estou abrindo a AGENDA no click do calendario, com parametros. Dessa forma, a cada clique no calendario executo essa rotina: procedure TFrmAgenda.CarregaHorarios(f_Data: TDate); var X: Integer; HoraIni: TTime; begin //Carregando os agendamentos do dia with FrmDm.qrAgenda do begin Close; SQL.Clear; SQL.Add('SELECT * FROM AGENDA'); SQL.Add('WHERE DATA = :DT'); ParamByName('DT').AsDate:= Calendario.Date; Open; end; // Limpa os dados da memória cdsHorarios.EmptyDataSet; // Procedimento de inicio de hora HoraIni := StrToTime('07:15'); //Carregando os dados da agenda qrCont.Close; qrCont.SQL.Clear; qrCont.SQL.Add('SELECT DATA, HORA FROM AGENDA'); qrCont.SQL.Add('WHERE HORA = :H AND DATA = :D'); // For para ir das 08:00 as 11:45 e 13:30 as 19:30 for X := 1 to 15 do begin HoraIni := IncMinute(HoraIni, 45); //Contando os registros pra colorir o grid horarios with qrCont do begin Close; ParamByName('H').AsTime := HoraIni; ParamByName('D').AsDate := Calendario.Date; Open; FetchAll; end; cdsHorarios.Append; cdsHorarios.FieldByName('HORA').AsDateTime := HoraIni; cdsHorarios.FieldByName('QTDE').AsInteger := qrCont.RecordCount; // Criei este campo para pintar o grid cdsHorarios.Post; if HoraIni = StrToTime('11:45') then HoraIni := IncMinute(HoraIni, 60); end; cdsHorarios.First; GridHorariosCellClick(GridHorarios.Columns[0]); //Mostra a agenda do 1º registro end; Sobre abrir e fechar a tabela, resolvi com a sua dica do Refresh. Embora o registro ainda esteja fisicamente no banco, ele não é mais mostrado no sistema. Acho que isso deve ser cache. Meus inserts geram um codigo autoincremento via storeprocedure, então meu insert ficou assim: O que me intriga é que não está gravando no banco após o applyupdates, fica apenas em memória e só vai gravar fisicamente quando fecho o sistema. Para gravar direto preciso dar o commitretaining. Só não sei se isso ée correto, visto que nunca trabalhei com esses componentes. cdsAgendamentos.Append; FrmDm.spFisio.ParamByName('TABELA').AsString := 'AGENDA'; FrmDm.spFisio.ExecProc; cdsAgendamentosCODIGO.AsInteger := FrmDm.spFisio.ParamByName('RESULT').AsInteger; cdsAgendamentosDATA.AsDateTime:= Calendario.Date; cdsAgendamentosHORA.AsDateTime:= cdsHorariosHORA.AsDateTime; cdsAgendamentos.Post; cdsAgendamentos.ApplyUpdates(0); //refaz o select para atualizar o contador CalendarioClick(Sender); Sobre o creatdataset. Não, apenas dou um open no create do formulario.
  12. Hum, agora está trazendo tudo. Abro a tabela no create do sistema e dou um: SELECT * FROM AGENDA Isso por si só já pesaria muito e como vou ter que fechar e abrir a tabela após cada inclusão e exclusão, imagina só onde irei parar. Acho que minha melhor saída seria um select por data, no onclick do Tcalendar, assim pelo menos traria no máximo 50 registros por busca. SELECT * FROM AGENDA WHERE DATA = TCALENDAR.DATE
  13. Leo, testei só o delete por hora e descobri o motivo. Após deletar, eu preciso fechar e abrir a tabela Agenda, assim o registro não aparece mais no clientdataset, mas continua no banco se você abrir a base via ibo ou ibexpert. Só sai do banco em definitivo se fecho o sistema. Já com o Commit ele é deletado do banco na hora. Abrir e fechar uma tabela dessas, que em um ano vai ter mais de 10.000 registros vai me causar lentidão né? Estou tentando um select baseado na data do TCalendar, mas daí vou precisar executar esse select cada vez que o usuario clicar em outra data with frmdm.qrAgenda do begin Close; SQL.Clear; SQL.Add('SELECT * FROM AGENDA'); SQL.Add('WHERE DATA = :DT'); ParamByName('DT').AsDate:= Calendario.Date; Open; end; O que você costuma fazer nesses casos?
  14. Boa tarde Leo, como vai? Montei toda estrutura com DataSetProvider e ClientDataSet e os filtros agora estão rodando bem. Estou enfrentando problemas de atualização no banco. Testei um delete desta forma if cdsAgendamentos.RecordCount > 0 then begin Mensagem := 'Deseja realmente excluir este agendamento ?'; if Application.MessageBox(PCHAR(Mensagem), 'Fisio Soft RM', MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2) = MRYES then cdsAgendamentos.Delete; cdsAgendamentos.ApplyUpdates(0); end; O registro não é deletado no banco de dados, a menos que eu saia do sistema e entre novamente. Se faria necessário um CommitRetaining após o ApplyUpdates?
  15. Bom dia Leo. Entendi sua lógica quanto ao empty e o create. Adicionei o create e o open no evento de create do formulario e na procedure que carrega os horarios alterei para empytdataset. Sobre carregar todos agendamentos num cds, pelo que pesquisei(link abaixo), precisarei fazer o uso de um conjunto de componentes que seriam http://www.devmedia.com.br/trabalhando-a-propriedade-filter-do-clientdataset-parte-2/13575 ibquery para fazer o select no banco datasetprovider para fazer o meio de campo clientdataset para receber ps dados no cliente datasource mostrar os dados no dbgrid2 Essa seria a unica opção? Fiz as ligações como mostrado no link acima e realmente funcionou, mas como nunca trabalhei com o datasetprovider, não tenho ideia de como eu poderia fazer as inclusões e exclusões, que hoje são feitas diretamente pela query e gerenciadas pelo ibupdatesql
  16. Boa tarde Leo. Obrigado por responder minhas duvidas. Carrego essa procedure no evento de click do TCalendar. Então a cada dia diferente que eu selecionar, estarei rodando ela.Uso o IsEmpty e o CreateDataSet por esse motivo, você acha que pode ser diferente? Sobre o carregamento da qrCont, fiz como você orientou. A primeira vista me pareceu que o carregamento do ClientDataSet foi mais lento, mas deve ser impressão pois dessa forma ficou mais leve. --------------------------- Se não sei importa, gostaria de uma dica pra carregar os agendamento no segundo dbgrid Como você pode ver pela tela que postei, no primeiro dbgrid eu carrego os horários e o número de agendamentos por horário. Por meio do evento de click, abasteço o dbgrid2 com os agendamentos do horário selecinado, mas como dá pra ver, novamente estou abrindo e fechando minha tabela. Preciso achar um meio de fazer isso com os dados em memoria. with frmdm.qrAgenda do begin Close; SQL.Clear; SQL.Add('SELECT * FROM AGENDA'); SQL.Add('WHERE HORA = :H AND DATA = :D'); ParamByName('H').AsTime:= cdsHorariosHORA.AsDateTime; ParamByName('D').AsDate:= Calendario.Date; Open; end; Achei uma dica aqui, porém nunca trabalhei com datasetprovider. Uso apenas ibquery, ibupdatesql e datasource nas minhas conexões. http://www.devmedia.com.br/trabalhando-a-propriedade-filter-do-clientdataset-parte-2/13575 Qualquer direção que puder me apontar, te agradeço.
  17. Estou com uma pequena agenda de compromissos, onde tenho uma duvida sobre trabalhar com dados em memoria, para melhorar a performance. O funcionamento é bem simples. Ao clicar num calendário, executo esse código, que varre a tabela AGENDA e conta quantos compromissos tenho por hora, listando os horários num clientdataset e exibido num dbgrid. procedure TFrmAgenda.CarregaHorarios(f_Data: TDate); var X: Integer; HoraIni: TTime; begin // Abre e fecha o componente de memoria cdsHorarios.Close; cdsHorarios.IsEmpty; cdsHorarios.CreateDataSet; cdsHorarios.Open; // Procedimento de inicio de hora HoraIni := StrToTime('07:15'); // For para ir das 08:00 as 11:45 e 13:30 as 20:15 for X := 1 to 16 do begin HoraIni := IncMinute(HoraIni, 45); //Contando os registros pra colorir o grid horarios with qrCont do begin Close; SQL.Clear; SQL.Add('SELECT DATA, HORA FROM AGENDA'); SQL.Add('WHERE HORA = :H AND DATA = :D'); ParamByName('H').AsTime := HoraIni; ParamByName('D').AsDate := Calendario.Date; Open; FetchAll; end; cdsHorarios.Append; cdsHorarios.FieldByName('HORA').AsDateTime := HoraIni; cdsHorarios.FieldByName('QTDE').AsInteger := qrCont.RecordCount; cdsHorarios.Post; if HoraIni = StrToTime('11:45') then HoraIni := IncMinute(HoraIni, 60); end; cdsHorarios.First; GridHorariosCellClick(GridHorarios.Columns[0]); //Mostra a agenda do 1º registro end;
×
×
  • Criar Novo...