Fórum Excluir dois lançamentos ao mesmo tempo na mesma tabela? #326269

27/07/2006

0

Bom dia amigos Delphianos, gostaria de saber se está certo gravar assim, dois lançamentos ao mesmo tempo na mesma tabela.

//grava debito
dm.TBconta.EDIT;
dm.TBconta.fieldbyname(´contad´).value:=e1.text;
dm.TBconta.fieldbyname(´valord´).value:=e3.text;
dm.TBconta.fieldbyname(´valor´).value:=e3.text; //valor fixo p/calculo soma
dm.TBconta.POST;

//-grava credito--------------
dm.TBconta.EDIT;
dm.TBconta.fieldbyname(´contac´).value:=e2.text;
dm.TBconta.fieldbyname(´valorc´).value:=e3.text;
dm.TBconta.fieldbyname(´valor´).value:=e3.text; //valor fixo p/calculo soma
dm.TBconta.POST;



Bom o que eu quero dizer é qui tenho uma tabela com os campos contad, contac, valord, valorc, valor....

Ai preciso gravar no mesmo tempo em duplicidade cfe. o lançamento, só qui uma cai na contad (conta débito) e outra cai na contac (conta crédito), entaum nesti caso tem dois lançamentos feitos num só, ficando o dbgrid com o unico dado identico somente o campo valor.

Bom funciona, mais quando preciso excluir como fazer pois ai quando excluir alguma linha, tem que excluir linha aonde esta o débito e linha aonde está o crédito.

Como uso Table para lançar e excluir pensei que se fizessi dois table usando o mastersource do segundo table para ligar no primeiro table e no master fields usar o campo VALOR. Assim achei que iria excluir os dois, naum funcionou.

Entaum pergunto eu devo fazer como para excluir, ou naum pode fazer desta forma para gravar na tabela.

Gradecido.


____________________
JLima_Jrº.


Jlimajr

Jlimajr

Responder

Posts

28/07/2006

Jlimajr

Para excluir ja sei

if trim(edit1.text)=´´ then begin
showmessage(´Selecione a linha que vc deseja excluir´);
end else
with dm.qtbcontalan do
begin
  close;
  sql.clear;
  sql.add(´delete from tbconta´); //codigo SQL para deletar linha
  sql.add(´where sequencia = ´+quotedstr(edit1.text)+´´);
  ExecSQL;
end;


e agora para alterar usando update? Nunca usei update, nao sei como monta-la certinho o que colocar no where

if trim(edit1.text)=´´ then begin
showmessage(´Selecione a linha que vc deseja excluir´);
end else
dm.qtbcontalan.Active := False;
dm.qtbcontalan.SQL.Clear;
dm.qtbcontalan.SQL.Add(´update tbconta set valor = ´+´´´´+e3.Text+´´´´+´ where = COD´);
dm.qtbcontalan.ExecSQL;


Alguem pode mi ajudar?


Responder

Gostei + 0

28/07/2006

Marco Salles

Entaum pergunto eu devo fazer como para excluir, ou naum pode fazer desta forma para gravar na tabela.


eu não sei se entendi direito , mas o mais indicado nesta situação é deixar com que o Banco Faça as Exclusões e Inserçoes para voce

Mas não sei se seu Banco permite o uso de Trigger ...

Qual é o Banco que voce esta usando ???


Responder

Gostei + 0

28/07/2006

Jlimajr

firebird 1.5 com delphi 5.0


Responder

Gostei + 0

29/07/2006

Marco Salles

Desculpe ., mas não entendi.. Primeiro voce fala em Inserção , depois voce fala em exclusão e por fim voce fala em edição :cry: :cry: :cry:


Responder

Gostei + 0

29/07/2006

Jlimajr

Desculpe ., mas não entendi.. Primeiro voce fala em Inserção , depois voce fala em exclusão e por fim voce fala em edição


Naum amigo, a exclusão ja consegui fazer atravez do comando delete.

O que eu quero agora é saber como se faz para alterar dois lançamentos ao mesmo tempo

Exemplo
gostaria de alterar somente a linha que eu selecionar no dbgrid

exemplo no grid vamos supor qui esta assim:
sequencia--contad---------campoc----------valord---------valorc----------valor [b:f2d7bc9bc5]001------000155----------null--------------500,00----------null------------500,00 001---------null-------------0648-------------null------------500,00----------500,00[/b:f2d7bc9bc5] 002---------001855----------null--------------300,00----------null------------300,00 002---------null-------------0006-------------null------------300,00----------300,00



Ai supondo que seleciono o primeiro quero que altere ele o o segundo tambem as linhas que estaum em negrito, que o segundo lançamento é a sequencia do primeiro lançamento.

Ai axo que deve ser feito com o [b:f2d7bc9bc5]update[/b:f2d7bc9bc5], assim se optar pela sequiencia 001 vai alterar os dois lançamentos.

O problema é qui naum sei como montar por sql, pois sempre trabalhei com table e dbedit usando append/edit/post/delete, só que bem simple agora esti aqui naum tem como fazer isso


Responder

Gostei + 0

29/07/2006

Marco Salles

estas linhas estão serão sempre sequencias ????

O que caracteriza ser os lançamentos é o Campo Sequencia ????

é o que voce quer alterar ???????

No seu exemplo voce poderia especificar momento antes da alteração , e momento depois da alteração :?: :?: :?:

[b:abaa3c4a0d]Isto é antes ou depois da alteração[/b:abaa3c4a0d] ???
sequen---contad-------campoc--------valord------valorc--------valor 001------000155----------null----------500,00-------null---------500,00 001-------null-------------0648---------null----------500,00------500,00 002-------001855----------null---------300,00-------null--------300,00 002-------null-------------0006---------null---------300,00------300,00


[b:abaa3c4a0d]Pelo que estou entendo a Sequencia que ser alterada vem do Edit1.text
Mas quias os campos que vovce quer alterar e eles recebem os novos valores de onde ???[/b:abaa3c4a0d]


Responder

Gostei + 0

31/07/2006

Jlimajr

Sim vem do edit as sequencias, note que a seguincia 001 tem dois lançamentos iguais só que um cai no campo debito e o outro no campo credito.

O que eu gostaria de saber se é possivel alterar os dois valores assim que desse um clique no dbgrid de algum lançamento. Ai abrir um form aonde tenho varios dbedits que ja possuem o mesmo valor que está no dbgrid. No caso se eu der um clique no campo aonte tem um lançamento debito ai tem que alterar o valor que possui nos dois campos debito e credito tem como automaticamente alterar tamebm o valor credito? Agora se alterar somente o campo aonde tem o numero da conta debito ai nao alterar o campo da conta credito por nao possuir valor algum ou seja esta null como mosteri na citação.

Espero ter sido mais claro na pergunta.


Gradecido.


Responder

Gostei + 0

01/08/2006

Jlimajr

Alguem tem alguma dica sobre?


Responder

Gostei + 0

01/08/2006

Marco Salles

Alguem tem alguma dica sobre?


Fiz um exemplo aqui bem básico.. Eu não sei se é isto que voce quer

[b:5e6389355e]No Incioi minha Base De Dados esta assim [/b:5e6389355e]:

[URL=http://imageshack.us][img:5e6389355e]http://img213.imageshack.us/img213/3258/imagemjlimajr1rd7.png[/img:5e6389355e][/URL]

[b:5e6389355e]O usuário altera o valor do Campo ValorC ..... Ele edita 300 , quando o valor original era 500.[/b:5e6389355e]
[URL=http://imageshack.us][img:5e6389355e]http://img74.imageshack.us/img74/9716/imagemjlimajr2uf8.png[/img:5e6389355e][/URL]

[b:5e6389355e]e ao sair do registros o valor é gravado nos demais campo...[/b:5e6389355e]
[URL=http://imageshack.us][img:5e6389355e]http://img216.imageshack.us/img216/2128/imagemjlimajr3rn6.png[/img:5e6389355e][/URL]

é isto que voce deseja ????


Responder

Gostei + 0

01/08/2006

Jlimajr

Perfeitamente colega.

fasso isso usando um update?

é isso?


Responder

Gostei + 0

01/08/2006

Marco Salles

Perfeitamente colega. fasso isso usando um update? é isso?


Não tão perfeito assim...

Não gosto muito desta abordagem , porque tenho que ter controle quase que total sobre a Grid...
Por Exemplo ,
1)evitar que o cara digite valores nun campo aonde Null
2)Ter sempre na Grid Dois Registros com a mesma sequencia
3)etc...

Em outra palavras , na minha opinião , fica a aplicação tendo que ter um controle quase que total sobre a Base de Dados... Isto eu não acho legal, Porque se algo sair errado , na inserção ou Eliminação dos Regsitros , o aplicativo fica todo comprometido...

A saída :
´Talves´ Duas tabelas aonde a inserção e a elimação Edição dos registros
se faça usando Trigger no Proprio Banco , ai sim , voce tem um controle maior na base de dados..

Esta é a minha opiniâo , mas se voce preferir pelo outro caminho e largar esta abordagem eu passo o codigo para voce , sem problema


Responder

Gostei + 0

01/08/2006

Jlimajr

[color=red:7da55daea0]A saída : ´Talves´ Duas tabelas aonde a inserção e a elimação Edição dos registros se faça usando Trigger no Proprio Banco , ai sim , voce tem um controle maior na base de dados.. [/color:7da55daea0]


Bom tambem concordo com voçe amigo.

Mais eu como naum sei usar [b:7da55daea0]trigger[/b:7da55daea0] naum saberia como fazer.

Agora se tu quiser dispor do codigo que tu fez figo grato.

Mais vou estudar como fazer essa [b:7da55daea0]trigger[/b:7da55daea0], pois naum tenho nem ideia como fazer.


Responder

Gostei + 0

02/08/2006

Marco Salles

jlimajr sobre o exemplo eu fiz usando DbExpress..... Qual é o componente de acesso que voce esta usando ????


Responder

Gostei + 0

02/08/2006

Jlimajr

Olá Marco Salles, estou usando os componetes IBX (Interbase) Delphi 5. e Firebird 1.5


Responder

Gostei + 0

02/08/2006

Marco Salles

Pois é eu fiz tudo usando DbExpress... Ate mesmo o Update que voce disse ter dificuldade

Apenas um exemplo , usando SlqConection , SqlQuery , ClientDateset , DatasetProvinder etc...

O que eu faço aqui...Atualizo todos os campos ValorD e Valor De todos os Registros que tem a sequencia definidos pelo edit2.tex e que tem o Valor do Campo CONTAD diferente de Null

Note ainda que os valores neste caso ve, de um StrtoCurr(Edit1.Text);

Olha a instrução Sql Acredito que voce ira conseguir adaptar para os seus DatSets.... Conseguindo executar esta instrução em um botão , a gente passa para a parte 2 Ok...

var
  Transacao : TTransactionDesc;
begin
  try
Transacao.TransactionID := 1;
Transacao.IsolationLevel := xilREADCOMMITTED;
sqlU.SQL.Clear;
sqlU.SQL.Text:=´update TBCONTA set ValorD = :pValorD , Valor = :pValor ´+
              ´Where (Sequencia = :pSequencia)and(not CONTAD is null)´;
sqlU.ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit1.text);
sqlU.ParamByName(´pValor´).AsCurrency:=strtoCurr(edit1.text);
sqlU.ParamByName(´pSequencia´).AsString:=edit2.text;
sqlConnection1.StartTransaction(Transacao);
sqlU.ExecSql;
sqlConnection1.Commit(Transacao);
cdsTbConta.close;
cdsTbConta.open;
 except on E:EDataBaseError do
    begin
      ShowMessage(´Erro no Update:´ + #1313 + E.Message);
      sqlConnection1.RollBack(Transacao);
    end;
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar