Procedure que Apaga Registros e Zera os Generators no Firebird.

SET SQL DIALECT 3;
SET NAMES ISO8859_1;

SET TERM ^ ;
CREATE PROCEDURE SP_LIMPAR_TABELAS
AS
BEGIN
EXIT;
END^
SET TERM ; ^

SET TERM ^ ;
ALTER PROCEDURE SP_LIMPAR_TABELAS
AS
DECLARE VARIABLE NOME_OBJETO VARCHAR(80);
DECLARE VARIABLE VSQL VARCHAR(256);
begin
FOR
SELECT DISTINCT t.RDB$RELATION_NAME TABELA
FROM RDB$USER_PRIVILEGES t
WHERE t.RDB$RELATION_NAME NOT LIKE ‘RDB$%’ AND
t.RDB$OBJECT_TYPE=0
ORDER BY 1
INTO :nome_objeto
DO
BEGIN
VSQL = ‘DELETE FROM ‘ :nome_objeto;
EXECUTE STATEMENT VSQL;
END

FOR SELECT g.RDB$GENERATOR_NAME
FROM RDB$GENERATORS g
WHERE (g.RDB$GENERATOR_NAME NOT LIKE ‘RDB$%’) AND
(g.RDB$GENERATOR_NAME NOT LIKE ‘SQL$%’)
INTO :nome_objeto
DO
BEGIN
VSQL = ‘SET GENERATOR ‘ :nome_objeto ‘ TO 0’;
EXECUTE STATEMENT VSQL;
END

end

Uma resposta para “Procedure que Apaga Registros e Zera os Generators no Firebird.

  1. ai blz, estou com um erro muito estranho, tenho uma atualizador, que possui a base de dados contendo as atualizações, nele tenho algumas alterações de procedures, campos,tabelas, que irão atualizar o banco de dados do cliente.
    Quando executo o atualizador ele percorre a base de atualizações, e executa os scripts na base de dados do cliente, este problema só está ocorrendo quando crio ou atualizo uma procedure.
    Quando executo a alteração de procedure uma exceção é lançada, na exceção eu pego o comando SQL e insiro no ibexpert e ele passa sem problemas.

    Abaixo em negrito segue a exceção, claro que eu retiro os caracteres que fazem parte da exceção e executo apenas o SQL, fazendo isso no ibexpert funciona, já no atualizador não. Repetindo que somente ocorre isso na atualização das stored procedures, as outras atualizações correm normalmente.

    A exceção ocorre no primeiro select, “CAUSA : Token unknown – line 40, column 8
    ?”, mas colocando no ibexpert, nenhum erro aparece.

    Alguém possui alguma explicação plausível para isso????

    —————————
    Warning
    —————————
    Não foi possível a inclusão/alteração do comando:
    1019:ALTER PROCEDURE COTFICHA_FORNECEDOR (
    IN_COTACAO CHAR(10),
    IN_COD_EMPRESA CHAR(6))
    AS
    declare variable var_contafichaserv smallint;
    declare variable var_codfornecedor char(5);
    declare variable var_contafichaprod smallint;
    declare variable var_coditem varchar(20);
    declare variable var_sequencia smallint;
    declare variable var_quantidade double precision;
    declare variable var_servico varchar(40);
    declare variable var_total smallint;
    declare variable var_contap smallint;
    declare variable var_contas smallint;
    declare variable var_seqfornecedor smallint;
    declare variable var_contador integer;
    declare variable var_numfornecedor smallint;
    declare variable var_nfichaspreenchidas smallint;
    declare variable var_achoufichaforn smallint;
    begin
    /*—————————————————————————-
    – Essa SP verifica se o fornecedor já tem a respectiva ficha de Cotação –
    – gerada. Se ainda não existir, o sistema preenche automaticamente –

    Versão: 1.0.3

    —————————————————————————-*/

    var_contafichaprod = 0;
    var_contafichaserv = 0;
    var_contap = 0;
    var_contas = 0;
    var_contador = 0;
    var_numfornecedor = 0;

    /* Verifica o número de fornecedores e registra as fichas de cabeçalho */

    select count(z.cd_empresa)
    from cotacao_fornece z
    where (z.codigo = :in_cotacao) and (z.cd_empresa = :in_cod_empresa)
    into :var_numfornecedor;

    select count(x.cd_empresa)
    from cotacao_fornecedor_header x
    where (x.codigo = :in_cotacao) and (x.cd_empresa = :in_cod_empresa)
    into :var_nfichaspreenchidas;

    if (var_numfornecedor > var_nfichaspreenchidas) then
    begin
    for select m.cd_fornece, m.seq_fornece
    from cotacao_fornece m
    where (m.codigo = :in_cotacao) and (m.cd_empresa = :in_cod_empresa)
    into :var_codfornecedor, :var_seqfornecedor
    do begin
    select count(n.codigo)
    from cotacao_fornecedor_header n
    where (n.cd_fornece = :var_codfornecedor) and
    (n.seq_fornece = :var_seqfornecedor) and
    (n.cd_empresa = :in_cod_empresa) and (n.codigo = :in_cotacao)
    into :var_achoufichaforn;

    if (var_achoufichaforn = 0) then
    begin
    insert into cotacao_fornecedor_header (codigo, cd_empresa, cd_fornece,
    seq_fornece, valortotal, vlrredespacho, valoreajuste, valordesconto)
    values
    (:in_cotacao, :in_cod_empresa, :var_codfornecedor,
    :var_seqfornecedor, 0, 0, 0, 0);
    end

    end
    end

    — Conta o número de produtos
    select count(a.codigo)
    from cotacao_itens a
    where (a.codigo = :in_cotacao) and (a.cd_empresa = :in_cod_empresa)
    into :var_contap;

    — Conta o número de Serviços
    select count(b.codigo)
    from cotacao_servicos b
    where (b.codigo = :in_cotacao) and (b.cd_empresa = :in_cod_empresa)
    into :var_contas;

    — Corrigido em 14-12-07 – Deixa-se de contar os itens dos fornecedores
    — e passa a contar os itens gerais em servicos e produtos
    –var_total = var_contafichaprod + var_contafichaserv;

    var_total = var_contap + var_contas;

    –Verifica se foram inseridos itens na cotação

    if (var_total > 0) then
    begin
    — Procura todos os fornecedores listados na cotação
    for select cf.cd_fornece, cf.seq_fornece
    from cotacao_fornece cf
    where (cf.codigo = :in_cotacao) and (cf.cd_empresa = :in_cod_empresa)
    into :var_codfornecedor, :var_seqfornecedor
    do
    begin

    –Conta o número de itens registrados para o forncedor
    select count(cfi.codigo)
    from cotacao_fornece_itens cfi
    where (cfi.codigo = :in_cotacao) and
    (cfi.cd_empresa = :in_cod_empresa) and
    (cfi.cd_fornece = :var_codfornecedor) and
    (cfi.seq_fornece = :var_seqfornecedor)
    into :var_contafichaprod;

    — se a quantidade de itens for menor, ele irá inserir os itens faltantes
    — para aquele fornecedore
    if (var_contafichaprod < var_contap) then
    begin
    — localiza todos os itens da cotação e insere todos os faltantes
    for select a.cd_item, a.seq_item, a.quantidade
    from cotacao_itens a
    where (a.codigo = :in_cotacao) and (a.cd_empresa = :in_cod_empresa)
    into :var_coditem, :var_sequencia, :var_quantidade
    do
    begin
    select count(b.cd_item)
    from cotacao_fornece_itens b
    where (b.codigo = :in_cotacao) and
    (b.cd_empresa = :in_cod_empresa) and
    (b.cd_fornece = :var_codfornecedor) and
    (b.seq_fornece = :var_seqfornecedor) and
    (b.cd_item = :var_coditem) and
    (b.seq_item = :var_sequencia)
    into :var_contador;

    if (var_contador = 0) then
    begin
    insert into cotacao_fornece_itens (cd_empresa, codigo, cd_fornece,
    seq_fornece, cd_item, valor_unit, ipi, valor_ipi, valor_total,
    seq_item, quantidade, valorfinal, valor_kgm)
    Values
    (:in_cod_empresa, :in_cotacao, :var_codfornecedor,
    :var_seqfornecedor, :var_coditem, 0, 0, 0, 0,
    :var_sequencia, :var_quantidade, 0, 0);
    end
    end
    end
    — Fim do processo de inserção de itens/materiais————————-
    — Verifica o número de servicos na cotação——————————-
    select count(cfs.codigo)
    from cotacao_fornece_serv cfs
    where (cfs.codigo = :in_cotacao) and
    (cfs.cd_empresa = :in_cod_empresa) and
    (cfs.cd_fornece = :var_codfornecedor) and
    (cfs.seq_fornece = :var_seqfornecedor)
    into :var_contafichaserv;

    if (var_contafichaserv < var_contas) then
    begin
    for select cs.seq_item, cs.servico, cs.quantidade
    from cotacao_servicos cs
    where (cs.codigo = :in_cotacao) and (cs.cd_empresa = :in_cod_empresa)
    into :var_sequencia, :var_servico, :var_quantidade
    do
    begin
    select count(k.codigo)
    from cotacao_fornece_serv k
    where (k.codigo = :in_cotacao) and
    (k.cd_empresa = :in_cod_empresa) and
    (k.cd_fornece = :var_codfornecedor) and
    (k.seq_fornece = :var_seqfornecedor) and
    (k.descricao = :var_servico) and
    (k.seq_item = :var_sequencia)
    into :var_contador;

    if (var_contador = 0) then
    begin
    insert into cotacao_fornece_serv (cd_empresa, codigo, cd_fornece,
    seq_fornece, valor, seq_item, descricao, quantidade)
    Values
    (:in_cod_empresa, :in_cotacao, :var_codfornecedor,
    :var_seqfornecedor, 0, :var_sequencia, :var_servico,
    :var_quantidade);
    end
    end
    end
    — ———————————————————————–
    end
    end
    end

    CAUSA : Token unknown – line 40, column 8
    ?

    Confirmar a Atualização do Parâmetro?
    —————————
    Yes No
    —————————

Deixe um comentário