Ver Mensaje Individual
  #7  
Antiguo 13-06-2025
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 646
Reputación: 23
mRoman Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
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^
Muchas gracias Duilio. Anoche estaba analizando la inicialización de la variable V_DATO....porque no insertaba registros y si hay!, pero ahora con tu sugerencia del IF NOT EXIST, mejor lo usaré. Al final mejor cree la TABLA como otra mas y la estaré llenando, para luego exportar los datos ahi registrados.


Gracias a todos por su tiempo y aportes.


Muchas gracias.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita