Campos numeric´s do Firebird …

Pessoal depois de muito tempo trabalhando com o FB, sinceramente não sabia que quando vc quer criar um campo que atenda um número como 999.99 o correto é criarmos um numeric de 5,2 ? opa como assim !!!!!!! quer testar !!!!

SELECT
CAST(’327.68′ AS NUMERIC(3,2))
FROM RDB$RELATIONS

e o que ocorre até Numeric(4) o FB armazena como Smallint, 16 bits. Os valores suportados vão de -32768 até 32767.

Numeric(4,2) é um smallint dividido por 100. Ou seja, o limite máximo é 327,67.  7 jan Angelo

Use sempre a convenção NUMERIC(X, Y), onde X é a quantidade total de digitos incluindo os decimais, e Y a parte decimal.

neste caso Numeric(5,2).

Loop em tabelas utilizando o Firebird.

Fazendo um Loop nas Tabelas usando o Execute Statment …

Imagine o Cenário vc não sabe em qual tabela esta a menor data de um certo campo, e precisamos fazer um Loop nas tabelas para descobrirmos qual a data é menor.

Tabelas
Campo

Documento1
DataInicial
Documento2
DataInicial
Documento3
DataInicial
Documento4
DataInicial

CREATE PROCEDURE SP_DOCUMENTO_MENORDATA
RETURNS (
OPDATAFINAL DATE)
AS
DECLARE VARIABLE VNOMETABELA VARCHAR(100);
DECLARE VARIABLE VDATAINICIAL DATE;
DECLARE VARIABLE VSQL VARCHAR(1000);
begin
OPDATAFINAL = CURRENT_DATE;
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 AND T.RDB$RELATION_NAME LIKE ‘DOCUMENTO%’
ORDER BY 1
INTO :VNOMETABELA
DO
BEGIN
VSQL = ”;
VSQL = ‘SELECT MIN(DATAINICIAL) FROM ‘ || :VNOMETABELA;
EXECUTE STATEMENT VSQL INTO :VDATAINICIAL;
IF (:VDATAINICIAL < :OPDATAFINAL) THEN
BEGIN
OPDATAFINAL = :VDATAINICIAL;
END
END
end

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