Traduçao de sql para firebird
--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 ?
(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
Curtidas 0
Respostas
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
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
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
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
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
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
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
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
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
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
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
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
05/03/2010
Olá Carlos,
Fico no aguardo da video então meu amigo.
Um abraço
Wesley Y
Fico no aguardo da video então meu amigo.
Um abraço
Wesley Y
GOSTEI 0
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#]
[#VIDEO-184#]
GOSTEI 0
Wesley Yamazack
05/03/2010
Blz amigo vou analisar
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
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
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
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
05/03/2010
Olá Carlos, sem problemas meu amigo.
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
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
05/03/2010
Ok amigo,
FIco no aguardo
Um abraço
Wesley Y
FIco no aguardo
Um abraço
Wesley Y
GOSTEI 0
Wesley Yamazack
05/03/2010
Olá amigo, e ai podemos fechar este chamado ?
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
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
05/03/2010
Ok amigo, fico no aguardo.
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
Wesley Yamazack
05/03/2010
Olá amigo, e ai consegui algum progresso no chamado ?
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
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
Um abraço
Wesley Y
GOSTEI 0