Ir para conteúdo
Fórum Script Brasil

alemoraes

Membros
  • Total de itens

    33
  • Registro em

  • Última visita

Tudo que alemoraes postou

  1. Leonardo, boa noite Testei aqui seu código que me passou e está funcionando perfeitamente. Tu é o cara camarada. Muito obrigado mesmo. Abraços Tópico RESOLVIDO
  2. Olá vou descrever as tabelas que uso P_CON_CODIGO referencia o campo CON_CODIGO (chave estrangeira ) tabela CONTAS CON_CODIGO (PK) CON_NUMERODACONTA CON_AGENCIA CON_SALDO_INICIAL CON_DATAINCLUSAO tabela MOVIMENTACAOBANCARIA MOV_CODIGO (PK) CON_CODIGO (FK) MOV_DATADOLANCAMENTO MOV_SALDOANTERIOR MOV_CREDITO MOV_DEBITO MOV_SALDOATUAL MOV_DESCRICAO
  3. Leonardo, perfeito Inverti a ordem e está funcionando perfeitamente. Muito obrigado. A propósito, gostaria de perguntar mais uma dúvida que tenho neste mesmo stored procedure. o campo COD_CONTA é uma chave estrangeira na tabela MovimentacaoBancaria, e no cadastro de cada conta tem um campo com saldo inicial CON_SALDO_INICIAL. Tem como trazer esse valor do saldo inicial no primeiro lançamento na variável v_saldo_anterior (em vez do 0 - zero). Gostaria de uma ajuda sua, agradecendo antecipadamente.
  4. Leonardo boa tarde Obrigado pela ajuda segue o código SET TERM ^ ; CREATE PROCEDURE MOVIMENTACAOBANCARIA_INS ( P_CON_CODIGO Integer, P_MOV_CREDITO Numeric(15,2), P_MOV_DEBITO Numeric(15,2), P_MOV_DESCRICAO Varchar(40) ) AS DECLARE VARIABLE v_saldo_anterior numeric(15,2); DECLARE VARIABLE v_saldo_atual numeric(15,2); DECLARE VARIABLE v_lancamento_anterior integer; BEGIN select max(MOV_CODIGO) From movimentacaobancaria where CON_CODIGO =:p_con_codigo into v_lancamento_anterior; if (v_lancamento_anterior is null) then begin v_saldo_anterior = 0; end else begin select MOV_SALDOATUAL from movimentacaobancaria where MOV_CODIGO = :v_lancamento_anterior into v_saldo_anterior; v_saldo_anterior = coalesce(:v_saldo_anterior, 0); v_saldo_atual = :v_saldo_anterior + :p_mov_credito - :p_mov_debito; end insert into movimentacaobancaria ( con_codigo, mov_datadolancamento, mov_saldoanterior, mov_credito, mov_debito, mov_saldoatual, mov_descricao) values ( :p_con_codigo, 'now', :v_saldo_anterior, :p_mov_credito, :p_mov_debito, :v_saldo_atual, :p_mov_descricao); END^ SET TERM ; ^ GRANT EXECUTE ON PROCEDURE MOVIMENTACAOBANCARIA_INS TO SYSDBA;
  5. Boa Noite Estou fazendo um pequeno programa para movimento de conta corrente mas a stored procedure que fiz no Firebird 2.5 apresenta um detalhe que não consigo resolver. Quando realizo o primeiro lançamento o saldo atual aparece null. A partir do segundo lançamento a procedure calcula o saldo atual normalmente. Exemplo: Saldo Ant. Crédito Débito Saldo Atual 0.00 200.00 0.00 0.00 Primeiro lançamento 200.00 100.00 0.00 300.00 Segundo lançamento ... Gostaria da ajuda de vocês. Abraços
  6. Bom dia, Tenho um formulário de conta corrente diário que trabalha com duas tabelas mestre detalhe TBCAIXA e TBCONTAS. Faço os lançamentos todos os dias, com data, escolho a conta, histórico e digito os valores. Eu queria fazer um relatório tipo Croostab com uma caixa de diálogo em que eu pudesse filtrar por ano para que as contas aparecessem uma por uma no relatório somadas por mês de janeiro a dezembro. Gostaria muito de uma ajuda pois nunca fiz Relatório Croostab no FastReport. Utilizo Delphi XE7, Firedac (FDQuerys) e banco de dados Firebird 2.5 Obrigado.
  7. Jhonas, obrigado pela ajuda. Apesar dos testes, ainda sim continua a execução do código mesmo tratando com a exception. Os seus exemplos estão perfeitos. Pode ter dado algum Bug no Delphi, não sei dizer. O que eu fiz foi alterar no banco de dados Firebird, ou seja, primeiro deletei todos os registros envolvendo as duas tabelas master / detail , depois fui na tabela Filha e alterei na FK_LOCALIZACAO_ITENS_PATRIMONIO para On Delete Cascade. Está funcionando nesta questão do foreign key. Resolvido.
  8. Jhonas boa tarde peço sua ajuda não consegui resolver. Criei uma variável global tipo boolean o registro continua sendo executado. Veja como eu fiz procedure TfrmPatrimonio.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if vRetorno = true then begin if pos('violation of FOREIGN KEY constraint',e.Message) <> 0 then begin Showmessage('ERRO: Este Patrimônio encontra-se em USO!. Exclua-o no Cadastro de Localização primeiro!'); end; Abort; end; end;
  9. Coloquei um componente Application Events para tratar um erro de violação de chave estrangeira, mas apesar da mensagem aparecer e dar um OK o código é executado mesmo assim: segue o código no Application Events: procedure TfrmPatrimonio.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if pos('violation of FOREIGN KEY constraint "FK_LOCALIZACAO_ITENS_PATRIMONIO" on table "LOCALIZACAO_ITENS"',e.Message) > 0 then begin Showmessage('ERRO: Este Patrimônio encontra-se em USO!. Exclua-o no Cadastro de Localização primeiro!'); Exit; end; end;
  10. Jhonas obrigado pela dica Eu tentei mas não tive sucesso. Consegui resolver alterando uma linha da função acima em vez de: WHERE B.LOC_CODIGO = '''+ IntToStr(DBGrid1.SelectedRows.Count) + ''' alterei para: WHERE B.LOC_CODIGO = '''+ DBGrid1.DataSource.DataSet.FieldByName('LOC_CODIGO').AsString +''' e funcionou. No evento OnCellClick do DBGrid ficou: procedure TfrmLocalizacao.DBGrid1CellClick(Column: TColumn); begin if dmDados.tblLocalizacao.State in [dsBrowse] then begin FDQuerySomaColuna.Open; lblTotal.Caption:= FormatCurr('R$ #,0.00', SomaLocalizacaoGrid); end; end; Esquecí: Resolvido Esquecí: Resolvido
  11. Boa tarde Tenho 02 tabelas LOCALIZACAO e LOCALIZACAO_ITENS (Master-Detail) funcionando perfeitamente. Apesar de pesquisar no Forum não consegui encontrar o que eu queria fazer: é o seguinte: Quando clico em um registro no DBGridMaster da tabela Pai ele mostra os registros no DBGridDetail da tabela Filha, mas quero trazer a soma Total para aparecer no Label (lblTotal). Seguem os códigos que fiz: function TfrmLocalizacao.SomaLocalizacaoGrid: Currency; begin with FDQuerySomaColuna do begin Close; Active:= true; SQL.Clear; SQL.Text:= 'SELECT SUM(A.QUANT * A.VALOR_UNITARIO) As Total, B.LOC_CODIGO FROM LOCALIZACAO_ITENS A INNER JOIN LOCALIZACAO B ON (A.LOC_CODIGO = B.LOC_CODIGO) WHERE B.LOC_CODIGO = '''+ IntToStr(DBGrid1.SelectedRows.Count) + ''' GROUP BY B.LOC_CODIGO'; Open; Result := FieldByName('Total').AsCurrency; end; end; No evento On CellClick procedure TfrmLocalizacao.DBGrid1CellClick(Column: TColumn); begin if dmDados.tblLocalizacao.State in [dsBrowse] then lblTotal.Caption:= FormatCurr('R$ #,0.00', SomaLocalizacaoGrid); end;
  12. Jhonas obrigado pelos posts Eu compreendi o que você me passou sobre gravar o caminho da foto, pois é bem mais prático e rápido e senão me engano o componente OpenDialog tem a propriedade InitialDir onde pode deixar como default o caminho da pasta para escolher a foto, e escolhendo a foto pelo OpenDialog, o endereço da foto fica gravado em um DBEditFoto por exemplo. (Resolvido)
  13. Jhonas, desculpe a demora, agora que retornei ao projeto. Estou usando o componente EDBImage Banco Firebird 2.5 // BOTÃO PARA INSERIR FOTO procedure TfrmPatrimonio.BitBtn2Click(Sender: TObject); var vJpg: TJpegImage; begin if odImagem.Execute then begin vJpg:= TJpegImage.Create; vJpg.LoadFromFile(odImagem.FileName); Clipboard.Assign(vJpg); EDBImageFoto.PasteFromClipboard; vJpg.Free; end; end; // BOTÃO GRAVAR procedure TfrmPatrimonio.btnGravarClick(Sender: TObject); begin if dmDados.FDQueryPatrimonioPAT_DESCRICAO.AsString = '' then begin Showmessage('Descrição do Patrimônio deve ser informado!'); DBEditDescricao.SetFocus; Abort; end; if dmDados.FDQueryPatrimonioPAT_FOTO.AsString then begin Showmessage('Inclua uma foto para o Patrimônio.'); //EDBImageFoto.SetFocus; BitBtn2.SetFocus; Abort; end; if dmDados.dsPatrimonio.State in [dsInsert, dsEdit] then begin dmDados.tblPatrimonio.Post; dmDados.tblPatrimonio.Refresh; lblTotal.Caption:= FormatCurr('R$ #,0.00', SomaColuna); // atualiza soma na coluna valor total end; // restaura; desabilita; DBLookupComboBox1.SetFocus; end;
  14. Boa noite Preciso fazer uma validação do campo PAT_FOTO (campo blob no Firebird para Imagem) antes de Salvar, ou seja, se não escolheu a Foto e tentar salvar aparece a mensagem de aviso. Só que mesmo selecionando a foto e tentar salvar, a mensagem de aviso aparece e não deixar gravar no banco. Estou usando FDQuery (Firedac) e não achei a instrução AsBlob para o campo Segue o código: (Coloquei este código no botão de Gravar antes de dar o Post) if dmDados.FDQueryPatrimonioPAT_FOTO.AsString = ‘’ then begin Showmessage('Inclua uma foto para o Patrimônio.'); BitBtn2.SetFocus; Abort; end;
  15. Funcionou assim procedure TfrmPatrimonio.btnNovoClick(Sender: TObject); begin if not (dmDados.tblPatrimonio.State in [dsInsert, dsEdit]) then dmDados.tblPatrimonio.Insert; end; Obrigado Jhonas RESOLVIDO
  16. Trabalho com Delphi XE7 – Firedac e Banco de Dados Firebird 2.5 Tenho 02 tabelas: PROPRIETARIO (tabela pai) - FDQueryProprietario (FDQuey) updProprietario (FDUpdateSQL) propriedade UpdateObject = updProprietario PATRIMONIO (tabela filha) – FDQueryPatrimonio (FDQuery) updPatrimonio (FDUpdateSQL) propriedade UpdateObject = updPatrimonio Na FDQueryPatrimonio configurado o Master-Detail MasterSource = dsProprietario MasterField = PRO_CODIGO IndexFieldNames = PAT_PROCODIGO No formulário frmProprietario: . Cadastrei todos os Proprietários na tabela PROPRIETARIOS No formulário frmPatrimonio: . ao cadastrar um Patrimonio eu clico no DBlookupProprietario, seleciono o proprietário e clico no botão para inserir o patrimônio, mas quando tento digitar nos campos aparece a mensagem: Código do Botão Inserir: procedure TfrmPatrimonio.btnNovoClick(Sender: TObject); begin if dmDados.tblPatrimonio.State in [dsInsert, dsEdit] then dmDados.tblPatrimonio.Insert; end; Quando abro o IBExpert mesmo gerando este erro, aparece gravado no banco de dados apenas a chave primária e a chave estrangeira. O que pode ter acontecido? No banco de dados está tudo relacionado as tabelas. PK e FK
  17. Jhonas boa tarde Fiz um novo procedimento usando o FDQuery e renomeei para tblLocalizacaoItens descartando o FDCommand Fiz um procedimento GravarItem e coloquei dentro do botão Gravar. Veja o Código: procedure TfrmLocalizacao.GravarItem; begin try if dmDados.tblLocalizacaoItens.State in [dsInsert] then // Se estiver Inserindo begin dmDados.tblLocalizacaoItensCOD_PROPRIETARIO.AsInteger := dblProprietario.KeyValue; dmDados.tblLocalizacaoItensCOD_PATRIMONIO.AsInteger := dblItens.KeyValue; dmDados.tblLocalizacaoItensNOMEPAT.AsString := EditPatrimonio.Text; dmDados.tblLocalizacaoItensMARCA.AsString := EditMarca.Text; dmDados.tblLocalizacaoItensDATAPAT.AsDateTime := DateEditData.Date; dmDados.tblLocalizacaoItensQUANT.AsInteger := RxCalcEditQuant.AsInteger; dmDados.tblLocalizacaoItensVALOR_UNITARIO.AsCurrency := CurrencyEditUnitario.Value; dmDados.tblLocalizacaoItensSITUACAO.AsInteger := StrToInt(EditCodSituacao.Text); dmDados.tblLocalizacaoItensATIVO.AsString := EditStatus.Text; dmDados.tblLocalizacaoItensFOTO.Value := DBImage1.Field.AsVariant; dmDados.tblLocalizacaoItensLOC_CODIGO.AsInteger := StrToInt(DBText1.Caption); dmDados.tblLocalizacaoItens.Post; dmDados.tblLocalizacaoItens.Refresh; end else if dmDados.tblLocalizacaoItens.State in [dsEdit] then // Se estiver Editando begin dmDados.tblLocalizacaoItens.Edit; dmDados.tblLocalizacaoItens.Post; dmDados.tblLocalizacaoItens.Refresh; end; except begin Showmessage('Erro ao gravar, verifique.'); Abort; end; end; end; Está gravando no Banco de dados com sucesso (inserindo e alterando). Repare a linha de código que grifei em vermelho sobre o campo FOTO. FOTO é um campo do tipo Blob Size 80 Sub Type 0 e ele recebe do DBImage1 o campo PAT_FOTO trazido da tabela PATRIMONIO com a mesma configuração: tipo Blob Size 80 Sub Type 0 O CAMPO PAT_FOTO tem as imagens em Jpeg salvas perfeitamente. (Banco de dados Firebird 2.5). Queria uma ajuda sua, pois quando tento abrir a impressão no FastReport o formulário não abre e aparece a seguinte mensagem: e apertando F4 Será que é no DBImage1? Obrigado mais uma vez.
  18. Boa tarde, Trabalhando com Delphi XE7, Firedac e banco de dados Firebird 2.5 Fiz um Insert Into no Componente: FDCommand na propriedade CommandText digitei o comando abaixo e está funcionando, ou seja, está gravando no Banco de dados, veja: Na tabela LOCALIZACAO_ITENS tem um campo chave Auto incremento: ITEM_CODIGO INSERT INTO LOCALIZACAO_ITENS (COD_PROPRIETARIO, COD_PATRIMONIO, NOMEPAT, MARCA, DATAPAT, QUANT, VALOR_UNITARIO, SITUACAO, ATIVO, FOTO, LOC_CODIGO) VALUES (:USUARIO, :COD_PATRIMONIO, :NOMEPAT, :MARCA, :DATAPAT, :QUANT, :VALOR_UNITARIO, :SITUACAO, :ATIVO, :FOTO, :LOC_CODIGO) e no botão de Inserir o código: procedure TfrmLocalizacao.btnAdicionarClick(Sender: TObject); begin if dblProprietario.KeyValue = 0 then begin Showmessage('Campo em Branco. Selecione o Proprietário!'); dblProprietario.SetFocus; Exit; end; if dblItens.KeyValue = 0 then begin Showmessage('Campo em Branco. Selecione o Item!'); dblItens.SetFocus; Exit; end; dmDados.FDCommandInsert.ParamByName('COD_PROPRIETARIO').Value:= dblProprietario.KeyValue; dmDados.FDCommandInsert.ParamByName('COD_PATRIMONIO').Value:= dblItens.KeyValue; dmDados.FDCommandInsert.ParamByName('NOMEPAT').Value:= EditPatrimonio.Text; dmDados.FDCommandInsert.ParamByName('MARCA').Value:= EditMarca.Text; dmDados.FDCommandInsert.ParamByName('DATAPAT').Value:= DateEditData.Date; dmDados.FDCommandInsert.ParamByName('QUANT').Value:= RxCalcEditQuant.Value; dmDados.FDCommandInsert.ParamByName('VALOR_UNITARIO').Value:= CurrencyEditUnitario.Value; dmDados.FDCommandInsert.ParamByName('SITUACAO').Value:= EditCodSituacao.Text; dmDados.FDCommandInsert.ParamByName('ATIVO').Value:= EditStatus.Text; dmDados.FDCommandInsert.ParamByName('FOTO').Value:= DBImage1.Picture.ToString; dmDados.FDCommandInsert.ParamByName('LOC_CODIGO').Value:= StrToInt(DBText1.Caption); (Chave estrangeira) dmDados.FDCommandInsert.Execute(); dmDados.tblLocalizacaoItens.Refresh; lblTotal.Caption:= FormatCurr('R$ #,0.00', SomaColuna); dblItens.Enabled:= false; RxCalcEditQuant.Enabled:= false; end; A cada lançamento vai sendo carregado em um DBGrid. Através deste código postado, eu gostaria de saber como fazer um INSERT INTO e UPDATE juntos no mesmo botão de comando. Não tenho idéia de como fazer. Se puderem me ajudar, agradeço.
  19. Jhonas, boa tarde Obrigado, funcionou perfeitamente. A última dúvida que tenho é no GroupReader1 onde está Agrupado o LOC_CODIGO e o LOC_NOME conforme a imagem que postei logo acima. Quando executo o Relatório o código aparece colado ao Nome. Já fui em Editar no Menu e adicionei um espaço entre as duas expressões mas não funcionou. Também não consegui desagrupar pois quando clico em cima dos campos eles estão unidos. Existe algum tipo de concatenação na expressão? Peço sua ajuda.
  20. Jhonas boa noite Entrei em Editar no Menu do FastReport e modifiquei a expressão conforme você disse e resolvido, O Código e o Nome do Usuário estão juntos no GroupReader, obrigado. Aproveitando este post para tirar mais uma dúvida com relação a outro relatório que estou fazendo, apareceu a seguinte dúvida: Tenho dois GroupReader GroupReader1 e GroupReader2 Gostaria de colocar uma Banda de Cabeçalho no GroupReader2. Se eu coloco os cabeçalhos dos campos dentro do GroupReader2, e faço um preview os cabeçalhos não aparecem. Como fazer? Segue o print
  21. Jhonas boa tarde Arrastei o campo USU_NOME para o GroupReader mas ao carregar o Relatório só aparece o Campo USU_CODIGO código do usuário veja como está.
  22. Trabalho com Delphi XE7 e banco de dados Firebird 2.5 Tenho duas tabelas USUARIO (PAI) PATRIMONIO (FILHA) Fiz um relatório no FastReport5 com estas duas tabelas e está funcionando perfeitamente, Porém na Banda GroupReader está agrupado pelo código do Usuário USU_CODIGO, mas eu queria que além do código estivesse também o Nome do Usuário neste GroupReader. O nome do Usuário (campo USU_NOME) está na banda MasterData1 junto com os campos da tabela PATRIMONIO. Como fazer esta modificação no FastReport pois sou iniciante com esta fantástica ferramenta.
  23. Jhonas bom dia Obrigado pela ajuda, quanto a sua dica para usar a mesma tabela PATRIMONIO para dar baixa é interessante, preciso expor o seguinte: o campo PAT_SITCODIGO da tabela PATRIMONIO é uma chave estrangeira que contém vários Status pré cadastrados como: ESTOQUE, ALUGADO, DEVOLVIDO, VENDIDO, ETC. Quando for colocado o Status VENDIDO neste Patrimonio e clicar no botão de comando ele sai da Listagem do DBGRid1 e passa para o DBGrid2 que vão conter a listagem dos Patrimonios vendidos. Peço a sua ajuda para me dar uma idéia de como poderia fazer estas rotinas usando apenas a tabela PATRIMONIO. Obrigado.
  24. Jhonas boa tarde Fiz os testes aqui com estes procedimentos. Não dá erro mas também não acontece nada quando clico no botão não grava no banco Firebird nem aparece no DBGrid2. No IBquery1 no SQL digitei: select A.*, B.* from BAIXA A, PATRIMONIO B WHERE B.PAT_CODIGO =:cod No IBQuey1 Propriedade Params: DataType: ftInteger ParamType: ptInput procedure TfrmPatrimonio.BitBtnBaixaClick(Sender: TObject); begin if dmDados.tblPatrimonio.IsEmpty then begin Application.MessageBox('Tabela vazia, não há dados para transferir!', 'Aviso', mb_Ok + MB_ICONQUESTION); Abort; end else if dsBaixa.State in [dsInsert, dsEdit] then begin IBQuery1.SQL.Clear; IBQuery1.SQL.Text:= 'INSERT INTO BAIXA (BAI_DATACADASTRO, BAI_DESCRICAO, BAI_MARCA, BAI_FORNECEDOR, BAI_DATACOMPRA, BAI_QUANT, BAI_VALORUNITARIO,'+ 'BAI_VALORTOTAL, BAI_OBS, BAI_DATASAIDA, BAI_DATADEVOLUCAO, BAI_DATAVENDA, BAI_SITCODIGO, BAI_USUCODIGO, BAI_FOTO)'+ 'SELECT PAT_DATACADASTRO, PAT_DESCRICAO, PAT_MARCA, PAT_FORNECEDOR, PAT_DATACOMPRA, PAT_QUANT, PAT_VALORUNITARIO, PAT_VALORTOTAL,'+ 'PAT_OBS, PAT_DATASAIDA, PAT_DATADEVOLUCAO, PAT_DATAVENDA, PAT_SITCODIGO, PAT_USUCODIGO, PAT_FOTO'+ 'FROM PATRIMONIO WHERE PAT_CODIGO = :cod'; IBQuery1.ParamByName('cod').AsInteger:= dmDados.tblPatrimonioPAT_CODIGO.AsInteger; IBQuery1.ExecSQL;
×
×
  • Criar Novo...