diff --git a/PROYECTO/PRDIR/prfmmt022.4fd b/PROYECTO/PRDIR/prfmmt022.4fd
index 2d5a42c..29c98a7 100644
--- a/PROYECTO/PRDIR/prfmmt022.4fd
+++ b/PROYECTO/PRDIR/prfmmt022.4fd
@@ -40,7 +40,7 @@
-
+
diff --git a/PROYECTO/PRDIR/prfmrp116.4fd b/PROYECTO/PRDIR/prfmrp116.4fd
new file mode 100644
index 0000000..1fe32c7
--- /dev/null
+++ b/PROYECTO/PRDIR/prfmrp116.4fd
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROYECTO/PRDIR/prfmrp116.per b/PROYECTO/PRDIR/prfmrp116.per
index fa987e1..14f8158 100644
--- a/PROYECTO/PRDIR/prfmrp116.per
+++ b/PROYECTO/PRDIR/prfmrp116.per
@@ -48,7 +48,7 @@ DATEEDIT f1 = formonly.fecha type date,format = "dd/mm/yyyy";
o1 = formonly.num_oc,comments="Digite un numero de orden o deje en blanco para todas";
v1 = formonly.sec_vend,comments="Digite un numero de vendedor o deje en blanco para todos";
COMBOBOX s=formonly.salida,ITEMS=(("prprrp116.4rp","Detallado"),("prprrp016a.4rp","Resumido")),default="Detallado";
-COMBOBOX v=formonly.visualiza,ITEMS=(("SVG","PANTALLA"),("PDF","ACROBAT READER")),default="PANTALLA";
+COMBOBOX v=formonly.visualiza,ITEMS=(("SVG","PANTALLA"),("PDF","ACROBAT READER"),("XLSX","EXCEL")),default="PANTALLA";
instructions
delimiters " "
end
diff --git a/PROYECTO/PRDIR/prprcs001.4gl b/PROYECTO/PRDIR/prprcs001.4gl
index c8a91b2..ef7c4ff 100644
--- a/PROYECTO/PRDIR/prprcs001.4gl
+++ b/PROYECTO/PRDIR/prprcs001.4gl
@@ -71,7 +71,9 @@ DEFINE hoy DATE
END INPUT
CONSTRUCT BY NAME criterio ON a.tipo_cliente,a.sec_cliente,
- a.num_oc,a.fecha
+ a.num_oc,a.fecha_oc
+ FROM tipo_cliente,sec_cliente,
+ num_oc,fecha
AFTER CONSTRUCT
IF tipo_orden = 'N' THEN
diff --git a/PROYECTO/PRDIR/prprrp116.4gl b/PROYECTO/PRDIR/prprrp116.4gl
index 08fd939..c182d39 100644
--- a/PROYECTO/PRDIR/prprrp116.4gl
+++ b/PROYECTO/PRDIR/prprrp116.4gl
@@ -79,6 +79,8 @@ FUNCTION prprrp016()
END RECORD,
salida,visualiza CHAR(20)
+ DEFINE hay_datos SMALLINT
+
OPTIONS
PROMPT LINE 23,
FORM LINE 8,
@@ -201,12 +203,46 @@ FUNCTION prprrp016()
"WHERE ",criterio clipped,
" and a.status_t is null and f.status_t is null "
- END IF
+ END IF
PREPARE comando FROM selec
DECLARE busca CURSOR FOR comando
+ -- Verifica primero si hay registros: si el reporte se inicia sin filas,
+ -- el motor de reportes falla al no poder resolver p_compania.nombre
+ -- (variable "look ahead" del encabezado) porque nunca se llega a imprimir nada.
+ OPEN busca
+ FETCH busca INTO busqueda.cotizacion_no,busqueda.fecha,busqueda.tipo_cliente,
+ busqueda.sec_cliente,busqueda.nombre_proyecto,busqueda.direccion_proyecto,
+ busqueda.telefono_r,busqueda.nombre,busqueda.num_oc,busqueda.fecha_oc,
+ busqueda.fecha_entrega,busqueda.fecha_cierre,busqueda.cod_n,
+ busqueda.cod_grupo,busqueda.cod_tipo,busqueda.cod_sec,
+ busqueda.descrip_esp,busqueda.unidad_med,busqueda.cantidad,
+ busqueda.precio,busqueda.cantidad_2,busqueda.cod_mov,
+ busqueda.fecha_doc,busqueda.documento,busqueda.status_mov,
+ busqueda.simbolo,busqueda.vendedor,busqueda.monto_cotizacion,
+ busqueda.condicion,busqueda.estado_orden,busqueda.telefono,
+ busqueda.celular,busqueda.email,busqueda.contacto
+ IF STATUS = NOTFOUND THEN
+ CALL fgl_winmessage("WARNING","NO EXISTEN REGISTROS CON ESA CONDICION","SOP")
+ LET hay_datos = FALSE
+ ELSE
+ LET hay_datos = TRUE
+ END IF
+
+ # El formulario solo guarda el texto visible del combo (no el valor interno
+ # que tenia el .per original), asi que aqui se traduce de vuelta.
+ CASE salida CLIPPED
+ WHEN "Detallado" LET salida = "prprrp116.4rp"
+ WHEN "Resumido" LET salida = "prprrp016a.4rp"
+ END CASE
+ CASE visualiza CLIPPED
+ WHEN "PANTALLA" LET visualiza = "SVG"
+ WHEN "ACROBAT READER" LET visualiza = "PDF"
+ WHEN "EXCEL" LET visualiza = "XLSX"
+ END CASE
+
LET r_filename = salida CLIPPED
-
+
IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file
LET r_output=visualiza CLIPPED
LET preview=1
@@ -216,30 +252,13 @@ FUNCTION prprrp016()
END IF
-IF handler IS NOT NULL THEN -- report engine was configured ok
+IF handler IS NOT NULL AND hay_datos THEN -- report engine was configured ok and there is data to print
START REPORT reporte_16 TO XML HANDLER handler
-
-
- FOREACH busca INTO busqueda.cotizacion_no,busqueda.fecha,busqueda.tipo_cliente,
- busqueda.sec_cliente,busqueda.nombre_proyecto,busqueda.direccion_proyecto,
- busqueda.telefono_r,busqueda.nombre,busqueda.num_oc,busqueda.fecha_oc,
- busqueda.fecha_entrega,busqueda.fecha_cierre,busqueda.cod_n,
- busqueda.cod_grupo,busqueda.cod_tipo,busqueda.cod_sec,
- busqueda.descrip_esp,busqueda.unidad_med,busqueda.cantidad,
- busqueda.precio,busqueda.cantidad_2,busqueda.cod_mov,
- busqueda.fecha_doc,busqueda.documento,busqueda.status_mov,
- busqueda.simbolo,busqueda.vendedor,busqueda.monto_cotizacion,
- busqueda.condicion,busqueda.estado_orden,busqueda.telefono,
- busqueda.celular,busqueda.email,busqueda.contacto
-
-
-
- IF STATUS = NOTFOUND THEN
- CALL fgl_winmessage("WARNING","NO EXISTEN REGISTROS CON ESA CONDICION","SOP")
- EXIT FOREACH
- END IF
+ -- La primera fila ya fue leida arriba (para saber si hay_datos); aqui se
+ -- procesa esa fila y se sigue con FETCH manual hasta agotar el cursor.
+ WHILE hay_datos
IF busqueda.cantidad_2 IS NULL THEN
LET busqueda.cantidad_2 = 0
END IF
@@ -247,7 +266,7 @@ IF handler IS NOT NULL THEN -- report engine was configured ok
LET busqueda.fecha_avance= NULL
LET busqueda.monto_avance = NULL
- SELECT MAX(a.num_doc),MAX(a.fecha_orig)
+ SELECT MAX(a.num_doc),MAX(a.fecha_orig)
INTO busqueda.avance,busqueda.fecha_avance,
busqueda.monto_avance
FROM cctb00001 a
@@ -255,7 +274,7 @@ IF handler IS NOT NULL THEN -- report engine was configured ok
a.tipo_Doc = 'AV' and a.tipo_cliente = busqueda.tipo_cliente and
a.sec_cliente = busqueda.sec_cliente and a.status_t is null and
a.fecha_orig > '08/01/2009'
-
+
LET busqueda.codigo = busqueda.cod_n using "&&&&","-",
busqueda.cod_grupo USING "&&&&","-",
busqueda.cod_tipo USING "&&&&","-",
@@ -266,11 +285,27 @@ IF handler IS NOT NULL THEN -- report engine was configured ok
IF busqueda.estado_orden = "S" THEN
LET busqueda.estado_orden = "CERRADA"
END IF
-
+
OUTPUT TO REPORT reporte_16(busqueda.*)
- END FOREACH
+
+ FETCH busca INTO busqueda.cotizacion_no,busqueda.fecha,busqueda.tipo_cliente,
+ busqueda.sec_cliente,busqueda.nombre_proyecto,busqueda.direccion_proyecto,
+ busqueda.telefono_r,busqueda.nombre,busqueda.num_oc,busqueda.fecha_oc,
+ busqueda.fecha_entrega,busqueda.fecha_cierre,busqueda.cod_n,
+ busqueda.cod_grupo,busqueda.cod_tipo,busqueda.cod_sec,
+ busqueda.descrip_esp,busqueda.unidad_med,busqueda.cantidad,
+ busqueda.precio,busqueda.cantidad_2,busqueda.cod_mov,
+ busqueda.fecha_doc,busqueda.documento,busqueda.status_mov,
+ busqueda.simbolo,busqueda.vendedor,busqueda.monto_cotizacion,
+ busqueda.condicion,busqueda.estado_orden,busqueda.telefono,
+ busqueda.celular,busqueda.email,busqueda.contacto
+ IF STATUS = NOTFOUND THEN
+ LET hay_datos = FALSE
+ END IF
+ END WHILE
FINISH REPORT reporte_16
END IF
+ CLOSE busca
AFTER DIALOG
@@ -349,7 +384,7 @@ BEFORE GROUP OF x.cotizacion_no
PRINTX x.cotizacion_no,x.direccion_proyecto,x.nombre_proyecto,
x.tipo_cliente,x.sec_cliente,x.telefono_r,x.num_oc,x.fecha,x.fecha_cierre,
- x.fecha_entrega,x.fecha_oc
+ x.fecha_entrega,x.fecha_oc,p_compania.nombre
BEFORE GROUP OF x.codigo
diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw
index cac9f5c..2f76760 100644
--- a/PROYECTO/mbsERP.4pw
+++ b/PROYECTO/mbsERP.4pw
@@ -284,7 +284,61 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -323,7 +377,7 @@
-
+
@@ -340,7 +394,7 @@
-
+
@@ -373,6 +427,7 @@
+