alemoraes
-
Total de itens
33 -
Registro em
-
Última visita
Posts postados por alemoraes
-
-
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
-
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.
-
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);
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;
-
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
-
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.
-
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.
-
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;
-
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;
-
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
-
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;
-
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)
-
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; -
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;
-
Funcionou assim
procedure TfrmPatrimonio.btnNovoClick(Sender: TObject);
begin
if not (dmDados.tblPatrimonio.State in [dsInsert, dsEdit]) then
dmDados.tblPatrimonio.Insert;
end;
Obrigado Jhonas RESOLVIDO
-
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
-
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.
-
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.
-
Em 16/03/2018 at 17:44, Jhonas disse:
clique no componente LOC_NOME e empurre ele para a direita ... dê o espaçamento que voce quiser
abraço
Resolvido!
-
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.
-
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
-
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á.
-
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.
-
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.
-
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;
Stored Procedure Movimento Bancário no Firebird
em Demais Bancos
Postado
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