Fórum AutoIncremento - Parte II #288006

13/07/2005

0

E aí galera, blz?

Há um tempo atrás, eu havia colocado este assunto em questão. Acabei resolvendo o problema do campo autoincremento graças às dicas de vcs, criando o generator e a trigger, e usando um insert no sqldataset para inserir os dados. Está funcionando, porém tentei criar uma aplicação usando o append, conforme codigos abaixo:

No botão gravar:

with cdsClientes do
begin
Append;
//eu nao coloquei aki o fieldbyname para o campo nome, pq ele sera gerado pela trigger
FieldByName(´CUSTOMER´).AsString := dbedit2.Text;
Applyupdates(0);
end;

Qdo clico no gravar, dá a mensagem ´key violation´, e nem mostra o valor gerado para o campo codigo.

Eu deixei a propriedade required false, mas mesmo assim não funcionou.

Alguem poderia me ajudar?

[]´s


Roger1976

Roger1976

Responder

Posts

14/07/2005

Beppe

Até onde eu sei, um Append é o mesmo que um Insert, então continue usando Insert´s.

T+


Responder

Gostei + 0

14/07/2005

Paullsoftware

ai a única diferença que percebo sobre [b:e08e66deea]APPEND[/b:e08e66deea] e [b:e08e66deea]INSERT[/b:e08e66deea] é que o APPEND insere o registro no final da Tabela independente de onde cursor está posicionado, já o INSERT insere o novo registro logo após a posição cursor...

faça um teste com um DbGrid e vc verá isso.


Responder

Gostei + 0

14/07/2005

Beppe

Hum...mas fechando e reabrindo a query o novo registro já aparecerá no final, com o auto-incremento. O que dá pra fazer seria posicionar o cursor no fim, antes do Insert.


Responder

Gostei + 0

14/07/2005

Paullsoftware

Hum...mas fechando e reabrindo a query o novo registro já aparecerá no final, com o auto-incremento. O que dá pra fazer seria posicionar o cursor no fim, antes do Insert.

Correto, como falei é a única diferença que vejo entre eles...


Responder

Gostei + 0

15/07/2005

Roger1976

Ae galera, valeu pela atenção de todos. Eu fiz o teste usando o insert ao invés do append, mas não obtive sucesso.
Está aparecendo a seguinte mensagem:

field ´CODIGO´ must a value

O que eu não estou entendendo é que já tenha uma trigger e um generator, fiz o teste no banco e lá tá incrementando numa boa. O problema tá na aplicação. Deixei habilitado pra não passar o foco no campo codigo, mas qdo digito o nome e clico no gravar, aparece a mensagem referida acima, e o focu no campo codigo no dbgrid. Como disse antes, qdo uso o insert into... no sqldataset funciona, mas imagino numa tela de pedidos, onde o usuário vai digitando o item do pedido e à medida que vai acrescentando novos, vai aparecendo no dbgrid. Infelizmente, não estou conseguindo simular esta situação.

Espero mais uma vez contar com a dica de vcs, e desde já valeu pela força...

[]´s


Responder

Gostei + 0

16/07/2005

Eduardo Pereira

Pelo que eu pude perceber você está usando DbExpress. Neste caso, o uso de trigger com generator no banco pode dar este tipo de problema, por que o ClientDataSet não toma conhecimento do valor do ID gerado pelo generator (a não ser se fechar e abrir a tabela, o que não é desejável).
Eu costumo fazer da seguinte forma:
- No banco, existe uma SP que gera o identificador para a tabela desejada (através de um generator, como no trigger)
- No evento BeforeUpdateRecord do DataSetProvider, a SP é chamada e o valor gerado é atribuído à chave primária.
Ex.:
stpGeraID.ExecProc;
DeltaDS.FieldByName(´ID´).NewValue := stpGeraID.ParamByName(´ID´).AsInteger;

- IMPORTANTE: No DataSetProvider, em Options, poPropogateChanges deve estar em TRUE. Desta forma o valor atribuído ao campo ID é refletido no ClientDataSet.

[]´s
Eduardo Pereira


Responder

Gostei + 0

16/07/2005

Roger1976

Eduardo, eu sou iniciante em delphi, eu ainda não trabalhei com SP. No interbase, a tela para criar uma é idêntica ao da trigger. Como eu crio essa SP? O processo é o mesmo da trigger? Ah, eu estou usando o dbExpress mesmo...

Valeu kra pela dica...

[]´s


Responder

Gostei + 0

18/07/2005

Eduardo Pereira

Roger,

Abaixo o código de uma SP usando o generator ´GEN_DOCUMENTO´:

CREATE PROCEDURE GERAIDDOCUMENTO 
RETURNS ( ID INTEGER)
AS
BEGIN 
  ID = Gen_Id ( GEN_DOCUMENTO, 1 );
  Suspend ;
END



Qualquer dúvida estamos aí...


[]´s
Eduardo Pereira


Responder

Gostei + 0

14/08/2005

Roger1976

Fala Eduardo, blz? Kra, desculpe-me pela demora, estive com problemas de saúde, mas agora já estou bom... Eu fiz o teste seguindo a sua sujestão, e deu certo. Porém, eu acabei descobrindo uma outra maneira de se fazer o auto incremento. Eu fiz o genarator, a trigger, coloquei o metodo append no botao incluir, no gravar, usei o applyupadates, o refresh, como havia feito anteriormente. O que faltava era alimentar a trigger com um valor (0, por exemplo), pra gerar o codigo. Aí kra, muitos haviam dado a sugestao de colocar isso no evento beforeapplyupadates do clientdataset. Mas aí estava mandando o 0 depois do applyupdates. Fiz um teste usando o evento afterinsert do clientdataset, aí funcionou...

É isso aí kra,

[]´s

Rogeriio


Responder

Gostei + 0

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

Aceitar