Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #9  
Antiguo 13-06-2025
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 646
Poder: 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
 



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 18:38:46.


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