Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problema con procedimiento

Estas en el tema de Problema con procedimiento en el foro de Oracle en Foros del Web. Hola, muy buen dia a todos... Hacia tiempo que no me ocurria un error como este y no se como solucionarlo, el problema es el ...
  #1 (permalink)  
Antiguo 03/03/2009, 13:26
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 17 años, 10 meses
Puntos: 4
Problema con procedimiento

Hola, muy buen dia a todos...


Hacia tiempo que no me ocurria un error como este y no se como solucionarlo, el problema es el siguiente:

Tengo el siguiente codigo el cual he retocado un poco para poder realizar una copia de informacion que se necesita en la empresa (he colocado el modificado ya q el original presenta el mismo problema) a medida que le hacia pruebas estaba mas satisfecho con el funcionamiento hasta que me ocurrio un error con una información, cuando digito esa cotización automaticamente me retorna el error ORA-01403: No se ha encontrado ningun dato. Pero descubri que el error es por un valor en la BD adjunto tabla.

Tabla original vista por el toad almacenada en excel.


Tabla modificada vista por el toad almacenada en excel



El valor que aparece resaltado en la segunda tabla es el que me genera el siguiente error por lo menos en este caso



Adjunto anexo una imagen de los tipos de datos de la tabla con la descripcion.




Aclaro que el procedimiento original esta en funcionamiento y que ese error sucede en algunas ocasiones y la unica solucion que hemos encontrado es quitar todos la informacion de esa columna en esa tabla con respecto al numero de cotizacion.


Les agradezco de antemano la ayuda que me puedan brindar.



Ahora el codigo del procedimiento.


Código:
--CREATE OR REPLACE PROCEDURE Pobrcopadicion(PNUMCOTI VARCHAR2,pcodcap VARCHAR2 DEFAULT NULL,PNUMOBR2 VARCHAR2,ptipo VARCHAR2)  IS
declare

   	   	CURSOR cAntCapitulos IS
	 select codigo,DESCRIPCION,CODCOTI,CODPADRE,COMENTARIOS,FECINICIAL,DURACION,FECREQUERIDA,TBUNMED_ID,CODEXT,CANTIDAD,VALOR from(
	  SELECT UNIQUE *
   FROM TDCAPCOTI
	  WHERE codcoti = :pnumcoti
	   CONNECT BY PRIOR codigo = codpadre
	    AND PRIOR codcoti = :pnumcoti
	   START WITH codigo =NVL(TO_NUMBER(:pcodcap),codigo) --codigo     --pcodcap
	    AND codcoti = :pnumcoti)
group by codigo,DESCRIPCION,CODCOTI,CODPADRE,COMENTARIOS,FECINICIAL,DURACION,FECREQUERIDA,TBUNMED_ID,CODEXT,CANTIDAD,VALOR;
---
	TYPE tCodigos IS TABLE OF NUMBER(10)
	INDEX BY BINARY_INTEGER;
	vCodPadres tCodigos;
    
    
    CURSOR cNuevObra IS
	SELECT 'x'
	  FROM TBOBRATEC
	 WHERE codigo = :pnumobr2;
	vDummy VARCHAR2(1);

	vCodigo NUMBER(10) := NULL;


BEGIN
   /************************
     Verifico que exista la Obra en la que se va a insertar el nuevo capitulo.
   ************************/
   OPEN cNuevObra;
   FETCH cNuevObra INTO vDummy;
   IF cNuevObra%NOTFOUND THEN
  RAISE_APPLICATION_ERROR(-20010,'No existe la Obra en la que se desea copiar el capitulo.');
--   PForMsgBox('No existe la Obra en la que se desea copiar el capitulo.','ERROK');
   END IF;
   CLOSE cNuevObra;
   /************************
     Hallo el siguiente consecutivo de la serie.
   ************************/
   SELECT NVL(MAX(codigo),0)+1 INTO vCodigo
     FROM TDCAPOBRAS
	WHERE tbobratec_cod = :pnumobr2;
   /************************
     Inserto los capitulos.
   ************************/
   FOR fila IN cAntCapitulos LOOP
   	   vCodPadres(fila.codigo) := vCodigo;
	   DECLARE
	   	 vCodauxPadre NUMBER(10);
	   BEGIN
	   
	   	  IF fila.codPadre IS NULL THEN
		   	  vcodAuxPadre := NULL;
		   ELSE
		   	  vCodAuxPadre := vCodPadres(fila.codpadre);
--			  dbms_output.put_line(' El valor de vCodPadres('||fila.codpadre||') es de: '||vCodPadres(fila.codpadre));
		   END IF;

-- dbms_output.put_line('El valor de vCodPadres('||fila.codigo||') es de: '||vCodPadres(fila.codigo)||' El valor de vCodauxPadre antes de asignar es de: '||vCodauxPadre||' El valor de vCodPadres('||fila.codpadre||') es de: '||vCodPadres(fila.codpadre));

		   dbms_output.put_line('los valores para el capitulo es, vCodigo: '||vCodigo||', descripcion: '||fila.descripcion||', Obra: '||:pnumobr2||', vCodAuxPadre: '||vCodAuxPadre||', comentarios:'||fila.comentarios||','||fila.fecinicial||','||fila.duracion||','||fila.fecrequerida||','||''||','||''||', Tipo: '||:ptipo||', tbunmed_id: '||fila.tbunmed_id||', codext: '||fila.codext||','||fila.cantidad||','||fila.valor);
		   
		   /*INSERT INTO TDCAPOBRAS(codigo,descripcion,tbobratec_cod,codpadre,comentarios,fecinicial,duracion,fecrequerida,fecinireal,fecfinreal,tipo,tbunmed_id,codext,cantidad,valor)
		   		VALUES (vCodigo,fila.descripcion,:pnumobr2,vCodAuxPadre,fila.comentarios,fila.fecinicial,fila.duracion,fila.fecrequerida,NULL,NULL,:ptipo,fila.tbunmed_id,fila.codext,fila.cantidad,fila.valor);
	   */END;
   /************************
     Inserto los componentes de los capitulos
   ************************/

--dbms_output.put_line('los valores para el detalle del capitulo son; '||vCodigo||','||fila.descripcion||','||:pnumobr2||','||vCodAuxPadre||','||fila.comentarios||','||fila.fecinicial||','||fila.duracion||','||fila.fecrequerida||','||''||','||''||','||:ptipo||','||fila.tbunmed_id||','||fila.codext||','||fila.cantidad||','||fila.valor);

	  	/*INSERT INTO TDDCAPOBRA(tdsumis_codpro, tdsumis_conster, numlinea, tdcapobra_cod, tbobratec_cod,
		   				   porcriesgo, total, precio, tbundmed_id, tbtemp_cod, undconv_id, tdters_nit,
						   tdters_tid, cantidad, fecha_reser, tbmanobra_codigo)
  	SELECT tdsumis_codpro, tdsumis_conster, numlinea, vCodigo, :PNUMOBR2,
  			porcriesgo, total, precio, tbundmed_id, tbptemp_cod,
			undconv_id, tdters_nit, tdters_tid, cantidad, NULL, tbmanobra_codigo
  	FROM TDDCAPCOTI
  	WHERE tdcapcoti_codcoti = fila.codcoti
	   AND tdcapcoti_cod=fila.codigo;
	   */
	   vCodigo := vCodigo +1;

   END LOOP;

COMMIT;
    EXCEPTION
     WHEN OTHERS THEN
	   IF cNuevObra%isopen THEN
	   	  CLOSE cNuevObra;
	   END IF;
      raise_application_error(-20000,'Error AL COPIAR CAPITULOS: ' || sqlerrm); --       RAISE;
END;-- Pobrcopadicion;
  #2 (permalink)  
Antiguo 05/03/2009, 09:28
 
Fecha de Ingreso: enero-2007
Ubicación: Cali - Valle
Mensajes: 135
Antigüedad: 17 años, 10 meses
Puntos: 4
Respuesta: Problema con procedimiento

Hola buen dia.

Ya encontre la solución y todo era un simple order by, el select al momento de pasar los datos al cursor los pasaba en desorden y era ahi donde ocacionaba el problema ya que no encontraba el item al cual estaba haciendo referencia.

Abajo dejo señalado la ubicación del order...
Código:
...	CURSOR cAntCapitulos IS
	 select codigo,DESCRIPCION,CODCOTI,CODPADRE,COMENTARIOS,FECINICIAL,DURACION,FECREQUERIDA,TBUNMED_ID,CODEXT,CANTIDAD,VALOR from(
	  SELECT UNIQUE *
   FROM TDCAPCOTI
	  WHERE codcoti = :pnumcoti
	   CONNECT BY PRIOR codigo = codpadre
	    AND PRIOR codcoti = :pnumcoti
	   START WITH codigo =NVL(TO_NUMBER(:pcodcap),codigo) --codigo     --pcodcap
	    AND codcoti = :pnumcoti)
group by codigo,DESCRIPCION,CODCOTI,CODPADRE,COMENTARIOS,FECINICIAL,DURACION,FECREQUERIDA,TBUNMED_ID,CODEXT,CANTIDAD,VALOR;
order by codigo; <-- Este era el problema!!! ...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:05.