Publicado por: Gustavo Henrique | Abril 17, 2008

Utilizando UDF no Firebird.

Primeiro declare a UDF como por exemplo :

DECLARE EXTERNAL FUNCTION LTRIM
    CSTRING(80) CHARACTER SET NONE
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT ‘IB_UDF_ltrim’ MODULE_NAME ‘ib_udf’;

DECLARE EXTERNAL FUNCTION STRLEN
    CSTRING(32767) CHARACTER SET NONE
RETURNS INTEGER BY VALUE
ENTRY_POINT ‘IB_UDF_strlen’ MODULE_NAME ‘ib_udf’;

DECLARE EXTERNAL FUNCTION RTRIM
    CSTRING(80) CHARACTER SET NONE
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT ‘IB_UDF_rtrim’ MODULE_NAME ‘ib_udf’;

DECLARE EXTERNAL FUNCTION LTRIM
    CSTRING(80) CHARACTER SET NONE
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT ‘IB_UDF_ltrim’ MODULE_NAME ‘ib_udf’;

depois é só usá-la

CREATE PROCEDURE SP_TEMPOLIGPART_SELECIONA
AS
DECLARE VARIABLE STRINGSQL VARCHAR(1000);
DECLARE VARIABLE STRINGSQL2 VARCHAR(1000);
DECLARE VARIABLE LODATA DATE;
DECLARE VARIABLE LOHORA TIME;
DECLARE VARIABLE LONUMERO VARCHAR(100);
DECLARE VARIABLE CODIGORAMAL INTEGER;
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE HORA TIME;
DECLARE VARIABLE DURACAO TIME;
DECLARE VARIABLE NUMERO CHAR(10);
begin
    STRINGSQL = ”;
    FOR
      SELECT DATA, HORA, NUMERO
      FROM LIGACAO
      WHERE DATA >= ‘06/14/05′ AND TIPO = ‘PARTICULAR’ AND PABX IS NULL INTO :LODATA, :LOHORA, :LONUMERO
    DO
    BEGIN
      STRINGSQL = ‘ SELECT FIRST 1 CODIGORAMAL, DATA, HORA, DURACAO, NUMERO ‘;
      STRINGSQL = STRINGSQL || ‘ FROM LIGACOES’;
      STRINGSQL = STRINGSQL || ‘ WHERE TIPO = ‘ || ”” || ‘SAÍDA’ || ””;
      STRINGSQL = STRINGSQL || ‘ AND DATA =’ || ”” || :LODATA || ””  || ‘ AND’;
      STRINGSQL = STRINGSQL || ‘ (HORA >= ‘ || ”” || (:LOHORA – (5 * 60)) || ”” || ‘ ) AND’;
      STRINGSQL = STRINGSQL || ‘ (HORA <= ‘ || ”” || (:LOHORA + (20 * 60)) || ”” || ‘ ) AND’;
      STRINGSQL = STRINGSQL || ‘ (‘;
      /* O SUBSTR COMEÇA A CONTAR DO 0 ENTÃO COLOCAMOS 3 PARA PEGAR OS ULTIMOS 4 CARACTERES*/
      STRINGSQL = STRINGSQL || ‘ RTRIM(NUMERO) LIKE ‘ || ”” || ‘%’ || SUBSTR(:LONUMERO,STRLEN(RTRIM(:LONUMERO)) – 3,STRLEN(RTRIM(:LONUMERO))) || ””; /*||  ‘%’ || ””;*/
      STRINGSQL = STRINGSQL || ‘) ORDER BY 3 DESC’;
      FOR
          EXECUTE STATEMENT STRINGSQL INTO :CODIGORAMAL, :D ATA, :HORA, :D URACAO, :NUMERO
      DO
      BEGIN
          STRINGSQL2 = ‘UPDATE LIGACAO’;
          STRINGSQL2 = STRINGSQL2 || ‘ SET PABX = ‘ || ”” || ‘   CÓD. RAMAL : ‘ || ”” || ”” || :CODIGORAMAL || ””
                                                    || ”” || ‘   DATA : ‘ || ”” || ”” || EXTRACT(DAY FROM :D ATA) || ‘/’ || EXTRACT(MONTH FROM :D ATA) || ‘/’ || EXTRACT(YEAR FROM :D ATA) || ””
                                                    || ”” || ‘   HORA : ‘ || ”” || ”” || EXTRACT(HOUR FROM :HORA) || ‘:’ || EXTRACT (MINUTE FROM :HORA) || ‘:’ || EXTRACT(MINUTE FROM :HORA) || ””
                                                    || ”” || ‘  NUMERO :’ || ”” || ”” || :NUMERO || ””
                                                    || ”” || ‘ DURAÇÃO : ‘ ||”” || ”” || EXTRACT(HOUR FROM :D URACAO) || ‘:’ || EXTRACT (MINUTE FROM :D URACAO) || ‘:’ || EXTRACT(MINUTE FROM :D URACAO) || ””;
          STRINGSQL2 = STRINGSQL2 || ‘ WHERE DATA =’ || ”” || :LODATA || ”” || ‘ AND HORA =’ || ”” || :LOHORA || ”” || ‘ AND NUMERO LIKE ‘ || ”” || ‘%’ || SUBSTR(:LONUMERO,STRLEN(RTRIM(:LONUMERO)) – 3,STRLEN(RTRIM(:LONUMERO))) || ””; /*|| ‘%’ || ””;*/
          EXECUTE STATEMENT STRINGSQL2;
      END
    END
  suspend;
end


Deixe uma resposta

Sua resposta:

Categorias