MySQL - PROCEDIMIENTOS ALMACENADOS

   
Vista:

PROCEDIMIENTOS ALMACENADOS

Publicado por Manuel (3 intervenciones) el 10/05/2016 17:25:37
Hola amigos tengo algunas dudas en cuanto a como obtener un resultado de una consulta dentro del SP e irla almacenando a medida que se ejecuta un cursor y al final mostrarla como una sola consulta...

el asunto es que tengo una tablas:
- zonas.
-empleados
- productos.
y las ventas se van cargando en distintas tablas segun el producto.
ejemplo
- zona: Zona 1,Zona 2,...
- empleados: Pedro,Luis,Juan...
- productos: Harina, Arroz, Azucar,...

- Ventas_Harina: juan 2000Bs.,Pedro 200Bs,Luis 3500Bs

- Ventas_Arroz: Juan 1700Bs.,Pedro 500Bs,Luis 150Bs

- Ventas_Azucar.: Luis 1250Bs, Juan 325Bs., Pedro 840Bs

y quiero que con un solo procedimiento almacenado pueda

recorrer todas las tablas ventas_x para obtener la informacion segun el zona y el producto y posterior en otro reporte
el empleado y el producto segun su zona asignada
sabiendo que son varios productos y bastantes empleados y que ellos estan asignados a distintas zonas y que cada zona puede tener varios empleados unicos de esa zona.

Ventas | Harina | Arroz | Azucar | xxx |
zona1 | 2000 | 500 | 150 |### |
zona2 | ### | ### | ### | ### |
zona3 ....
zona(n)

ya yo hago este reporte en php pero por cada celda de la tabla en html hago una consulta de la suma de ese item de ese producto y el reporte se hace lento de un dia. imaginense hacerlo cuando la tabla esta full y lo hago de un año... es de morir y al final se cae el mysql...

yo tengo ya un bosquejo pero no me funciona bien y solo para una consulta a su vez...
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

PROCEDIMIENTOS ALMACENADOS

Publicado por Gonzalo (103 intervenciones) el 13/05/2016 15:49:43
¿Has hecho algo del SP o lo que quieres es que te lo escribamos?

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

PROCEDIMIENTOS ALMACENADOS

Publicado por Manuel (3 intervenciones) el 13/05/2016 18:29:59
Yo realice ya varios SP sencillos y lo que es por medio de php es llamar cada cual segun el resultado con otro...
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
CREATE DEFINER=`root`@`localhost` PROCEDURE `Cargar_Categorias_Vinculadas`()
BEGIN
 
SELECT c.codcat,c.desccat,COUNT(v.codpro) AS columna FROM categorias c
INNER JOIN productos p ON c.codcat = p.clspro
INNER JOIN vinculoprod v ON v.codpro = p.codpro
AND p.statuspro != 'D' AND v.act='S'
GROUP BY c.desccat ORDER BY c.desccat DESC;
 
END
 
CREATE DEFINER=`root`@`localhost` PROCEDURE `Cargar_Productos_Vinculados`(in codigo varchar(3))
BEGIN
SET @consulta = concat("SELECT p.codpro,p.nompro FROM productos p ",
                       "INNER JOIN vinculoprod v ON p.codpro = v.codpro ",
                       "AND p.statuspro != 'D' AND v.act='S' AND p.clspro='",codigo,"'");
 
	PREPARE sentencia FROM @consulta;
	EXECUTE sentencia;
    DEALLOCATE PREPARE sentencia;
	SET @consulta = NULL;
 
 
    -- select @consulta;
 
END
 
CREATE DEFINER=`root`@`localhost` PROCEDURE `cuadre_ventas_zona`(IN fecha1 date,fecha2 date,valor char(1),codpro varchar(3),zona varchar(3))
BEGIN
 
DECLARE fin_registros INT(1) default 0;
set @f1 = fecha1;
set @f2 = fecha2;
set @z = zona;
set @p = codpro;
 
 
	IF (valor = 'V') THEN
		SET @campo = 'sum(t.valorpos)';
	ELSEIF  (valor = 'P') THEN
		SET @campo = 'sum(t.valorneg)';
	ELSE
		SET @campo = 'sum(t.valorpos-t.valorneg)';
	END IF;
 
    IF (@p!='RG' AND @p!='AV' AND @p!='TFD') THEN
		SET @tabla = concat('ventas_',@p);
 
		SET @consulta = concat("SELECT ",@campo," AS monto FROM ",@tabla," t ",
							   "INNER JOIN agencias a ON a.codage = t.vinculo ",
							   "INNER JOIN usuarios u ON a.codage=u.codage ",
							   "AND u.statususu='A' AND a.codzon='",@z,"' ",
                               "AND t.fecha BETWEEN '",@f1,"' AND '",@f2,"'");
    ELSEIF (@p = 'AV') THEN
		SET @consulta = concat("SELECT SUM(t.mtoava) AS monto FROM avances t ",
							   "INNER JOIN agencias a ON a.codage = t.codage ",
							   "INNER JOIN usuarios u ON a.codage=u.codage ",
							   "AND u.statususu='A' AND a.codzon='",@z,"' ",
                               "AND t.fechtrs BETWEEN '",@f1,"' AND '",@f2,"'");
	ELSEIF (@p = 'TFD') THEN
		SET @consulta = concat("SELECT SUM(t.mtotrs*-1) AS monto FROM trf_diarias t ",
							   "INNER JOIN agencias a ON a.codage = t.codage ",
							   "INNER JOIN usuarios u ON a.codage=u.codage ",
							   "AND u.statususu='A' AND a.codzon='",@z,"' ",
                               "AND t.fechtrs BETWEEN '",@f1,"' AND '",@f2,"'");
	ELSEIF (@p = 'RG') THEN
		SET @consulta = concat("SELECT SUM(t.mtores*-1) AS monto FROM resguardos t ",
							   "INNER JOIN agencias a ON a.codage = t.codage ",
							   "INNER JOIN usuarios u ON a.codage=u.codage ",
							   "AND u.statususu='A' AND a.codzon='",@z,"' ",
                               "AND t.fechtrs BETWEEN '",@f1,"' AND '",@f2,"'");
	END IF;
 
    PREPARE sentencia FROM @consulta;
	EXECUTE sentencia;
    -- select @consulta;
    DEALLOCATE PREPARE sentencia;
	SET @consulta = NULL;
 
END

estos son los tres SP que cree para sacar el total por zona pero igual tarda un poco.. ya no tanto pero esta bien...


los resultados en php los trato de reflejar cono arreglos y asi evitar mas consultas
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
$sql = "call Cargar_Categorias_Vinculadas()";
$r1 = $DbConect->Consulta($sql);
if ($DbConect->nroreg($r1) > 0) {
    while ($cat = $DbConect->ExtraerDatos($r1)) {
        $DbConect->Cerrar();
        $categorias[$cat['codcat']] = $cat['desccat'];
        $columnas[$cat['codcat']] = $cat['columna'];
        $sql = "call Cargar_Productos_Vinculados('".$cat['codcat']."')";
        $r2 = $DbConect->Consulta($sql);
        while ($pro = $DbConect->ExtraerDatos($r2)) {
           $p[$cat['codcat']][]= $pro['codpro'];
           $subproducto[$pro['codpro']]=0;
           $subproductoext[$pro['codpro']]=0;
        }
 
    }
}
$DbConect->Cerrar();
 
<table style="border: 1px solid #007ED1;">
                    <tr class="tituloMetro">
                        <td style="font-size: 10px;width: 80px;">&nbsp;</td>
                        <?php
                        foreach ($categorias as $cod => $desc) {
                            echo "<td colspan='" . $columnas[$cod] . "' style='text-align:center;font-size: 10px;border:1px solid black;'>";
                            echo $desc;
                            echo "</td>";
                        }
                        ?>
                        <td style="font-size: 10px;width: 100px;">&nbsp;</td>
                    </tr>
                    <tr class="tituloMetro">
                        <td style="font-size: 10px;width: 80px;">ZONAS</td>
                        <?php
                        foreach ($categorias as $cod => $desc) {
                            foreach ($p[$cod] as $key => $value) {
                                echo "<td style='text-align:center;font-size: 10px;border:1px solid black;width:80px;'>";
                                    echo $value;
                                echo "</td>";
                            }
                        }
                        ?>
                        <td style="font-size: 10px;width: 100px;">TOTAL</td>
                    </tr>
                    <?php
                    $k=1;
 
                    $rz = $NewFuncion->CargarZonasCV("I");
                    while ($z= $DbConect->ExtraerDatos($rz)){
                        if(in_array($z['codzon'],$zonaspermitidas)){
                        ?>
                        <tr bgcolor="<?php echo $color[$k++%2]; ?>">
                            <td style="font-size: 10px;width: 100px;border:1px solid #007ED1;"><?php echo $z['desczon']; ?></td>
                            <?php
                            $subtotal=0;
                            foreach ($categorias as $cod => $desc) {
                                foreach ($p[$cod] as $key => $value) {
                                    $sql = "call cuadre_ventas_zona('".$fecha1."','".$fecha2."','".$optvalor."','".$value."','".$z['codzon']."')";
                                    $r3 = $DbConect->Consulta($sql);
                                    if($r3){
                                        while($saldo = $DbConect->ExtraerDatos($r3)){
                                            echo "<td style='text-align:right;font-size: 10px;border:1px solid #007ED1;'>";
                                                echo number_format($saldo['monto'],2,",",".");
                                                $subtotal+=$saldo['monto'];
                                                $subproducto[$value]+=$saldo['monto'];
                                            echo "</td>";
                                        }
                                    }else{
                                        echo "<td style='text-align:right;font-size: 10px;border:1px solid #007ED1;'>";
                                            echo "0";
                                        echo "</td>";
                                    }
                                    $DbConect->Cerrar();
                                }
                            }
                            ?>
                            <td style="font-size: 10px;width: 100px;border:1px solid #007ED1;text-align: right;">
                                  <?php echo number_format($subtotal,2,",","."); ?></td>
                        </tr>
                        <?php
                        }
                    }

Me gustaria mas bien tratar de hacer todos esos ciclos dentro y ejecutar todas esas consultas de forma que se maneje una tabla temporal y asi cada quien maneje la informacion a su antojo y no tarde tanto en presentar el reporte
reporte
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