Excluir dois lançamentos ao mesmo tempo na mesma tabela?

Delphi

27/07/2006

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

Curtidas 0

Respostas

Jlimajr

Jlimajr

27/07/2006

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?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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 ???


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

firebird 1.5 com delphi 5.0


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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:


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

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


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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]


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

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.


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Alguem tem alguma dica sobre?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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 ????


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Perfeitamente colega.

fasso isso usando um update?

é isso?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

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


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

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


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

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;



GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Naum consegui usar a variavel que voçe passou no codigo, meu Delphi naum reconheceu (Delphi 5).

Ai adaptei assim:

procedure TFConta.Button6Click(Sender: TObject);
var
ok: boolean;
begin
if trim(edit1.text)=´´ then begin
showmessage(´Selecione a linha que vc deseja Alterar´);
end else
if application.messagebox(Pchar(´Deseja Alterar este Lançamento:´ + #13+ dm.qtbcontalan.FieldByName(´nomeconta´).AsString +´  ´+ 13+ dm.qtbcontalan.FieldByName(´historico´).AsString), Pchar(´Excluir Dados´+Self.Caption), MB_ICONQUESTION
+ MB_YESNO) = IDYES then begin
try
with dm.qtbcontalan do begin
SQL.Clear;
SQL.text:=´update TBCONTA set ValorD = :pValorD , Valor = :pValor ´+´Where (Sequencia = :pSequencia)´;//and(not CONTAD is null)´;
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pSequencia´).AsString:=edit1.text;
ExecSql;
end;
with dm.qtbcontalan do
begin
  close;
  sql.clear;
  sql.add(´select * from tbconta´);
  open;
end;
except
    application.MessageBox(´Erro na Alteração! Tente Novamente!´,´Aviso´,mb_ok+mb_iconexclamation);
    ok:=false;
    MaskEdit1.Enabled:=true;
    E1.Enabled:=true;
    e2.Enabled:=true;
    e3.Enabled:=true;
    e4.enabled:=true;
    r1.enabled:=true;
    e1.setfocus;
  end;
  if ok then begin
    dm.TLconta.Commit;
    dm.Tbconta.FetchAll;
    eNR.Caption := IntToStr(dm.tbconta.RecordCount);
    sbar.SimpleText := ´Linha Excluída...´;
  end else begin
    dm.TLconta.Rollback;
    sbar.SimpleText := ´Abortado...´;
  end;
  fechatabela;
  abretabela;
  END;
end;


Mais neste caso só estou conseguindo alterar na segunda vez que clico no botão para alterar.

O que está errado?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Naum consegui usar a variavel que voçe passou no codigo, meu Delphi naum reconheceu (Delphi 5).


ela não esta presente ...Faz parte do DbExpress que não esta disponível no Delphi 5.0...

Ai adaptei assim:

bla....bla....bla...

Mais neste caso só estou conseguindo alterar na segunda vez que clico no botão para alterar. O que está errado?


[b:3d8f389d11]pq que voce tirou a instrução not CONTAD is null do Sql :?: :?: :?: :?: [/b:3d8f389d11]


[b:3d8f389d11]Aho que voce ira precisar dela [/b:3d8f389d11] :!: :!: :!: :!:

Bem , voltemos :

with dm.qtbcontalan do begin SQL.Clear; SQL.text:=´update TBCONTA set ValorD = :pValorD , Valor = :pValor ´+´Where (Sequencia = :pSequencia)´;//and(not CONTAD is null)´; ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text); ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text); ParamByName(´pSequencia´).AsString:=edit1.text; ExecSql; end;


este codigo altera o valor dos campos ValorD e Valor que tem a sequencia igual ao Valor definido no edit1.text....Não tem sentido ele alterar somente na segunda vez ????? De um BreakPoint no seu codigo e verifique se ele esta passando por essas intruçoes quendo voce clicou no Botão

Outra coisa.... Voce deve usar um Try Finally no seu Bloco , é importante para evitar estouro de memória....

Assim

try try with dm.qtbcontalan do bla ..bla...bla excpet bla...bla...bla end; //FIM DO EXCEPT finally begin if ok then begin bla bla bla... end else begin bla ..bla...bla... end; fechatabela; abretabela; end; //fim do Finally


[b:3d8f389d11]Esta é a estrutura correta[/b:3d8f389d11]

Bem , voce deve tentar modificar , usando o update ... Tem que modificar sempre.. Não tem essa de ser na segunda vez , na terceira vez etc... [b:3d8f389d11]Mandou a instrução , ele tem que modificar...[/b:3d8f389d11]

Porem , como eu falei isto é uma etapa do que voce propos fazer. Vamos ultrapassar esta etapa para tentar chegar na segunda.. Dependo agora de voce.



GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Só naum altera os dados a primeira vez que entro no programa. Depois altera certinho.

Fiz conforme o codigo que voçe postou

procedure TFConta.Button6Click(Sender: TObject);
var
ok: boolean;
begin
if trim(edit1.text)=´´ then begin
showmessage(´Selecione a linha que vc deseja Alterar´);
end else
if application.messagebox(Pchar(´Deseja Alterar este Lançamento:´ + #13+ dm.qtbcontalan.FieldByName(´nomeconta´).AsString +´  ´+ 13+ dm.qtbcontalan.FieldByName(´historico´).AsString), Pchar(´Excluir Dados´+Self.Caption), MB_ICONQUESTION
+ MB_YESNO) = IDYES then begin
try
try
with dm.qtbcontalan do begin
SQL.Clear;
SQL.text:=´update TBCONTA set ValorD = :pValorD , Valor = :pValor ´+´Where (Sequencia = :pSequencia)´;//and(not CONTAD is null)´;
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pSequencia´).AsString:=edit1.text;
ExecSql;
end;
with dm.qtbcontalan do
begin
  close;
  sql.clear;
  sql.add(´select * from tbconta´);
  open;
end;
except
    application.MessageBox(´Erro na Alteração! Tente Novamente!´,´Aviso´,mb_ok+mb_iconexclamation);
    ok:=false;
    MaskEdit1.Enabled:=true;
    E1.Enabled:=true;
    e2.Enabled:=true;
    e3.Enabled:=true;
    e4.enabled:=true;
    r1.enabled:=true;
    e1.setfocus;
end; //fim do except
finally begin
  if ok then begin
    dm.TLconta.Commit;
    dm.Tbconta.FetchAll;
    eNR.Caption := IntToStr(dm.tbconta.RecordCount);
    sbar.SimpleText := ´Linha Excluída...´;
  end else begin
    dm.TLconta.Rollback;
    sbar.SimpleText := ´Abortado...´;
  end;
  fechatabela;
  abretabela;
  END;
end;
end;
end;


pq que voce tirou a instrução not CONTAD is null do Sql


Naum estava funcionando, só consegui alterar o valor depois que tirei esta linha.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Só naum altera os dados a primeira vez que entro no programa. Depois altera certinho.


:?: :?: :?: :?: .. Vamos proseguir sem levar em conta isso

Naum estava funcionando, só consegui alterar o valor depois que tirei esta linha.


´Uma coisa é uma coisa outra coisa é outra coisa´

Origem da ´filosofica´ frase : Vanderlei Luxemburro
Profissão : Técnico

Voce diz que não funciona ..isto é : erro na execução , gerando uma exeção simplesmente não altera :?: :?: :?: Fiquei na dúvida :?: :?: :?:

Mas vamos prosegguir sem isso...


bem agora voce tem que dar um Duplo Update.... O primeiro Update , atualiza os registros com o numero da sequencia igual ao Digitado no Edit1.Text e ainda que tem o Campo CONTAC igual a Null e o segundo Update ira atualizar os registros que tem o o numero de sequencia igual ao digitado no Edit1.text porem com o valor do CAMPOD igual a null


<caso a instrução null> não funcione ainda tem a opção de testar
CampoC = QuotedStr(´´) , mas isto fica para depois....>

:arrow:
[b:50bc0dff15]O que voce tem que fazer no seu Botão... [/b:50bc0dff15]:?: :?: :?:

if trim(edit1.text)=´´ then begin
bla ..bla..bla...
try
try
with dm.qtbcontalan do begin
SQL.Clear;
SQL.text:=´update TBCONTA set ValorD = :pValorD , Valor = :pValor ´+´Where (Sequencia = :pSequencia)and(not CONTAD is null)´;
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pSequencia´).AsString:=edit1.text;
ExecSql;
SQL.Clear;
SQL.text:=´update TBCONTA set ValorC = :pValorC , Valor = :pValor ´+´Where (Sequencia = :pSequencia)and(not CONTAC is null)´;
ParamByName(´pValorC´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pSequencia´).AsString:=edit1.text;
ExecSql;
bla...bla..bla...
o Resto é iguallll //****************************************
end;


Amigo , não tem ´esta´ de não funcionar .. [b:50bc0dff15]Tem e vai dar certo[/b:50bc0dff15]....
Quer uma sugestão , coloque este codigo em um outro Projeto , acessando esta sua base de dados e aplique o método.. Verifique se a atualização ocorre conforme o esperado... Acredito que sim , pois aqui comigo , esta dando certo , não tem porque dá errado com voce..

no aguardo...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

´Bom dia amigo, fiz uns testes aqui até chegar no que eu queria para atualizar.

procedure TForm4.BitBtn1Click(Sender: TObject);
var
ok: boolean;
begin
if application.messagebox(Pchar(´Deseja Alterar este Lançamento:´ + #13+ dm.qtbcontalan.FieldByName(´nomeconta´).AsString +´  ´+ 13+ dm.qtbcontalan.FieldByName(´historico´).AsString), Pchar(´Excluir Dados´+Self.Caption), MB_ICONQUESTION
+ MB_YESNO) = IDYES then begin
try
try
with dm.qtbcontalan do begin
close;
SQL.Clear;
SQL.text:=´update TBCONTA set conta = :pConta, NumConta = :pNumConta, ValorD = :pValorD, ValorC = :pValorC, Valor = :pValor, descricao = :pDescricao, data = :pData ´+´Where (Sequencia = :pSequencia)´;
//and(not CONTAD is null)and(not CONTAC is null)´;
ParamByName(´pConta´).AsString:=edit2.text;
ParamByName(´pNumConta´).AsString:=e1.text;
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pValorC´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pDescricao´).value:=e3.text;
ParamByName(´pData´).AsDate:=strtoDate(MaskEdit1.text);
ParamByName(´pSequencia´).AsString:=edit1.caption;
ExecSql;
end;
except
    application.MessageBox(´Erro na Alteração! Tente Novamente!´,´Aviso´,mb_ok+mb_iconexclamation);
    ok:=false;
    editv;
end; //fim do except
finally begin
  if ok then begin
    dm.TLconta.Commit;
    dm.Tbconta.FetchAll;
    fconta.eNR.Caption := IntToStr(dm.tbconta.RecordCount);
    fconta.sbar.SimpleText := ´Linha Alterada...´;
  end else begin
    dm.TLconta.Rollback;
    fconta.sbar.SimpleText := ´Abortado...´;
  end;
  fechatabela;
  abretabela;
[b]//joquei a atualização da tabela aqui
  with dm.qtbcontalan do begin
         close;
         sql.clear;
         dm.qtbcontalan.sql.add(´select * from tbconta´);
         open;[/b]
  end;
end;
end;
end;


Funcionou, corrigiu certinho, mais da o maior rolo, porque na tabela tenho contadebito, contacredito, valordebito, valorcredito, ai o padrao da tabela é lançar primeiro contadebito e segundo contacredito, entaum quando um contem dados o outro fica null.

Agora fica dificil de corrigir os dois valores.

Tentei usar um
IF edit1.Text = ´D´ then
bla, bla, bla

ou seja se for D de Debito lançar somente no debito, mais jogar o valor tambem no valorcredito. Naum deu.

O problema desta tabela ser em duplicidade foi por causa de fazer consultas de contas debitos com saldos e tal, o mesmo acontecendo com o credito, mais naum percebi que para alterar a tabela seria dificil. Ao contrario de excluir.

Agora acho que o correto é usar a linha [b:2a041a3e26]and(not CONTAD is null)´;[/b:2a041a3e26]
e tambem usar outra para atualizar o credito [b:2a041a3e26]and(not CONTAC is null)´;[/b:2a041a3e26].

Entaum Marco Salles, se funcionar devo colocar o segundo update depois do ExecSQL do primeiro update?


Grato pela ajuda


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Desculpe Marco Salles, naum percebi que voçe ja tinha feito dois updates, vou fazer os testes aqui usando o codigo que voçe me passou.

Depois eu posto o resultado.

Obs: Srs. Moderadores: Respondi o meu topico por causa que eu naum tenho permissão de editar a pergunta, se naum corrigia minha pergunta acima, e por falta de atençaum minha nao li direito o que o Marco Salles postou.


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Amigo, acho que naum dá para fazer assim naum

Do jeito que pensei em fazer repete alguns campos o que naum deveria repetir ou seja fica igual na hora do update.

Os campos que ficam com os mesmo valores

[b:9e826e21ab]contaD, contaC, NomecontaD, NomecontaC, NumContaD, NumContaC[/b:9e826e21ab]

Eu axo que naum é assim que altera os dados.

Naum consigo bolar um jeito de fazer isso

O ultimo codigo meu ficou assim:
procedure TForm4.BitBtn1Click(Sender: TObject);
var
ok: boolean;
begin
if application.messagebox(Pchar(´Deseja Alterar este Lançamento:´ + #13+ dm.qtbcontalan.FieldByName(´nomeconta´).AsString +´  ´+ 13+ dm.qtbcontalan.FieldByName(´historico´).AsString), Pchar(´Excluir Dados´+Self.Caption), MB_ICONQUESTION
+ MB_YESNO) = IDYES then begin
Try
try
with dm.qtbcontalan do begin
//---------------update conta debito------------------------
close;
SQL.Clear;
SQL.text:=´update TBCONTA set contad = :pcontaD, valor = :pvalor, descricao = :pdescricao, data = :pdata, valord = :pvalord, conta = :pconta, dataextenso = :pdataextenso, mes = :pmes, ano = :pAno, historico = :phistorico, nomeCD = :pnomeCD, numcontad = :pnumcontad ´+´Where (Sequencia = :pSequencia) and(not CONTAD is null)´;
ParamByName(´pContaD´).AsString:=e1.text;
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pdescricao´).AsString:=e3.text;
ParamByName(´pData´).AsDate:=strtoDate(MaskEdit1.text);
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pConta´).AsString:=edit2.text;
ParamByName(´pdataextenso´).value:=uppercase(formatdatetime(´MMMM´,(STRTODATE(Maskedit1.TEXT)))
    +´ / ´+formatdatetime(´YYYY´,(STRTODATE(MaskEdit1.TEXT))));
ParamByName(´pmes´).Value:=uppercase(formatdatetime(´MM´,(STRTODATE(Maskedit1.TEXT))));
ParamByName(´pAno´).Value:=uppercase(formatdatetime(´YYYY´,(STRTODATE(Maskedit1.TEXT))));
ParamByName(´phistorico´).AsString:=e3.text;
ParamByName(´pnomeCD´).AsString:=Label2.Caption;
ParamByName(´pNumContaD´).AsString:=e1.text;
ParamByName(´pSequencia´).AsString:=edit1.caption;

ExecSql;
//---------------update contacredito----------------
close;
SQL.Clear;
SQL.text:=´update TBCONTA set contaC = :pcontaC, valor = :pvalor, descricao = :pdescricao, data = :pdata, valorC = :pvalorC, conta = :pconta, dataextenso = :pdataextenso, mes = :pmes, ano = :pAno, historico = :phistorico, nomeCC = :pnomeCC, numcontaC = :pnumcontaC ´+´Where (Sequencia = :pSequencia) and(not CONTAC is null)´;
ParamByName(´pContaC´).AsString:=e1.text;
ParamByName(´pValor´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pdescricao´).AsString:=e3.text;
ParamByName(´pData´).AsDate:=strtoDate(MaskEdit1.text);
ParamByName(´pValorC´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pConta´).AsString:=edit2.text;
ParamByName(´pdataextenso´).value:=uppercase(formatdatetime(´MMMM´,(STRTODATE(Maskedit1.TEXT)))
    +´ / ´+formatdatetime(´YYYY´,(STRTODATE(MaskEdit1.TEXT))));
ParamByName(´pmes´).Value:=uppercase(formatdatetime(´MM´,(STRTODATE(Maskedit1.TEXT))));
ParamByName(´pAno´).Value:=uppercase(formatdatetime(´YYYY´,(STRTODATE(Maskedit1.TEXT))));
ParamByName(´phistorico´).AsString:=e3.text;
ParamByName(´pnomeCC´).AsString:=Label2.Caption;
ParamByName(´pNumContaC´).AsString:=e1.text;
ParamByName(´pSequencia´).AsString:=edit1.caption;
ExecSql;
end;
except
    application.MessageBox(´Erro na Alteração! Tente Novamente!´,´Aviso´,mb_ok+mb_iconexclamation);
    ok:=false;
    editv;
end; //fim do except
finally begin
  if ok then begin
    dm.TLconta.Commit;
    dm.Tbconta.FetchAll;
    fconta.eNR.Caption := IntToStr(dm.tbconta.RecordCount);
    fconta.sbar.SimpleText := ´Linha Alterada...´;
  end else begin
    dm.TLconta.Rollback;
    fconta.sbar.SimpleText := ´Abortado...´;
  end;
  fechatabela;
  abretabela;
  with dm.qtbcontalan do begin
         close;
         sql.clear;
         dm.qtbcontalan.sql.add(´select * from tbconta´);
         open;
  end;
end;
end;
end;


Bom naum sei se é porque primeiro fasso assim tenho o dbgrid com todos os dados cadastrados, ai clico em cima de uma linha aonde preciso corrigir o valor, data, conta, e as vezes até o historico. Ai que complica por isso estava com a ideia de criar um IF, mais tambem naum sei se tem como fazer porque nesti caso tem que corrigir os valores que se repetem nos dois lançamentos.

O problema pior é isso tem alguns dados que repetem tanto na sequencia do debito quanto a do credito, mais tem alguns que naum podem repitir o mesmo dados.

Ta complicado. :D


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Do jeito que pensei em fazer repete alguns campos o que naum deveria repetir ou seja fica igual na hora do update.


como assim ????? se voce não alterar os valores desse campo é claro que eles vão ficar com o mesmo valor...


Os campos que ficam com os mesmo valores contaD, contaC, NomecontaD, NomecontaC, NumContaD, NumContaC



Eu axo que naum é assim que altera os dados.


como não é assim ???? pelo que enttendi desde do inicio voce que r altera apenas o valores : ValorC e ValorD e Valor dos respectivos Registros :?: :?: :?:

[b:a7bd92d44c]Ate o exemplo visual que lhe passei voce disse estar ´Perfeito´ [/b:a7bd92d44c]

O problema pior é isso tem alguns dados que repetem tanto na sequencia do debito quanto a do credito, mais tem alguns que naum podem repitir o mesmo dados.


Ai ja não é delphi e sim a estrutura do seu progarma ... Venho lhe falado isso a muito tempo:

[b:a7bd92d44c]citação minha ha uns tempos atras...[/b:a7bd92d44c]
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...


[b:a7bd92d44c]eu tenho que entender melhor para tentar lhe ajudar .... Quando eu penso que vai , ai não vai[/b:a7bd92d44c] :cry: :cry: :cry:


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Pois é amigo, no começo axai que era só para alterar os valores, ai funciona, mais no decorrer percebi que preciso alterar mais dados, ai o problema ficou mais sério.

Do jeito que estou querendo fazer o update repete os valore por que!!!
Simples: por causa que o edit que estou usando para alterar valores e outros dados, usei para fazer o update no primeiro e no segundo update.

Ai que nao estou conseguindo fazer pois preciso que o programa saiba que se for conta D tem que alterar somente alguns itens e outros repetirem, o mesmo se aplica para conta C.

Por isso a dificudade em fazer a tal alretação.


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Fiz alem da quelas duas updates mais duas updates com outra condiçaum no where assim pra ver se naum repetia os valores

//-----------------update somente campos debito cfe condicao where----------------
close;
SQL.Clear;
SQL.text:=´update TBCONTA set contaD = :pcontaD, valorD = :pvalorD, nomeCD = :pnomeCD, numcontaD = :pnumcontaD ´+´Where (Sequencia = :pSequencia) and(DC = :pDC)and(not CONTAD is null)´;
ParamByName(´pContaD´).AsString:=e1.text;
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pnomeCD´).AsString:=Label2.Caption;
ParamByName(´pNumContaD´).AsString:=e1.text;
ParamByName(´pDC´).AsString:=´D´;
ParamByName(´pSequencia´).AsString:=edit1.caption;
ExecSql;
//-----------------update somente campos CREDITO cfe condicao where----------------
close;
SQL.Clear;
SQL.text:=´update TBCONTA set contaC = :pcontaC, valorC = :pvalorC, nomeCC = :pnomeCC, numcontaC = :pnumcontaC ´+´Where (Sequencia = :pSequencia) and(DC = :pDC)and(not CONTAC is null)´;
ParamByName(´pContaC´).AsString:=e1.text;
ParamByName(´pValorC´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pnomeCC´).AsString:=Label2.Caption;
ParamByName(´pNumContaC´).AsString:=e1.text;
ParamByName(´pDC´).AsString:=´C´;
ParamByName(´pSequencia´).AsString:=edit1.caption;
ExecSql;


Mais ta repitindo nos dois lançamentos.

Porque naum faz como pesso na condiçaum?

[b:49ead2040e]and(DC = :pDC)[/b:49ead2040e]

Os parametros
Se for debito
[b:49ead2040e]ParamByName(´pDC´).AsString:=´D´;[/b:49ead2040e]

Se for credito
[b:49ead2040e]ParamByName(´pDC´).AsString:=´C´;[/b:49ead2040e]

Ta errado assim?
Minha ideia seria gravar somente conforme a condiçaum.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

se eu que to acompanhando este tópico , ja estou sem saber o que queres , imagina quem ligou a televisão agora :!: :!: :!:

Vamos por partes...

calma amigo. Se não deu é pq ainda não chegou a hora Me diga , quais os campos voce tem nessa tabela Quais os campos que voce quer alterar ???? Quando voce quer alterar ??? Aonde estão os valores que voce quer atribuir a esses campos ??? Qual a condição para se alterar os campos ???? Na sua tabela voce tem quantos registros com o mesmo numero de sequencia ???? [b:524c7a0417]se o numro de campos com a mesma sequencia não for igual a DOIS eu não to entendendo nada[/b:524c7a0417] :?: :?: :?: :?:


[b:524c7a0417]Veja , eu no meu exemplo eu fiz assim....[/b:524c7a0417]

O usuário clica nun registros da Grid O usuário so tem permição para [b:524c7a0417]editar os campos VALORD e VALORC[/b:524c7a0417] :arrow: :arrow: Todos os outros campos para edição e ReadOnly= True No momento que o usuário edita um Novo Valor para o CampoC ou Campod , ao dar um Post o sistema pergunta se confirma ou não ... Se o usuário escolher confirma , ´automaticamente´ eu faço os Updates...


[b:524c7a0417]eu atribui assim os updates[/b:524c7a0417]

Se o Campo Alterado foi VALORD __>>>> Automaticamente eu modifico
o VALORC e o campo VALOR do Registro aonde CONTAC <> nil
Se o Campo Alterado foi VALORC --->>>>Automaticamente eu modifico
o VALORD e o campo VALOR do Registro aonde CONTAD <> nil 
Isto é feito automaticamente , sem ter que clicar em nenhum botão e nen ficar passando valores em edits...


eu pensei que voce quisesse assim , mas voce nen me deixa molhar o bico...

P:S Leia com calma este ultimo post, para que a gente não fique andando em circulos.


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Vamos lá entaum ver se consigo explicar.

Tenho um dbgrid aonde preciso fazer uma alteração do campos valores, contaDebito, ContaCredito, Data, ContaReduzidoDebito, Conta ReduzidoCredito, valor, valordebito, valorcredito, historico.

Na dbgrid é lançado a mesma sequencia duas vezes que corresponde primeiro contadebito deizando como nullo a contacredito, o mesmo ocorre na segunda linha só que ao contrario.
Os unicos lançamentos que se repetem são os campos data, valor, sequencia, historico.

ai quando preciso fazer uma alteração de linha dou um clique na linha desejada, abre um form com varios edits para modificar os dados.


Neste segundo update a ideia é se no caso dentro do where for D apenas modificar o que escrevi dentro do edit na linha aonde esta o D que é um campo chamado DC, o mesmo ocorre se a linha for C.

Só que não está modificando conforme eu quero e sim repetindo os mesmos valores tipo
Ex:
vamos supor que no campo da conta debito eu teria um valor assim;
111.10.1.2
e no campo valor debito eu teria um lançamento assim;
211.10.1.1

exemplo como estaria gravado na tabela
sequencia-----campodebito------campocredito---------DC
0001-----------111.10.1.2----------<null>-----------------D
0001-----------<null>-------------211.10.1.1--------------C

ai tenho que modificar o campodebito se eu colocar no edit a conta 111.10.1.1

deveria ficar assim
sequencia-----campodebito------campocredito-------DC
0001-----------111.10.1.1----------<null>--------------D
0001-----------<null>-------------211.10.1.1-----------C

mais ta ficando assim:
sequencia-----campodebito------campocredito--------DC
0001-----------111.10.1.1----------<null>---------------D
0001-----------<null>-------------111.10.1.1------------C

Ou seja ta duplicando os dois campos então não é assim que usa o where?

No caso que voçe me passou esta funcionando corretamente, mais percebi que necessito modificar mais do que o campo valor, se fosse somente campos que se repetem nos dois lançamentos seria facil, que saum os campos DATA, VALOR, HISTORICO, mais os campos que naum se repetem porque estaum modificando tambem? tipo CONTADEBITO, CONTACREDITO, VALORDEBITO, VALORCREDITO...

A naum ser que naum devo na hora de dar um clique no dbgrid abrir um form. Este form que abri dentro dos edits estaum me trazendo todos os valores que estaum no grid, ai la dentro do edit é que estou modificando para depois apertar no botao alterar para chamar o update.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Mas porque que voce em vez de fazer tanto Updades , não faz isto somente usando os dois primeiros..


veja ... voce não precisa testar

´Where (Sequencia = :pSequencia) and(DC = :pDC)and(not CONTAD is null)´;..


quando DC for igual a D o CONTAD nunca sera <> Nill

quando DC for igual a C o CONTAC nunca sera <> Nill

[b:f50d1042be]logo é uma redundancia e ainda do jeito que esta escrito retornara sempre vazio.. Ou seja , não altera-rá nada[/b:f50d1042be]

Tente com isso :

´Where (Sequencia = :pSequencia) and(DC = D)´ e o mesmo quando voce quiser alterar os valor Dos CampoC ´Where (Sequencia = :pSequencia) and(DC = C)´


é so voce colocar agora os campos que voce quer alterar e fornecer os parametros aos mesmos , conforme as descriçoes anteriores....

No aguardo...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Mas porque que voce em vez de fazer tanto Updades , não faz isto somente usando os dois primeiros..

Porque queria separar os updates que podem repetir os campos que saum os deis primeiros e os que naum podem repetir os campos que saum ois dois ultimos.


Citação:
´Where (Sequencia = :pSequencia) and(DC = D)´

e o mesmo quando voce quiser alterar os valor Dos CampoC

´Where (Sequencia = :pSequencia) and(DC = C)´

Desta forma da erro de sintaxe

[color=red:8de80fed2f]Dynamic SQL Error
SQL Error= -206
Column Unknown D
At Line 1, Column 100[/color:8de80fed2f]

E se eu fizer assim (DC = ´D´) ai da erro na hora de compilar.

Estava pensando em usar um [b:8de80fed2f]IF[/b:8de80fed2f] assim, mesmo assim naum funciona

if e2.Caption = ´D´ then begin // e2 é o mesmo que um label ele ja vem com o campo preenchido.
close;
SQL.Clear;
SQL.text:=´update TBCONTA set contaD = :pcontaD, valorD = :pvalorD, nomeCD = :pnomeCD, numcontaD = :pnumcontaD ´+´Where (Sequencia = :pSequencia) and(DC =D)´;
ParamByName(´pContaD´).AsString:=edit2.text;
ParamByName(´pValorD´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pnomeCD´).AsString:=Label2.Caption;
ParamByName(´pNumContaD´).AsString:=e1.text;
//ParamByName(´pDC´).AsString:=´D´;
ParamByName(´pSequencia´).AsString:=edit1.caption;
ExecSql;
//end else
//-----------------update somente campos CREDITO cfe condicao where----------------
close;
SQL.Clear;
SQL.text:=´update TBCONTA set contaC = :pcontaC, valorC = :pvalorC, nomeCC = :pnomeCC, numcontaC = :pnumcontaC ´+´Where (Sequencia = :pSequencia) and(DC = C)´;
ParamByName(´pContaC´).AsString:=edit2.text;
ParamByName(´pValorC´).AsCurrency:=strtoCurr(edit3.text);
ParamByName(´pnomeCC´).AsString:=Label2.Caption;
ParamByName(´pNumContaC´).AsString:=e1.text;
//ParamByName(´pDC´).AsString:=´C´;
ParamByName(´pSequencia´).AsString:=edit1.caption;
ExecSql;
end;



GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

se da erro de compilar use com o comando [b:ed6e523f25]QuotedStr()[/b:ed6e523f25]

´Where (Sequencia = :pSequencia) and(DC = ´+QuotedStr(´D´)+´)´;

e 

´Where (Sequencia = :pSequencia) and(DC = ´+QuotedStr(´C´)+´)´;



GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Mesmo usando um IF naum funcionaria, acabei de analizar a tabela, pois eu preciso que o campo valorC modifique igual ao campo ValorD, ai analizando chegeu a conclusao que preciso de mais edits para fazer a alteração dos dados tipo assim

1 edit para camporeduzido D
1 edit para camporeduzido C

explicando melhor nos parametros
esta linha pertence ao debito
ParamByName(´pContaD´).AsString:=edit2.text; //continuo usando este edit.

agora estava usando o mesmo para o campo do credito.
ParamByName(´pContaC´).AsString:=edit2.text;

Por isso a duplicidade, acho que eh impossivel de fazer com que o programa reconheça que este campo naum deve ser alterado. Por isso a ideia que me veio a cabeça foi.

Linha do Parametro do Credito
ParamByName(´pContaC´).AsString:=editC.text; //que seria um outro edit somente se tiver que alterar este campo.

Bom agora o que eu posso fazer quando der um clique no edit?
Simples pedir para ele verificar a linha que eu cliquei no campo DC, se for D, os edits aonde estaum para alterar o debito deixo desabilitados e se a linha que eu der um clique for C fasso o contrario desabilitando os edits do debito.

Bom espero que essa minha ideia funcione. Pois analizando percebi que desta forma naum altera mesmo sem duplicar os dois campos.

Bom axo que agora deve estar encerrado este topico.

Muito obrigado pela sua ajuda, força de pelo grande esforço por me ajudar e por ter me ensinado como usa updates com parametros.

Valeu mesmo Marco Salles.
Fico muito gradecido por voçe dedicar seu tempo com meus problemas.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

boa sorte...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Ta quase funcionando, mais agora apareceu uma mensagem que possuo mais de 255 caracteres, naum tenho nenhum campo com este tamanho, nem mesmo campo blob.

isso aconteceu depois de eu unir a update em uma só

SQL.Clear;
SQL.text:=´update TBCONTA set contaD = :pcontaD, valorD = :pvalorD, nomeCD = :pnomeCD, numcontaD = :pnumcontaD, contaC = :pcontaC, valorC = :pvalorC, nomeCC = :pnomeCC, numcontaC = :pnumcontaC, valor = :pvalor, descricao = :pdescricao, data = :pdata, conta = :pconta, dataextenso = :pdataextenso,
mes = :pmes, ano = :pAno, historico = :phistorico ´+´Where(Sequencia = :pSequencia)´;


Ta dando erro na hora de compilar antes do sinal de + do where

Erro:
[Error] Ualteraconta.pas(101): String literals may have at most 255 elements



GOSTEI 0
Adriano_servitec

Adriano_servitec

27/07/2006

Olah amigo,
Use o ADD no ligar do Text e quebra as linhas

tipo
SQL.Clear;
SQL.Add(´update <<tabela>>´);
SQL.Add(´ set campo1 = :pcampo1, campo2 = :pcampo2,´);
SQL.Add(´ campo3 = :pcampo3, campo4 = :pcampo4´)
SQL.Add(´..................´);

Entendeu.

Qualquer coisa vai postando amigo
Abraços
T+


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Citação: [Error] Ualteraconta.pas(101): String literals may have at most 255 elements


voce pode tirar alguns[b:2208079c4d] espaçoes desneccessários [/b:2208079c4d]em sua string e ver se complila

SQL.text:=´update TBCONTA set contaD=:pcontaD, valorD=:pvalorD, nomeCD=:pnomeCD, numcontaD=:pnumcontaD,contaC=:pcontaC, valorC=:pvalorC,nomeCC=:pnomeCC,numcontaC=:pnumcontaC,
valor=:pvalor,descricao=:pdescricao,data=:pdata,conta=:pconta,
dataextenso=:pdataextenso,mes=:pmes,ano=:pAno,
historico=:phistorico ´+´Where(Sequencia = :pSequencia)´;


ou tentar com o Sql.add


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Depois de passar quase a metade da noite acordado, achei o melhor jeito de alterar a tabela. A chamada gambiarra.

O que eu fiz assim que seleciono no grid o lançamento para alterar, abro um form contendo os dados do contad, contac, historico, valor, etc..

ai si preciso alterar a maneira que eu encontrei dentro de um buton foi usar um delete para excluir os dois lançamentos e depois fazer um insert novamente como se eu estivesse incluindo tudo de novo.

Bom foi a unica maneira que eu consegui Marco Salles.

Agora gostaria de saber se é possível assim se eu der um clique no grid em algum lançamento que a sequencia seja 004 (bom como ja foi passado e voçe está acompanhando) sabes que tens dois lançamentos com esta sequencia. Então de eu clicar em um lançamento tem como automaticamente o multselect marcar o outro lançamento da sequencia, pois estou usando o shift para selecionar os dois lançamentos.


Valeu ai


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Talvez a solução vai depender de com esta organizado os ses Dados

Isto é voce esta agrupando pela sequencia ?????
O registro aonde tem a ContaC vem sempre antes do Registro aonde tem a contaD ??? Ou é o contrário ????.... Ou isto é aleatório ????
Qunato mais agrupado e Indexado esta sua tabela mais fácil e rápido é para obter este Resultado.

Dependendo de com esta agrupado os seus dados temos a opção de dar next ou First , ao inves de percorrer a tabela toda a procura de dois registros de mesma sequencia...

Bem , mais se voce quiser ir tentando , uma saida é programar o evento
DBGrid1CellClick da grid , efetuar uma pesquisa ou dar um Next Ou First , e marcar o Outro Registro com a opção
DbGrid1.SelectedRows.CurrentRowSelected:=true;

Não precisa segurar tecla nenhuma...A dificuldade a principio sera achar este outro ´Registro´ que com eu disse , vai depender de como esta agrupado os seu Dados...

[b:7fd89139c9]Claro que tudo isso depende de Options.MultiSelect Da Grid estar em True[/b:7fd89139c9]


Detalhe : Tb aconselho o uso de um ChekBox para marcar e desmacar esta opção na Grid , pois isto so fara sentido na Exclusão ou Edição de dosio registros simultaneamente...


pois estou usando o shift para selecionar os dois lançamentos.

[b:7fd89139c9]Não seria a tecla CNTRL[/b:7fd89139c9] :?: :?: :?:


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

O registro aonde tem a ContaC vem sempre antes do Registro aonde tem a contaD ??? Ou é o contrário ????.... [/quote

É ao contrario sempre contaD vem sempre antes de contaC

Naum é aleartorio naum.

a tabela segue este padrão.

sequencia--------contaD----------contaC-----------valor
0001--------------111.1.1.1---------<null>-----------50,00
0001--------------<nul>-----------211.1.1.3---------50,00
[b:39336f9b3d]0002--------------111.1.3.4---------<null>-----------20,00
0002--------------<nul>-----------210.1.7.1---------20,00[/b:39336f9b3d]
0003--------------111.1.1.3---------<null>-----------35,00
0003--------------<nul>-----------311.1.1.5---------35,00

Vamos supor que eu der um clique no lançamento que esta em negrito, entaum tem como automaticamente os dois ficarem selecionados sem a presença da techa Ctrl?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

- Vá na seção ´private´ da unit e declare a procedure abaixo:

private
procedure DBGridClick(Sender: TObject);
- Logo após a palavra ´implementation´, escreva a procedure:

implementation
{$R *.DFM}

procedure TForm1.DBGridClick(Sender: TObject);
begin
     if DbGrid1.SelectedRows.Count = 2 Then
     dbgrid1.SelectedRows.Clear;
  if SeuDataSetContad.AsString <> ´´ Then
      begin
        SeuDataSet.Next;
        dbgrid1.SelectedRows.CurrentRowSelected:=True;
      end
   else
     begin
      SeuDataSet.First;
      dbgrid1.SelectedRows.CurrentRowSelected:=True;
    end;
  end;


- Coloque as instruções abaixo no evento OnCreate do Form:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGrid1.ControlStyle :=
  DBGrid1.ControlStyle + [csClickEvents];
  TForm(DBGrid1).OnClick := DBGridClick;
end;


[b:1bfacb34c4]Não esqueça de Options do DbGrid em MultiSelect Em True[/b:1bfacb34c4]


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Marco Salles, fico grato por seu esforço, mais desta forma naum está funcionando corretamente, as vezes ele seleciona o primeiro e um do meio.

Chegei a mudar o codigo
if jvDbGrid1.SelectedRows.Count = 2 Then
     jvdbgrid1.SelectedRows.Clear;
  if dm.qtbcontalanContaD.AsString <> ´+quotedstr(edit1.text)+´ Then
      begin
        dm.qtbcontalan.Next;
        jvdbgrid1.SelectedRows.CurrentRowSelected:=True;
      end
   else
     begin
      dm.qtbcontalan.First;
      jvdbgrid1.SelectedRows.CurrentRowSelected:=True;

    end;


Até modifiquei esta linha
[b:4746223a13]if dm.qtbcontalanContaD.AsString <> ´+quotedstr(edit1.text)+´ Then[/b:4746223a13] para ver se pegava certo, mais naum funcionou ainda. Motivo se eu clicar dentro de vamos supor na segunda linha ele seleciona a segunda e a terceira linha, em vez da segunda e a primeira aonde esta a mesma sequencia ou seja a sequencia repetida, como esta em negrito no modelo da tabela logo a alguns posts acima.

Depois pensei em fazer um select no onCellClick do dbGrid, mais ai naum seleciona

with dm.qtbcontalan do
      begin
        close;
        sql.clear;
        sql.add(´select * from tbconta´);
        sql.add(´where sequencia = ´+quotedstr(edit1.text)+´´);
        Open;
end;        

if jvDbGrid1.SelectedRows.Count = 2 Then
     jvdbgrid1.SelectedRows.Clear;
  if dm.qtbcontalanContaD.AsString <> ´+quotedstr(edit1.text)+´ Then
      begin
        dm.qtbcontalan.Next;
        jvdbgrid1.SelectedRows.CurrentRowSelected:=True;
      end
   else
     begin
      dm.qtbcontalan.First;
      jvdbgrid1.SelectedRows.CurrentRowSelected:=True;

    end;


Bom vou tentando aqui.

Valeu a ajuda amigo.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

[b:281de02c7e]Aonde voce colocou estas istruçoes ???[/b:281de02c7e]

[b:281de02c7e]em qual o evento ????[/b:281de02c7e]

[b:281de02c7e]foi no evento OnClick Que criei para o seu DbGrid ????[/b:281de02c7e]

Motivo se eu clicar dentro de vamos supor na segunda linha ele seleciona a segunda e a terceira linha, em vez da segunda e a primeira aonde esta a mesma sequencia ou seja a sequencia repetida, como esta em negrito no modelo da tabela logo a alguns posts acima.


[b:281de02c7e]Por isso que tem Next E first , estão estrategicamente colocados dentro do codigo.....[/b:281de02c7e]

procedure TForm1.DBGridClick(Sender: TObject); 
begin 
if DbGrid1.SelectedRows.Count = 2 Then 
     dbgrid1.SelectedRows.Clear; 

//ao clicar na primeira linha .. com certeza , fo isto que voce me garantiu
// SeuDataSetContad.AsString tem um valor diferente de zero...
//logo dou um Next e pego a segunda linha.. Pois com voce mesmo falou:
// sempre contaC vem Depois  de contaC... Por isso o next 

  if SeuDataSetContad.AsString <> ´´ Then 
      begin 
        SeuDataSet.Next; 
        dbgrid1.SelectedRows.CurrentRowSelected:=True; 
      end 
   else 

//ao clicar na segunda linha .. com certeza , fo isto que voce me garantiu
// SeuDataSetContaC.AsString tem um valor diferente de zero...
//logo dou um FIRST epego a primeira linha.. Pois com voce mesmo falou:
// sempre contaD vem sempre antes de contaC ..Por isso o first

     begin 
      SeuDataSet.First; 
      dbgrid1.SelectedRows.CurrentRowSelected:=True; 
    end; 
  end;


Pelo raciocineo lógico não tem erro. Testei aqui em meu exemplo...Porem , com Next e First são instruçoes relacionadas com base de dados , outros eventos são dispararados (Como por exemplo BeforeScrool, AfterScroll etc...) depedendo do que tem nesses eventos
pode sim ter alguma interferencia no Resultado..

Voce deve marcar com um BrackPoint dentro destas instruçoes e tentar acompanhar o fluxo de instruçoes..... No Mais não tem ERRO

sabe amigo , as vezes eu falo que Programação e igual a andar de Cavalo
O Programa sabe quem ta montando nele e muitas vezes prega peça na gente ... O que é para ser , ele proprositalmente , como se estivesse Vida, resolve Brincar com a gente...


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Tem uma mesnagem anteiror a esta .... Mas verifiquei que colei errado para Voce...

Troquei a instrução

SeuDataSet.prior; por SeuDataSet.First;

Marco Salles, fico grato por seu esforço, mais desta forma naum está funcionando corretamente, as vezes ele seleciona o primeiro e um do meio.


Por isso que ele estava Selecionando osempre o primeiro... Por causa do First , que é vá para o primeiro ao Inves de Prior .. Vá para o anterior

procedure TForm1.DBGridClick(Sender: TObject); 
begin 
if DbGrid1.SelectedRows.Count = 2 Then 
     dbgrid1.SelectedRows.Clear; 

//ao clicar na primeira linha .. com certeza , fo isto que voce me garantiu 
// SeuDataSetContad.AsString tem um valor diferente de zero... 
//logo dou um Next e pego a segunda linha.. Pois com voce mesmo falou: 
// sempre contaC vem Depois  de contaC... Por isso o next 

  if SeuDataSetContad.AsString <> ´´ Then 
      begin 
        SeuDataSet.Next; 
        dbgrid1.SelectedRows.CurrentRowSelected:=True; 
      end 
   else 

//ao clicar na segunda linha .. com certeza , fo isto que voce me garantiu 
// SeuDataSetContaC.AsString tem um valor diferente de zero... 
//logo dou um FIRST epego a primeira linha.. Pois com voce mesmo falou: 
// sempre contaD vem sempre antes de contaC ..Por isso o first 

     begin 
      SeuDataSet.prior; //*******aqui estava o erro......*****
      dbgrid1.SelectedRows.CurrentRowSelected:=True; 
    end; 
  end;



GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Ai Marco Salles, agora esta certinho.... :D

Usando o Prior esta pegando certo, tanto usando clicar na primeira linha como na segunda linha. Ele acha certo agora. :D


Bom esta parte ja esta certa, agora a parte pior, sei que estou sendo chato com meus problemas de programador iniciante, mais e agora como jogar os dois selecionados dentro do edit do forme que altera?


Axo que o codigo seria este:

*********dados do campo debito************
   form4.edit2.text:=dm.qtbcontalan.fieldbyname(´contad´).value;
   form4.e1.text:=dm.qtbcontalan.fieldbyname(´numcontad´).value;
   form4.label2.caption:=dm.qtbcontalan.fieldbyname(´nomecd´).value;
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
   form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;
//****************dados do campo credito*************
form4.edit4.text:=dm.qtbcontalan.fieldbyname(´contac´).value;
   form4.jm1.text:=dm.qtbcontalan.fieldbyname(´numcontac´).value;
   form4.label3.caption:=dm.qtbcontalan.fieldbyname(´nomecc´).value;
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
   form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;


Ou seja o form4 e seus edits e labels recebe o que eu selecionei conforme o clique dentro do dbgrid.

Está correto assim?

Quando usava o Ctrl para selecionar os dois ele jogava certinho no form4, mais agora que esta selecionando automatico naum joga os campos dentro dos edits.

Ta ficando cansativo naum é. hehehehehe.

Desculpe minha falta de conhecimento.

E mais uma veiz obrigado por estar me ajudando amigo.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Ai Marco Salles, agora esta certinho....


o cavalo sabe quem ta montando nele...

Ta ficando cansativo naum é. hehehehehe. Desculpe minha falta de conhecimento.


Conta 11111-1 agencia 1111 .. Aceito todos os tipos de cartãoes de credito, divido e parcelo tb , faço qualquer negócio.

Bom esta parte ja esta certa, agora a parte pior, sei que estou sendo chato com meus problemas de programador iniciante, mais e agora como jogar os dois selecionados dentro do edit do forme que altera?


Faça assim:

Var
BookMarkList:TBookMarkList;
BookMark:TBookmarkstr;

em

procedure TForm1.DBGridClick(Sender: TObject);
var
  Seq:String;
begin
  if DbGrid1.SelectedRows.Count = 2 Then
   bla...bla...bla...bla...
    BookMarkList:=DbGrid1.SelectedRows; //acrescente esta INSTRUÇÃO*
end;


Agora para capturar esses valores faça

procedure SuEventoMiasAdequado;

begin

   BookMark:=CdsTbConta.bookmark;
   SeuDataSet.disablecontrols;
   SeuDataSet:=BookMarkList[0];

  //****************dados do campo Debito************* 

     form4.edit2.text:=dm.qtbcontalan.fieldbyname(´contad´).value; 
   form4.e1.text:=dm.qtbcontalan.fieldbyname(´numcontad´).value; 
   form4.label2.caption:=dm.qtbcontalan.fieldbyname(´nomecd´).value; 
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value; 
   form4.edit3.text:= FormatFloat(´,0.00;(,0.00)´,StrToFloat   (form4.edit3.Text)); 
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value; 

  SeuDataSet:=BookMarkList[1];

//****************dados do campo credito************* 
form4.edit4.text:=dm.qtbcontalan.fieldbyname(´contac´).value; 
   form4.jm1.text:=dm.qtbcontalan.fieldbyname(´numcontac´).value; 
   form4.label3.caption:=dm.qtbcontalan.fieldbyname(´nomecc´).value; 
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value; 
   form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text)); 
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;

   SeuDataSet.bookmark:=BookMark;
   SeuDataSet.enablecontrols;

end;


espero que dè mais este passo , mas se nãoconseguir relate o erro , para que possamos Tetar corrijir.. Acho que não vai dar erro nenhum ...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Naum passou aqui

BookMark:=CDSTbConta.bookmark;
   dm.qtbcontalan.disablecontrols;
   dm.qtbcontalan:=BookMarkList[0];

Erro:
[b:295b06a20d][Error] UConta.pas(785): Undeclared identifier: ´cdsTbConta´[/b:295b06a20d]

Depois tentei assim
BookMark:=dm.TbConta.bookmark;
   dm.qtbcontalan.disablecontrols;
   dm.qtbcontalan:=BookMarkList[0];


Erro
[b:295b06a20d][Error] UConta.pas(787): Incompatible types: ´TIBQuery´ and ´String´[/b:295b06a20d]

ai tentei desta forma
BookMark:=dm.qtbcontalan.bookmark;
   dm.qtbcontalan.disablecontrols;
   dm.qtbcontalan:=BookMarkList[0];

da o mesmo erro
[b:295b06a20d][Error] UConta.pas(787): Incompatible types: ´TIBQuery´ and ´String´[/b:295b06a20d]


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

qual o seu componente de acesso


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

To usando um ibdatabase, ibtransaction e um ibquery, da aba do Interbase


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Ate achei esquesito , mas fui conferir....

O IBquery Tem a propriedade Bookmark

BookMark:=IBQuery1.Bookmark;

[b:be99876218]compila sem problema....[/b:be99876218]

veja o que voce fez dm.qtbcontalan:=BookMarkList[0];


ta errado .. Pois deveria ser assim :

[b:be99876218]dm.qtbcontalan.BookMark:=BookMarkList[0];[/b:be99876218]

[b:be99876218]vamos recomeçar[/b:be99876218]

[b:be99876218]//declarar abaixo da secção Implementation...[/b:be99876218]
Var 
BookMarkList:TBookMarkList; 
BookMark:TBookmarkstr; 


em

Código: 
procedure TForm1.DBGridClick(Sender: TObject); 
var 
  Seq:String; 
begin 
  if DbGrid1.SelectedRows.Count = 2 Then 
   bla...bla...bla...bla... 
    BookMarkList:=DbGrid1.SelectedRows; //acrescente INSTRUÇÃO* 
end; 


Agora para capturar esses valores faça

Código:
procedure SuEventoMiasAdequado; 

begin 

   BookMark:=IBQuery1.bookmark; 
   IBQuery1.disablecontrols; 

   IBQuery1.BookMark:=BookMarkList[0]; 

  //****************dados do campo Debito************* 

     form4.edit2.text:=dm.qtbcontalan.fieldbyname(´contad´).value; 
   form4.e1.text:=dm.qtbcontalan.fieldbyname(´numcontad´).value; 
   form4.label2.caption:=dm.qtbcontalan.fieldbyname(´nomecd´).value; 
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value; 
   form4.edit3.text:= FormatFloat(´,0.00;(,0.00)´,StrToFloat   (form4.edit3.Text)); 
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value; 

   IBQuery1.BookMark:=BookMarkList[1];

//****************dados do campo credito************* 
form4.edit4.text:=dm.qtbcontalan.fieldbyname(´contac´).value; 
   form4.jm1.text:=dm.qtbcontalan.fieldbyname(´numcontac´).value; 
   form4.label3.caption:=dm.qtbcontalan.fieldbyname(´nomecc´).value; 
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value; 
   form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text)); 
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value; 

    IBQuery1.bookmark:=BookMark; 
    IBQuery1.enablecontrols; 

end; 


[b:be99876218][color=darkred:be99876218]claro , aonde eu escrevi IBQuery1 e o seu dm.qtbcontalan[/color:be99876218][/b:be99876218]

espero não ter errado nada


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Agora passou mas...
agora bagunça o selecionador sera que esta em lugar errado o bookmak nesta linha.

procedure TFConta.DBGridClick(Sender: TObject);
var
Seq:String;
begin
if jvDbGrid1.SelectedRows.Count = 2 Then
jvdbgrid1.SelectedRows.Clear;
if dm.qtbcontalanContaD.AsString <> ´´ Then
begin
dm.qtbcontalan.Next;
jvdbgrid1.SelectedRows.CurrentRowSelected:=True;
end
else
begin
dm.qtbcontalan.Prior;
jvdbgrid1.SelectedRows.CurrentRowSelected:=True;
end;
[color=red:9cc4cc1d16]BookMarkList:=jvDbGrid1.SelectedRows;[/color:9cc4cc1d16]
end;


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Agora passou mas...


mas o que ????? o que que esta ocorrendo ???

... errado o bookmak nesta linha.


não .. ele esta no lugar certo...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Pois é amigo, agora depois que coloquei o bookmark ele naum esta mais selecionando corretamente como antes, as vezes aponta para o primeiro registro de algum registro do meio. como estava ocorrendo antes quando naum usava o prior.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Cara hj não vai dar para continuar , pois ja tenho que sair...

Pois é amigo, agora depois que coloquei o bookmark ele naum esta mais selecionando corretamente como antes, as vezes aponta para o primeiro registro de algum registro do meio. como estava ocorrendo antes quando naum usava o prior.


Mas o BookMark não tem nada a ver com isso .... Ele esta lendo os valores que estão selecionados no jvDbGrid1.SelectedRows;
[b:435160b482]Não faça a segunda parte [/b:435160b482], coloque somente a isntrução e verifique. Depois tire a instrução e faça novamente


Faça teste deixando a Instrução //jvDbGrid1.SelectedRows;
Comentário e veja se o erro ainda persiste...

So digo uma coisa.. Não se assuste e fácil demaas... Cabeça quente a gente so faz errado. Relaxe e faça com calma. E mole !!!


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Faça teste deixando a Instrução //jvDbGrid1.SelectedRows;


Se eu deixar esta linha acima citada assim [b:fb39a652c8]//jvDbGrid1.SelectedRows[/b:fb39a652c8]

Aparece o seguinte erro, quando vou selecionar dentro do grid.

[color=red:fb39a652c8]´Access violation at Address 004B4BE5 in Module ´TBContabil.EXE´ Read of Address 00000004´[/color:fb39a652c8]


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Citação: Faça teste deixando a Instrução //jvDbGrid1.SelectedRows; Se eu deixar esta linha acima citada assim //jvDbGrid1.SelectedRows Aparece o seguinte erro, quando vou selecionar dentro do grid.


Mas não é para fazer a parte Dois... E so para se certificar que a Parte I
continua funcionando...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Olha estou com estes codigos aqui naum sei se funciona pois naum testei

with DBGrid1 do
begin
for i := 0 to Pred(SelectedRows.Count) do
begin
DataSource.DataSet.Bookmark :=SelectedRows;
{ o DataSet está posicionado na seleção }
end;
end;

outra


Gerenciando mais de uma linha selecionada num DBGrid (Multiselect) O DBGrid tem uma propriedade não documentada
chamada SelectedRows
(Tbookmark). Com ela você pode gerenciar
Multiselect da seguinte forma:
var
contador: Integer;
begin
With Dbgrid1 do
Begin
for contador:= 0 to Pred(SelectedRows.Count)
do
Begin
Datasource.Dataset.Bookmark:=
SelectedRows[contador]; // posiciona nos registros selecionados do
DBGrid
end;
end;
Voltar ao início
9- Compactando Tabelas
Para compactar (remover fisicamente todos registros
apagados) de uma tabela Paradox deve-se utilizar o seguinte código: procedure ParadoxPack(Table : TTable);
var
TBDesc : CRTblDesc;
hDb: hDbiDb;
TablePath: array[0..dbiMaxPathLen] of char;
begin
FillChar(TBDesc,Sizeof(TBDesc),0);
with TBDesc do begin
StrPCopy(szTblName,Table.TableName);
StrPCopy(szTblType,szParadox);
bPack := True;
end;
hDb := nil;
Check(DbiGetDirectory(Table.DBHandle, True,
TablePath));
Table.Close;
Check(DbiOpenDatabase(nil, ´STANDARD´,
dbiReadWrite, dbiOpenExcl,nil,0, nil, nil, hDb));
Check(DbiSetDirectory(hDb, TablePath));
Check(DBIDoRestructure(hDb,1,@TBDesc,nil,nil,nil,False));
Table.Open;
end;
Para compactar tabelas Dbase use o seguinte
comando:
DBIPackTable(Table1.DBHandle,Table1.Handle,nil,nil,True);
Voltar ao início 10- Procura e substituição de string num campo memo Basta você passar
a string a ser procurada, a string que à substituirá e campo memo.
Chamando por
exemplo no evento OnClick de em botão. Procedure TForm1.Button1Click (Sender: TObject);
Begin
FindReplace(Edit1.Text,Edit2.Text, Memo1);
end;
Procedure FindReplace (const Enc, subs: String; Var
Texto:TMemo);
Var
i, Posicao: Integer;
Linha: string;
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines;
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0
then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines:=Linha;
end;
until Posicao = 0;
end;
end;

outra

RETRIEVING MULTIPLE SELECTED ROWS/BOOKMARKS IN A DBGRID
The following code is excerpted from the accompanying sample program. It iterates through and displays the company name for each selected row.

var
x : integer ;
b : TBookmark ;
begin
b := Table1.GetBookmark ;
Table1.DisableControls ;
for x := 0 to DBGrid1.SelectedRows.Count - 1 do begin
Table1.Bookmark := DBGrid1.SelectedRows.Items[x] ;
ShowMessage(Table1Company.Value) ;
end ;
Table1.GotoBookmark(b) ;
Table1.FreeBookmark(b) ;
Table1.EnableControls ;
DBGrid1.SetFocus ;
end ;

Note the use of the TTable.Bookmark property. Assigning it directly accomplishes the same thing as using the GoToBookmark method. The only difference is that the Bookmark property expects a TBookmarkStr argument, whereas GoToBookmark expects a TBookmark argument. Because SelectedRows contains a list of TBookmarkStr, you would need to typecast in order to use GoToBookmark. 


outra com tabela:
Para marcar um determinado local em uma tabela 
necessitamos criar uma nova instancia de TBookmark e 
executar o método GetBookMark de uma TTable.

var
bmMarcaLocal : TBookmark;
.
.
.
begin
bmMarcaLocal := table.GetBookMark;

Para retornar a este local em particular a qualquer momento
deve-se utiliza o método GotoBookMark(), este método 
recebe como parâmetro o TBookmark recebido como retorno
de GetBookMark.

table1.GotoBookMark(bmMarcaLocal);

Após utilizar o Bookmark para atender seus objetivos, é 
importante que a memória utilizada por este recurso seja 
novamente liberada para o sistema, para executar esta operação
utilize o método FreeBookMark.

table1.FreeBookMark(bmMarcaLocal);

Podem ser criados vários Bookmarks para uma mesma tabela, 
sendo este numero limitado apenas pela quantidade de memória
livre no equipamento.

OBS: Cuidado com o uso indevido deste recurso, cada instancia
de TBookMark reserva uma determinada porção de memória que
só será novamente liberada para ser reutilizada após a execução de
um FreeBookmark. Se vários Bookmarks forem criados e não 
liberados podem comprometer a execução do programa.

outro:
PROBLEMS WITH TTABLE.RECORDCOUNT PROPERTY
s there something wrong with the TTable.RecordCount property? Sometimes it works, but sometimes it always returns zero.

A. Although it is not considered to be a "bug", there is most definitely a quirk involved with the RecordCount property. To ensure the proper return value, you must call the Last method. The following code snippet demonstrates.

var
b : TBookmark ;
begin
b := MyTable.GetBookmark ;
MyTable.Last ;
MyTable.GotoBookmark(b) ;
MyTable.FreeBookmark(b) ;
end ;

outra dica:
Usando Multi-Select com um DBGrid

procedure TForm1.SelectClick(Sender: TObject);
var
x: word;
TempBookmark: TBookMark;
begin
DBGrid1.Datasource.Dataset.DisableControls;
with DBgrid1.SelectedRows do
if Count <> 0 then
begin
TempBookmark:= DBGrid1.Datasource.Dataset.GetBookmark;
for x:= 0 to Count - 1 do
begin
if IndexOf(Items[x]) > -1 then
begin
DBGrid1.Datasource.Dataset.Bookmark:= Items[x];
showmessage(DBGrid1.Datasource.Dataset.Fields[1].AsString);
end;
end;
end;
DBGrid1.Datasource.Dataset.GotoBookmark(TempBookmark);
DBGrid1.Datasource.Dataset.FreeBookmark(TempBookmark);
DBGrid1.Datasource.Dataset.EnableControls;
end;


Soh deixei aqui para ver se tem alguma utilidade


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Olha estou com estes codigos aqui naum sei se funciona pois naum testei


[b:a7c82ad770]é o mesmo codigo , com exceção de[/b:a7c82ad770]

9- Compactando Tabelas Para compactar (remover fisicamente todos registros apagados) de uma tabela Paradox deve-se utilizar o seguinte código: procedure ParadoxPack(Table : TTable);


[b:a7c82ad770]que não é o seu caso....[/b:a7c82ad770]

O seu caso é apenas : :arrow:

Gerenciando mais de uma linha selecionada num DBGrid (Multiselect) O DBGrid tem uma propriedade não documentada chamada SelectedRows (Tbookmark). Com ela você pode gerenciar Multiselect da seguinte forma: var contador: Integer; begin With Dbgrid1 do Begin for contador:= 0 to Pred(SelectedRows.Count) do Begin Datasource.Dataset.Bookmark:= SelectedRows[contador]; // posiciona nos registros selecionados do DBGrid end;


Agora , para que que voce vai fazer um contador se no seu caso especifico
[b:a7c82ad770]voce so tera marcados dois items no DbGrid[/b:a7c82ad770]

:arrow: :arrow: Logo o[b:a7c82ad770] Lopp For contador...[/b:a7c82ad770]
for contador:= 0 to Pred(SelectedRows.Count) bla..bla Datasource.Dataset.Bookmark:= SelectedRows[contador];


[b:a7c82ad770]pode ser substituido por: [/b:a7c82ad770]
Datasource.Dataset.Bookmark:= 
SelectedRows[0]; 
"Tire" os items desse Registros e Datasource.Dataset.Bookmark:= SelectedRows[1]; "Tire" os items desse registros


Agora olha o que seu texto Diz :

Note the use of the TTable.Bookmark property. Assigning it directly accomplishes the same thing as using the GoToBookmark method. Traduzindo..... Anotar o uso da propriedade de TTable.Bookmark. Atribui-la realiza diretamente [b:a7c82ad770]a mesma coisa [/b:a7c82ad770]que usando o método de GoToBookmark.


As biografias nos revelam que ai inves de usar restaurar a posição e excluir o marcador com as instruçoes :
table1.gotoBookMark(BookMark); table1.FreeBookMark(BookMark);

usamos simplesmente a [b:a7c82ad770]propriedade BookMark [/b:a7c82ad770]da classe Tdataset...

O que ganhamos com isso ??? :?: :?: :?:

Na prática nada , apenas usamos uma estrutura , que tecnicamente se comporta como uma String Opaca , uma estrutura sujeita ao gerenciamento de vida da String . Ou seja o delphi , cuida da memória , não é necessário usar o table1.FreeBookMark(BookMark);


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Naum tem jeito mesmo, se eu usar o [b:de297ac6e8]BookMark [/b:de297ac6e8] bagunça o selecionamento do dbgrid.

Naum teria outra forma de jogar os dados selecionados para dentro do outro form?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Naum tem jeito mesmo, se eu usar o BookMark bagunça o selecionamento do dbgrid.


mas o BookMark é exatamente para isto.. Para não bagunçar o selecionamento do Grid

Naum teria outra forma de jogar os dados selecionados para dentro do outro form?


voce declarou esta variavel na secção publica do form ????
com em outro formulário voce acessa esta variavel ????
e algo que voce esta fazendo que esta fazendo esta ´bagunça´....

[b:7b4f7b4b45]Não tem erro[/b:7b4f7b4b45]

Faça isto num botão no prorprio form :!: :!: :!:

BookMarkList:=DbGrid1.SelectedRows;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
   BookMark:=SeuDataSet.bookmark;
   SeuDataSet.disablecontrols;
      for i :=  0 to  DBGrid1.SelectedRows.Count - 1  do
      begin
        SeuDataSet.booKmark:=BookMarkList[i];
        showmessage(  CdsTbConta.FieldByName(´CONTAD´).AsString);
      end;
   SeuDataSet.bookmark:=BookMark;
   SeuDataSet.enablecontrols;
end;


e veja se tem ´bagunça´ e se não apresenta corretamente o valor da CONTAD dos dois registros selecionados...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Coloquei o codigo dentro de um button e apareçe o seguinte erro:

[b:8f2826cad7]´Access violation at Address 004B4BE5 in Module ´TBContabil.EXE´ Read of Address 00000004´[/b:8f2826cad7]

procedure TFConta.Button8Click(Sender: TObject);
var
i:integer;
begin
   BookMark:=dm.qtbcontalan.bookmark;
   dm.qtbcontalan.disablecontrols;
      for i :=  0 to  jvDBGrid1.SelectedRows.Count - 1  do
      begin
        dm.qtbcontalan.booKmark:=BookMarkList[i];
        showmessage( dm.qtbcontalan.FieldByName(´CONTAD´).AsString);
      end;
   dm.qtbcontalan.bookmark:=BookMark;
   dm.qtbcontalan.enablecontrols;


end;
[/b]


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Coloquei o codigo dentro de um button e apareçe o seguinte erro:

´Access violation at Address 004B4BE5 in Module ´TBContabil.EXE´ Read of Address 00000004´

voce colocou tb a instrução BookMarkList:=DbGrid1.SelectedRows;
apos ter selecionado os items do DbGrid ????

Acho que voce esqueceu desse detalhe...


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

descuple o erro que lhe foi abordado foi de acesso a memória .

´Access violation at Address 004B4BE5 in Module ´TBContabil.EXE´ Read of Address 00000004´



Geralmente Access Violation está relacionado com tentativas de utilizar objetos que ou ainda não foram criados no programa ou já foram destruídos (automaticamente ou não) em algum ponto do programa.

No seu caso por exemplo com voce esta criando o DataModulo ??
Ele esta sendo Criado depois do Form ????


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

descuple o erro que lhe foi abordado foi de acesso a memória .

´Access violation at Address 004B4BE5 in Module ´TBContabil.EXE´ Read of Address 00000004´



Geralmente Access Violation está relacionado com tentativas de utilizar objetos que ou ainda não foram criados no programa ou já foram destruídos (automaticamente ou não) em algum ponto do programa.

No seu caso por exemplo com voce esta criando o DataModulo ??
Ele esta sendo Criado depois do Form ????


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Resolvido esta parte, era o que voçe disse no post anterior, tinha esquecido desta linha

voce colocou tb a instrução BookMarkList:=DbGrid1.SelectedRows; apos ter selecionado os items do DbGrid ????


agora fiz uns telstes aqui usando um memo para ver se jogava o que eu selecionava dentro do memo, e percebi que naum joga os dois lançamentos selecionados.

procedure TFConta.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key in [1, 4, 22] then
begin
jvDBGrid1.DataSource.DataSet.First;
while not jvDBGrid1.DataSource.DataSet.Eof do
begin
{Ctrl+A}
if key = 1 then
jvDBGrid1.SelectedRows.CurrentRowSelected := true;

{Ctrl+D}
if key = 4 then
jvDBGrid1.SelectedRows.CurrentRowSelected := false;

{Ctrl+I}
if key = 22 then
jvDBGrid1.SelectedRows.CurrentRowSelected := not jvDBGrid1.SelectedRows.CurrentRowSelected;

jvDBGrid1.DataSource.DataSet.Next;
end;
end;
end;


e chamo assim no memo

procedure TFConta.Button9Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;

With jvDBGrid1 do
Begin
if SelectedRows.Count > 0 then
for i := 0 to Pred(SelectedRows.Count) do
Begin
{posiciona nos registros selecionados do DBGrid}
//DataSource2.Dataset.Bookmark := SelectedRows;
BookMarkList:=jvDbGrid1.SelectedRows;
Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString)
end;
end;

end;


Repare que usei para visualizar dentro de um memo os campos NOMECD e NOMECC, que saum os campos do nome da conta debito e da conta credito.

E vamos supor que na minha tabela está gravado assim:

contaCD---------contaCC---------nomeCD----------nomeCC
0001--------------null--------------INSS A RECOLHER-----null
-------------------0006--------------null------------------CAIXA

Percebi que se eu selecionar este conjunto de lançamentos e jogar para um memo ou apareçe nos dois campos somente CAIXA ou somente INSS A RECOLHER, em vez de aparecer como foi selecionado.

Amigo to quase desistindo deste negocio.

Grato.


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Resolvido esta parte, era o que voçe disse no post anterior, tinha esquecido desta linha

voce colocou tb a instrução BookMarkList:=DbGrid1.SelectedRows; apos ter selecionado os items do DbGrid ????


agora fiz uns telstes aqui usando um memo para ver se jogava o que eu selecionava dentro do memo, e percebi que naum joga os dois lançamentos selecionados.

procedure TFConta.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key in [1, 4, 22] then
begin
jvDBGrid1.DataSource.DataSet.First;
while not jvDBGrid1.DataSource.DataSet.Eof do
begin
{Ctrl+A}
if key = 1 then
jvDBGrid1.SelectedRows.CurrentRowSelected := true;

{Ctrl+D}
if key = 4 then
jvDBGrid1.SelectedRows.CurrentRowSelected := false;

{Ctrl+I}
if key = 22 then
jvDBGrid1.SelectedRows.CurrentRowSelected := not jvDBGrid1.SelectedRows.CurrentRowSelected;

jvDBGrid1.DataSource.DataSet.Next;
end;
end;
end;


e chamo assim no memo

procedure TFConta.Button9Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;

With jvDBGrid1 do
Begin
if SelectedRows.Count > 0 then
for i := 0 to Pred(SelectedRows.Count) do
Begin
{posiciona nos registros selecionados do DBGrid}
//DataSource2.Dataset.Bookmark := SelectedRows;
BookMarkList:=jvDbGrid1.SelectedRows;
Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString)
end;
end;

end;


Repare que usei para visualizar dentro de um memo os campos NOMECD e NOMECC, que saum os campos do nome da conta debito e da conta credito.

E vamos supor que na minha tabela está gravado assim:

contaCD---------contaCC---------nomeCD----------nomeCC
0001--------------null--------------INSS A RECOLHER-----null
-------------------0006--------------null------------------CAIXA

Percebi que se eu selecionar este conjunto de lançamentos e jogar para um memo ou apareçe nos dois campos somente CAIXA ou somente INSS A RECOLHER, em vez de aparecer como foi selecionado.

Amigo to quase desistindo deste negocio.

Grato.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Resolvido esta parte, era o que voçe disse no post anterior, tinha esquecido desta linha


agora fiz uns telstes aqui usando um memo para ver se jogava o que eu selecionava dentro do memo, e percebi que naum joga os dois lançamentos selecionados.


claro que não vai jogar , pois voce faz diferente daquilo que a gente combina :cry: :cry:

Amigo to quase desistindo deste negocio.


Se voce não ter um pouquinho de atenção , voce não ira conseguir..

Voce esta usando um método no OnKey para marcar a Grid... So que voce esta mais uma vez esquecendo de fazer BookMarkList:=DbGrid1.SelectedRows; no fim do processo

procedure TFConta.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
if key in [1, 4, 22] then 
begin 
jvDBGrid1.DataSource.DataSet.First; 
while not jvDBGrid1.DataSource.DataSet.Eof do 
begin 
{Ctrl+A} 
if key = #1 then 
jvDBGrid1.SelectedRows.CurrentRowSelected := true; 

{Ctrl+D} 
if key = 4 then 
jvDBGrid1.SelectedRows.CurrentRowSelected := false; 

{Ctrl+I} 
if key = 22 then 
jvDBGrid1.SelectedRows.CurrentRowSelected := not jvDBGrid1.SelectedRows.CurrentRowSelected; 

jvDBGrid1.DataSource.DataSet.Next; 
end; 
 BookMarkList:=jvDBGrid1.SelectedRows; //tem que alimentar....
end; 
end;


e para chamar o método voce esta trocando a instrução
dm.qtbcontalan.Bookmark:=BookMarkList[i]; CORRETA por BookMarkList:=jvDbGrid1.SelectedRows;-->>>Incorreta




procedure TFConta.Button9Click(Sender: TObject); 
var 
i: Integer; 
begin 
Memo1.Clear; 

With jvDBGrid1 do 
Begin 
if SelectedRows.Count > 0 then 
for i := 0 to Pred(SelectedRows.Count) do 
Begin 
{posiciona nos registros selecionados do DBGrid} 
//DataSource2.Dataset.Bookmark := SelectedRows; 
//BookMarkList:=jvDbGrid1.SelectedRows;-->>>Para que isso ???
dm.qtbcontalan.Bookmark:=BookMarkList[i];//
Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString) 
end; 
end; 
end;



GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Impressionante amigo o que faz

Se eu colocar este memo1 no form aonde está os lançamentos, me mostra certinho, agora se eu chama-lo no form4.show, naum aparece as duas contas

procedure TFConta.Button9Click(Sender: TObject);
var
i: Integer;
begin
With jvDBGrid1 do
Begin
if SelectedRows.Count > 0 then
for i := 0 to Pred(SelectedRows.Count) do
Begin
{posiciona nos registros selecionados do DBGrid}
dm.qtbcontalan.Bookmark:=BookMarkList[i];//
form4.showmodal; //jogar para o form4
form4.Memo1.Clear; 
form4.Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString);

form4.edit1.caption:=dm.qtbcontalan.fieldbyname(´sequencia´).asString;
form4.maskedit1.text:=dm.qtbcontalan.fieldbyname(´data´).value;
if dm.qtbcontalan.fieldbyname(´DC´).asString = ´D´ then begin
   form4.edit2.text:=dm.qtbcontalan.fieldbyname(´contad´).value;
   form4.e1.text:=dm.qtbcontalan.fieldbyname(´numcontad´).value;
   form4.label2.caption:=dm.qtbcontalan.fieldbyname(´nomecd´).value;
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
   form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;
end else begin
   form4.edit4.text:=dm.qtbcontalan.fieldbyname(´contac´).value;
   form4.jm1.text:=dm.qtbcontalan.fieldbyname(´numcontac´).value;
   form4.label3.caption:=dm.qtbcontalan.fieldbyname(´nomecc´).value;
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
   form4.edit3.text:= FormatFloat(´,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;
end;
edit3.text:=dm.qtbcontalan.FieldByName(´valor´).value;
edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(edit3.Text));
edit3.setfocus;
end;
end;
end;


Trecho que eu jogeui para o form4 // Naum funcionou
form4.showmodal; //jogar para o form4
form4.Memo1.Clear; 
form4.Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString);



Seu codigo // Esse funciona mais ai o memo esta no mesmo form.
procedure TFConta.Button9Click(Sender: TObject); 
var 
i: Integer; 
begin 
Memo1.Clear; 

With jvDBGrid1 do 
Begin 
if SelectedRows.Count > 0 then 
for i := 0 to Pred(SelectedRows.Count) do 
Begin 
{posiciona nos registros selecionados do DBGrid} 
//DataSource2.Dataset.Bookmark := SelectedRows; 
//BookMarkList:=jvDbGrid1.SelectedRows;-->>>Para que isso ??? 
dm.qtbcontalan.Bookmark:=BookMarkList[i];// 
Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString) 
end; 
end; 
end;


Poxa aonde será qui estou errando?


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Se eu colocar este memo1 no form aonde está os lançamentos, me mostra certinho, agora se eu chama-lo no form4.show, naum aparece as duas contas


for i := 0 to Pred(SelectedRows.Count) do 
Begin 
{posiciona nos registros selecionados do DBGrid} 
dm.qtbcontalan.Bookmark:=BookMarkList[i];// 
form4.showmodal; //jogar para o form4 
...o que ta debaixo daqui esta esperando o 
..fechamento do form4 para continuar a execução..
..voce tem que primeiro criar o formulário
..depois carregar os dados
..e por ultimo apresentar o formulário


sinceramente eu não consigo entender pq voce faz um ShowModal dentro de um for.... eu não consigo entender.... :?: :?: :?:



mudei a posição do form4.Showmodal e tb do Form4.Memo1.Lines

var
i: Integer;
begin
  With jvDBGrid1 do
    Begin
      if SelectedRows.Count > 0 then
        begin  //coloquei esse begin
           form4.Memo1.Clear; //alteria a posição dessa instrução
            for i := 0 to Pred(SelectedRows.Count) do
              Begin
              {posiciona nos registros selecionados do DBGrid}
                dm.qtbcontalan.Bookmark:=BookMarkList[i];//

                form4.Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString);

                form4.edit1.caption:=dm.qtbcontalan.fieldbyname(´sequencia´).asString;
                form4.maskedit1.text:=dm.qtbcontalan.fieldbyname(´data´).value;
                if dm.qtbcontalan.fieldbyname(´DC´).asString = ´D´ then
                 begin
                    form4.edit2.text:=dm.qtbcontalan.fieldbyname(´contad´).value;
                    form4.e1.text:=dm.qtbcontalan.fieldbyname(´numcontad´).value;
                    form4.label2.caption:=dm.qtbcontalan.fieldbyname(´nomecd´).value;
                    form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
                    form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
                    form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;
                 end
               else
                 begin
                   form4.edit4.text:=dm.qtbcontalan.fieldbyname(´contac´).value;
                   form4.jm1.text:=dm.qtbcontalan.fieldbyname(´numcontac´).value;
                   form4.label3.caption:=dm.qtbcontalan.fieldbyname(´nomecc´).value;
                   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
                   form4.edit3.text:= FormatFloat(´,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
                   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;
                 end;
          end;
       //Alterei a posição dessas instruçoes
        form4.showmodal;
        edit3.text:=dm.qtbcontalan.FieldByName(´valor´).value; 
        edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(edit3.Text));
        edit3.setfocus;
      end;
    end;
  end;


IMPORTANTE : é claro que presupõem-se que o form4 ja tenha sido previamente criado , senão ira ocorrer erros de acessos violados etc...


GOSTEI 0
Jlimajr

Jlimajr

27/07/2006

Cara como eu sou um burro, estava colocando o SHOWMODAL em lugar errado.

O codigo correto é este
procedure TFConta.Button6Click(Sender: TObject);
var
i: Integer;
begin
form4.Memo1.Clear;

With jvDBGrid1 do
Begin
if SelectedRows.Count > 0 then
for i := 0 to Pred(SelectedRows.Count) do
Begin
{posiciona nos registros selecionados do DBGrid}
dm.qtbcontalan.Bookmark:=BookMarkList[i];//
form4.Memo1.Lines.Add(´Selecionado: ´+dm.qtbcontalan.fieldbyname(´nomeCD´).AsString +dm.qtbcontalan.fieldbyname(´nomeCC´).AsString);

form4.edit1.caption:=dm.qtbcontalan.fieldbyname(´sequencia´).asString;
form4.maskedit1.text:=dm.qtbcontalan.fieldbyname(´data´).value;

if dm.qtbcontalan.fieldbyname(´DC´).asString = ´D´ then begin

   //BookMark:=dm.qtbcontalan.bookmark;
   //dm.qtbcontalan.disablecontrols;

   //dm.qtbcontalan.BookMark:=BookMarkList[0];


   form4.edit2.text:=dm.qtbcontalan.fieldbyname(´contad´).value;
   form4.e1.text:=dm.qtbcontalan.fieldbyname(´numcontad´).value;
   form4.label2.caption:=dm.qtbcontalan.fieldbyname(´nomecd´).value;
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
   form4.edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;
end else begin

   //dm.qtbcontalan.BookMark:=BookMarkList[1];

   form4.edit4.text:=dm.qtbcontalan.fieldbyname(´contac´).value;
   form4.jm1.text:=dm.qtbcontalan.fieldbyname(´numcontac´).value;
   form4.label3.caption:=dm.qtbcontalan.fieldbyname(´nomecc´).value;
   form4.edit3.text:=dm.qtbcontalan.fieldbyname(´valor´).value;
   form4.edit3.text:= FormatFloat(´,0.00;(,0.00)´,StrToFloat(form4.edit3.Text));
   form4.e3.text:=dm.qtbcontalan.fieldbyname(´descricao´).value;

   //dm.qtbcontalan.bookmark:=BookMark;
   //dm.qtbcontalan.enablecontrols;

end;
edit3.text:=dm.qtbcontalan.FieldByName(´valor´).value;
edit3.text:= FormatFloat(´#,0.00;(,0.00)´,StrToFloat(edit3.Text));
edit3.setfocus;
end;
form4.showmodal; //AQUI É O LUGAR PARA CHAMAR O FORM.
end;
end;



Caso encerrado amigo

Mais uma vez agradeço sua paciencia por ter me ajudado nesta dificil missão que foi pra mim, pois naum conheço quase nada de programação.

Valeu mesmo, Marco Salles, nem sei como ti agradecer amigo.


GOSTEI 0
Marco Salles

Marco Salles

27/07/2006

Caso encerrado amigo


a persistencia é um grande passo para o aprendizado...

e muitas vezes da mais resultado , uma hora fora do computador pensando na solução , do que dez horas sentado diante dele.....

seguimos adiante e ate a próxima...


GOSTEI 0
POSTAR