Ir para conteúdo
Fórum Script Brasil

renanbg

Membros
  • Total de itens

    67
  • Registro em

  • Última visita

Tudo que renanbg postou

  1. Desta forma não funciona, pois se o erro der no cdscontas, o sistema vai gravar o cdsagenda. Preciso abortar tudo em caso de erro.
  2. A minha agenda é para fisioterapia e tem mais de um paciente por horario. Por isso o filter. Então o primeiro select traz os pacientes do dia, em seguida carrego num dbgrid os horarios da clinica. Daí ai clicar no horario, o filter busca os pacientes daquele horario.
  3. Eu mantenho o database e o transaction ativados em tempo de desenvolvimento, mas vou ter que lembrar de desativar antes de compilar então.
  4. No meu botão gravar, gravo dados em 3 tabelas diferentes. em 2 delas uso clientdataset, na outra uso query. Joguei tudo dentro de um try except e caso de erro, dou um rollback. O problema é que se o erro der no applyupdates(0), a exceção não será gerada e terei dados inconsistentes gravados. Já pesquisei e vi que devo apresentar a mensagem de erro no evento OnReconcileError do clientdataset pra apresentar a mensagem de erro. Mas mesmo após a mensagem, o restante do código será executado. O resumo do meu codigo é assim: try cdsagenda.post; cdsagenda.applyupdates(0); cdscontas.post; cdscontas.applyupdates(0); while not cdsitens.eof do ... ... qrproducao.post; except showmessage('deu erro, não gravei nada'); transaction.rollbackretaining; end; Minha duvida é como cancelar tudo em caso de erro.
  5. O select não é uma opção neste caso, pois já uso um select para listar os pacientes do dia e em seguida uso um filter para listar os do horario selecionado. Então para posicionar o cursor, somente me resta o locate
  6. Na verdade a leitura está correta. Debugando notei que o problema pode ser pelo fato de eu manter o database ativo em tempo de projeto.
  7. Jhonas. Usei o locate pra buscar o código recém gravado, mas as vezes da erro de invalid pointer operation. Pior que não é sempre. O código ficou assim. E o erro só aconteceu depois que usei o Locate var Posicao_Horario : TBookmark; Posicao_Agenda : Integer; begin if not FrmDm.trFisio.InTransaction then //Inicia a transação FrmDm.trFisio.StartTransaction; try //Gravando na AGENDA if not FrmDm.cdsAgenda.Active then FrmDm.cdsAgenda.Open; .... .... FrmDm.cdsAgenda.Post; FrmDm.cdsAgenda.ApplyUpdates(0); //Armazena o codigo do registro recem incluido Posicao_Agenda := FrmDm.cdsAgendaCODIGO.AsInteger; //Gravando na CONTAS A RECEBER .... .... FrmDm.cdsContasReceber.Post; FrmDm.cdsContasReceber.ApplyUpdates(0); //Inicia a gravação da PRODUCAO .... .... FrmDm.qrProducao.Post; //Grava fisicamente no banco FrmDm.trFisio.CommitRetaining; //fecha a tabela FrmDm.cdsContasReceber.Close; //Pega a posição atual do cursor dos horarios Posicao_Horario := FrmAgenda.cdsHorarios.GetBookmark; //Refaz busca dos pacientes do dia Frmdm.cdsAgenda.Close; Select * from agenda where data = hoje Frmdm.cdsAgenda.Open; //Volta o cursor dos horarios ao lugar que estava FrmAgenda.cdsHorarios.GotoBookmark(Posicao_Horario); FrmAgenda.cdsHorarios.FreeBookmark(Posicao_Horario); //Carrega os pacientes do horario Aqui apenas um filter mostra os pacientes do horario selecionado em cdshorarios //Volta o cursor da agenda ao lugar que estava Frmdm.cdsAgenda.Locate('CODIGO', Posicao_Agenda, []); Application.MessageBox(PCHAR('Agendamento realizado com sucesso!'), 'Fisio Soft RM', MB_ICONINFORMATION + MB_OK); FrmAgendamento.Close; except on e : exception do begin FrmDm.trFisio.RollbackRetaining; Application.MessageBox(PChar('Ocorreu o seguinte erro: '+#13+#13+ e.message +#13+#13+'Nenhuma alteração foi realizada.'), 'Fisio Soft RM', MB_ICONERROR + MB_OK); FrmAgenda.CalendarioClick(Sender); //Volta o cursor ao lugar que estava antes FrmAgenda.cdsHorarios.GotoBookmark(Posicao_Horario); FrmAgenda.cdsHorarios.FreeBookmark(Posicao_Horario); // Carrega os pacientes do horario FrmAgenda.ExibirPacientesDoHorario; FrmAgendamento.Close; end;
  8. Amigos, em tempo de projeto eu tenho meu database ligado ao banco de dados local e como active = True. Tudo setado no Object Inspector. Aí, no meu DPR faço a conexão com o banco do servidor, em tempo de execução, usando um arquivo .INI. Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TFrmDm, FrmDm); FrmDm.dbCompras.Connected := False; if not FileExists(ExtractFilePath(ParamStr(0)) + 'Config.ini') then begin MessageBox(Application.Handle, 'Arquivo de configuração, Config.ini, não encontrado.', 'Gestão de Compras RM', MB_ICONERROR); Exit; end; Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'Config.ini'); Dir_banco := Ini.ReadString('Banco', 'Dir', '***'); Ini.Free; if Dir_banco = '***' then begin MessageBox(Application.Handle, 'Configuração de acesso ao banco de dados incorreta.', 'Gestão de Compras RM', MB_ICONERROR); Exit; end; if Copy(Dir_banco, Length(Dir_banco), 1) <> '\' then Dir_banco := Dir_banco + '\'; frmdm.dbCompras.DatabaseName := Dir_banco + 'CADASTRO.FDB'; Frmdm.dbCompras.Connected := True; De uns dias pra cá, o sistema teima em não respeitar esse INI. Ele insiste em conectar no caminho que está fixo no datamodule. Já debuguei e ele busca a informação do banco no servidor corretamente, mas ao chegar na hora de conectar = True, ele diz que não acha o banco local. Alguém mais passou por isso ou tem alguma dica pra me dar?
  9. Pelo que vi usar o bookmark não será mais viavel mesmo, visto que preciso refazer o select após incluir um novo registro. Na sua opinião é mais rapido para a aplicação, usar o recno ou locate/findkey?
  10. Estou tentando recuperar a posição do cursor após gravar um registro, mas da o erro "record not found" Li alguns tópicos no forum da embarcadero e me parece que é normal o cursor se perder após um close/open no dataset. Meu código está mais ou menos assim: .. cds.Post; cds.ApplyUpdates(0); Posicao_Agenda := FrmDm.cdsAgenda.GetBookmark; cds.Close; //Aqui é executado um select que traz a agenda do dia cds.Open; //Aqui filtro para trazer somente os pacientes do horario cds.filtered := True FrmDm.cdsAgenda.GotoBookmark(Posicao_Agenda); FrmDm.cdsAgenda.FreeBookmark(Posicao_Agenda); Alguma sugestão de como recuperar a posição neste caso?
  11. Bom dia. Obrigado pela dica. Foi só testar isso e resolvi. Abraço
  12. Estou com uma rotina assim para ler notas XML de um diretorio. try XMLDoc := TXMLDocument.Create(nil); repeat //inicio leitura XML XMLDoc.LoadFromFile(DirectoryListBox.Directory +'\'+ SR.Name); Pai := XMLDoc.DocumentElement.ChildNodes.FindNode('NFe'); Info := Pai.ChildNodes.FindNode('infNFe'); .... .... .... until FindNext(SR) <> 0; FindClose(SR); except showmessage('ops, deu um erro'; end; Tudo funciona bem, mas se por algum motivo uma NFSe estiver neste diretório, uma exceção será gerada na linha abaixo e o codigo é interrompido. Com isso o sistema não vai ler os demais XML que estão no diretório Info := Pai.ChildNodes.FindNode('infNFe'); Preciso achar uma forma de informar ao usuario que um arquivo não pode ser lido,mas que ao em seguida o laço continue e leia o proximo xml. Alguém tem alguma sugestão?
  13. Foi preciso fechar e abrir a tabela. Obrigado.
  14. Beleza Jhonas. Melhor mesmo, assim evito dar updates desnecessários em registros que já são N. Aproveitando o gancho... Como te expliquei, somente um registro será S. Imagine que o usuario queira excluir ou inativar esse registro... Preciso achar uma forma de setar um outro registro como S. Não teria um registro preferencial, pode ser qualquer um. Dar um next na query seria a opção mais pratica na sua opinião?
  15. Um registro. Creio que a melhor forma seria alterar o campo selecionado para S e em seguida dar um update nos demais para N
  16. Executo essa rotina para alterar o valor de determinado campo. Porém após a execução, os dados no dbgrid não são atualizados. O que está errado? Qry := TIBQuery.Create(nil); try Qry.Database := FrmDm.dbFisio; Qry.SQL.Add('UPDATE BANCOS SET PRINCIPAL = :PRI'); Qry.SQL.Add('WHERE CODIGO <> :COD'); Qry.ParamByName('PRI').AsString := 'N'; Qry.ParamByName('COD').AsInteger := FrmDm.qrBancosCODIGO.AsInteger; Qry.ExecSQL; finally FreeAndNil(Qry); FrmDm.trFisio.CommitRetaining; end;
  17. Bom dia Jhonas. Não, os itens serão listados em um DBGrid.
  18. O que desejo é exatamente o que tem na imagem abaixo. Selecionar um item no meu cadastro e definir ele como default ou principal. Como tenho varios registros, não estou achando a lógica para fazer isso. o campo PRINCIPAL é do tipo char e arnazena S ou N, onde S significa que o campo é o default. O melhor caminho seria dar um update no campo PRINCIPAL, tornando todos registros como "N" e depois um novo update tornando S somente o registro selecionado?
  19. Bom dia Jhonas. Creio que a melhor opção seja mesmo o desconto em cada conta. No entanto eu não posso fazer uma divisão simples, como valor desconto / numero de contas, pois terei muitos caracteres após a virgula. O ideal seria fazer como no calculo de parcelas, mas isso envolve um FOR e não estou conseguindo encaixar esse FOR dentro do WHILE que citei no primeiro post. Você consegue me ajudar nisso?
  20. Tenho uma tabela de contas a receber com essa estrutura CODIGO INTEGER COD_AGENDAMENTO INTEGER COD_CONVENIO INTEGER PAGO INTEGER TOTAL DOUBLE PRECISION DATA_RECEBIMENTO DATE FORMA_PAGAMENTO VARCHAR(8) Ao baixar uma conta, executo isso, para marcar como pago, definir a data que foi pago e a forma de pagamento. while not eof do begin if FieldByName('MARCADO').AsString = 'S' then begin Edit; FieldByName('PAGO').AsInteger := 1; FieldByName('DATA_RECEBIMENTO').AsDateTime := Date; FieldByName('FORMA_PAGAMENTO').AsString := ComboPagamento.Text; Post; end; Next; end; Em seguida gravo na tabela de movimentação apenas o histórico, que seria mais ou menos assim: RECEBIMENTO DE FULANO DA SILVA | 150,00 Ocorre que me pediram para botar um campo para desconto. Então ao efetuar o recebimento, terei uma divergencia de valores. Suponhamos que eu esteja baixando 3 contas que totalizam 150,00 e forneça um desconto de 10,00. Na tabela de contas a receber, continuarei tendo 3 contas, agora pagas, com o valor de 50,00 cada. Já na tabela movimentação, terei um lançamento de 140,00. Ao tirar um relatorio de contas recebidas o usuario pensará que recebeu 150,00, mas recebeu somente 140,00 Como contornar isso?:
  21. Beleza Jhonas. Desta forma então creio que não terei problemas. Só me tira uma duvida: após o update que marca como paga, você também da um update que desmarca o registro ou deixa ele marcado mesmo?
×
×
  • Criar Novo...