PHP - ayuda para como totalizar por lote de registros

 
Vista:
sin imagen de perfil

ayuda para como totalizar por lote de registros

Publicado por Marcelino (6 intervenciones) el 05/02/2024 01:12:19
Necesito por favor su ayuda para como totalizar por nro de apto ejemplo cuando termine de imprimir el apartamento 01-01 totalice el monto y asi sucesivamente y luego lo haria con el siguiente.
aqui envio el reporte. Por favor ayudenme con este caso.

reporte
y este es el codigo:
coloque en negrita la pregunta cuando el nroapto sea diferente al siguiente pero no lo esta haciendo en realidad.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
 
$conexion = pg_connect("host=localhost port=5432 dbname=administra user=postgres password=Wrap*/1808");
   //define('./PDF/font/');
require('WriteTag.php');
 $deudas = "SELECT * FROM vvista WHERE nroedif = '{$_POST['nroedif']}'";
 
class PDF extends PDF_WriteTag
{
//Cabecera de página
function Header()
{
    $this->SetFont('Arial','B',8);
    $this->Cell(90, 5, 'Residencias', 0, 0, 'L');
    $this->Ln(6);
    $this->Cell(95, 5, 'Fecha: '.date('d/m/Y'), 0, 1, 'L');
    $this->Cell(80);
    $this->Cell(30,10,'Listado General de la Deuda',0,0,'C');
    //Logo
     /*$this->Image('archivo',x,y,w,h);*/
     //$this->Image('imagenes/dibujo.JPG',55,10,100,20);
	 $this->Ln(20);
//$this->Cell(190, 10, 'Listado de la Deuda', 0, 1, 'C');
     $this->SetFont('Times', '', 10);
     $this->Cell(15,10,"Nombres",0,0,'L');
     $this->Cell(30,10,"Apellidos",0,0,'R');
     $this->Cell(40,10,"Monto",0,0,'R');
	 $this->Cell(50,10,"Fecha",0,1,'R');
	 $this->Line($this->GetX(), $this->GetY(), 205, $this->GetY());
    //Arial bold 15
     $this->SetFont('Arial','B',8);
	 $this->Ln(8);
}
//Pie de página
function Footer()
{
    //Posición: a 1,5 cm del final
    $this->SetY(-20);
    //Arial italic 8
    $this->SetFont('Arial','I',8);
    //Número de página
    $this->Cell(0,10,'Pag '.$this->PageNo(),0,0,'C');
}
}
//--Fin de la Clase
//Creación del objeto de la clase heredada
$pdf=new PDF('P','mm','Letter');
$pdf->AddPage();
$pdf->Ln(4);
$pdf->SetFillColor(200);
$contador = $tdeuda = 0;
$nroapto = '';
 
//$deudas = "SELECT * FROM vdeuda ORDER BY nombres";
$lisdeuda = @pg_query($conexion,$deudas);
while($select2 = @pg_fetch_array($lisdeuda)){
 
        $pdf->SetFont('Arial','B',8);
        $monto  = $select2['total'];
        $nroapto = $select2['nroapto'];
        $contador++;
        $pdf->SetFont('Arial','I',8);
        $pdf->Cell(15,4,$select2['nombres'],0,0,'L',(($contador%2)==0));
        $pdf->Cell(30,4,$select2['apellidos'],0,0,'R',(($contador%2)==0));
        $pdf->Cell(30,4,$select2['nroapto'],0,0,'R',(($contador%2)==0));
        if($select2['nroapto']!=$nroapto)
          {
               $contador++;
               $pdf->Cell(112,4,"Total--->",0,0,'R');
               $pdf->Cell(14,4,number_format($tdeuda,2,'.',','),0,1,'R');
               $tdeuda = 0;
          }
        $pdf->Cell(40,4,number_format($monto,2,'.',','),0,0,'R',(($contador%2)==0));
        $pdf->Cell(47,4,$select2['fecha'],0,1,'R',(($contador%2)==0));
        $pdf->SetFont('Arial','I',8);
        $tdeuda +=$monto;
}
        $pdf->SetFont('Arial','B',8);
        $pdf->Cell(112,4,"Total--->",0,0,'R');
        $pdf->Cell(14,4,number_format($tdeuda,2,'.',','),0,1,'R');
        $totalde +=$tdeuda;
        $pdf->SetFont('Arial','B',8);
$totald = 0;
$pdf->Output();
$pdf->Close();
?>
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

ayuda para como totalizar por lote de registros

Publicado por Mauro (1036 intervenciones) el 05/02/2024 14:38:54
Hola Marcelino:

Lo que deberías hacer es obtener los datos ordenados por el nroapto y hacer un bucle dentro de otro. Lo que se conoce como corte de control.

Saludos,
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

ayuda para como totalizar por lote de registros

Publicado por Marcelino (6 intervenciones) el 05/02/2024 18:08:30
Hola Mauro, bueno estoy tratando implementar tu sugerencia pero no puedo complementarlo con php

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
<?php
 $deudas = "SELECT * FROM vvista WHERE nroedif = '{$_POST['nroedif']}' ORDER BY nroapto";
 
 
	auxColeccion = obtener(auxSql); //obtenemos los pedidos y los guardamos en auxColeccion
	//la función obtener() obtiene los datos desde la base de datos.
	//su aplicación queda a criterio...
 $lisdeuda = @pg_query($conexion,$deudas);
while($select2 = @pg_fetch_array($lisdeuda)){
	while contador < auxColeccion.rowcount{
		//Es el primer while, vamos a usar una variable "contador" o como la llamo yo "recorredor".
		//Ésta se debe mantener menor a la cantidad de registros,
		//ya que va a recorrer la colección hasta llegar a su fin.
		IdAnterior = auxColeccion.item(contador).IdProducto;
		//Principio del corte
		//Hay que igualar el IdAnterior al Id que se recorre.
		//El IdAnterior va a ser el Id del elemento con
		//índice que se está recorriendo en la colección.
		cantidad = 0;
		//Si tenemos un acumulador, hay que igualarlo a 0 aca.
		//Esto se va a ejecutar una vez por Id
		while contador < auxColeccion.rowcount and IdAnterior = auxColeccion.item(contador).IdProducto{
			//El segundo while. El contador se mantiene menor al total de registros.
			//IdAnterior es lo mismo que el Id de lo que recorro.
			//Cuando esto no sea asi, se sale del while.
 
			//LOGICA
			//Aca es donde hacemos lo que necesitamos con los datos.
			//Por ejemplo sumar la cantidad de items
			cantidad += auxColeccion.item(contador).Cantidad;
			//Suponemos que Cantidad es una propiedad de lo que tenemos en la coleccion.
			//Como se ve, para acceder a un item de la coleccion, usamos como indice el contador.
 
			//Al terminar la logica, sumamos uno al contador:
			contador += 1;
		}
		//Termino el "cuerpo" del corte
		//Ahora tengo que decidir como mostrar la informacion.
		//Instancio un nuevo producto, buscandolo con su Id:
		Producto pProducto = buscarProducto(IdAnterior);
		//El buscarProducto queda a criterio...
 
		Mostrar(IdAnterior, Producto.Nombre, cantidad);
		//la función Mostrar puede guardar los datos en un String y agregarlos a otra colección,
		// o lo que decidan.
	}
}
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

ayuda para como totalizar por lote de registros

Publicado por Mauro (1036 intervenciones) el 06/02/2024 11:45:37
Pues... en principio el problema que veo es que ese código que publicaste no es PHP... ¿intentaste "traducirlo"?
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

ayuda para como totalizar por lote de registros

Publicado por Marcelino (6 intervenciones) el 06/02/2024 14:33:23
Bueno Mauro la verdad te soy franco no se traducir ese codigo, estoy intentandolo llevar a Php. y me disculpa.
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

ayuda para como totalizar por lote de registros

Publicado por Mauro (1036 intervenciones) el 07/02/2024 11:14:14
Ya veo... pues lo que te recomiendo es que te metas más profundo a aprender las bases de php, de otro modo te será muy difícil resolver este tipo de problemas
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

ayuda para como totalizar por lote de registros

Publicado por Marcelino (6 intervenciones) el 08/02/2024 15:06:04
Buen dia Mauro. Disculpa hay algun sitio que explique paso a paso eso que me sugieres? sobretodo que explique estas lineas por ejemplo:
Y disculpa mi desconocimiento.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//esto es lo que traigo de la bbdd
 $deudas = "SELECT * FROM vvista WHERE nroedif = '{$_POST['nroedif']}' ORDER BY nroapto";
	while contador < auxColeccion.rowcount{
 
 
		IdAnterior = auxColeccion.item(contador).IdProducto;
 
		cantidad = 0;
 
 
		while contador < auxColeccion.rowcount and IdAnterior = auxColeccion.item(contador).IdProducto{
			cantidad += auxColeccion.item(contador).Cantidad;
			contador += 1;
  	    }
		Producto pProducto = buscarProducto(IdAnterior);
		Mostrar(IdAnterior, Producto.Nombre, cantidad);
 
	}
 
}
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

ayuda para como totalizar por lote de registros

Publicado por Marcelino (6 intervenciones) el 09/02/2024 00:41:47
Hola Mauro, bueno logre llegar al codigo; he pasado casi todo este dia picando codigo claro con intervalos de decanso. Analizando el codigo de corte de control que me sugeriste empece a analizarlo, no esta exactamente igual pero tiene la logica, esta sumarizando por grupo de registros en este caso por nro de apto. Pero tiene un problemilla, es que no esta creando o sumarizando el TOTAL GLOBAL.

este es el reporte:
A ver si alguien puede ver cual es el problema para imprimir el Total Global

ReporteG

y este es el codigo:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
 
$conexion = pg_connect("host=localhost port=5432 dbname=administra user=postgres password=Rtop/1808");
   //define('./PDF/font/');
require('WriteTag.php');
 
class PDF extends PDF_WriteTag
{
//Cabecera de página
function Header()
{
    $this->SetFont('Arial','B',8);
    $this->Cell(90, 5, 'Residencias', 0, 0, 'L');
    $this->Ln(6);
    $this->Cell(95, 5, 'Fecha: '.date('d/m/Y'), 0, 1, 'L');
    $this->Cell(80);
    $this->Cell(30,10,'Listado General de la Deuda',0,0,'C');
    //Logo
     /*$this->Image('archivo',x,y,w,h);*/
     //$this->Image('imagenes/dibujo.JPG',55,10,100,20);
	 $this->Ln(20);
//$this->Cell(190, 10, 'Listado de la Deuda', 0, 1, 'C');
     $this->SetFont('Times', '', 10);
     $this->Cell(15,10,"Nombres",0,0,'L');
     $this->Cell(30,10,"Apellidos",0,0,'R');
     $this->Cell(30,10,"edificio",0,0,'R');
     $this->Cell(30,10,"Apto",0,0,'R');
 
     $this->Cell(40,10,"Monto",0,0,'R');
	 $this->Cell(50,10,"Fecha",0,1,'R');
	 $this->Line($this->GetX(), $this->GetY(), 205, $this->GetY());
    //Arial bold 15
     $this->SetFont('Arial','B',8);
	 $this->Ln(8);
}
//Pie de página
function Footer()
{
    //Posición: a 1,5 cm del final
    $this->SetY(-20);
    //Arial italic 8
    $this->SetFont('Arial','I',8);
    //Número de página
    $this->Cell(0,10,'Pag '.$this->PageNo(),0,0,'C');
}
}
//--Fin de la Clase
//Creación del objeto de la clase heredada
$pdf=new PDF('P','mm','Letter');
$pdf->AddPage();
$pdf->Ln(4);
$pdf->SetFillColor(200);
$numero = $contador = $tdeuda = $totdeu = 0;
 
$nroapto = '';
$deudas = "SELECT * FROM vvista WHERE nroedif = '{$_POST['nroedif']}' ORDER BY nroapto";
$lisdeuda = @pg_query($conexion,$deudas);
while($dato=pg_fetch_array($lisdeuda))
        {
            $nombre = $dato['nombre'];
            $numero++;
      if (!$nroapto){
          $nroapto=$dato['nroapto'];
       }
                ///totaliza por nro de apartamento
 
        while ($dato['nroapto'] != $nroapto){
             $pdf->SetFont('Arial','B',8);
             $pdf->Cell(112,4,"Total--->",0,0,'R');
             $pdf->Cell(14,4,number_format($tdeuda,2,'.',','),0,1,'R');
             $numero++;
             $nroapto = $dato['nroapto'];
             $tdeuda = 0;
            }
             $contador++;
            $pdf->SetFont('Arial','I',8);
            $pdf->Cell(15,4,$dato['nombres'],0,0,'L',(($contador%2)==0));
            $pdf->Cell(30,4,$dato['apellidos'],0,0,'R',(($contador%2)==0));
            $pdf->Cell(30,4,$dato['nombre'],0,0,'R',(($contador%2)==0));
            $pdf->Cell(30,4,$dato['nroapto'],0,0,'R',(($contador%2)==0));
            $pdf->Cell(40,4,number_format($dato['total'],2,'.',','),0,0,'R',(($contador%2)==0));
            $pdf->Cell(47,4,$dato['fecha'],0,1,'R',(($contador%2)==0));
            $pdf->SetFont('Arial','I',8);
            $tdeuda+=$dato['total'];
            $totglobal+=$tdeuda;
 
        }
        $numero++;
        $pdf->SetFont('Arial','B',8);
        $pdf->Cell(112,4,"Total--->",0,0,'R');
        $pdf->Cell(14,4,number_format($tdeuda,2,'.',','),0,1,'R');
        $pdf->SetFont('Arial','B',8);
        $numero++;
        $pdf->SetFont('Arial','B',8);
        $pdf->Cell(112,4,"Total Global--->",0,0,'R');
        $pdf->Cell(14,4,number_format($totglobal,2,'.',','),0,1,'R');
        $pdf->SetFont('Arial','B',8);
$tdeuda = 0;
$pdf->Output();
$pdf->Close();
?>
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

ayuda para como totalizar por lote de registros

Publicado por Marcelino (6 intervenciones) el 09/02/2024 19:55:48
Esperando que esten todos bien. Tambien ya resolvi el problema del Total Global.
este es el codigo corregido y en negrita y subrayado esta la solucion.

Este codigo puede servirles.

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
 
$conexion = pg_connect("host=localhost port=5432 dbname=administra user=postgres password=prueba");
   //define('./PDF/font/');
require('WriteTag.php');
 
class PDF extends PDF_WriteTag
{
//Cabecera de página
function Header()
{
    $this->SetFont('Arial','B',8);
    $this->Cell(90, 5, 'Residencias', 0, 0, 'L');
    $this->Ln(6);
    $this->Cell(95, 5, 'Fecha: '.date('d/m/Y'), 0, 1, 'L');
    $this->Cell(80);
    $this->Cell(30,10,'Listado General de la Deuda',0,0,'C');
    //Logo
     /*$this->Image('archivo',x,y,w,h);*/
     //$this->Image('imagenes/dibujo.JPG',55,10,100,20);
	 $this->Ln(20);
//$this->Cell(190, 10, 'Listado de la Deuda', 0, 1, 'C');
     $this->SetFont('Times', '', 10);
     $this->Cell(15,10,"Nombres",0,0,'L');
     $this->Cell(30,10,"Apellidos",0,0,'R');
     $this->Cell(30,10,"edificio",0,0,'R');
     $this->Cell(30,10,"Apto",0,0,'R');
 
     $this->Cell(40,10,"Monto",0,0,'R');
	 $this->Cell(50,10,"Fecha",0,1,'R');
	 $this->Line($this->GetX(), $this->GetY(), 205, $this->GetY());
    //Arial bold 15
     $this->SetFont('Arial','B',8);
	 $this->Ln(8);
}
//Pie de página
function Footer()
{
    //Posición: a 1,5 cm del final
    $this->SetY(-20);
    //Arial italic 8
    $this->SetFont('Arial','I',8);
    //Número de página
    $this->Cell(0,10,'Pag '.$this->PageNo(),0,0,'C');
}
}
//--Fin de la Clase
//Creación del objeto de la clase heredada
$pdf=new PDF('P','mm','Letter');
$pdf->AddPage();
$pdf->Ln(4);
$pdf->SetFillColor(200);
$numero = $contador = $tdeuda = $totdeu = $totglobal = 0;
 
//$nroapto = '';
$deudas = "SELECT * FROM vvista WHERE nroedif = '{$_POST['nroedif']}' ORDER BY nroapto";
$lisdeuda = @pg_query($conexion,$deudas);
while($dato=pg_fetch_array($lisdeuda))
        {
            $nombre = $dato['nombre'];
            $numero++;
      if (!$nroapto){
          $nroapto=$dato['nroapto'];
       }
                ///totaliza por nro de apartamento
 
        while ($dato['nroapto'] != $nroapto){
             $pdf->SetFont('Arial','B',8);
             $pdf->Cell(112,4,"Total--->",0,0,'R');
             $pdf->Cell(14,4,number_format($tdeuda,2,'.',','),0,1,'R');
             $numero++;
             $nroapto = $dato['nroapto'];
             $tdeuda = 0;
            }
             $contador++;
            $pdf->SetFont('Arial','I',8);
            $pdf->Cell(15,4,$dato['nombres'],0,0,'L',(($contador%2)==0));
            $pdf->Cell(30,4,$dato['apellidos'],0,0,'R',(($contador%2)==0));
            $pdf->Cell(30,4,$dato['nombre'],0,0,'R',(($contador%2)==0));
            $pdf->Cell(30,4,$dato['nroapto'],0,0,'R',(($contador%2)==0));
            $pdf->Cell(40,4,number_format($dato['total'],2,'.',','),0,0,'R',(($contador%2)==0));
            $pdf->Cell(47,4,$dato['fecha'],0,1,'R',(($contador%2)==0));
            $pdf->SetFont('Arial','I',8);
            $tdeuda+=$dato['total'];
            $totglobal+=$dato['total'];            
        }
        $numero++;
        $pdf->SetFont('Arial','B',8);
        $pdf->Cell(112,4,"Total--->",0,0,'R');
        $pdf->Cell(14,4,number_format($tdeuda,2,'.',','),0,1,'R');
        $pdf->SetFont('Arial','B',8);
        $numero++;
        $pdf->SetFont('Arial','B',8);
        $pdf->Cell(112,4,"Total Global--->",0,0,'R');
        $pdf->Cell(14,4,number_format($totglobal,2,'.',','),0,1,'R');
        $pdf->SetFont('Arial','B',8);
$tdeuda = $totglobal = 0;
$pdf->Output();
$pdf->Close();
?>
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