Como obter o valor de um Generator

Firebird

12/12/2003

Eu gostaria de saber como posso obter o valor de
um determinado [b:40e2bf0a25]GENERATOR[/b:40e2bf0a25][/b]


Fabio-ps

Fabio-ps

Curtidas 0

Respostas

Afarias

Afarias

12/12/2003

function TFormx.GetNewID(const AGenerator: string): Integer; 
const 
  SQLText = ´select gen_id(¬s, 1) from rdb$database´; 
begin 
  with IBSQL1 do 
  begin 
    SQL.Text := Format(SQLText, [AGenerator]); 
    Transaction.StartTransaction; 
    try 
      ExecQuery; 
      Result := Fields[0].AsInteger; 
    finally 
      Transaction.Commit; 
    end; 
  end; 
end; 



...faça uma pesquisa no fórum pela palavra GENERATOR...


T+


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Uma pequena dúvida em cima disso.. onde exatamente eu coloco esse código?? :?:



Allan Elias Ramos :?:


GOSTEI 0
Afarias

Afarias

12/12/2003

vc poderá usar a função acima em diversos lugares do seu código. 2 lugares ´preferidos´ são no evendo BeforePost e OnNewRecord do DataSet (Query, etc...)


ex::

DataSet.FieldByName(´nome_campo´).AsInteger := GetNewID(´nome_do_generator´);



T+


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Valeu afarias,

Só estou com mais uma pequena dúvida.. essa function tem q ser declarada? eu nunca fiz uma.. eu sei fazer procedures...

eu declaro la em cima como ´procedure teste´ por exemplo, em cima dele clico em ´Crtl + Shift + C´ e ele me abre pra bota o código.. é a mesma coisa com a function???



Allan Elias Ramos :roll:


GOSTEI 0
Gandalf.nho

Gandalf.nho

12/12/2003

Tente esse componente, serve justamente para recuperar o valor de um generator: [url]www.ceres-software.com/files/ibgen.zip[/url]


GOSTEI 0
Afarias

Afarias

12/12/2003

eu declaro la em cima como ´procedure teste´ por exemplo, em cima dele clico em ´Crtl + Shift + C´ e ele me abre pra bota o código.. é a mesma coisa com a function???


a mesma coisa! funções e procedimentos (métodos já q estamos falando de classes) são a mesma coisa. a única diferença é q uma função tem um ´valor associado´.

pra declarar a função::

function NomeDaFunção( ** lista de parâmetros ** ): TipoDeRetorno;



T+


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Tente esse componente, serve justamente para recuperar o valor de um generator: [url]www.ceres-software.com/files/ibgen.zip[/url]


Gandalf, o arquivo nao abre, nao dá erro na página, como se ela nao existisse.. :cry:



Allan Elias Ramos :roll:


GOSTEI 0
Rodrrs

Rodrrs

12/12/2003

É SIMPLES

select gen_id(nomedogenerator,0) from rdb$database

colocando o nome do generator vc ja tem o valor dele e 0 para
ele nao incrementar nada somente para vc ter o valor dele.

rodrigo-regis@uol.com.br


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

RODRRS, onde eu coloco esse código? E pra colocar ele eu preciso dakele outro maior la em cima?

Tentei colocar esse select no BeforePost do TClientDataSet e me deu o seguinte erro na hora de compilar:


[Error] UDmDados1.pas(48): Undeclared identifier: ´select´
[Error] UDmDados1.pas(48): Undeclared identifier: ´gen_grupos_id´
[Error] UDmDados1.pas(48): Missing operator or semicolon
[Error] UDmDados1.pas(48): Missing operator or semicolon
[Fatal Error] ProjTeste.dpr(7): Could not compile used unit ´UDmDados1.pas´




Allan Elias Ramos :cry:


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Dei um tempo na programação do meu software, mas agora estou voltando.. ainda nao consegui arrumar o erro q ta dando no post acima, alguém sabe o q pode ser? grato..



Allan Elias Ramos


GOSTEI 0
Beppe

Beppe

12/12/2003

Ae, conterrâneo, o Delphi não permite SQL embarcado nos fontes. Vc insere ele no IBSQL, como o primeiro post do afarias mostra. :wink:


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Ae, conterrâneo, o Delphi não permite SQL embarcado nos fontes. Vc insere ele no IBSQL, como o primeiro post do afarias mostra. :wink:


Hmmm.. agora ja clareou um pokinho.. ja sei onde não colocar.. hehe.. mas ainda continuo em dúvida de onde colocar, já q nesse mesmo post tem duas resposta diferentes.. uma com uma function q é complexa e outra somente com o select.. qual das duas eu uso no evento BeforePost??

Não sei pq eu emperrei nessa e não consigo sair nem da etapa inicial... :cry:



Allan Elias Ramos :cry:


GOSTEI 0
Vinicius2k

Vinicius2k

12/12/2003

Se eu estivesse na sua posição, utilizaria a função do afarias que é genérica e vai lhe servir por toda a aplicação, não necessitando de implentar toda a rotina várias vezes...

T+


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Ceeerto.. agora estou me encontrando.. hehe.. mas, onde eu coloco ela? como eu declaro? (Nunca me dei bem com Functions).. eu preciso ´ativar´ ela nos forms ou em algum componente q vou precisar dela?? :?:



Allan Elias Ramos :roll:


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Pessoal, por incrível q pareça eu consegui obter o valor do gerador, mas ainda preciso de uma ajuda.. o q esta acontecendo é o seguinte..

Tá, eu insiro os registros e ele nao me aparece os códigos, q foi feito pra ser auto-numeração.. mas o gerador e a trigger funcionam.. quando eu fecho a aplicação e abro ela novamente, ele me lista os registros ja com os devidos códigos... bom, os códigos estao aparecendo como eu keria, mas só se eu reiniciar a aplicaçao.. tem como eu fazer eles aparecer sem precisar reiniciar? tem algum jeito de dar um refresh em algum componente ou algo do tipo?? to usando FB 1.5 e lingando pelo DbExpress... :wink:



Allan Elias Ramos :roll:


GOSTEI 0
Rodolpho123

Rodolpho123

12/12/2003

Vc pode fazer o seguinte:
Quando vc faz o select para obter o valor do generator, vc tem o campo GEN_ID na sua Query. Então, vc pode acrescentar mais um valor no seu generator para vc ver o valor que irá ser cadastrado. Ex:
ShowMessage(IntToStr(IBQuery1GEN_ID.Value + 1));

Isto não irá alterar o valor do seu generator. É só uma forma de vc ver o registro que irá ser cadastrado.


GOSTEI 0
Aersoftware

Aersoftware

12/12/2003

Olá, gostaria a agradecer todos pela ajuda.. finalmente consegui o q eu keria fazer.. mas por incrivel q pareça, nao precisei desses códigos nao.. eu botei, pra toda vez q salvar um registro, alem de salvar e dar o ApplyUpdates, eu coloco o Active do ClientDataSet pra false e depois novamente para True, e dou um refresh na grid.. isso faz com q, ao salvar, ele me exiba o código gerado.. :wink:



Allan Elias Ramos :roll:


GOSTEI 0
POSTAR