Excluir 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
Respostas
Jlimajr
27/07/2006
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?
Marco Salles
27/07/2006
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 ???
Jlimajr
27/07/2006
Marco Salles
27/07/2006
Jlimajr
27/07/2006
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:
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
Marco Salles
27/07/2006
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] ???
[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]
Jlimajr
27/07/2006
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.
Jlimajr
27/07/2006
Marco Salles
27/07/2006
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 ????
Jlimajr
27/07/2006
fasso isso usando um update?
é isso?
Marco Salles
27/07/2006
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
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
Jlimajr
27/07/2006
Marco Salles
27/07/2006
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;
Jlimajr
27/07/2006
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?
Marco Salles
27/07/2006
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...
[b:3d8f389d11]Aho que voce ira precisar dela [/b:3d8f389d11] :!: :!: :!: :!:
Bem , voltemos :
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
[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]
Jlimajr
27/07/2006
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;
Naum estava funcionando, só consegui alterar o valor depois que tirei esta linha.
Marco Salles
27/07/2006
:?: :?: :?: :?: .. Vamos proseguir sem levar em conta isso
´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...
<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...
Jlimajr
27/07/2006
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
Jlimajr
27/07/2006
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.
Jlimajr
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.
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
Marco Salles
27/07/2006
como assim ????? se voce não alterar os valores desse campo é claro que eles vão ficar com o mesmo valor...
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]
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]
[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:
Jlimajr
27/07/2006
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.
Jlimajr
27/07/2006
//-----------------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.
Marco Salles
27/07/2006
Vamos por partes...
[b:524c7a0417]Veja , eu no meu exemplo eu fiz assim....[/b:524c7a0417]
[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.
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
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 :
é so voce colocar agora os campos que voce quer alterar e fornecer os parametros aos mesmos , conforme as descriçoes anteriores....
No aguardo...
Jlimajr
27/07/2006
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;
Marco Salles
27/07/2006
´Where (Sequencia = :pSequencia) and(DC = ´+QuotedStr(´D´)+´)´; e ´Where (Sequencia = :pSequencia) and(DC = ´+QuotedStr(´C´)+´)´;
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
Jlimajr
27/07/2006
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:
Adriano_servitec
27/07/2006
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+
Marco Salles
27/07/2006
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
Jlimajr
27/07/2006
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
Marco Salles
27/07/2006
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]
[b:7fd89139c9]Não seria a tecla CNTRL[/b:7fd89139c9] :?: :?: :?:
Jlimajr
27/07/2006
É 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?
Marco Salles
27/07/2006
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]
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
[b:281de02c7e]em qual o evento ????[/b:281de02c7e]
[b:281de02c7e]foi no evento OnClick Que criei para o seu DbGrid ????[/b:281de02c7e]
[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...
Marco Salles
27/07/2006
Troquei a instrução
SeuDataSet.prior; por SeuDataSet.First;
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;
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
o cavalo sabe quem ta montando nele...
Conta 11111-1 agencia 1111 .. Aceito todos os tipos de cartãoes de credito, divido e parcelo tb , faço qualquer negócio.
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 ...
Jlimajr
27/07/2006
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]
Marco Salles
27/07/2006
Jlimajr
27/07/2006
Marco Salles
27/07/2006
O IBquery Tem a propriedade Bookmark
BookMark:=IBQuery1.Bookmark;
[b:be99876218]compila sem problema....[/b:be99876218]
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
Jlimajr
27/07/2006
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;
Marco Salles
27/07/2006
mas o que ????? o que que esta ocorrendo ???
não .. ele esta no lugar certo...
Jlimajr
27/07/2006
Marco Salles
27/07/2006
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 !!!
Jlimajr
27/07/2006
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]
Marco Salles
27/07/2006
Mas não é para fazer a parte Dois... E so para se certificar que a Parte I
continua funcionando...
Jlimajr
27/07/2006
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
Marco Salles
27/07/2006
[b:a7c82ad770]é o mesmo codigo , com exceção de[/b:a7c82ad770]
[b:a7c82ad770]que não é o seu caso....[/b:a7c82ad770]
O seu caso é apenas : :arrow:
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]
[b:a7c82ad770]pode ser substituido por: [/b:a7c82ad770]
Datasource.Dataset.Bookmark:= SelectedRows[0];
Agora olha o que seu texto Diz :
As biografias nos revelam que ai inves de usar restaurar a posição e excluir o marcador com as instruçoes :
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);
Jlimajr
27/07/2006
Naum teria outra forma de jogar os dados selecionados para dentro do outro form?
Marco Salles
27/07/2006
mas o BookMark é exatamente para isto.. Para não bagunçar o selecionamento do Grid
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...
Jlimajr
27/07/2006
[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;
Marco Salles
27/07/2006
´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...
Marco Salles
27/07/2006
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 ????
Marco Salles
27/07/2006
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 ????
Jlimajr
27/07/2006
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.
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
claro que não vai jogar , pois voce faz diferente daquilo que a gente combina :cry: :cry:
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
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;Jlimajr
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
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?
Marco Salles
27/07/2006
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...
Jlimajr
27/07/2006
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.
Marco Salles
27/07/2006
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...