Traduçao de sql para firebird

05/03/2010

--assim e no sql server create table tb_Teste
(id integer primary key identity (1,1),
 name varchar (100))
 go 
  procedure de insert do sqlserver  nessa proc eu vou passar apenas o campo name e ela vai me retornar o id  create procedure pri_tb_Teste
 (@name varchar (100) ,
  @id int output )
  as
  begin
    insert into tb_Teste (name) values (@name)
  end     como eu faço a procedure de insert me dar um retorno no momento do insert ?   outra pergunta la do componente stored_proc eu vou poder usar esse retorno como faço no sql server ?  
Carlos Faria

Carlos Faria

Curtidas 0

Respostas

Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá meu amigo,
  Boa noite, poderia ser mais claro no que você esta precisando ? É no SQL Server mesmo que você qyuer fazer a procedure ? Você não esta usando ClientDataSet? Pq usar Store Proc ? achei que você tivesse largado isso de mão, e estivesse trabalhando somente com CDS

Um abraço

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

E que no meu caso aqui , tem um tela onde vou fazer lancamentos em 4 tabelas diferentes ,tudo dentro de um bloco de begin transacion   no casou vou precisar do retorno da funcao que no caso é o id , eu andei tentando com o clientdatatase mas simplesmesmnento ao dar um insert no cds se o id é 1 ela ja vai para 2 ; se o id é 2 ele ja vai para 3 , isso ai fura a regra de negocio aqui ,   com o clientdataset eu ja abra ou form com o id do cliente na tela , mas se o usuario cancelar mesmo nao dando um applyupdates aquela sequencia e aumentada no banco   no caso da proc , pelo menos aqui no sql funcionda da seguinte maneira   tb2 id_cliente essa aqui e auto incremento as em vermlho nao sao , precisa do id do insert aqui para inserir nas outras tabelas tb_id_cliente tb_id_cliente tb_4 id_cliente         no componente proc se o usuario cancelar a operarco e fetio um rolback e o numero la no banco do auto incremento nao é disparado , vi tambem um problema com o cds se uma grande quantidade de maquinas acessaren a mesma tabela , pode dar erro com esses id ,   de qualquer é maneira eu preciso saber como fazer a proc , quanto a alicacao aqui se voce tiver uma sujestao melhor eu volto para o cds     O que vc falar eu vou tentar seguir      
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo,
   O que você vai fazer com estas 4 tabelas ? É um mestre detalhe ? Você precisa do ID para poder gravar como chave estrangeira nas outras 3 tabelas ? Se for isso, o que você precisa é fazer um mestre detalhe com o ClientDataSet.

Um abraço

Welsey Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

Sim , eu ja fiz dessa forma mas de qualquer maneira ate por questao de saber mesmo eu ainda preciso saber como pegar o retono no firebird como citei no ememplo abaixo   no sql    
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo, isso é um generetor certo ?

Eu faço assim, no meu datamodule, eu declaro esta function publica, e na hora que clico no botão novo para incluir um registro eu faço o segundo codigo

Codigo 1

function TDM.Generator_ID(xNome: String): String;
Var
  xQry : TSQLQuery;
begin
  Try
    xQry := TSQLQuery.Create(Self);
    With xQry do
    begin
      SQLConnection := BDPRONTO;
      SQL.Clear;
      SQL.Add('SELECT GEN_ID(' +  xNome + ',1) FROM rdb$database ');
      Open;
      Result := Fields[0].AsString;
    end;
  Finally
    FreeAndNil(xQry);
  End;
end;

Codigo 2

  DSPadrao.DataSet.FieldByName('ID_BAIRRO').AsString:= DM.Generator_ID('GEN_BAIRRO');

Com este select, você gera pelo firebird, e ele lhe devolve o id gerado. Seria isso meu velho amigo ?

Um abraço

Wesley Y

GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

Funciona tambem mas eu gostaria de saber como eu pego o retorno da procedure no momento do insert   pois eu pegando ele assim dessa maneira ao adiconar um componente stored proc no formulario eu ja dou o insert e ja tenho nesse momento o id      
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo,

   Como você vai usar o generetor ? Vai ser invocado pelo delphi ? Se for no momento que você for gravar, mande gerar o ID, e cosneguira pegar, ao inves de deixar no clique do botão novo, e sim no botao gravar, acha que assim resolve seu problema ?

Um abraço

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

Eu entendo seu raciocionio e ate agradeco mas a questao e que eu preciso aprender a fazer isso como no sql , vou gravar uma video e postar aqui para voce ver como é realmente , pelo metodo que voce falou resolve tambem e bem , mas eu preciso saber se um dia for usar
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá Carlos,

Fico no aguardo da video então meu amigo.

Um abraço

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

Ai esta amigo ,eu preciso fazer exatamento isso no firebir ,Ter um retorno da procedure de insert.Como eu e voce sabemos toda stored procedure tem que ter um retorno mesmo que ela seja de insert. O seu exemplo e muito bom , eu ja usei ele em algumas situações ,mas na que estou trabalhano no momento tem que ser essa. Um problema que vi em pegar o Id da maneira que voce me explicou e que exemplo estou com id 10 no banco o usuario abre o form simplesmente da um append o gen_id e disparado mesmo que voce nao de o post em seguida e nao fique registro gravado no banco da proxima vez que voce abrir o mesmo form o id ja será 12 .Pelo menos comigo foi assim Se tiver uma maneira de fazer do seu exemplo mas na condicao que o gerador somente seja dispara depois de dar um applyupdates e voce quizer postar o exemplo ai agradeco. Esse da proc eu vou precisar aprender mesmo , eu como voce ja viu trabalhava muito com stored procs estou migrando para o clientdataset aos poucos hoje diria que ja estou utilizando 80% das minha aplicacoes com clientdataset mas tem horas que a melhor solução e a proc mesmo. Bom se existe o recurso e para ser usado quando precisar ! E bom saber como se faz para quando precisar .....

[#VIDEO-184#]
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Blz amigo vou analisar

Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo,

  Fiz os testes aqui e funcionou, veja a procedure como é


 CREATE PROCEDURE GRAVARCLIENTE (NOME VARCHAR(50))
 RETURNS (Result INTEGER)
AS
  DECLARE VARIABLE XID INTEGER;
BEGIN
  SELECT GEN_ID(GEN_CLIENTE,1) FROM rdb$database  INTO :XID;
  INSERT INTO cliente (IDCLIENTE, NOME)
  VALUES(:XID, :NOME);
 Result = XID;
END


Fiz a mesma implementação que você e funcionou


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SQLStoredProc1.Params[0].Value := Edit1.Text;
SQLStoredProc1.ExecProc;
ShowMessage( SQLStoredProc1.Params[1].Value );

end;


Um abraço

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

Ola wesley ,me da so mais um dia cara para fechar esse chamado nao tive tempo de verificar a sua resposta amanha eu vou testasr e agente mata aqui ok
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá Carlos, sem problemas meu amigo.

Um abraço

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

Wesley guenta mais ate amanha , amanha agente fecha , eu executei a proc funcionou porem la no select do gen_id(gerado,1) ela gera de dois em dois ,eu altereir para 0 ai sim trouxe de 1 em um la na aplicacao delphi tive que informar que o retorno da proc e ele + 1 para dar certo   Isso nao ta me cherando muito bem nao amanha eu vou analizar isso aqui com mais calma e te falo!  
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Ok amigo,

  FIco no aguardo

Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo, e ai podemos fechar este chamado ?

Um abraço

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

05/03/2010

So Mais um dia agente fecha eu andei enrolado reescrevendo meus codigos devido aquele pau que o delphi deu que te mostrei no outro chamado
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Ok amigo, fico no aguardo.


Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo, e ai consegui algum progresso no chamado ?

Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

05/03/2010

Olá amigo, e ai algum progresso neste chamado ? Vou fechar o mesmo se ainda existir alguma dúvida, reabrimo o mesmo.

Um abraço

Wesley Y
GOSTEI 0
POSTAR