Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #9  
Antiguo 10-03-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola Casimiro.

Que yo sepa ha sido posible hacerlo desde siempre, desde Firebird 1 (que es cuando empecé a utilizar Interbase/Firebird). Que yo recuerde, en los procedimientos almacenados siempre se ha podido añadir el suspend (que normalmente utilizas con un for select) para que devuelva el resultado como un dataset.

Aunque esto normalmente se usa para leer un dataset en tu programa (en lugar de utilizando un select), también puedes utilizar el procedimiento almacenado dentro de un select, en una union, en una subconsulta, etc. ...

Así que un buen día me di cuenta de que eso podia ser muy útil, ya que además de utilizarlo para consultar datos también podría servir para definirme mi propia librería de funciones en PSQL, y no tener que depender tanto de udf's externas.

La verdad es que desde entonces lo vengo usando de forma masiva.

Me es especialmente imprescindible cuando tengo que importar datos. Muchas veces tengo que programar importaciones hacia nuestro sistema de las gestiones que puedan tener nuevos clientes. Con lo que te encuentras que tienes que trabajar con todo tipo de datos, y que muchas veces los clientes lo tiene en un simple campo de texto, mal formateado, y que te las tienes que apañar para convertirlo, por ejemplo, en un timestamp.

Por eso tengo una librería de funciones como esta (en este caso intenta convertir una cadena en fecha) :

Código SQL [-]
CREATE PROCEDURE "X_IMPORT_Data" (
    VALOR VARCHAR(50))
RETURNS (
    DATA TIMESTAMP)
AS
DECLARE VARIABLE DIA INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE TMP VARCHAR(50);
begin
  DATA = null;
  I = 1;
  while (substring(:VALOR from I for 1) not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    I = I + 1;
  end
  TMP = '';
  while (substring(:VALOR from I for 1) in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    TMP = TMP || substring(VALOR from I for 1);
    I = I + 1;
  end
  DIA = cast(TMP as integer);
  while (substring(:VALOR from I for 1) not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    I = I + 1;
  end
  TMP = '';
  while (substring(:VALOR from I for 1) in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    TMP = TMP || substring(VALOR from I for 1);
    I = I + 1;
  end
  MES = cast(TMP as integer);
  while (substring(:VALOR from I for 1) not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    I = I + 1;
  end
  TMP = '';
  while (substring(:VALOR from I for 1) in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    TMP = TMP || substring(VALOR from I for 1);
    I = I + 1;
  end
  ANO = cast(TMP as integer);
  if (:ANO < 20) then ANO = 2000 + ANO;              /* Tracto l'any, ja que pot estar en 2 digits */
  else if (:ANO < 100) then ANO = 1900 + ANO;
  TMP = cast(MES as varchar(20)) || '-' || cast(DIA as varchar(20)) || '-' || cast(ANO as varchar(20));
  DATA = cast(TMP as TIMESTAMP);
  suspend;
  when any do exit;    /* En cas d'Error retorno Null */
end
^

Creo una tablas temporales de importacion, con la estructura de los datos a importar, y hago un DataPump, con lo que ya tengo todos los datos en una única base de datos Firebird.

Luego ya solo tengo que hacer los correspondentes INSERT INTO *** SELECT **** FROM IMPORT_**** para poner los datos de las tablas temporales en las tables correspondientes de nuestro sistema, y puedo utilizar esas funciones como si fueran UDF's, con lo que he recortado drasticamente el tiempo que tardo en hacer una importacion de datos (antes me tenía que hacer un programa en Delphi ex-profeso en cada ocasión).

Saludos
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 10-03-2010 a las 19:50:29.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Firebird 1.5.4 funciona en Win Vista pero Firebird 2.0.1 NO !!! Hagen Firebird e Interbase 5 19-05-2007 21:17:54
Firebird 1.5.3 Error:No puede ejecutarse Firebird Guardian xq ya hay una instancia Delphius Firebird e Interbase 5 26-01-2007 10:19:20
alguien ha utilizado Firebird DDX provider? (conectarse con db en firebird!) JuanErasmo .NET 1 04-11-2006 16:17:12
Firebird : Llamado para probadores de Firebird 2.0 JOSEPE Firebird e Interbase 0 12-03-2005 20:33:18
Problemas Firebird Super Server 1.5 con RFunc Firebird v 1.0 Prophoenix Firebird e Interbase 1 09-03-2004 11:40:48


La franja horaria es GMT +2. Ahora son las 04:03:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi