Ir para conteúdo
Fórum Script Brasil

alemoraes

Membros
  • Total de itens

    33
  • Registro em

  • Última visita

Posts postados por alemoraes

  1. 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.

  2. 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;

  3. 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

  4. 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.

  5. 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.

     

     

  6. 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;

     

  7. 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;

  8. 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

  9. 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;

     

  10. 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) 

  11. 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;

     

  12. 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;

  13. 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:

    image.png.656f2bb9b9bc97b6308b0d33b0067096.png

    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

     

     

     

  14. 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:

    image.png.6a31141cb68b9a371e940413a709ac69.png

    e apertando F4

    image.png.d13aa55969e10dab0f94a0214223342e.png

    Será que é no DBImage1?  Obrigado mais uma vez.

  15. 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.

     

  16. 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.

  17. 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

     

     

    image.png

  18. 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.

  19. 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.

     

  20. 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...