Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo 13-06-2025
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
El problema es que no se pueden crear y borrar tablas externas desde un procedimiento.

Primero tienes que crear la tabla y luego utilizarla como si fuera una tabla más de la base de datos.
Además, veo que faltan algunas comas...

El script de creación sería algo así;
Recuerda inicializar V_DATO en cada iteración del bucle.
Si un select no encuentra registros, V_DATO no se toca y queda con el valor anterior y podría dar falsos positivos.


Código SQL [-]
set term ^;

CREATE TABLE ERR_COMBINACIONES EXTERNAL 'C:\ATENCION\ERR_COMBINACION.TXT' (
                           ERR_LEC_ORIGEN CHAR(10),
                           ERR_LEC_DESTINO CHAR(10),
                           ERR_RUTA CHAR(3),
                           ERR_FECHA_VISITA CHAR(10))
^
commit work^

CREATE PROCEDURE SP_VALIDAR_COMBINACION (
    I_MES INTEGER,
    I_ANIO INTEGER)
AS
DECLARE VARIABLE V_RUTA INTEGER;
DECLARE VARIABLE V_FECHA_VISITA DATE;
DECLARE VARIABLE V_CONSEC_MAX INTEGER;
DECLARE VARIABLE V_CONSEC INTEGER;
DECLARE VARIABLE V_LEC_SEDE NUMERIC(10,0);
DECLARE VARIABLE V_LECHERIA NUMERIC(10,0);
DECLARE VARIABLE V_DATO NUMERIC(1,0);
DECLARE VARIABLE V_LECHERIA2 NUMERIC(10,0);
begin
    /* La tabla ya existe
    CREATE TABLE ERR_COMBINACIONES EXTERNAL 'C:\ATENCION\ERR_COMBINACION.TXT' (
                               ERR_LEC_ORIGEN CHAR(10),
                               ERR_LEC_DESTINO CHAR(10)
                               ERR_RUTA CHAR(3)
                               ERR_FECHA_VISITA CHAR(10));
    */

    FOR SELECT DISTINCT(a.clave_ruta),
                        a.fecha_visita,
                   MAX( a.consec )
        FROM atencion_lecheria a
        WHERE a.clave_ruta in (SELECT DISTINCT(A.clave_ruta)
                               FROM atencion_lecheria A
                               WHERE A.mes_periodo=:i_MES
                                 AND A.anio_periodo=:i_ANIO)
          AND a.mes_periodo=:i_mes
          AND a.anio_periodo=:i_anio
        GROUP BY a.clave_ruta,
                 a.fecha_visita
        INTO :v_ruta, :v_fecha_visita, :v_consec_max DO
        BEGIN
             v_consec=1;
             While ( v_consec <= v_consec_max ) do
             begin
                  select b.clave_lec
                  from atencion_lecheria b
                  where b.fecha_visita=:v_fecha_visita
                    and b.clave_ruta=:v_ruta
                    and b.consec=:v_consec
                  into :v_lecheria;

                  /********************************/
                  /*INICIALIZO V_DATO EN CADA BUCLE*/
                  /********************************/
                  v_dato = NULL;

                  /*DISTANCIA DE LA SEDE A LA PRIMER LECHERIA*/
                  if (v_consec=1) then
                  begin
                      /*Obtener la lecheria sede de la ruta*/
                      select r.clave_lec_sede
                      from ruta r
                      where r.clave_ruta=:v_ruta
                      into :v_lec_sede;

                      /*Buscar si existe la combinacion de la SEDE a la primer lecheria de la visita*/
                      select 1
                      from lecheria_a_lecheria c
                      where c.clave_lec_origen=:v_lec_sede
                        and c.clave_lec_destino=:v_lecheria
                      into :v_dato;

                      if (v_dato is null) then
                      begin
                          select 1
                          from lecheria_a_lecheria c
                          where c.clave_lec_origen=:v_lecheria
                            and c.clave_lec_destino=:v_lec_sede
                          into :v_dato;
                          if (v_dato is null) then
                          begin
                              INSERT INTO ERR_COMBINACIONES (ERR_LEC_ORIGEN,
                                                             ERR_LEC_DESTINO,
                                                             ERR_RUTA,
                                                             ERR_FECHA_VISITA)
                                                     values (:v_lecheria,
                                                             :v_lec_sede,
                                                             :v_ruta,
                                                             :v_fecha_visita);
                          end
                      end
                      v_lecheria2=v_lecheria;
                  end Else
                  begin
                      /*Buscar si existe combinacion de la primer lecheria con la segunda*/
                      select 1
                      from lecheria_a_lecheria c
                      where c.clave_lec_origen=:v_lecheria2
                        and c.clave_lec_destino=:v_lecheria
                      into :v_dato;

                      if (v_dato is null) then
                      begin
                          select 1
                          from lecheria_a_lecheria c
                          where c.clave_lec_origen=:v_lecheria
                            and c.clave_lec_destino=:v_lecheria2
                          into :v_dato;
                          if (v_dato is null) then
                          begin
                              INSERT INTO ERR_COMBINACIONES (ERR_LEC_ORIGEN,
                                                             ERR_LEC_DESTINO,
                                                             ERR_RUTA,
                                                             ERR_FECHA_VISITA)
                                                     values (:v_lecheria,
                                                             :v_lec_sede,
                                                             :v_ruta,
                                                             :v_fecha_visita);
                          end
                      end
                      v_lecheria2=:v_lecheria;
                  end
                  v_consec=:v_consec+1;
             end
        END
end
^
commit work^

Última edición por duilioisola fecha: 13-06-2025 a las 16:22:11.
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
Atorado al crear un store procedure pmtzg Firebird e Interbase 3 16-10-2008 22:53:12
Ejecutar Store Procedure desde Trigger Raptor Firebird e Interbase 1 26-08-2008 06:36:36
Ejecutar store procedure desde linea de comando. mcalmanovici Firebird e Interbase 6 21-12-2007 15:13:33
Invocar Store Procedure desde delphi JuanPa1 Oracle 10 29-11-2006 23:43:44
store procedure no puedo llamarlos desde ado..! Arturo MySQL 1 10-05-2006 01:03:56


La franja horaria es GMT +2. Ahora son las 05:28:13.


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