Buenas tardes:
Me presento, me llamo Fernando, soy nuevo en el foro. Vi muchísimos post que hicieron aquí y muchos me
ayudaron, pero ésta es la primera vez que yo hago una pregunta.
Resulta que en mi trabajo estoy haciendo consultas a Oracle con php para generar un excel, pero siempre me
omite el primer registro, al principio pense que los titulos lo estaban tapando pero debugeando pareciera que
directamente no tengo ese primer registro.
Si realizo la consulta directamente con un cliente como el toad me devuelve 36 rows, mientras que el mismo
procedimiento a traves de mi aplicacion php me devuelve solo 35 suprimiendome el primero.
Código PHP:
GenerarExcel::prestadoresTerapiaRadiante('name.xls', 'UP3069986282300', '05/2011',);
Código PHP:
static public function prestadoresTerapiaRadiante($nombre, $usuario, $periodos, $debug = false) {
self::$_nombre = $nombre;
$usuario = implode(',', self::formatearUsuarios($usuario));
$periodos = self::formatearPeriodo($periodos);
$sql = "BEGIN prestadoresTerapiaRadiante(:p_usuario, :p_periodos , :salida); END;";
$conex = Conexion::getInstancia(USUARIO2, PASSWORD2, BASE2, SERVIDOR2);
$stid = oci_parse($conex, $sql);
oci_bind_by_name($stid, ':p_usuario', $usuario, -1, SQLT_CHR);
oci_bind_array_by_name($stid, ':p_periodos', $periodos, count($periodos), -1, SQLT_INT);
$salida = oci_new_cursor($conex);
oci_bind_by_name($stid, ":salida", $salida, -1, OCI_B_CURSOR);
oci_execute($stid);
oci_execute($salida);
return self::generar($salida, $debug);
}
Código PHP:
static private function generar($stid, $debug) {
$rows = oci_fetch($stid);
if ($rows && !$debug) {
$filename = self::$_nombre;
$workbook = new Spreadsheet_Excel_Writer();
$workbook->send($filename);
$workbook->setVersion(8);
$workbook->setTempDir(self::$_temporal);
$worksheet = & $workbook->addWorksheet('Items');
$worksheet->setInputEncoding('UTF-8');
$worksheet->setMargins(0.25);
$worksheet->centerHorizontally(1);
$worksheet->activate();
$format_header = & $workbook->addFormat();
$format_header->setBold();
$format_header->setSize(12);
$format_row = & $workbook->addFormat();
$format_row->setSize(12);
$i = 0;
$j = 1;
while ($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_LOBS)) {
foreach ($row as $key => $valor) {
if ($j == 1) {
$worksheet->write(0, $i, $key, $format_header);
}
//$worksheet->writeString($j, $i, $valor, $format_row);
$i++;
}
$i = 0;
$j++;
}
$workbook->close();
exit;
}
return $rows;
}
Y el procedimiento oracle que ejecuta
Código:
CREATE OR REPLACE PROCEDURE NMP_PAMI_LIQUIDACION.prestadoresTerapiaRadiante(
p_usuario IN varchar2,
p_periodos IN Types.arraynumber,
p_recordset OUT Types.cursor_type) AS
BEGIN
FOR i IN 1 .. p_periodos.COUNT LOOP
insert into tmp_numeros values ( p_periodos(i) );
END LOOP;
COMMIT;
OPEN p_recordset FOR
select t.c_usuario, t.c_anio, t.c_mes, t.n_instalacion, r.*, s.*
from nmp_pami.nmt_proceso_calculo_archivos t
inner join
(select pca.c_anio, pca.c_mes, pca.c_usuario, pca.n_instalacion, max(pca.c_file_upload)
c_file_upload, c_mr_tcalc
from nmp_pami.nmt_proceso_calculo_archivos pca
where pca.marca_a_procesar = 1
and (pca.c_anio * 100 + pca.c_mes) in (select numero from tmp_numeros)
and pca.c_mr_tcalc = 'CAP'
and pca.c_usuario = p_usuario
group by pca.c_anio, pca.c_mes, pca.c_usuario, pca.n_instalacion, c_mr_tcalc) j
on t.c_file_upload = j.c_file_upload
and t.c_mr_tcalc = j.c_mr_tcalc
inner join nmp_pami.nmt_prestacion_ti r
on r.c_file = t.c_file_upload
inner join nmp_pami.nmt_practica_prest_ti s
on r.c_file = s.c_file
and r.n_prestacion = s.n_prestacion
and s.c_modulo_pami in (30,31,32,33)
where exists (select a.n_beneficio,a.c_grado_paren, d.c_usuario, sum(q_practica)
from nmp_pami.nmt_prestacion_ti a
inner join nmp_pami.nmt_practica_prest_ti c
on a.c_file = c.c_file
and a.n_prestacion = c.n_prestacion
and c.c_modulo_pami in (30,31,32,33)
inner join nmp_pami.nmt_proceso_calculo_archivos d
on a.c_file = d.c_file_upload
and d.marca_a_procesar = 1
and (d.c_anio * 100 + d.c_mes) in (select numero from tmp_numeros)
and d.c_mr_tcalc = 'CAP'
where t.c_usuario = d.c_usuario
and r.n_beneficio = a.n_beneficio
and r.c_grado_paren = a.c_grado_paren
group by a.n_beneficio,a.c_grado_paren, d.c_usuario
having sum(q_practica) >1)
order by t.c_usuario,r.n_beneficio,r.c_grado_paren,s.c_modulo_pami,r.c_file,s.c_practica;
delete tmp_numeros;
commit;
END prestadoresTerapiaRadiante;
/
Bueno, gracias y Saludos