Ajuda - Busca - Membros - Calendário
Versão Completa: Exibir codigo após applyupdate
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
fajo
Oi pessoal,

estou usando o D7 com DBExpress e Firebird e tenho a seguinte SQL no SQLDataset:

SELECT * FROM CLIENTES WHERE CODIGO = :CODIGO

a tabela CLIENTES tem o campo CODIGO q é autonumeração

tudo está funcionando perfeitamente só q quando mando gravar, o código não é mostrado no dbtext, e se dou um refresh, devido ao parametro não é exibido nenhum registro.

quando não trabalho com parametro, posso usar o bookmark, mas, assim, não sei como fazer.

alguém pode me dar uma dica?
William - TI
meu amigo não estou compreendendo direito, vamos lá.

no seu programa você da o select e depois salva?
usa a mesma query para fazer isto.

se for este é o problema você precisa dar o update e pesquisar de novo dando um locate no registro que você estava.

caso não for isso posta novamente a duvida pois não compreendi muito bem.
fajo
E dá pra usar o Locate quando uso query com parametro?
Jhonas
QUOTE
E dá pra usar o Locate quando uso query com parametro?


Nãao é necessário se o retorno da sua query for apenas um registro, caso contrário voce pode usar para localizar um registro especifico dentro de um grupo de registros.

abraço
fajo
Eu penso exatamento dessa forma Jhonas, o meu problema é com a não exibição do codigo gerado no banco no dbtext após o applyupdate, só isso.
Jhonas
QUOTE
o meu problema é com a não exibição do codigo gerado no banco no dbtext após o applyupdate


Não entendi isso ... explique melhor

fajo
Vou tentar, colocarei um exemplo resumido:

criei no Ibexpert uma tabela de CLIENTES, com os campos CODIGO e NOME, o campo CODIGO é auto-incremento, então criei o generator, trigger.

fui no Delphi, no datamodule fiz a conexão com o banco através do SQLConnection, inseri o SQLDataset com a seguinte SQL:

SELECT * FROM CLIENTES WHERE CODIGO = :CODIGO

coloquei o datasetprovider e o clientdataset, tudo como manda o figurino.

no form de cadastro de clientes, coloquei os 2 campos e um botão de inserir e outro de gravar, no botão inserir coloquei o Append e no botão gravar coloquei o ApplyUpdate(0);

clico no botão inserir, digito o nome do cliente e mando gravar, beleza, sem fechar o sistema, vou até o banco e tudo esta gravado no banco normalmente, inclusive o códig gerado automaticamente, voltando ao sistema, o nome do cliente permanece na tela de cadastro, mas o codigo q foi gerado no banco não é mostrado no dbedit q está linkado ao código, ou seja, não está refletindo o valor q foi gerado no banco.

se você puder fazer ai talvez entenda melhor.

Obrigado
Jhonas
QUOTE
no form de cadastro de clientes, coloquei os 2 campos e um botão de inserir e outro de gravar, no botão inserir coloquei o Append e no botão gravar coloquei o ApplyUpdate(0);

clico no botão inserir, digito o nome do cliente e mando gravar, beleza, sem fechar o sistema, vou até o banco e tudo esta gravado no banco normalmente, inclusive o códig gerado automaticamente, voltando ao sistema, o nome do cliente permanece na tela de cadastro, mas o codigo q foi gerado no banco não é mostrado no dbedit q está linkado ao código, ou seja, não está refletindo o valor q foi gerado no banco.



Esta parecendo que voce esqueceu de dar o Commit na transação para atualizar os dados

exemplo:

CODE
procedure TForm1.TransferButtonClick(Sender: TObject);

var
  Amt: Integer;
  TD: TTransactionDesc;
begin
  if not SQLConnection1.InTransaction then
  begin
    TD.TransactionID := 1;
    TD.IsolationLevel := xilREADCOMMITTED;
    SQLConnection1.StartTransaction(TD);
    try
      Amt := StrToInt(AmtEdit.Text);
      Debit.Params.ParamValues['Amount'] := Amt;
      Credit.Params.ParamValues['Amount'] := Amt;
      SQLConnection1.Commit(TD); {sucesso};
    except

      SQLConnection1.Rollback(TD); {falhou};
    end;
  end;
end;


abraço
fajo
Realmente tinha esquecido de dar o commit, o codigo do botão gravar está agora assim:

CODE
procedure TfrmCadClientes.btSalvarClick(Sender: TObject);
var
  TD: TTransactionDesc;
begin
  if not dm.SQLConnection1.InTransaction then
  begin
    TD.TransactionID := 1;
    TD.IsolationLevel := xilREADCOMMITTED;
    dm.SQLConnection1.StartTransaction(TD);
    try
     dm.cdsClientes.ApplyUpdates(0);
     dm.SQLConnection1.Commit(TD);
    except
     dm.SQLConnection1.Rollback(TD);
    end;
  end;

end;


mas continua a mesma coisa, o código continua sem aparecer;

esse amt é dai mesmo? assim como Debit e Credit?
Jhonas
QUOTE
esse amt é dai mesmo? assim como Debit e Credit?

`
É do exemplo .. voce não precisa usar

Esta correto a maneira como voce colocou ... fiz um teste aqui, criei uma tabela no IB com 2 campos ( COD - autoincremento e NOME - string ) e está funcionando ... o codigo aparece na tabela após o ApplyUpdates e o Commit

Experimenta Fechar a tabela e abrir novamente após o commit e veja o que acontece

abraço

fajo
QUOTE
...o codigo aparece na tabela após o ApplyUpdates e o Commit

Experimenta Fechar a tabela e abrir novamente após o commit e veja o que acontece


mas o problema de fechar e abrir a tabela e q da forma como a sql,não vai mostrar nenhum registro,a não ser q passe o valor do parametro q e exatamente o codigo q não e exibido.

faça ai um teste.
Jhonas
QUOTE
mas o problema de fechar e abrir a tabela e q da forma como esta sql,não vai mostrar nenhum registro,a não ser q passe o valor do parametro q e exatamente o codigo q não e exibido.


é exatamente dessa maneira que tem que funcionar se voce estiver usando parametros ... em uma pesquisa voce usará o codigo gerado para ele mostrar o registro

o teste que fiz aqui sem usar parametros e está funcionando sem problemas

CODE
procedure TForm1.Button1Click(Sender: TObject);
var
  TD: TTransactionDesc;
begin
  if not SQLConnection1.InTransaction then
  begin
    TD.TransactionID := 1;
    TD.IsolationLevel := xilREADCOMMITTED;
    SQLConnection1.StartTransaction(TD);
    try
     ClientDataSet1.ApplyUpdates(-1);
     SQLConnection1.Commit(TD);
     ClientDataSet1.Active := FALSE;
     ClientDataSet1.Active := TRUE;
    except
     SQLConnection1.Rollback(TD);
    end;
  end;
end;


abraço
fajo
QUOTE
em uma pesquisa voce usará o codigo gerado para ele mostrar o registro


Certo, então me diga, como é q vou saber o valor do código pra associar ao parametro se ele não é mostrado, mesmo q use um SELECT MAX(CODIGO) FROM CLIENTES, não dá, pois se estiver em rede complica.

sem parametro eu sei q funciona pois eu usaria o Tbookmark pra me levar ao registro q estava trabalhando,

mas o problema é: e com parametro?
Jhonas
QUOTE
Certo, então me diga, como é q vou saber o valor do código pra associar ao parametro se ele não é mostrado, mesmo q use um SELECT MAX(CODIGO) FROM CLIENTES, não dá, pois se estiver em rede complica.

sem parametro eu sei q funciona pois eu usaria o Tbookmark pra me levar ao registro q estava trabalhando,

mas o problema é: e com parametro?


Acho que voce está fazendo uma confusão.... veja:

1 - quando voce usa parametro em uma SQL, ao clicar no botão salvar o seu DBgrid ficara vazio ( está correto ) pois na passagem do parametro o seu COD estará com um numero que não existe na tabela.

2 - para a pesquisa voce deve montar uma SQL sem parametros, mas que não traga todos os registros da tabela mas somente uma quantidade fixa ( Ex: 500 ) para não sobregarregar o trafego da rede

3 - Na pesquisa voce pode selecionar pelo campo que deseja pesquisar ( ex: NOME, ENDERECO, CODIGO, etc... ) por exemplo: voce traz para a tela de pesquisa somente 500 NOMES. Desses voce seleciona 1.

4 - Depois de selecionado o registro, voce pode usar uma outra SQL para trazer apenas este registro para a sua tela e editar os seus campos.

Querer fazer as 2 coisas ao mesmo tempo não dá ( salvar e pesquisar usando a mesma SQL )

abraço
fajo
Jhonas, desculpa, mas acho que você está fazendo tempestado em copo d'áqua,

QUOTE

quando voce usa parametro em uma SQL, ao clicar no botão salvar o seu DBgrid ficara vazio ( está correto ) pois na passagem do parametro o seu COD estará com um numero que não existe na tabela.
Não, o dbgrid não ficara vazio, exibirá todos os campos, menos o código, q é exatamente o foco da minha dúvida, eu quero q ao clicar em salvar, além dos outros campos, nome, endereco, etc..., o codigo tb seja exibido, sei lá, alguma propriedade do provider, enfim, mas já estou perdendo as esperanças.

Já imaginou um caso desse como mestre/detalhe, onde a tabela detalhe precisa do codigo da mestre para poder fazer a linkagem, ...

QUOTE

2 - para a pesquisa voce deve montar uma SQL sem parametros, mas que não traga todos os registros da tabela mas somente uma quantidade fixa ( Ex: 500 ) para não sobregarregar o trafego da rede

3 - Na pesquisa voce pode selecionar pelo campo que deseja pesquisar ( ex: NOME, ENDERECO, CODIGO, etc... ) por exemplo: voce traz para a tela de pesquisa somente 500 NOMES. Desses voce seleciona 1.

4 - Depois de selecionado o registro, voce pode usar uma outra SQL para trazer apenas este registro para a sua tela e editar os seus campos.


Com relação à pesquisa não tenho problemas, sei como faze-la para pegar o registro desejado.

QUOTE
Querer fazer as 2 coisas ao mesmo tempo não dá ( salvar e pesquisar usando a mesma SQL )


Não sei se o seu pensamento é diferente do meu, mas, acho q dá sim, mas, se e somente se, eu souber o codigo q foi gerado pelo banco, onde após o salvar, pegaria o codigo e repassaria como parametro para query;

Obrigado pela dedicação, espero continuarmos com o debate.
Jhonas
OK ... veja este codigo ...

Select * from TESTE where COD = :CODI

Quando voce clicar no botão salvar o dbgrid ficará vazio em virtude da passagem do parametro CODI que é autoincremento, pois quando voce fechar e abrir a tabela o campo COD estará com outro valor


CODE
procedure TForm1.Button1Click(Sender: TObject);
var
  TD: TTransactionDesc;
begin
  if not SQLConnection1.InTransaction then
  begin
    TD.TransactionID := 1;
    TD.IsolationLevel := xilREADCOMMITTED;
    SQLConnection1.StartTransaction(TD);
    try
     ClientDataSet1.ApplyUpdates(-1);
     SQLConnection1.Commit(TD);

     ClientDataSet1.Active := FALSE;
     ClientDataSet1.Active := TRUE;
  
except
     SQLConnection1.Rollback(TD);
    end;
  end;
end;


QUOTE
Não sei se o seu pensamento é diferente do meu, mas, acho q dá sim, mas, se e somente se, eu souber o codigo q foi gerado pelo banco, onde após o salvar, pegaria o codigo e repassaria como parametro para query;


Para saber o codigo que foi gerado pelo banco voce pode pegar o valor gerado e jogá-lo em uma variavel .... para pegar o valor voce deve fechar e abrir a tabela ou dar um refresh, ir para o ultimo registro, ler o campo e jogá-lo em uma variavel de controle.

abraço
fajo
Vamos lá,

QUOTE

Quando voce clicar no botão salvar o dbgrid ficará vazio em virtude da passagem do parametro CODI que é autoincremento, pois quando voce fechar e abrir a tabela o campo COD estará com outro valor
concordo, se abrir e fechar a tabela, realmente o dbgrid ficará vazio.

QUOTE

Para saber o codigo que foi gerado pelo banco voce pode pegar o valor gerado e jogá-lo em uma variavel .... para pegar o valor voce deve fechar e abrir a tabela ou dar um refresh, ir para o ultimo registro, ler o campo e jogá-lo em uma variavel de controle.


isso até q daria, mas se o sistema não rodasse em rede, concorda?

abraço
Jhonas
QUOTE
isso até q daria, mas se o sistema não rodasse em rede, concorda?


Se no botão salvar voce guardar na variavel o numero gerado, não vai atrapalhar em nada a rede, pois só voce terá esse numero .... se outro usuário salvar tambem, ele já terá um outro numero

abraço
fajo
Chegamos ao problema central, como pegar o valor do codigo gerado no banco para associar a variável.

abraço
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.