Ir para conteúdo
Fórum Script Brasil
  • 0

Exibir codigo após applyupdate


fajo

Pergunta

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?

Editado por fajo
Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0
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:

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

Link para o comentário
Compartilhar em outros sites

  • 0

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

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?

Editado por fajo
Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0
...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.

Link para o comentário
Compartilhar em outros sites

  • 0
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

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

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0

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

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

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.

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.

Editado por fajo
Link para o comentário
Compartilhar em outros sites

  • 0

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

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;

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

Link para o comentário
Compartilhar em outros sites

  • 0

Vamos lá,

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.

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

Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...