Re: [delphi-br] Re: Recuperar valor de campo Oid Serial no PostgreSQL

2010-02-07 Por tôpico Vinicius Santos
silvioprog wrote:
  
 
 Galera consegui fazer sem POG mudando o SQL, vejam como fiz, com outras 
 tabelas:
 
 ==
 insert into Pedido (Oid, Data)
 values (nextval('pedido_oid_seq'), current_date);
 
 insert into PedidoItem (OidPedido, Preco, Quantidade)
 values (currval('pedido_oid_seq'), 10, 1);
 ==
 
 Pequei a dica nesse artigo:
 
 http://imasters.uol.com.br/artigo/1804 
 http://imasters.uol.com.br/artigo/1804
 
 Mas se alguém conseguir pegar o valor atual de um sequenciador sem 
 incrementá-lo eu agradeço.

currval, não incrementa a sequence, somente o nextval.

Veja: http://www.postgresql.org/docs/7.4/interactive/functions-sequence.html


[delphi-br] Re: Recuperar valor de campo Oid Serial no PostgreSQL

2010-02-04 Por tôpico silvioprog
Galera consegui fazer sem POG mudando o SQL, vejam como fiz, com outras tabelas:

==
insert into Pedido (Oid, Data)
 values (nextval('pedido_oid_seq'), current_date);
 
insert into PedidoItem (OidPedido, Preco, Quantidade)
 values (currval('pedido_oid_seq'), 10, 1);
==

Pequei a dica nesse artigo:

http://imasters.uol.com.br/artigo/1804

Mas se alguém conseguir pegar o valor atual de um sequenciador sem 
incrementá-lo eu agradeço.

--- Em delphi-br@yahoogrupos.com.br, silvioprog silviop...@... escreveu

 Olá galera,
 
 Pelo que pesquisei no Google a combinação de campo do tipo Serial + tdataset 
 não é legal, e pelo que vi, a solução seria via POG (argh! :P*), vejam:
 
 Tabela:
 =
 CREATE TABLE teste
 (
   oid serial NOT NULL,
   nome character varying(50),
   CONSTRAINT pk_oidteste PRIMARY KEY (oid)
 );
 =
 
 Código (com Zeos):
 ...
 procedure TForm1.Button1Click(Sender: TObject);
 begin
   ZConnection1.StartTransaction;
   try
 ZQuery1.SQL.Text := 'insert into Teste (Nome) values (''testando'') 
 returning Oid';
 ZQuery1.Open; // Será?
 ShowMessage(IntToStr(ZQuery1.FieldByName('Oid').AsInteger));
 ZConnection1.Commit;
   except
 ZConnection1.Rollback;
   end;
 end;
 ...
 
 Hum... Com Open? Isso é POG e das feias, só existe essa maneira de fazer? Não 
 tem como pegar o valor do sequencial antes de aplicar o commit?
 
 No Firebird-2.1.3 o código acima nem funcionou.

--
Silvio Clécio
--
Contato - silvioproggmail/googlewave
Blog estilo mural - silvioclecio.blogspot.com
Twitter - twitter.com/silvioprog
--
programmer ObjectPascal - silvioprog.blogspot.com
--
Duas coisas instruem o homem, qualquer que seja a sua natureza: o instinto e a 
experiência. Blaise Pascal.



[delphi-br] Re: Recuperar valor de campo Oid Serial no PostgreSQL

2010-02-04 Por tôpico silvioprog
Consegui pegar o sequencial sem incrementá-lo:

...
ZConnection1.StartTransaction;
try
  ZQuery1.Open;
  ZQuery1.SQL.Text := 'select * from teste_oid_seq';
ShowMessage(IntToStr(ZQuery1.FieldByName('last_value').AsInteger));
  ZConnection1.Commit;
...

Fica a dica ;)

--- Em delphi-br@yahoogrupos.com.br, silvioprog silviop...@... escreveu

 Galera consegui fazer sem POG mudando o SQL, vejam como fiz, com outras 
 tabelas:
 
 ==
 insert into Pedido (Oid, Data)
  values (nextval('pedido_oid_seq'), current_date);
  
 insert into PedidoItem (OidPedido, Preco, Quantidade)
  values (currval('pedido_oid_seq'), 10, 1);
 ==
 
 Pequei a dica nesse artigo:
 
 http://imasters.uol.com.br/artigo/1804
 
 Mas se alguém conseguir pegar o valor atual de um sequenciador sem 
 incrementá-lo eu agradeço.
 
 --- Em delphi-br@yahoogrupos.com.br, silvioprog silvioprog@ escreveu
 
  Olá galera,
  
  Pelo que pesquisei no Google a combinação de campo do tipo Serial + 
  tdataset não é legal, e pelo que vi, a solução seria via POG (argh! :P*), 
  vejam:
  
  Tabela:
  =
  CREATE TABLE teste
  (
oid serial NOT NULL,
nome character varying(50),
CONSTRAINT pk_oidteste PRIMARY KEY (oid)
  );
  =
  
  Código (com Zeos):
  ...
  procedure TForm1.Button1Click(Sender: TObject);
  begin
ZConnection1.StartTransaction;
try
  ZQuery1.SQL.Text := 'insert into Teste (Nome) values (''testando'') 
  returning Oid';
  ZQuery1.Open; // Será?
  ShowMessage(IntToStr(ZQuery1.FieldByName('Oid').AsInteger));
  ZConnection1.Commit;
except
  ZConnection1.Rollback;
end;
  end;
  ...
  
  Hum... Com Open? Isso é POG e das feias, só existe essa maneira de fazer? 
  Não tem como pegar o valor do sequencial antes de aplicar o commit?
  
  No Firebird-2.1.3 o código acima nem funcionou.

--
Silvio Clécio
--
Contato - silvioproggmail/googlewave
Blog estilo mural - silvioclecio.blogspot.com
Twitter - twitter.com/silvioprog
--
programmer ObjectPascal - silvioprog.blogspot.com
--
Duas coisas instruem o homem, qualquer que seja a sua natureza: o instinto e a 
experiência. Blaise Pascal.