Home » Developer & Programmer » Forms » Deleting an Excel sheet using OLE2 (Oracle Forms 6i, Windows 10)
Deleting an Excel sheet using OLE2 [message #687605] Thu, 13 April 2023 00:42 Go to next message
AmadeoGS
Messages: 2
Registered: April 2023
Location: Murcia, Spain
Junior Member
Hi everyone.

I need to delete remaining sheets from an excel file but i'm unable to do that.

For example, with 12 sheets, I want to delete 11 and 12.
  FOR I IN 1 .. 12 LOOP
		args := ole2.create_arglist;
		ole2.add_arg(args, I);
		worksheet := ole2.get_obj_property(worksheets, 'Item', args);
		if i in (11, 12) then
 		  ole2.invoke(worksheet, 'Delete');
		end if;
		ole2.destroy_arglist(args);
		ole2.release_obj(worksheet);
  END LOOP;
nothing happens.
But after many tries I've noticed the following with this code
  FOR I IN 1 .. 12 LOOP
		args := ole2.create_arglist;
		ole2.add_arg(args, I);
		worksheet := ole2.get_obj_property(worksheets, 'Item', args);
		if i in (11, 12) then
			ole2.set_property(worksheet, 'Name', 'b');
			ole2.set_property(worksheet, 'Name', 'c');
			ole2.set_property(worksheet, 'Name', 'd');
			ole2.set_property(worksheet, 'Name', 'e');
		end if;
		ole2.destroy_arglist(args);
		ole2.release_obj(worksheet);
  END LOOP;
Sheet 11 gets "e" name, but 12 gets "d". If I leave only the "b" naming, sheet 12 remains unnamed, after applying "b" and "c" it gets the name "b"...
Why is happening this??? I don't know if its related to the fact that I'm not able to delete the sheets.

But, the reason for this post is that I need to delete the sheets.

Thank you in advance.
Amadeo.
Re: Deleting an Excel sheet using OLE2 [message #687606 is a reply to message #687605] Thu, 13 April 2023 00:43 Go to previous message
AmadeoGS
Messages: 2
Registered: April 2023
Location: Murcia, Spain
Junior Member
Full code

PROCEDURE GENERAR_MODELOSB_MRR_CI_2 IS

  FECHA_DESDE                    DATE;
  FECHA_HASTA                    DATE;
  CREDITO_TOTAL                  NUMBER(14, 2);
  GASTO_AUTORIZADO_CORRIENTE     NUMBER(14, 2);
  GASTO_AUTORIZADO_POSTERIOR     NUMBER(14, 2);
  GASTO_COMPROMETIDO_CORRIENTE   NUMBER(14, 2);
  GASTO_COMPROMETIDO_POSTERIOR   NUMBER(14, 2);
  OBLIGACIONES_RECONOCIDAS       NUMBER(14, 2);
  TOTAL_PAGOS                    NUMBER(14, 2);
  TCREDITO_TOTAL                 NUMBER(14, 2);
  TGASTO_AUTORIZADO_CORRIENTE    NUMBER(14, 2);
  TGASTO_AUTORIZADO_POSTERIOR    NUMBER(14, 2);
  TGASTO_COMPROMETIDO_CORRIENTE  NUMBER(14, 2);
  TGASTO_COMPROMETIDO_POSTERIOR  NUMBER(14, 2);
  TOBLIGACIONES_RECONOCIDAS      NUMBER(14, 2);
  TTOTAL_PAGOS                   NUMBER(14, 2);

  -- Fichero destino
  ruta_						VARCHAR2(250) := 'c:\temp\';
  fichero_				VARCHAR2(250) := 'MODELOSB_MRR_CI.xlsx';

	-- Declare the OLE objects
	application 		ole2.obj_type;
	workbooks 			ole2.obj_type;
	workbook 				ole2.obj_type;
	worksheets			ole2.obj_type;
	worksheet				ole2.obj_type;
	cell 						ole2.obj_type;
	rango						ole2.obj_type;

	nombrehoja_			varchar2(5);

	args   					ole2.list_type;
	check_file 			text_io.file_type;
	no_file 				exception;

	FILA_						NUMBER;
	NUMERO_HOJA			NUMBER := 0;
	NUMERO_HOJAS		NUMBER;
	NUMERO_DUPLAS		NUMBER;

	PRAGMA EXCEPTION_INIT (no_file, -302000);

  CURSOR HOJAS IS
    SELECT DISTINCT COMPONENTE, INVERSION
      FROM DATOSPROYECTOS
     ORDER BY TO_NUMBER(SUBSTR(COMPONENTE, 2, LENGTH(COMPONENTE) - 1)), TO_NUMBER(SUBSTR(INVERSION, 2, LENGTH(INVERSION) - 1));

  CURSOR CAPITULOS IS
    SELECT ECO CAPITULO, NOM
      FROM TIPIFICADA
     WHERE EJE         = 2023
       AND TIPECO      = 'G'
       AND LENGTH(ECO) = 1
       AND ECO NOT    IN ('5', '9')
     ORDER BY ECO;

  CURSOR IMPORTES (COMPONENTE_  DATOSPROYECTOS.COMPONENTE%TYPE,
                   INVERSION_   DATOSPROYECTOS.INVERSION%TYPE,
                   ECO_         TIPIFICADA.ECO%TYPE,
                   FECHA_DESDE_ DATE,
                   FECHA_HASTA_ DATE) IS
    SELECT DECODE(P.CTA, '0030', P.CTA, SUBSTR(P.CTA, 1, 3)) CTA, P.DEBHAB, ROUND(NVL(SUM(P.IMP), 0) / 1000, 2) IMP
      FROM PASI P, ASIENTOS A, DATOSPROYECTOS D
     WHERE D.COMPONENTE                   = COMPONENTE_
       AND D.INVERSION                    = INVERSION_
       AND D.FECINI                      <= FECHA_HASTA_
       AND (D.FECFIN IS NULL OR D.FECFIN >= FECHA_DESDE_)
       AND P.NUMPROY                      = D.NUMPROY
       AND (   P.CTA = '0030' AND P.DEBHAB = 'H'
            OR P.CTA = '004'  AND P.DEBHAB = 'H'
            OR P.CTA = '005'  AND P.DEBHAB = 'H'
            OR P.CTA LIKE '400%')
       AND SUBSTR(P.ECO, 1, 1)            = ECO_
       AND A.ANOASI                       = P.ANOASI
       AND A.NUMASI                       = P.NUMASI
       AND A.FECENT                 BETWEEN FECHA_DESDE_ AND FECHA_HASTA_
     GROUP BY DECODE(P.CTA, '0030', P.CTA, SUBSTR(P.CTA, 1, 3)), P.DEBHAB;

BEGIN

  FECHA_DESDE := :PRINCIPAL.FECHA_DESDE;
  FECHA_HASTA := :PRINCIPAL.FECHA_HASTA;

	SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'BUSY');

	HOST('delete '||ruta_||fichero_, NO_SCREEN);

	-- Copio la plantilla original en c:\temp para trabajar sobre ella.
	HOST('copy '||fichero_||' '||ruta_||fichero_, NO_SCREEN);

	check_file := TEXT_IO.FOPEN(ruta_||fichero_, 'R');
	TEXT_IO.FCLOSE(check_file);

	application := ole2.create_obj('Excel.Application');
	ole2.set_property(application , 'Visible', 0);
	workbooks 	:= ole2.get_obj_property(application, 'Workbooks');

	args := ole2.create_arglist;
	ole2.add_arg(args, ruta_||fichero_);
	workbook := ole2.invoke_obj(workbooks, 'Open', args);
	ole2.destroy_arglist(args);

	worksheets := ole2.get_obj_property(workbook, 'Worksheets');

  SELECT COUNT(*)
  	INTO NUMERO_DUPLAS
  	FROM (SELECT DISTINCT COMPONENTE, INVERSION
				    FROM DATOSPROYECTOS);

	NUMERO_HOJAS := ole2.get_num_property(worksheets, 'Count');

	IF NUMERO_DUPLAS > NUMERO_HOJAS THEN
		ERROR('EL NÚMERO DE DUPLAS COMPONENTE|INVERSION ('||NUMERO_DUPLAS||') ES DISTINTO AL NÚMERO DE HOJAS CONTEMPLADAS EN EL FICHERO EXCEL ('||NUMERO_HOJAS||')');
	END IF;

	-- Recorremos las hojas
  FOR H IN HOJAS LOOP

  	NUMERO_HOJA := NUMERO_HOJA + 1;

		args := ole2.create_arglist;
		ole2.add_arg(args, NUMERO_HOJA);
		worksheet := ole2.get_obj_property(worksheets, 'Item', args);
		ole2.destroy_arglist(args);

		-- Obtenemos el nombre de la hoja, que será igual a COMPONENTE+INVERSION
		--nombrehoja_ := ole2.get_char_property(worksheet, 'Name');

		-- Nombramos la hoja según su número
		ole2.set_property(worksheet, 'Name', NUMERO_HOJA);

	  args := ole2.create_arglist;
	  ole2.add_arg(args, 2);
	  ole2.add_arg(args, 1);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', 'Código Componente.Inversión: '||H.COMPONENTE||'.'||H.INVERSION);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);

    TCREDITO_TOTAL 								:= 0;
    TGASTO_AUTORIZADO_CORRIENTE 	:= 0;
    TGASTO_AUTORIZADO_POSTERIOR		:= 0;
    TGASTO_COMPROMETIDO_CORRIENTE := 0;
    TGASTO_COMPROMETIDO_POSTERIOR := 0;
    TOBLIGACIONES_RECONOCIDAS 		:= 0;
    TTOTAL_PAGOS 								  := 0;

    FOR C IN CAPITULOS LOOP

      CREDITO_TOTAL 							 := 0;
      GASTO_AUTORIZADO_CORRIENTE 	 := 0;
      GASTO_COMPROMETIDO_CORRIENTE := 0;
      OBLIGACIONES_RECONOCIDAS 		 := 0;
      TOTAL_PAGOS 								 := 0;

      FOR I IN IMPORTES (H.COMPONENTE, H.INVERSION, C.CAPITULO, FECHA_DESDE, FECHA_HASTA) LOOP
        IF I.CTA = '0030' AND I.DEBHAB = 'H' THEN
          CREDITO_TOTAL  := I.IMP;
          TCREDITO_TOTAL := TCREDITO_TOTAL + CREDITO_TOTAL;
        ELSIF I.CTA = '004' AND I.DEBHAB = 'H' THEN
          GASTO_AUTORIZADO_CORRIENTE  := I.IMP;
          TGASTO_AUTORIZADO_CORRIENTE := TGASTO_AUTORIZADO_CORRIENTE + GASTO_AUTORIZADO_CORRIENTE;
        ELSIF I.CTA = '005' AND I.DEBHAB = 'H' THEN
          GASTO_COMPROMETIDO_CORRIENTE  := I.IMP;
          TGASTO_COMPROMETIDO_CORRIENTE := TGASTO_COMPROMETIDO_CORRIENTE + GASTO_COMPROMETIDO_CORRIENTE;
        ELSIF I.CTA LIKE '400%' AND I.DEBHAB = 'H' THEN
          OBLIGACIONES_RECONOCIDAS  := I.IMP;
          TOBLIGACIONES_RECONOCIDAS := TOBLIGACIONES_RECONOCIDAS + OBLIGACIONES_RECONOCIDAS;
        ELSIF I.CTA LIKE '400%' AND I.DEBHAB = 'D' THEN
          TOTAL_PAGOS  := I.IMP;
          TTOTAL_PAGOS := TTOTAL_PAGOS + TOTAL_PAGOS;
        END IF;
      END LOOP;

      -- GASTOS AUTORIZADOS EJ POSTERIOR
      SELECT ROUND(NVL(SUM(P.IMP), 0) / 1000, 2)
        INTO GASTO_AUTORIZADO_POSTERIOR
        FROM PARTIGASEF P, DOCGASEF DF, DATOSPROYECTOS D
			 WHERE D.COMPONENTE                   = H.COMPONENTE
         AND D.INVERSION                    = H.INVERSION
         AND D.FECINI                      <= FECHA_HASTA
         AND (D.FECFIN IS NULL OR D.FECFIN >= FECHA_DESDE)
         AND P.NUMPROY                      = D.NUMPROY
         AND P.TIPOPEGAS                 LIKE 'A%'
         AND SUBSTR(P.ECO, 1, 1)            = C.CAPITULO
         AND DF.ANODOCGASEF                 = P.ANODOCGASEF
         AND DF.NUMDOCGASEF                 = P.NUMDOCGASEF
         AND DF.FECMAT                     IS NOT NULL    
         AND (DF.FECACTIVACION IS NOT NULL AND DF.FECACTIVACION >= TO_DATE('01/' || TO_CHAR(OBT_EJETRABAJO(USER)+1),'MM/YYYY') OR DF.CARPRE >= :CABECERA.EJETRABAJO+1);
      TGASTO_AUTORIZADO_POSTERIOR := TGASTO_AUTORIZADO_POSTERIOR + GASTO_AUTORIZADO_POSTERIOR;

      -- GASTOS COMPROMETIDOS EJ POSTERIOR
      SELECT ROUND(NVL(SUM(P.IMP), 0) / 1000, 2)
        INTO GASTO_COMPROMETIDO_POSTERIOR
        FROM PARTIGASEF P, DOCGASEF DF, DATOSPROYECTOS D
			 WHERE D.COMPONENTE                   = H.COMPONENTE
         AND D.INVERSION                    = H.INVERSION
         AND D.FECINI                      <= FECHA_HASTA
         AND (D.FECFIN IS NULL OR D.FECFIN >= FECHA_DESDE)
         AND P.NUMPROY                      = D.NUMPROY
         AND P.TIPOPEGAS                 LIKE '%D%'
         AND SUBSTR(P.ECO, 1, 1)            = C.CAPITULO
         AND DF.ANODOCGASEF                 = P.ANODOCGASEF
         AND DF.NUMDOCGASEF                 = P.NUMDOCGASEF
         AND DF.FECMAT                     IS NOT NULL    
         AND (DF.FECACTIVACION IS NOT NULL AND DF.FECACTIVACION >= TO_DATE('01/' || TO_CHAR(OBT_EJETRABAJO(USER)+1),'MM/YYYY') OR DF.CARPRE >= :CABECERA.EJETRABAJO+1);
      TGASTO_COMPROMETIDO_POSTERIOR := TGASTO_COMPROMETIDO_POSTERIOR + GASTO_COMPROMETIDO_POSTERIOR;

			IF C.CAPITULO = 1 THEN
				FILA_ := 6;
			ELSIF C.CAPITULO = 2 THEN
				FILA_ := 8;
			ELSIF C.CAPITULO = 3 THEN
				FILA_ := 11;
			ELSIF C.CAPITULO = 4 THEN
				FILA_ := 12;
			ELSIF C.CAPITULO = 6 THEN
				FILA_ := 24;
			ELSIF C.CAPITULO = 7 THEN
				FILA_ := 27;
			ELSIF C.CAPITULO = 8 THEN
				FILA_ := 40;
			END IF;

			-- CREDITO TOTAL
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 3);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', CREDITO_TOTAL);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- GASTO_AUTORIZADO_CORRIENTE
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 4);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', GASTO_AUTORIZADO_CORRIENTE);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- GASTO_AUTORIZADO_POSTERIOR
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 5);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', GASTO_AUTORIZADO_POSTERIOR);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- GASTO_COMPROMETIDO_CORRIENTE
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 6);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', GASTO_COMPROMETIDO_CORRIENTE);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- GASTO_COMPROMETIDO_POSTERIOR
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 7);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', GASTO_COMPROMETIDO_POSTERIOR);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- OBLIGACIONES_RECONOCIDAS
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 8);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', OBLIGACIONES_RECONOCIDAS);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- TOTAL GASTO EJECUTADO
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 10);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', OBLIGACIONES_RECONOCIDAS);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

			-- TOTAL PAGOS
		  args := ole2.create_arglist;
		  ole2.add_arg(args, FILA_);
		  ole2.add_arg(args, 11);
		  cell := ole2.get_obj_property(worksheet, 'Cells', args);
		  ole2.set_property(cell, 'Value', TOTAL_PAGOS);
		  ole2.release_obj(cell);
		  ole2.destroy_arglist(args);

    END LOOP;

		-- TOTALES
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 3);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TCREDITO_TOTAL);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 4);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TGASTO_AUTORIZADO_CORRIENTE);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 5);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TGASTO_AUTORIZADO_POSTERIOR);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 6);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TGASTO_COMPROMETIDO_CORRIENTE);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 7);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TGASTO_COMPROMETIDO_POSTERIOR);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 8);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TOBLIGACIONES_RECONOCIDAS);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 10);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TOBLIGACIONES_RECONOCIDAS);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);
	  args := ole2.create_arglist;
	  ole2.add_arg(args, 56);
	  ole2.add_arg(args, 11);
	  cell := ole2.get_obj_property(worksheet, 'Cells', args);
	  ole2.set_property(cell, 'Value', TTOTAL_PAGOS);
	  ole2.release_obj(cell);
	  ole2.destroy_arglist(args);

	  ole2.release_obj(worksheet);

  END LOOP;

	-- Recorremos las hojas
  FOR I IN 1 .. 12 LOOP
		args := ole2.create_arglist;
		ole2.add_arg(args, I);
		worksheet := ole2.get_obj_property(worksheets, 'Item', args);
		if i in (11, 12) then
			--mensaje('hoja '||i||' nombre: '||ole2.get_char_property(worksheet, 'Name'));
			ole2.set_property(worksheet, 'Name', 'b');
			ole2.set_property(worksheet, 'Name', 'c');
			ole2.set_property(worksheet, 'Name', 'd');
			ole2.set_property(worksheet, 'Name', 'e');
			--mensaje('hoja '||i||' nombre: '||ole2.get_char_property(worksheet, 'Name'));
			ole2.invoke(worksheet, 'Delete');
		end if;
		ole2.destroy_arglist(args);
		ole2.release_obj(worksheet);
  END LOOP;

  -- Se guardan los datos y sale de Excel
  ole2.release_obj(worksheets);
	ole2.invoke(workbook, 'Save');
	ole2.invoke(workbook, 'Close');
	ole2.release_obj(workbook);
	ole2.release_obj(workbooks);
	ole2.invoke(application, 'Save');
	ole2.invoke(application, 'Quit');
	ole2.release_obj(application);

	SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'DEFAULT');
	HOST('start '||ruta_||fichero_, NO_SCREEN);

EXCEPTION
 	WHEN no_file THEN
 		SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'DEFAULT');
  	ERROR('No se ha encontrado la plantilla Excel.');
	WHEN OTHERS THEN
		SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'DEFAULT');
   	MENSAJE('ERROR '||sqlcode||': '||sqlerrm);
 		FOR i IN 1 .. tool_err.nerrors LOOP
   		MENSAJE(tool_err.message);
   		tool_err.pop;
 		END LOOP;
END;

[Updated on: Thu, 13 April 2023 01:09]

Report message to a moderator

Previous Topic: Debugging Constraint error on Forms 6i
Next Topic: Ctrl+V
Goto Forum:
  


Current Time: Thu Feb 29 23:31:38 CST 2024