Migrar un procedimiento que genera un PDF y un Excel de GX9 a GX18

Migrar un procedimiento que genera un PDF y un Excel de GX9 a GX18

🔄 Migración GX9 → GX18: Como Migrar un procedimiento que genera un PDF y un Excel

Usaremos un caso de ejemplo de cómo se separó un procedimiento original en GX9 en dos archivos independientes (PDF y Excel) en GX18

GX9: FiscImpr GX18: PFiscImpPDF y PFiscImpExcel

📋 Resumen de la migración

En GeneXus 9 existía un único procedimiento llamado FiscImpr que generaba tanto Excel como PDF. En GeneXus 18 se separó en dos procedimientos independientes para mayor claridad y mantenimiento:

FiscImpr (GX9)

PFiscImpPDF

+

PFiscImpExcel

📊 Creación de PFiscImprExcel

Se partió de una copia del original FiscImpr (GX9) y se aplicaron estos pasos:

Pasos realizados

1

Con Ctrl+F busqué todas las líneas que contenían print en el código y las eliminé, ya que pertenecen a la generación del PDF.

2

En la sección de Layout borré todo el contenido (los printblocks del PDF).

3

Con Ctrl+H (Replace) reemplacé todas las llamadas viejas del Excel:
&Excel → &ExcelDocument
Esto convierte automáticamente las referencias como &Excel.Cells a &ExcelDocument.Cells.

4

Reemplacé la Sub ‘XLS’ completa. Se eliminó la llamada vieja a PCrtFile y se usó GetBlob + DownloadBlob en su lugar.

Comparación: Sub ‘XLS’

❌ GX9 (antes):

Sub 'XLS'
    &PlaNom = Upper(&IdBienChr) + '_' + Upper(&Tip)
    &PlaNom = Trim(&PlaNom)
    // Usaba PCrtFile para obtener la plantilla
    Call(PCrtFile, 2, 61,'','N',&PlaNom,'N',&PlaImp,&PlaAbr,&ArcDes,&CantCopias,&Ok)
    &Exist = FileExist(&ArcDes)
    if &Exist = 0
        &msg = 'No existe Plantilla ' + &ArcDes
        Msg(&msg)
        Return
    Else
        If &ArcDes <> ''
            &Err = &Excel.Open(&ArcDes)
            If &Excel.ErrCode <> 0
                Msg('Error de carga de archivo')
                Return
            Else
                &T = 7
                &P = 1
                &Excel.Cells(1,1).Text = &Head(1)
                // ...resto de celdas...
            EndIF
        EndIF
    Endif
EndSub

✅ GX18 (después):

Sub 'XLS'
    // Obtener plantilla con GetBlob (código 61)
    &PlaCod = 61
    getblob.Call(&PlaCod, &NuevoArchivo, &PlaNom, &PlaExtArc, &mensaje, &ok)
    If &Ok <> 'S'
        msg(&mensaje)
        Return
    EndIf

    // Abrir Excel
    &ExcelDocument.Open(&NuevoArchivo)
    If &ExcelDocument.ErrCode <> 0
        msg('Error al abrir Excel: ' + &ExcelDocument.ErrDescription)
        &ExcelDocument.Close()
        Return
    EndIf

    // Encabezados fijos
    &ExcelDocument.Cells(1,  1).Text = &Head(1)
    &ExcelDocument.Cells(6,  2).Text = &Head(2)
    &ExcelDocument.Cells(6,  8).Text = &Head(3)
    &ExcelDocument.Cells(6, 11).Text = DTOC(&FisFecAct)
    &ExcelDocument.Cells(6, 13).Text = &Head(4)
    &ExcelDocument.Cells(1,  8).Text = &Head(6)

    // Encabezados de columnas
    &T = 7
    &P = 1
    Do While &T < 36
        If &Head(&T) <> ''
            &ExcelDocument.Cells(8, &P).Text = &Head(&T)
            &ExcelDocument.Cells(8, &P).Bold = True
        EndIf
        &T += 1
        &P += 1
    EndDo
EndSub
📖 Existe documentación aparte sobre cómo utilizar GetBlob y DownloadBlob para reemplazar el viejo PCrtFile / PCrtFilev2. Consultala en la wiki.

Luego en el sub Mues_XLS que comunmente sule estar en todos los procedimientos lo dejamos asi:
Sub ‘MuesExc’
         &ExcelDocument.Save()
        &ExcelDocument.Close()
EndSub

Es muy importante dejarlo asi ya que suele estar &ExcelDocument.Show() lo cual nos dara un error invisible

Rules:
Por ultimo agregaremos las variables nuevas del GetBlob como salida:
out:&mensaje, out:&PlaExtArc, out:&PlaNom,out:&NuevoArchivo

⚙️ Propiedades del objeto

Propiedad Valor
Call Protocol Internal
Main Program False

📄 Creación de PFiscImpPDF

También se partió de una copia del original FiscImpr (GX9) pero aplicando la lógica inversa:

1

Con Ctrl+F busqué todas las líneas que contenían Excel y las eliminé, ya que este procedimiento solo genera PDF.
Al igual que la llamada del PCrtFile o PCrtFileV2 y las lineas que debugean esos procedimientos como:

&Exist = FileExist(&ArcDes)
If &Exist = 0
        Msg(‘No existe plantilla: ‘ + &ArcDes)
        Return
EndIf

Rules:
Agregamos el output_file:
output_file(‘Impresion_Fiscalizacion’,’PDF’);

⚙️ Propiedades del objeto

Propiedad   PFiscImpPDF
Call Protocol   HTTP
Main Program   True
     
     

🖥️ Pantalla que llama a los procedimientos: WFiscExte

En la pantalla WFiscExte se agregaron 2 checkboxes: uno para XLS y otro para PDF. Al lado hay botones de acción (Agentes Percepción, Contribuyentes, Fisco, etc.). Según qué checkbox esté marcado, se llama al procedimiento correspondiente.

Ejemplo: Event ‘DoAgePer’ (Agentes de Percepción)

Event 'DoAgePer'
    // Si eligió PDF
    if &pdfgen = true
        pfiscimpPDF.Call('APE', ORGCOD, IdBien, FisCod, FisEstCod)
    endif

    // Si eligió Excel
    If &GenExe = True
        PFiscImprExcel.call('APE', ORGCOD, IdBien, FisCod,
                FisEstCod, &GenExe, &mensaje, &PlaExtArc,
                &PlaNom, &NuevoArchivo)
        DownloadBlob.link(&PlaExtArc, &PlaNom, &NuevoArchivo)
    EndIf
EndEvent

Ejemplo: Event ‘DoPeriodosGenerados’

En este caso la opción de Excel no está disponible, solo funciona PDF. Si el usuario marca XLS se muestra un mensaje con un toast informativo.

Event 'DoPeriodosGenerados'
    if &pdfgen = true
        If FisEstCod = 2 OR FisEstCod = 4
            PFisPerGen.Call(ORGCOD, IdBien, FisCod)
        Else
            msg('Esta opción esta disponible para Fiscalización/Sumario PROCESADOS')
        EndIf
    EndIf
    If &GenExe = True
        toast.Info('EXCEL NO DISPONIBLE',
            'Esta Opcion solo esta disponible en PDF', 5000, '')
    endif
EndEvent
ℹ️ El patrón es siempre el mismo: verificar el checkbox → llamar al procedimiento correspondiente. Para Excel, después del .call siempre va el DownloadBlob.link.
📖 Existe documentación en la wiki sobre cómo funciona DownloadBlob. Consultala para más detalle.
Deja un comentario 0

Your email address will not be published. Campos requeridos marcados *