Manejar Rowspan con php

Necesito generar una tabla a partir de una consulta a oracle con php, pero necesito que los campos repetidos aparezcan como uno solo en una celda combinada
Si alguien sabe una manera de hacer esto lo agradecería mucho

1 respuesta

Respuesta
1
Tu problema se puede resolver por dos caminos: uno fácil y el otro difícil.
- Camino fácil: ¿Tu consulta t arroja campos duplicados? Será porque tienes una consulta hacia varias tablas con nombres de campos iguales. Entonces la manera de resolver esto no es mediante PHP sino mediante SQL. Ejemplo:
Tabla 1
iduser | nombre | paterno
tabla 2
idsocio | iduser | fecha_alta
Supongamos q tenemos estas dos tablas la consulta q t regresaría campos duplicados sería:
SELECT * FROM tabla1
LEFT OUTER JOIN tabla2
ON (tabla1.iduser = tabla2.iduser)
esto me daría un resultado:
iduser | nombre | paterno | idsocio | iduser | fecha_alta
y tendría dos campos iduser q tienen la misma información.
Solución:
SELECT tabla1.*, tabla2.idsocio, tabla2.fecha_alta FROM tabla1
LEFT OUTER JOIN tabla2
ON (tabla1.iduser = tabla2.iduser)
- Camino difícil: Generar un loop para barrer lo renglones del recordset obtenido y dentro de este otro para recorrer los campos por cada renglón, como sabemos cuales son los nombres de los campos que arroja la consulta, generamos una condición que cuando los campos se llamen así o así los omita o incluya en la celda por o algo por el estilo.
No t recomendaría esta solución, pues "duplicarias" las operaciones en los servers, pues el DB Server primero se encargó de hacer la relación de los registros que ya están duplicados, y después tu Web Server tendrá que volver a hacer otra vez la chamba de leerlos todos y hacer otras operaciones.
Si lo puedes resolver con SQL mucho mejor
Saludos !
Atentamente:
Mack
-------------------------------------------------------------
Be Free, be Linux
de antemano gracias por la alluda, pero lo que pasa es que estoy generando una consulta de agrupacion
select modalidad,nombrefac,nombreprg
from TB_PLA_PROGRAMAS,TB_PLA_FACULTADES,TB_PLA_MODALIDADES
where TB_PLA_PROGRAMAS.CODFAC=TB_PLA_FACULTADES.CODFAC and TB_PLA_MODALIDADES.CODMOD=TB_PLA_PROGRAMAS.CODMOD
order by modalidad desc ,nombrefac";
que es más o menos así:
pregrado c basicas i sistemas
Pregrado c básicas i física
Postgrado c básicas matemáticas
Postgrado salud medicina
Y quiero la tabla pintada así:
Pregrado* c básicas i sistemas
i física
Postgrado c básicas matemáticas
Salud medicina
*con estas celdas combinadas
Muchas gracias tuxx
Obviamente esto supone que tus datos los recibes en un RecordSet al cual puedes accesar como un arreglo y que sabes como hacer todo esto.
El código en PHP sería de la siguiente forma:
for ($j = 0; $j < count ($Recordset1 [0]); ++$j) {
$k = -1;
$rowspan = 1;
for ($i = 0; $i < count ($Recordset1); ++$i) {
if ($i > 0) {
if ($Recordset1 [$i][$j] == $Recordset1 [$i - 1][$j]) {
$k = ($k == -1)? $i - 1: $k;
$rowspan++;
$formato [$i][$j] = 0;
if ($i == count ($Recordset1) - 1) {
$formato [$k][$j] = $rowspan;
}
} else {
if ($i > 0 && $k > -1) {
$formato [$k][$j] = $rowspan;
$formato [$i][$j] = 1;
} else {
$formato [$i][$j] = 1;
}
$rowspan = 1;
$k = -1;
}
} else {
$formato [$i][$j] = 1;
$rowspan = 1;
$k = -1;
}
}
}
echo "<br>\n";
echo "Arreglo Rowspan: ".print_r ($formato);
echo "<br><br>\n";
$s = "<table id=\"main\" colspan=1 border=1>\n";
$s .= "<tbody>\n";
for ($i = 0; $i < count ($Recordset1); $i++) {
$s .= "\t<tr>\n";
for ($j = 0; $j < count ($Recordset1[0]); $j++) {
if ($formato [$i][$j] > 0) {
$s .= "\t\t<td rowspan=".$formato [$i][$j]." style=\"width: 80px\">";
$s .= ($Recordset1 [$i][$j] == "")? " ": $Recordset1 [$i][$j];
$s .= "</td>\n";
}
}
$s .= "\t</tr>\n";
}
$s .= "</tbody>\n</table>\n";
echo $s;
Saludos !
Atentamente: Mack
----------------------------------------
Al principio era UNIX, y UNIX habló y dijo:
"Hello World\n",
no dijo: "Hello New Jersey\n",
ni "Hello USA\n"...
Se me ocurre una solución solo que puede ser un poco compleja (basada en arreglos o matrices):
Primero tendrías que analizar tu RecordSet sobre las columnas sobre las que operaras para unir las celdas, e ir almacenando en otra variable la información de los renglones en donde se ubican las celdas a unir para poder hacer el rowspan de "N" filas
Usando notación genérica:
for ($j = 0; $j < columnas.arreglo.recordset; incrementa ($j)) {
// Inicializamos variables
$k = -1; // Puntero para determinar la celda en donde se comenzará el span
$rowspan = 1; // Cuantas celdas se incluiran en el span
// Definimos la variable en donde almacenaremos los valores para el atributo
// rowspan d nuestra tabla
$formato as new arreglo // En los lenguajes q lo necesiten definimos $formato
// como un arreglo q corresponda con las dimensiones del RecordSet
for ($i = 0; $i < filas.arreglo.recordset; incrementa ($i)) {
if ($i > 0) {
if ( valor.elemento.actual.recordset == valor.elemento.anterior.recordset) {
$k = ($k tiene el valor inicial)? valor.fila.actual sino $k;
incrementa ($rowspan); // vamos contando cuantas celdas con el mismo valor existen
valor.elemento.actual.$formato = 0;
if ($i == filas.arreglo.recordset - 1) {
valor.elemento.fila[$k]columna[$j].$formato = $rowspan;
}
} else {
if ($i > 0 && $k > -1) {
valor.elemento.fila[$k]columna[$j].$formato = $rowspan;
valor.elemento.actual.$formato = 1;
} else {
valor.elemento.actual.$formato = 1;
}
// Reinicializamos nuestras variables punteros
$rowspan = 1;
$k = -1;
}
} else {
valor.elemento.actual.$formato = 1;
// Reinicializamos nuestras variables punteros
$rowspan = 1;
$k = -1;
}
}
}
// Para imprimirlo:
$S as string // Declaramo una variable en donde arrojamos la cadena d texto q
// formará nuestra tabla (En los lenguajes q necesiten q se declaren antes las variables)
// formamos el encabezado de la tabla
$s = "<table id=\"main\" colspan=1 border=1>\n";
$s .= "<tbody>\n";
for ($i = 0; $i < filas.arreglo.recordset; incrementa ($i)) {
$s .= "\t<tr>\n";
for ($j = 0; $j < columnas.arreglo.recordset; incrementa ($j)) {
if (valor.elemento.actual.$formato > 0) {
$s .= "\t\t<td rowspan=";
$s .= valor.elemento.actual.$formato;
$s .= ">";
$s .= (valor.elemento.actual.recordset es nulo o vacio)? " " sino valor.elemento.actual.recordset;
$s .= "</td>\n";
}
}
$s .= "\t</tr>\n";
}
$s .= "</tbody>\n</table>\n";
imprime $s;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas