PHP - Subtotal por grupo

 
Vista:
sin imagen de perfil
Val: 10
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Nostrum (9 intervenciones) el 12/05/2020 16:50:57
Buen día compañeros

Aprendiendo un poco en php necesito su apoyo para resolver un tema que no he podido hacer.
Tengo una tabla con N cantidad de datos de personas y horas trabajadas, necesito listar esa tabla y sacar subtotales por cada persona y un total general.

Mi consulta funciona perfectamente al igual que el total general, pero no he encontrado la forma de realizar los subtotales por cada persona y es donde requiero me brinden su apoyo.

Básicamente lo que quiero es esto:

1
2
3
4
5
6
7
8
ID	Nombre	Apellido	Fecha_Asistencia	Horas_Trabajadas	Horas_Extras
1	Maria	Perez	01/05/2020	                    5	                         1
2	Maria	Perez	02/05/2020	                    8	                         0
                         Total Persona             13	                         1
3	Pedro	Suarez	05/05/2020	                    4	                         1
4	Pedro	Suarez	06/05/2020	                    6	                         2
                        Total Persona              10	                         3
                        Total General              23     	                     4

Les comparto el código que hasta el momento he desarrollado y que me funciona en la lista y el total general pero no se como integrar subtotal por persona

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$sSQL = "SELECT * FROM sstncs WHERE Fecha_Asistencia BETWEEN '$Fecha_Inicio' and '$Fecha_Fin' ORDER BY Fecha_Asistencia, Apellido_Enfer, HoraI ";
$result = mysql_query($sSQL);
 
$Total_Horas_Extras = 0;
$Total_Horas_Trabajadas = 0;
 
while($row = mysql_fetch_assoc($result))
{
$Total_Horas_Trabajadas += $row["Horas_Trabajadas"];
$Total_Horas_Extras += $row["Horas_Extras"];
echo '<tr height="30" bgcolor="#F6F6F6">
<td nowrap>'.$row["Apellido_Enfer"]." ".$row["Nombre_Enfer"].'</td>
<td nowrap align="center">'.$row["Fecha_Asistencia"].'</td>
<td nowrap align="center">'.$row["Horas_Trabajadas"].'</td>
<td nowrap align="center">'.$row["Horas_Extras"].'</td>
</tr>';
}
echo '<tr height="30" bgcolor="#F6F6F6">
<td nowrap colspan="4" align="right">'.'Total General'.'</td>
<td nowrap align="center">'.$Total_Horas_Trabajadas.'</td>
<td nowrap align="center">'.$Total_Horas_Extras.'</td>
</tr>';
echo '</table>';
?>

Gracias de antemano por la atención y la ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Julio (830 intervenciones) el 12/05/2020 17:07:14
Hola.

Usa el mismo concepto que estás usando para obtener el total de horas trabajadas y el total de extras, sólo que pon a 0 el total de la persona cada vez que acabes una:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$personaActual = '';
$trabajadasActual = 0;
$extrasActual = 0;
 
while ($row = mysql_fetch_assoc($result)) {
	$persona = $row["Apellido_Enfer"] . ' ' . $row["Nombre_Enfer"];
	if ($personaActual === $persona || $personaActual === '') {
		$trabajadasActual += $row["Horas_Trabajadas"];
		$extrasActual += $row["Horas_Extras"];
 
		if ($personaActual === '') {
			$personaActual = $persona;
		}
	} else {
		echo '<td>Total Persona ' . $trabajadasActual . ' ' . $extrasActual . '</td>';
 
		$personaActual = $persona;
		$trabajadasActual = 0;
		$extrasActual = 0;
	}
 
        // Aquí el código que tienes
}
echo '<td>Total Persona ' . $trabajadasActual . ' ' . $extrasActual . '</td>';

Sólo algunos detalles. La primera vez la persona actual será la cadena vacía, por eso he puesto que pase por el valor del if si la persona actual tiene la cadena vacía (la primera vez será así y luego ya pondrá persona actual con el nombre de la persona actual). Cuando la persona cambie, entonces entrará en el else e imprimirá los totales, volviendo a colocar a 0 los contadores y cambiando de persona. Al terminar el while deberás imprimir el total de la última persona, por eso hay una impresión fuera.

OJO: todo esto funcionará si tus personas están siempre juntas, una detrás de la otra. Si tienes una persona al principio, luego otra distinta y luego de nuevo la del principio NO te va a funcionar así.

Creo que te funcionará tal cual, pero lo he hecho rápido y sin probar, así que pruébalo a ver si va bien.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Nostrum (9 intervenciones) el 12/05/2020 17:35:26
Genial mi estimado Julio. Hice pruebas con el código que me envías, no me hace lo que necesito pero me diste luces de como seguir.

Voy a probar con esta lógica a ver si consigo resolver y vuelvo con la solución cuando lo consiga

Muchas gracias de verdad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Nostrum (9 intervenciones) el 12/05/2020 19:59:53
Bueno he estado probando y sigue sin mostrar el subtotal

Con respecto a eso que dices de que solo va a funcionar si las personas están juntas creo que se soluciona con el ORDER BY en el SELECT no???? porque ya trae los datos ordenados por el apellido y nombre.

Por otro lado incorporé el código pero nada que logro hacer que me muestre el subtotal, solo muestra el de afuera con valores de un solo trabajador pero ni siquiera es el ultimo porque la prueba la hago solo con dos trabajdores y 7 registros de cada uno
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julio
Val: 2.007
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Julio (830 intervenciones) el 12/05/2020 20:08:41
Pon todo tu código ahora o no sé cómo ayudarte.

-----------------------------
Aprende la programación desde una perspectiva básica y simplista en Programación Básica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Nostrum (9 intervenciones) el 12/05/2020 20:20:27
Así lo tengo actualmente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
// ***** INICIO DE CONSULTA ***** \\
 
	$sSQL = "SELECT * FROM sstncs WHERE Fecha_Asistencia BETWEEN '$Fecha_Inicio' and '$Fecha_Fin' ORDER BY Apellido_Enfer, Fecha_Asistencia";
	$result = mysql_query($sSQL);
 
$personaActual = '';
$trabajadasActual = 0;
$extrasActual = 0;
 
while ($row = mysql_fetch_assoc($result))
{
	$persona = $row["Apellido_Enfer"] . ' ' . $row["Nombre_Enfer"];
 
	if ($personaActual === $persona || $personaActual === '')
	{
		$trabajadasActual += $row["Horas_Trabajadas"];
		$extrasActual += $row["Horas_Extras"];
 
		if ($personaActual === '')
		{
			$personaActual = $persona;
		}
	}
	else
	{
		echo '
		<td nowrap colspan="2" align="right">'.'Subtotal Persona'.'</td>
		<td nowrap align="center">'.$trabajadasActual.'</td>
		<td nowrap align="center">'.$extrasActual.'</td>';
 
		$personaActual = $persona;
		$trabajadasActual = 0;
		$extrasActual = 0;
	}
 
$Total_Horas_Extras = 0;
$Total_Horas_Trabajadas = 0;
$Total_Horas = 0;
 
while($row = mysql_fetch_assoc($result))
{
 
$Total_Horas_Trabajadas += $row["Horas_Trabajadas"];
$Total_Horas_Extras += $row["Horas_Extras"];
 
echo '<tr height="30" bgcolor="#F6F6F6">
<td nowrap>'.$row["Apellido_Enfer"]." ".$row["Nombre_Enfer"].'</td>
<td nowrap align="center">'.date('d-m-Y', strtotime($row['Fecha_Asistencia'])).'</td>
<td nowrap align="center">'.$row["Horas_Trabajadas"].'</td>
<td nowrap align="center">'.$row["Horas_Extras"].'</td>
</tr>';
 
}
}
echo '
		<td nowrap colspan="2" align="right">'.'Subtotal Externo'.'</td>
		<td nowrap align="center">'.$trabajadasActual.'</td>
		<td nowrap align="center">'.$extrasActual.'</td>';
 
echo '<tr height="30" bgcolor="#F6F6F6">
<td nowrap colspan="2" align="right">'.'Total General'.'</td>
<td nowrap align="center">'.$Total_Horas_Trabajadas.'</td>
<td nowrap align="center">'.$Total_Horas_Extras.'</td>
</tr>';
echo '</table>';
?>

No está entrando nunca al else cuando cambia de persona por lo que no imprime el subtotal respectivo, incluso algo debe estar afectando el array porque me está suprimiendo el primer registro en el print del listado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 16 puestos en PHP (en relación al último mes)
Gráfica de PHP

Subtotal por grupo

Publicado por Nostrum (9 intervenciones) el 12/05/2020 20:56:26
Listooooo!!!! ya quedó mi estimado Julio

Ya logré hacerlo totalizar por persona, el tema era los dos while iguales que me imagino estaban dando conflicto.

Dejo el código que me funciona para futuras consultas

De corazón GRACIAS!!!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
// ***** INICIO DE CONSULTA ***** \\
 
	$sSQL = "SELECT * FROM sstncs WHERE Fecha_Asistencia BETWEEN '$Fecha_Inicio' and '$Fecha_Fin' ORDER BY Apellido_Enfer, Fecha_Asistencia";
	$result = mysql_query($sSQL);
 
$personaActual = '';
$trabajadasActual = 0;
$extrasActual = 0;
 
while ($row = mysql_fetch_assoc($result))
{
	$persona = $row["Apellido_Enfer"] . ' ' . $row["Nombre_Enfer"];
 
	if ($personaActual === $persona || $personaActual === '')
	{
		$trabajadasActual += $row["Horas_Trabajadas"];
		$extrasActual += $row["Horas_Extras"];
 
		if ($personaActual === '')
		{
			$personaActual = $persona;
		}
	}
	else
	{
		echo '
		<td nowrap colspan="2" align="right">'.'Subtotal Persona'.'</td>
		<td nowrap align="center">'.$trabajadasActual.'</td>
		<td nowrap align="center">'.$extrasActual.'</td>';
 
		$personaActual = $persona;
		$trabajadasActual = 0;
		$extrasActual = 0;
	}
 
 
 
$Total_Horas_Extras = 0;
$Total_Horas_Trabajadas = 0;
$Total_Horas = 0;
 
 
 
$Total_Horas_Trabajadas += $row["Horas_Trabajadas"];
$Total_Horas_Extras += $row["Horas_Extras"];
 
echo '<tr height="30" bgcolor="#F6F6F6">
<td nowrap>'.$row["Apellido_Enfer"]." ".$row["Nombre_Enfer"].'</td>
<td nowrap align="center">'.date('d-m-Y', strtotime($row['Fecha_Asistencia'])).'</td>
<td nowrap align="center">'.$row["Horas_Trabajadas"].'</td>
<td nowrap align="center">'.$row["Horas_Extras"].'</td>
</tr>';
 
}
 
echo '
		<td nowrap colspan="2" align="right">'.'Subtotal Externo'.'</td>
		<td nowrap align="center">'.$trabajadasActual.'</td>
		<td nowrap align="center">'.$extrasActual.'</td>';
 
echo '<tr height="30" bgcolor="#F6F6F6">
<td nowrap colspan="2" align="right">'.'Total General'.'</td>
<td nowrap align="center">'.$Total_Horas_Trabajadas.'</td>
<td nowrap align="center">'.$Total_Horas_Extras.'</td>
</tr>';
echo '</table>';
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar