Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
ada:sicoferp:financiero:presupuesto:compromisos:rp_consulta [2022/07/13 15:38] 200.21.21.42 |
ada:sicoferp:financiero:presupuesto:compromisos:rp_consulta [2026/07/14 21:28] (actual) 192.168.175.197 [Inclusión de Código CPC DANE - Reporte de Compromisos] |
||
|---|---|---|---|
| Línea 23: | Línea 23: | ||
| En esta pestaña se encuentra el rubro, la disponibilidad y el articulo que quedara asociado al compromiso. | En esta pestaña se encuentra el rubro, la disponibilidad y el articulo que quedara asociado al compromiso. | ||
| + | |||
| + | ===== Implementación del Botón "Exportar a PDF" ===== | ||
| + | |||
| + | === 1. Propósito === | ||
| + | |||
| + | Se ha implementado una funcionalidad que permite a los usuarios exportar los detalles de los registros consultados a formato PDF. Esta característica mejora la portabilidad y el archivo de los documentos generados por el sistema. | ||
| + | |||
| + | === 2. Módulos Afectados === | ||
| + | La funcionalidad se ha agregado a las siguientes ventanas de consulta: | ||
| + | |||
| + | Disponibilidades (w_disponibilidad_cons) | ||
| + | Compromisos (w_compromiso_cons) | ||
| + | Recepciones de pedido (w_causacion_documento) | ||
| + | Órdenes de pago (w_ordenes_pago_cons) | ||
| + | === 3. Componentes Técnicos Clave === | ||
| + | La implementación se basa en los siguientes elementos de PowerBuilder: | ||
| + | |||
| + | Botón: cb_exportar_pdf | ||
| + | Evento clicked: Llama a la función principal de generación de PDF. | ||
| + | Función Principal: wf_generar_pdf() | ||
| + | Responsabilidad: Contiene toda la lógica para iterar sobre los registros seleccionados, configurar las propiedades del PDF y generar los archivos. | ||
| + | |||
| + | === 4. Flujo de Ejecución === | ||
| + | El proceso que sigue el sistema al hacer clic en el botón es el siguiente: | ||
| + | |||
| + | Verificación de Directorios: El sistema comprueba si la ruta C:\COMPROBANTES\[Modulo] existe. Si no, la crea. | ||
| + | Iteración de Registros: Se recorre la lista principal (dw_lista) para identificar todas las filas que el usuario ha seleccionado. | ||
| + | Preparación del DataStore: Para cada registro seleccionado: | ||
| + | Se crea un uo_datastore en memoria. | ||
| + | Se le asigna el DataObject del reporte correspondiente (ej: f_formato_documento(2, '01')). | ||
| + | Se ejecuta el Retrieve() para cargar los datos específicos del registro. | ||
| + | Configuración de Exportación a PDF: Se establecen las propiedades del DataWindow para la correcta generación del PDF. Este es el paso más crítico. | ||
| + | Generación del Archivo: Se invoca la función ldw_dw.SaveAs(ls_pathfilename, PDF!, TRUE). | ||
| + | Notificación: Al finalizar el bucle, se informa al usuario si la exportación fue exitosa o si no se seleccionó ningún registro. | ||
| + | |||
| + | === 5. Configuración Técnica y Dependencias (¡Muy Importante!) === | ||
| + | Para que la exportación a PDF funcione correctamente en los equipos de los usuarios, se deben cumplir los siguientes requisitos, ya que se utiliza el método Distill!. | ||
| + | |||
| + | Método de Exportación: DataWindow.Export.PDF.Method = Distill! | ||
| + | |||
| + | Este método utiliza un motor externo para "destilar" un archivo PostScript a PDF, lo que ofrece alta fidelidad con el diseño original. | ||
| + | Dependencia 1: Ghostscript | ||
| + | |||
| + | Requisito: Debe estar instalado en cada máquina cliente que vaya a utilizar esta funcionalidad. | ||
| + | Configuración: La carpeta bin de la instalación de Ghostscript (que contiene gswin32c.exe) debe estar agregada a la variable de entorno PATH del sistema. De lo contrario, PowerBuilder no lo encontrará y el SaveAs devolverá un error -1. | ||
| + | Dependencia 2: Impresora Virtual "Sybase DataWindow PS" | ||
| + | |||
| + | Requisito: Debe existir una impresora con el nombre exacto Sybase DataWindow PS. | ||
| + | Instalación Manual: | ||
| + | Ir a Dispositivos e Impresoras y Agregar una impresora. | ||
| + | Seleccionar "Agregar una impresora local o de red con configuración manual". | ||
| + | Elegir "Usar un puerto existente" y seleccionar FILE: (Imprimir a un archivo). | ||
| + | Seleccionar un controlador (driver) PostScript (PS). Uno genérico como HP LaserJet 2200 Series PS es una opción segura. | ||
| + | Asignar el nombre exacto: Sybase DataWindow PS. | ||
| + | No compartirla y finalizar la instalación. | ||
| + | |||
| + | === 6. Solución a Problemas Comunes Implementada en el Código === | ||
| + | Durante el desarrollo, se encontraron y solucionaron los siguientes inconvenientes: | ||
| + | |||
| + | Problema: El contenido del reporte se cortaba horizontalmente, generando una segunda página en blanco a la derecha. | ||
| + | Causa: Discrepancias entre el tamaño de papel del diseño del DataWindow y la configuración de la impresora virtual o los márgenes por defecto del motor de PDF. | ||
| + | Solución: Se realiza configuración con la resolución de la pantalla para que permita la exportación correcta resolución de 1366 x 768. | ||
| + | |||
| + | == continuación, se muestra el fragmento de código relevante de la función wf_generar_pdf en w_causacion_documentos.srw: == | ||
| + | String ls_tipo, ls_ruta, ls_pathfilename,ls_valor,ls_estado | ||
| + | long ll_selected, ll_count, ll_reintentos, ll_filesize, i, ll_estado_valido | ||
| + | Decimal ld_cod_documento, ld_consecutivo_recep_pedido | ||
| + | integer li_ret | ||
| + | |||
| + | uo_datastore ldw_dw | ||
| + | ldw_dw = Create uo_datastore | ||
| + | |||
| + | ll_count = carpeta.pagina1.dw_lista.RowCount() | ||
| + | ll_selected = 0 | ||
| + | |||
| + | ls_ruta = "C:\COMPROBANTES\Causaciones" | ||
| + | IF NOT DirectoryExists("C:\COMPROBANTES") THEN CreateDirectory("C:\COMPROBANTES") | ||
| + | IF NOT DirectoryExists(ls_ruta) THEN CreateDirectory(ls_ruta) | ||
| + | |||
| + | FOR i = 1 TO ll_count | ||
| + | ll_estado_valido = 0 | ||
| + | ld_consecutivo_recep_pedido = carpeta.pagina1.dw_lista.GetItemDecimal(i, "consecutivo") | ||
| + | ls_estado = carpeta.pagina1.dw_lista.GetItemString(i, "estado") | ||
| + | |||
| + | IF carpeta.pagina1.dw_lista.IsSelected(i) AND ld_consecutivo_recep_pedido <> 0 THEN | ||
| + | |||
| + | IF ls_estado = 'Y' or ls_estado = 'P' or ls_estado = 'p' THEN | ||
| + | MessageBox("Error", "No se pudo exportar la causación: " + String(ld_consecutivo_recep_pedido) & | ||
| + | + " El estado actual no es válido para este proceso.") | ||
| + | ll_estado_valido = 1 | ||
| + | END IF | ||
| + | |||
| + | ld_cod_documento = carpeta.pagina1.dw_lista.GetItemDecimal(i, "codigo_documento") | ||
| + | | ||
| + | guo_app.of_sql_embedded_context( sqlca ) | ||
| + | SELECT VALOR_ALFA | ||
| + | INTO :ls_valor | ||
| + | FROM M_CONSTANTES | ||
| + | WHERE TRIM(DESCRIPCION) = 'CAUSACION CONTABLE' | ||
| + | USING SQLCA; | ||
| + | |||
| + | ldw_dw.DataObject = ls_valor // f_formato_documento(4, '01') | ||
| + | |||
| + | ldw_dw.SetTransObject(ts_transaccion) | ||
| + | li_ret = ldw_dw.Retrieve(ld_cod_documento) | ||
| + | |||
| + | ls_pathfilename = ls_ruta + "\CXP" +' '+ String(ld_consecutivo_recep_pedido) + ".pdf" | ||
| + | ldw_dw.Object.DataWindow.Export.PDF.Method = Distill! | ||
| + | ldw_dw.Object.DataWindow.Printer = "Sybase DataWindow PS" | ||
| + | ldw_dw.Modify("DataWindow.PDF.XSLFOP.Print=NO") | ||
| + | ldw_dw.object.DataWindow.Export.PDF.Distill.CustomPostScript = "YES" | ||
| + | |||
| + | li_ret = ldw_dw.SaveAs(ls_pathfilename, PDF!, TRUE) | ||
| + | |||
| + | IF li_ret <> 1 OR ll_estado_valido = 1 THEN | ||
| + | MessageBox("Error", "No se pudo exportar la recepción de pedido: " + String(ld_consecutivo_recep_pedido)) | ||
| + | END IF | ||
| + | ll_selected++ | ||
| + | END IF | ||
| + | NEXT | ||
| + | IF ll_selected > 0 THEN | ||
| + | MessageBox("Información", "Se finalizó la exportación.") | ||
| + | ELSE | ||
| + | MessageBox("Sin acción", "No se seleccionó ningún documento válido para ser exportado.") | ||
| + | END IF | ||
| + | |||
| + | RETURN 1 | ||
| + | |||
| + | === Desarrollado por: [Miguel Muñoz] Fecha: [02/07/2026] Versión de PB: 12.5 === | ||
| + | |||
| + | |||
| + | ===== Inclusión de Código CPC DANE - Reporte de Compromisos ===== | ||
| + | === 1. Descripción del Cambio === | ||
| + | Se integró el campo "Código CPC DANE" en el reporte de detalles de compromiso. Para lograr una visualización limpia, se optimizó el diseño del reporte ocultando espacios innecesarios y priorizando la aparición de este nuevo dato. | ||
| + | |||
| + | |||
| + | === 2. Solución Funcional === | ||
| + | Nueva Información: Ahora el reporte muestra el Código CPC DANE asociado a los artículos del compromiso, un dato necesario para la clasificación y reportes de la entidad. | ||
| + | Mejora Visual: Se ajustó el diseño del reporte para ocultar campos que estaban en blanco o sin uso. Esto permitió liberar espacio y "pintar" el nuevo código de forma clara y ordenada sin saturar el documento. | ||
| + | |||
| + | |||
| + | === 3. Solución Técnica === | ||
| + | Librería Modificada: sf01cmps.pbl | ||
| + | Objeto Modificado: DataWindow r_compromiso_doc_det_cefit | ||
| + | Detalles del Cambio: | ||
| + | Consulta SQL: Se modificó la sentencia SQL del DataWindow para incluir un nuevo campo proveniente de la tabla maestra de artículos: MAESTRO_ARTICULOS.CODIGO_DANE. | ||
| + | Ajuste de Layout: En el diseñador del DataWindow, se reorganizaron los objetos. Se ocultaron los campos que no contenían información para posicionar y hacer visible el nuevo campo de código DANE en el espacio recuperado. | ||
| + | |||
| + | |||
| + | === 4. Datos del Objeto === | ||
| + | Módulo: Presupuesto | ||
| + | Reporte: Detalle de Compromisos (CEFIT). | ||
| + | DataWindow: r_compromiso_doc_det_cefit. | ||