Execute Statement no Firebird, uso avançado.

Execute Statement a Fundo …

Mudando um pouco de não só o execute stament, imagine que o usuário possui um Nível que está ligado a verificação de registros de vários setores e que o Nível 1 tem acesso a todos os setores.

Ex:
Setor :
1 – ADM
2 – CONSERVA
3 – PEDÁGIO

Usuários :
Cód. – Nome – Nível
1 – SÁVIO – 2
2 – BRANDINO – 2
3 – DIRETOR – 1

Acessos :
2 CONSERVA – 1 SÁVIO
3 PEDÁGIO – 2 BRANDINO
1 ADM – 3 DIRETOR
2 CONSERVA – 3 DIRETOR
3 PEDÁGIO – 3 DIRETOR

Quando o usuário incluir o usuário com o nível um na tabela de acessos terá que ser criado um acesso para cada setor já que ele é o nível 1 que tem acesso a todos os setores.

CREATE PROCEDURE SP_LOGON_INCLUI (
LOGON VARCHAR(20),
SENHA VARCHAR(10),
NIVEL INTEGER)
AS
DECLARE VARIABLE VCODIGOSETOR INTEGER;
DECLARE VARIABLE VCODIGOLOGON INTEGER;
BEGIN
INSERT INTO LOGON ( LOGON, SENHA, NIVEL)
VALUES ( :LOGON, :SENHA, :NIVEL);

SELECT CODIGOLOGON FROM LOGON WHERE LOGON = :LOGON AND SENHA = :SENHA AND NIVEL = :NIVEL INTO :VCODIGOLOGON;

IF (:NIVEL = 1) THEN
BEGIN
FOR
SELECT CODIGOSETOR FROM SETOR INTO :VCODIGOSETOR
DO
INSERT INTO ACESSOS (CODIGOSETOR, CODIGOLOGON) VALUES (:VCODIGOSETOR, :VCODIGOLOGON);
END

WHEN SQLCODE -803 DO
EXCEPTION CHAVE;
END

CREATE PROCEDURE SP_LOGON_ALTERA (
CODIGOLOGON INTEGER,
LOGON VARCHAR(20),
SENHA VARCHAR(10),
NIVEL INTEGER)
AS
BEGIN
IF (:NIVEL = 1) THEN
BEGIN
EXCEPTION ERRO ‘PARA O NÍVEL ‘ || :NIVEL || ‘ DO USUÁRIO ‘ || :LOGON || ‘ NÃO É POSSÍVEL ALTERAÇÃO’;
EXIT;
END
ELSE
BEGIN
UPDATE LOGON
SET LOGON = :LOGON, SENHA = :SENHA, NIVEL = :NIVEL
WHERE (CODIGOLOGON = :CODIGOLOGON);
END
END

CREATE PROCEDURE SP_LOGON_EXCLUI (
CODIGOLOGON INTEGER)
AS
DECLARE VARIABLE VNOME VARCHAR(100);
BEGIN
SELECT LOGON
FROM LOGON L, ACESSOS A
WHERE L.CODIGOLOGON = A.CODIGOLOGON INTO :VNOME;

DELETE FROM LOGON
WHERE CODIGOLOGON = :CODIGOLOGON;

WHEN SQLCODE -530 DO
EXCEPTION RELACIONAMENTO ‘NÃO É POSSÍVEL EXCLUIR O ACESSO DO USUÁRIO ‘ || VNOME;
END

Execute Statement com Firebird + Delphi.

Outro Execute Statement Brincando ainda mais no Delphi e no Firebird

Vc pode chamar no delphi desta maneira, olha o detalhe coloque entre aspas duplas e o que acontece bumba posso colocas um espaço no apelido de cada campo.

SELECT
OPCODIGOLOGON AS “CODIGO LOGON :”,
OPLOGON AS “LOGON :”,
OPSENHA AS “SENHA :”,
OPNIVEL AS “NIVEL :”,
OPCODIGOSETOR AS “CODIGO SETOR :”,
OPSETOR AS ” SETOR :”,
OPMNEMONICO AS “MNENOMICO :”
FROM SP_ACESSOS_SELECIONA(0,”,”,0,0,”,”,’NAO’,’1′)

CREATE PROCEDURE SP_ACESSOS_SELECIONA (
IPCODIGOLOGON INTEGER,
IPLOGON VARCHAR(20),
IPSENHA VARCHAR(10),
IPNIVEL INTEGER,
IPCODIGOSETOR INTEGER,
IPSETOR VARCHAR(20),
IPMNEMONICO VARCHAR(8),
IPPREENCHACAMPOS VARCHAR(3),
IPORDENAR VARCHAR(1000))
RETURNS (
OPCODIGOLOGON INTEGER,
OPLOGON VARCHAR(20),
OPSENHA VARCHAR(10),
OPNIVEL INTEGER,
OPCODIGOSETOR INTEGER,
OPSETOR VARCHAR(20),
OPMNEMONICO VARCHAR(8))
AS
DECLARE VARIABLE VSQL VARCHAR(1000);
BEGIN
VSQL = ‘SELECT A.CODIGOLOGON, L.LOGON, L.SENHA, L.NIVEL, A.CODIGOSETOR, S.SETOR, S.MNEMONICO’;
VSQL = VSQL || ‘ FROM LOGON L, SETOR S, ACESSOS A’;

IF (:IPCODIGOLOGON = 0) THEN
IPCODIGOLOGON = NULL;
IF (:IPLOGON = ”) THEN
IPLOGON = NULL;
IF (:IPSENHA = ”) THEN
IPSENHA = NULL;
IF (:IPNIVEL = 0) THEN
IPNIVEL = NULL;
IF (:IPCODIGOSETOR = 0) THEN
IPCODIGOSETOR = NULL;
IF (:IPSETOR = ”) THEN
IPSETOR = NULL;
IF (:IPMNEMONICO = ”) THEN
IPMNEMONICO = NULL;
IF ((:IPORDENAR = ”) OR (:IPORDENAR IS NULL)) THEN
IPORDENAR = ‘1’;
IF (:IPPREENCHACAMPOS = ”) THEN
IPPREENCHACAMPOS = ‘SIM’;

IF ( :IPPREENCHACAMPOS = ‘SIM’) THEN
BEGIN
–Se eu quiser coloca algum campo como obrigatório
IF ( (:IPLOGON IS NULL) ) THEN
BEGIN
EXCEPTION ERRO ‘PREENCHA OS CAMPOS OBRIGATÓRIOS’;
EXIT;
END
END

VSQL = VSQL || ‘ WHERE A.CODIGOLOGON = L.CODIGOLOGON AND A.CODIGOSETOR = S.CODIGOSETOR ‘;

–Neste Caso o And é obrigatório
IF (:IPCODIGOLOGON IS NOT NULL) THEN
VSQL = VSQL || ‘ AND A.CODIGOLOGON = ‘ || :IPCODIGOLOGON;

IF (:IPLOGON IS NOT NULL) THEN
VSQL = VSQL || ‘ AND L.LOGON LIKE ‘ || ”” || ‘%’ || :IPLOGON || ‘%’ || ””;

IF (:IPSENHA IS NOT NULL) THEN
VSQL = VSQL || ‘ AND L.SENHA LIKE ‘ || ”” || ‘%’ || :IPSENHA || ‘%’ || ””;

IF (:IPNIVEL IS NOT NULL) THEN
VSQL = VSQL || ‘ AND L.NIVEL = ‘ || :IPNIVEL;

IF (:IPCODIGOSETOR IS NOT NULL) THEN
VSQL = VSQL || ‘ AND A.CODIGOSETOR = ‘ || :IPCODIGOSETOR;

IF (:IPSETOR IS NOT NULL) THEN
VSQL = VSQL || ‘ AND S.SETOR LIKE ‘ || ”” || ‘%’ || :IPSETOR || ‘%’ || ””;

IF (:IPMNEMONICO IS NOT NULL) THEN
VSQL = VSQL || ‘ AND S.MNEMONICO LIKE ‘ || ”” || ‘%’ || :IPMNEMONICO || ‘%’ || ””;

VSQL = VSQL || ‘ ORDER BY ‘ || :IPORDENAR;

FOR
EXECUTE STATEMENT VSQL INTO :OPCODIGOLOGON, :OPLOGON, :OPSENHA, :OPNIVEL, :OPCODIGOSETOR, :OPSETOR, :OPMNEMONICO
DO

SUSPEND;

End

Utilizando o Execute Statement em uma procedure selecionável no Firebird.

1. Esta seria uma procedure que busca em uma tabela recebendo os parâmetros até de ordenação pelo delphi vc pode chamar ela

SELECT
OPCODIGOLOGON AS CODIGO,
OPLOGON AS LOGON,
OPSENHA AS SENHA,
OPNIVEL AS NIVEL
FROM SP_LOGON_SELECIONA(0,”,”,1,’SIM’,’2,1 DESC’)

O Interessante é que vc executa a Store com o parâmetro que vc quiser aí vc pode simplesmente consultar por todos campos ou só por um, ordenando por um vários de ordem crescente ou decrescente, ficando de acordo com o gosto do cliente.

CREATE PROCEDURE SP_LOGON_SELECIONA (
IPCODIGOLOGON INTEGER,
IPLOGON VARCHAR(20),
IPSENHA VARCHAR(10),
IPNIVEL INTEGER,
IPPREENCHACAMPOS VARCHAR(3),
IPORDENAR VARCHAR(1000))
RETURNS (
OPCODIGOLOGON INTEGER,
OPLOGON VARCHAR(20),
OPSENHA VARCHAR(10),
OPNIVEL INTEGER)
AS
DECLARE VARIABLE VAND VARCHAR(1);
DECLARE VARIABLE VSQL VARCHAR(1000);
BEGIN
— Aqui é o caso do And se já tem algum campo ele coloca o AND se não ele não coloca
VAND = ‘N’;

— Começo do SQL aqui em cima vai o Select e o FROM
VSQL = ‘SELECT CODIGOLOGON, LOGON, SENHA, NIVEL’;
VSQL = VSQL || ‘ FROM LOGON’;

–Do Jeito que vem do Delphi transformo para NULL
IF (:IPLOGON = ”) THEN
IPLOGON = NULL;
IF (:IPSENHA = ”) THEN
IPSENHA = NULL;
IF (:IPNIVEL = 0) THEN
IPNIVEL = NULL;
IF (:IPCODIGOLOGON = 0) THEN
IPCODIGOLOGON = NULL;
IF ((:IPORDENAR = ”) OR (:IPORDENAR IS NULL)) THEN
IPORDENAR = ‘1’;
IF (:IPPREENCHACAMPOS = ”) THEN
IPPREENCHACAMPOS = ‘SIM’;

–Se precisar ser tudo obrigatório ou se fazer parte dele dá o erro aqui
IF ( :IPPREENCHACAMPOS = ‘SIM’) THEN
BEGIN
IF ( (:IPLOGON IS NULL) AND (:IPSENHA IS NULL) AND (:IPNIVEL IS NULL)) THEN
BEGIN
EXCEPTION ERRO ‘PREENCHA OS CAMPOS OBRIGATÓRIOS’;
EXIT;
END
ELSE
BEGIN
–Aqui coloca o WHERE
VSQL = VSQL || ‘ WHERE ‘;

–Começa a conferencia de campos
IF (:IPLOGON IS NOT NULL) THEN
BEGIN
–Estou usando o Like as 4 aspas é para colocar uma aspas no parametro ex: Logon like ‘%PARAMETRO%’
VSQL = VSQL || ‘ LOGON LIKE ‘ || ”” || ‘%’ || :IPLOGON || ‘%’ || ””;
VAND = ‘S’;
END
–Aqui começa a verificação do And

IF (:IPSENHA IS NOT NULL) THEN
BEGIN
IF (:VAND = ‘S’) THEN
VSQL = VSQL || ‘ AND’;

VSQL = VSQL || ‘ SENHA LIKE ‘ || ”” || ‘%’ || :IPSENHA || ‘%’ || ””;

VAND = ‘S’;
END

IF (:IPNIVEL IS NOT NULL) THEN
BEGIN
IF (:VAND = ‘S’) THEN
VSQL = VSQL || ‘ AND’;

VSQL = VSQL || ‘ NIVEL = ‘ || :IPNIVEL;

VAND = ‘S’;
END

–Verifico a Ordenação que foi passada via Parametro tambem
VSQL = VSQL || ‘ ORDER BY ‘ || :IPORDENAR;

–Uso o For Execute Stamente pois pode ser que seja mais de uma linha que será retornado
FOR
EXECUTE STATEMENT VSQL INTO :OPCODIGOLOGON, :OPLOGON, :OPSENHA, :OPNIVEL
DO

— Usa o SUSPEND todas as vezes que retornar valor
SUSPEND;
END
END
End