New question

Question:

Date: 14-01-2018 17:47:58 (In Spanish)

Mostrar saldos acumulados por persona[Resolved]

Hola a todos,
tengo una lista y de ella debo sacar los saldos diarios por persona. No logro sacar los resultados intermedios.El listado json actual es el siguiente:
[{"id":"1","per_nr":"1","nombre":"Jose","tag":"1","producto":"naranja","cantidad":"5","precio":"3","saldo":15,"saldo_cum":15},{"id":"2","per_nr":"1","nombre":"Jose","tag":"1","producto":"naranja","cantidad":"5","precio":"5","saldo":25,"saldo_cum":40},{"id":"3","per_nr":"1","nombre":"Jose","tag":"1","producto":"naranja","cantidad":"10","precio":"3","saldo":30,"saldo_cum":70},{"id":"4","per_nr":"1","nombre":"Jose","tag":"1","producto":"naranja","cantidad":"15","precio":"2","saldo":30,"saldo_cum":100},{"id":"5","per_nr":"1","nombre":"Jose","tag":"1","producto":"naranja","cantidad":"12","precio":"2","saldo":24,"saldo_cum":124},{"id":"6","per_nr":"2","nombre":"Jose","tag":"1","producto":"naranja","cantidad":"11","precio":"2","saldo":22,"saldo_cum":146},{"id":"7","per_nr":"3","nombre":"Jose","tag":"2","producto":"naranja","cantidad":"8","precio":"4","saldo":32,"saldo_cum":178},{"id":"8","per_nr":"4","nombre":"Jose","tag":"3","producto":"naranja","cantidad":"9","precio":"3","saldo":27,"saldo_cum":205


<?php
$server = "localhost";
$user = "root";
$pass = " ##";
$bd = "test";

//Creamos la conexión
$conexion = mysqli_connect($server, $user, $pass,$bd) 
or die("Ha sucedido un error inexperado en la conexion de la base de datos");

//generamos la consulta
$sql = "SELECT * FROM productos_json";
mysqli_set_charset($conexion, "utf8"); //formato de datos utf8

if(!$result = mysqli_query($conexion, $sql)) die();
$productoPersona = array(); //creamos un array para grabar los valores por persona y por dia
$clientes = array(); //creamos un array

	$saldo_cum=0;
	while($row = mysqli_fetch_array($result)) 
	{ 
		$id=$row['id'];
		$per_nr=$row['per_nr'];
		$nombre=$row['nombre'];
		$tag=$row['tag'];
		$producto=$row['producto'];
		$cantidad=$row['cantidad'];
		$precio=$row['precio'];
	
		$saldo= $cantidad*$precio;
		$saldo_cum=$saldo_cum+$saldo;
	
	
		$clientes[] = array(
		'id'=> $id, 
		'per_nr'=> $per_nr,
		'nombre'=> $nombre,
		'tag'=> $tag,  
		'producto'=> $producto,		
		'cantidad'=> $cantidad,
		'precio'=> $precio,
		'saldo'=> $saldo,
		'saldo_cum'=> $saldo_cum);
	}
			
		//diferenciamos por persona y por dia en que compró

	if(sizeof($productoPersona)>0 && $clientes['pers_nr']==$productoPersona[0]['pers_nr'] && $clientes['tag']==$productoPersona[0]['tag']){
		array_push($productoPersona,$clientes);
		
	}else{	
	
		/*$json_string = json_encode($clientes);
		echo $json_string;*/
		echo "armar la Lista de nueva persona productoPersona-clientes";
		array_push($productoPersona,$clientes);
	}		
			
			
			
		//desconectamos la base de datos
		$close = mysqli_close($conexion) 
		or die("Ha sucedido un error inexperado en la desconexion de la base de datos");


Les estaría agradecida de algún comentario o ayuda.. atte.
Tags: Javascript - Javascript JSON - JQuery - JSON - PHP - Question Votes: 1 - Answers: 5 - Views: 14 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 14-01-2018 22:06:38 María, un alcance muy importante: tu tabla que recoge las ventas no debe recoger los datos del cliente, sólo debe tener una referencia al cliente, el cual tiene sus datos en otra tabla, la tabla 'clientes', y la tabla que llamas 'productos_json', creo que debería llamarse 'ventas' o 'ventas_cred', bueno, pero vamos, que también vamos a pensar que tienes un campo llamado fx que es la fecha de la venta.
    Dicho eso y conservando más o menos tu idea del código, vamos a saber los saldos diarios "por persona".
    Podemos querer saber sólo el saldo de las personas que tuvieron movimiento en una fecha x.
    Entonces primero vamos a obtener las distintas personas o clientes que compraron en una fecha, ellas identificadas por su campo "per_num", que creo es el campo que identifica unívocamente al cliente ( tus clientes todos se llaman José) .
    Seleccionamos los distintos "per_num" para una fecha, que puede ser también una búsqueda entre fechas, hagámoslo simple, supongamos que el campo fecha tiene el día, es un campo Date:
    // $fx es la fecha x que estamos buscando
    $sql1 = "SELECT DISTINCT('per_num') FROM productos_json WHERE fecha='$fx' ";

    Luego recorremos con el WHILE los registros y para cada persona obtenemos el registro de sus compras con:
    // $pn es el $row['per_nr']
    $sql2 = "SELECT * FROM productos_json WHERE fecha='$fx' AND per_num='$pn' ";

    Luego, para cada cliente le vamos ingresando cada venta.
    Recuerdas que cada cliente tiene un identificador único ? Puedes usar su identificador único como clave del array de cada cliente. Por ejemplo, el cliente 1 es cliente[1], el cliente 2 es cliente[2]... cliente xyz es cliente['xyz'] o cliente[$pn] en otras palabras.
    Bien, tenemos identificado el cliente, ahora vamos a agregar a cada cliente lo suyo, estamos obteniendo todos los campos de la venta. Entonces en cada pasada le agregas la compra sólo a él (no sé si te sirve el campo 'tag' para identificar algo de la venta, o del cliente):
    cliente[$pn]['ventas'][]=[
            'tag'=> $tag,  
            'producto'=> $producto,        
            'cantidad'=> $cantidad,
            'precio'=> $precio,
            'saldo'=> $saldo,
            'saldo_cum'=> $saldo_cum,
            'fx'=> $fx]

    Por qué el nivel 'ventas'? Simple: para que cuando recorras el json busques 'ventas' y lo recorras obteniendo en forma agrupada los datos de las ventas. Podemos allí ir sumando para obtener los totales parciales luego de cada venta.
    Debo decirte que no agregas a cada venta el id, nombre etc, porque caeríamos en una mala práctica de repetir datos sin necesidad. También deberías tener una tabla aparte para Productos y en ventas referenciar el producto con su id, así te puedes recoger un resumen de ventas por producto en tramo de fechas, y te acercas a un control de stock... bla bla bla :)
    Bueno, en resumen lo que haces es construir el encabezado con los datos del cliente y luego la lista de sus ventas.
    Finalmente envías json_encode(clientes) y queda todo listo para crear la tabla con el json.

    Te dejo la idea, ya te envío el código.
    Espero te ayude.
      Votes: 4 - Link answer
     
  • Date: 14-01-2018 22:44:22 Muchas gracias Néstor, lo intentaré, me parece muy bueno el comentario...para no repetir datos inútilmente.

    Te pongo un link para que puedas ver lo que opino, en realidad, es quizás más simple de lo pensado:grafico


      Votes: 0 - Link answer
     
  • Date: 15-01-2018 23:05:40 María !! Hola, mira primero decirte que tienes un error en la tabla, en la fila Total el dato 878 que es la suma de los acumulados no te sirve para nada, también enmarcaste el usuario 1 y 2 con rojo y debías enmarcar sólo el 1, con un total de 124.
    Bueno, en tu script cuando pasas a otro cliente debes dejar a cero la suma acumulada del cliente para que el siguiente comience con valor 0 y no tenga la suma del anterior. Ese era tu problema en tu pregunta anterior y lo dejé explicado allí.

    Bien, ahora al código. Tal como te dije anteriormente, el código busca los clientes a los que se les vendió aquel día, luego todas sus ventas para cada uno de ello.
    El json generado no repite valores del cliente en las ventas. Pero puedes recuperarlo en cualquier momento y colocarlo donde desees porque está al inicio y hasta el final de las ventas.

    El código sería más limpio si creas 3 clases, pero no creo que eso interese en este momento.

    El código está en una función que pide argumento fecha a buscar algo como "2018-01-16", pero por defecto puedes dejarla con la fecha actual. Devuelve un json o un null.
    María: tu tabla debe tener campo fecha. Salvo error u omisión:
    function maria_quiere_totales_por_cliente($fx){
        // $conn tiene tu conexión
        $conn =  mysqli_connect($server, $user, $pass, $bd);
        // obtenemos clientes con movimiento en la fecha $fx
        $sql1 = "SELECT DISTINCT('per_nr') FROM productos_json WHERE fx='$fx' ";
        $clie = $conn->query($sql1);
        if( $clie->num_rows > 0 ){
            // recorremos cada cliente $c encontrado en $clie
            while($c = $clie->fetch_assoc()){
                // el cliente es $pn 
                $pn = $c['per_nr'];
    
                // buscas datos del cliente, como nombre, crédito autorizado, etc.
                $sqlCL = "SELECT nombre FROM productos_json WHERE per_nr='$pn' ";
                $datoCL = $conn->query($sqlCL);
                if( $datoCL->num_rows > 0 ){
                    $d = $datoCL->fetch_assoc();
                    $nombre = $d['nombre'];
                }
    
                // vamos llenando la cabecera
                $cliente[$pn]=[
                    'per_nr'=> $pn,  
                    'nombre'=> $nombre 
                    ];
    
                // para $pn buscas las ventas con campo fx = $fx
                $sql2 = "SELECT * FROM productos_json WHERE fx='$fx' AND per_nr='$pn' ";
                $vtas = $conn->query($sql2);
                if( $vtas->num_rows > 0 ){
                    // recorremos las ventas de $pn el día $fx
                    // A CERO PARA NO ACUMULAR TOTAL ANTERIOR
                    $saldo=0; $saldo_cum=0;
                    while($v = $vtas->fetch_assoc()){
                        // recogemos datos de vtas, son tus $row
                        // $id       =$v['id'];
                        // $nombre   =$v['nombre'];
                        $tag    =$v['tag'];
                        $prod   =$v['producto'];
                        $cant   =$v['cantidad'];
                        $precio =$v['precio'];
                    
                        $saldo     = $cant * $precio;
                        $saldo_cum = $saldo_cum+$saldo;
    
                        $cliente[$pn]['ventas'][]=[
                                'tag'      => $tag,  
                                'producto' => $prod,        
                                'cantidad' => $cant,
                                'precio'   => $precio,
                                'saldo'    => $saldo,
                                'saldo_cum'=> $saldo_cum
                                ];
                    }
                }else{ 
                    // NUNCA ENTRA AQUÍ, todos tienen ventas;
                }
            }
            return json_encode($cliente);
        }else{
            return null;
        }
    }


    Espero te sirva. Ahora falta aplicar lo de la anterior pregunta respecto a tabla con json y haces lo que quieras con los datos.
    Saludos
      Votes: 0 - Link answer
     
  • Date: 15-01-2018 23:48:02 Hola Néstor, ya me pondré a tratar de aplicarlo, es una tremenda ayuda. Me olvidé decirte que tag signica día, o sea 1 es lunes y 2 es martes, por ello me salvaba de usar fechas reales. Así que los subtotales que necesito se refieren al día por cliente. Tal vez eso no se ve claro en el gráfico. Estoy ahora preparando para poner tu solución y te avisaré al momento si me resultó o no. Desde ya, muchas, muchas gracias.

    Listo, ya me realiza bien la generación de una lista json:
    {
    "1":
    {"per_nr":"1","nombre":"Jose","ventas":
    [{"tag":"1","producto":"naranja","cantidad":"5","precio":"3","saldo":15,"saldo_cum":15},
    {"tag":"1","producto":"naranja","cantidad":"5","precio":"5","saldo":25,"saldo_cum":40},
    {"tag":"1","producto":"naranja","cantidad":"10","precio":"3","saldo":30,"saldo_cum":70},
    {"tag":"1","producto":"naranja","cantidad":"15","precio":"2","saldo":30,"saldo_cum":100},
    {"tag":"1","producto":"naranja","cantidad":"12","precio":"2","saldo":24,"saldo_cum":124}]},
    "2":
    {"per_nr":"2","nombre":"Maria","ventas":[{"tag":"1","producto":"naranja","cantidad":"11","precio":"2","saldo":22,"saldo_cum":22}]},
    "3":
    {"per_nr":"3","nombre":"Teresa","ventas":[{"tag":"1","producto":"naranja","cantidad":"8","precio":"4","saldo":32,"saldo_cum":32}]}
    }
    



    pero ahora, disculpa , estoy chocando en la sacada de los valores con javascript:

    	var url="generarjson3.php";
        $("#tablajson tbody").html("");
        $.getJSON(url,function(clientes){
            // defino variables que guarda sumas
            var suma1=0,suma2=0;
            $.each(clientes, function(i,cliente){    
    		   var newRow =
                "<tr>"       
    		+"<td>"+cliente.nombre+"</td>"  
    		+"<td>"+cliente.per_nr+"</td>"   			
    		+"<td>"+cliente.tag+"</td>"         
                    +"<td>"+cliente.producto+"</td>"
    		+"<td>"+cliente.cantidad+"</td>"   
                    +"<td>"+cliente.precio+"</td>"   
                    +"<td>"+cliente.saldo+"</td>"
                   +"<td>"+cliente.saldo_cum+"</td>"			
                +"</tr>";				
                $(newRow).appendTo("#tablajson tbody");
                // acumulo los valores de cada uno
                suma1+=parseInt(cliente.saldo);			
                suma2+=parseInt(cliente.saldo_cum);
            });
            $("#tablajson tfoot").html("");
            // uso las sumas en vez de cliente ya que
            // 'cliente' no existe fuera del each (alcance)                       
                var newRow2 =            
            "<tr>"
                +'<td colspan="7">Total</td>'
                +"<td>"+suma1+"</td>"
                +"<td>"+suma2+"</td>"
            +"</tr>";     		
            $(newRow2).appendTo("#tablajson tfoot");
        });
    
    Te agradezco mucho la ayuda Néstor, está perfecta, saludos
      Votes: 0 - Link answer
     
  • Date: 16-01-2018 16:50:03 María, verifica tu json recibido en este visor online de json: visor
    En la pestaña Text pegas el texto del json y luego vas a Viewer para ver la estructura del json.
    Si no te pega el Texto pega con Ctrl+V.
    Esta vista te ayudará a comprender la estructura y darte cuenta lo que debes hacer para acceder a cada dato.
    Como sabes, si tienes un json en js puedes navegar por el json con notación punto, como cualquier objeto al que se accede a sus propiedades.
    Asignas a una variable el json, supongamos var obj = recibido.
    Luego vas agregando niveles para llegar al dato.
    Como tienes varios clientes, necesitas un each o un for para acceder a cada uno, lo tenemos claro. Así vamos viendo en la estructura que se puede llegar a datos con obj.per_nr para ese dato y obj.nombre para el nombre.
    Cuando quieres entrar a ventas lo haces así: obj.ventas, pero si ves la estructura, ventas es un array entonces vuelves a usar un each o for para navegar dentro de ventas. En este caso pasas el obj.ventas para iterar sobre esa estructura y cada uno que encuentres tiene sus propiedades como tag, producto, cantidad, etc. que vas colocando en una línea de la tabla. Ver video con estructura de tu json.

    Para obtener el json que está en php desde el front con js usas una carga asíncrona como ajax o usas la $.post() de JQuery. Usando JQuery pides al php que te envíe el json, basado en una fecha, le envías la fecha:
    let f = 'ruta relativa del script php que entrega el json',
        laFecha = '2018-01-17';
    
    // fx es la variable que envías y le das el contenido de la fecha
    $.post(f, { fx: laFecha }, function(recibido) {
        // en este lugar va el código para cuando recibas la respueta
        // aquí tienes acceso a lo que devuelve el script php
        // en este caso recibes el json
        // lo recibes en la variable 'recibido'
    
        // vemos lo recibido en la consola
        console.log("llegó esto: " + recibido);
        if (recibido != null && recibido != '') {
            // parece viene bien el json, hacemos la tabla y la append
    
            // aquí va el código tabla con un json
            // ...... ....
    
            alert('Estoy creando la tabla !!');
        }
    });

    La ruta relativa es la ruta de tu php que genera el json.

    El php que recibe la petición para que devuelva el json se hace más o menos así: Creas un archivo php, y lo tratas como respuesta a un formulario con post.
    Vale decir, verificas que te llegue por post el dato fecha necesario para obtener los datos, que viene en la variable fx, y corres la función que ya sabemos cuál es.
    El php sería por ejemplo:
    // inicio del php
    function crearJsonVentasPorClienteEnUnDia($fx){
        // aquí va cod de la función que te entrega el json
    }
    
    // verificamos post de la variable fecha ( le mandaste fx )
    // verificas la fecha que llega $_POST['fx'] como desees
    // isset() verifica que existe y no sea null.
    
    if( isset($_POST['fx']) && $_POST['fx'] != '' ){
        // si entra aquí, existe la fecha y obtenemos el json
        crearJsonVentasPorClienteEnUnDia( $_POST['fx'] );
    }else{
        echo "No se aprueba la fecha o no fue enviada";
    }
    
    // fin del php

    Espero te ayude, saludos
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com