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
📋 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:
→
+
📊 Creación de PFiscImprExcel
Se partió de una copia del original FiscImpr (GX9) y se aplicaron estos pasos:
Pasos realizados
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.
En la sección de Layout borré todo el contenido (los printblocks del PDF).
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.
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
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:
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
.call siempre va el DownloadBlob.link.