Como fazer um while e insert apos o select no IbExpert

Delphi

06/07/2010

Olá pessoal,

estou querendo fazer assim no IbExpert....


Select * From Adm_Cad_Endereco E, Adm_Cad_Bairro B
where E.CodBairro = B.Codigo and (B.Codigo >= :Cod1) and (B.Codigo <= :Cod2)
order by B.Codigo



e ai apos o select rodar um while desse select e ai vai comparando....e dentro do while vou colocar um insert...
pois hoje eu faço isso tudo no delphi.....mas está demorando um pouco...qero mais agilidade....
Robson Morais

Robson Morais

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

07/07/2010

você pode fazer numa única instrução:

Insert Into Adm_Cad_Cep (Cep, Logradouro, Numero, Bairro, CodCidade, Complemento)
Select E.Cep, E.Logradouro, E.Numero, E.Bairro, B.CodCidade, E.Complemento)
From Adm_Cad_Endereco E, Adm_Cad_Bairro B
where E.CodBairro = B.Codigo and (B.Codigo >= :Cod1) and (B.Codigo <= :Cod2)

outra forma é como o colega Daniel Tavares sugeriu, usando uma stored procedure:

create procedure CADENDERECO (
    cod1 integer,
    cod2 integer)
as
declare variable cep varchar(8);
declare variable logradouro varchar(80);
declare variable numero varchar(5);
declare variable bairro varchar(50);
declare variable codcidade integer;
declare variable complemento varchar(30);
begin
  for
    select E.Cep, E.Logradouro, E.Numero, B.Bairro, B.CodCidade, E.Complemento
    from Adm_Cad_Endereco E, Adm_Cad_Bairro B
    where E.CodBairro = B.Codigo and (B.Codigo >= :cod1) and (B.Codigo <= :cod2)
    order by B.Codigo
  into
    :cep, :logradouro, :Numero, :Bairro, :CodCidade, :Complemento
  do
    insert into Adm_Cad_Cep (Cep, Logradouro, Numero, Bairro, CodCidade, Complemento)
    values (:cep, :logradouro, :Numero, :Bairro, :CodCidade, :Complemento);
end

e, para executá-la:

EXECUTE PROCEDURE CADENDERECO(1, 1000)

note que em nenhum dos exemplos acima é passado um valor para o campo Codigo. para fazer desta forma esse campo deve estar como NOT NULL e ter um generator e uma trigger ligados à ele.

eis a instrução para criação do generator:

CREATE GENERATOR GEN_ADM_CAD_CEP_ID;

e da trigger:

CREATE OR ALTER TRIGGER ADM_CAD_CEP_BI FOR ADM_CAD_CEP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.codigo is null) then
    new.codigo = gen_id(gen_adm_cad_cep_id,1);
end

note também que você não está fazendo qualquer verificação de existência do registro na tabela destino. isso não é perigoso? a cada vez que a stored procedure for executada, os registros serão multiplicados.




GOSTEI 1

Mais Respostas

Daniel Oliveira

Daniel Oliveira

06/07/2010

vamo ver se eu entendo seu problema...

CRIE UMA STORED PROCEDURE

...
For Select * From Adm_Cad_Endereco E, Adm_Cad_Bairro B
    Where E.CodBairro = B.Codigo and (B.Codigo >= :Cod1) and (B.Codigo <= :Cod2)
    Order by B.Codigo
Into
  :nome
  :endereco
  :cidade
  etc
do
begin
/*faça o q for necessario aki, esse espaço sera executado em cada repeticao do for*/
end

...

espero ter ajudado
GOSTEI 0
Robson Morais

Robson Morais

06/07/2010

ixi cara....agora que fiquei maluco aqui....

você tem algum exemplo ai para me ajudar.......
vou explicar atraves do delphi como eu faço;..;;


faço um select.....


  with QryEnd do
    begin
      close;
      sql.Clear;
      sql.Add('Select * From Adm_Cad_Endereco E, Adm_Cad_Bairro B where E.CodBairro = B.Codigo and (B.Codigo >= :Cod1) and (B.Codigo <= :Cod2) order by B.Codigo');
      ParamByName('Cod1').AsString := Edit5.Text;
      ParamByName('Cod2').AsString := Edit6.Text;
      open;
    end;




e o que está dentro da IbQuery (QryEnd) quue obtem atraves do select eu faço esse procedimento para gravar.....



   while not QryEnd.Eof do
     begin

       Codigo := Codigo + 1;
       a := a + 1;
       with QryCep do
         begin
           close;
           sql.Clear;
           sql.Add('Insert Into Adm_Cad_Cep (Codigo, Cep, Logradouro, Numero, Bairro, CodCidade, Complemento) Values ('+
                   #39 + IntToStr(Codigo) + #39 +
                   ',' + #39 + QryEnd.FieldByName('Cep').AsString + #39 +
                   ',' + #39 + QryEnd.FieldByName('Logradouro').AsString + #39 +
                   ',' + #39 + QryEnd.FieldByName('Numero').AsString + #39 +
                   ',' + #39 + QryEnd.FieldByName('Bairro').AsString + #39 +
                   ',' + #39 + QryEnd.FieldByName('CodCidade').AsString + #39 +
                   ',' + #39 + QryEnd.FieldByName('Complemento').AsString + #39 + ')' );
           ExecSQL;
         end;

       QryEnd.Next;
     end;




ai eu vou gravando os dados que tive em outra tabela...

o problema meu é que está demorando demais para gravar isso atraves do delphi.....ai queria saber se eu fazendo um script no IbExpert nao vai ser melhor ??


e tbem não consegui fazer como procedure...alguém poderia me ajudar :::???
GOSTEI 0
Pedro Saraiva.

Pedro Saraiva.

06/07/2010

Programa com códigos fontes Ola pessoal, você programador que quer um aplicativo exemplo para fins comerciais, tenho uma dica, compre o WinPhar que vem com todos os códigos fontes e faça um programa baseado nele, sim ele também vêm com todos os componentes para instalar, voce além de ganhar um programa complidao, ganha tb os seus códigos fontes e seus componentes. O programa foi desenvolvido em Delphi 7 com banco de dados paradox, e custa apenas 20,00 reais
deem uma olhadinha ai no produto
http://produto.mercadolivre.com.br/MLB-149256966-winphar-2008-sistema-para-farmacias-e-drogarias-_JM
e ente em contato pelo e-mail pedroluissaraiva@yahoo.com.br.!  
GOSTEI 0
POSTAR