Ir al contenido principal

Tips semanales #2

Suma de Entradas y Salidas

El problema reside en realizar una suma de dos campos en tablas distintas (entradas y salidas) con un enlace común (artículos), el DER correspondería a lo siguiente:
Modelo de Bodega
Pareciera fácil pero no lo es tanto pues tiene su truco. El código sería el siguiente:

SELECT tipo_articulos_nombre_tipo, articulos_descripcion, 
SUM(cantidad) AS entradas, SUM(cantidad_salida) AS salidas
FROM (
(SELECT
     tipo_articulos.`nombre_tipo` AS tipo_articulos_nombre_tipo,
     articulos.`descripcion` AS articulos_descripcion,
     detalle_entradas.`cantidad` AS cantidad,
 0.0 as cantidad_salida
FROM `articulos` articulos
     LEFT JOIN `detalle_entradas` detalle_entradas ON detalle_entradas.`idarticulo` = articulos.`idarticulo`
     INNER JOIN `entradas` entradas on entradas.identrada=detalle_entradas.`identrada`
     INNER JOIN `tipo_articulos` tipo_articulos ON articulos.`idtipo_articulo` = tipo_articulos.`idtipo_articulo`

ORDER entradas.`fecha_entrada` DESC
)
UNION ALL
(SELECT
     tipo_articulos.`nombre_tipo` AS tipo_articulos_nombre_tipo,
     articulos.`descripcion` AS articulos_descripcion,
     0.0 as cantidad,
     detalle_salidas.`cantidad_despachada` AS cantidad_salida
FROM `articulos` articulos
     INNER JOIN `tipo_articulos` tipo_articulos ON articulos.`idtipo_articulo` = tipo_articulos.`idtipo_articulo`
     LEFT JOIN `detalle_salidas` detalle_salidas  ON detalle_salidas.`idarticulo` = articulos.`idarticulo`
INNER JOIN `salidas` salidas ON detalle_salidas.`idsalida` = salidas.`idsalida`

ORDER BY salidas.`fecha_salida` DESC)
) AS tabla
GROUP BY articulos_descripcion

Me parece que este código es bastante optimizable e incluso puede existir otro enfoque totalmente distinto.
Que coincidan el uso del UNION, subconsulta y agrupación no me da buena espina. Me gustaría saber si es posible hacer esto de otra forma.

Booleanos en PHP

Si quieres convertir un representación en cadena de un boolean, ejem. "yes", "on", "true", "false", etc... a un boolean real, puedes probar esto:

<?php
        $myString = "On";
        $b = filter_var($myString, FILTER_VALIDATE_BOOLEAN);
?>
Esto retornará TRUE para "1", "true", "on" y "yes". De lo contrario retorna FALSE.
 
Escapar los caracteres raros en php para mysql

if(function_exists('mysql_real_escape_string')){
         $_REQUEST = array_map('mysql_real_escape_string', $_REQUEST); 
}

Remover elementos duplicados en un arreglo en PHP: array_unique($array);

$entrada = array("a" => "verde", "rojo", "b" => "verde", "azul", "rojo");
$resultado = array_unique($entrada);
print_r($resultado);
El resultado del ejemplo seria: Array ( [a] => verde [0] => rojo [1] => azul )

 Consulta que devuelve una fila aleatoria de una tabla de MySQL

select * from YOUR_TABLE order by rand() limit 1

Esta consulta funciona bien para tablas con pocos registros (menos de 10,000)  para tablas mas pesadas este enlace provee una mejor forma para seleccionar una fila aleatoria

Entradas populares de este blog

Enumerar filas en una consulta con MySQL

Supongamos que tenemos tablas con la estructura siguiente:
documentos (iddocumento, nombre_documento, url_original, idtipo_documento, idproyecto) proyectos (idproyecto, nombre_proyecto, longitud, unidad_medida) tipo_documentos (idtipo_documento, descripcion_tipo_documento) Tenemos necesidad de hacer una consulta como la siguiente: "Enumerar todos los documentos en la base de datos agrupados por proyecto"

Parece fácil, excepto por el término "enumerar", aquí tienes un truquito para que logres enumerar tus consultas:
SELECT (@rownum:=@rownum+1) AS rownum, nombre_documento, descripcion_tipo_documento, nombre_proyecto FROM (SELECT @rownum:=0) r, documentos AS d INNER JOIN proyectos AS p ON d.idproyecto = p.idproyecto INNER JOIN tipo_documentos AS td ON d.idtipo_documento = td.idtipo_documentoPero que tal si te piden que enumeres los proyectos con sus correspondientes documentos?. Teniendo lo anterior es un poco mas sencillo
SELECT IF(@fila=proyectos.idproyecto, @rownum:…

Como implementar SCRUM en 10 pasos fáciles - Paso #1: Ordena tu "Pila del Producto"

Esta es la continuación de la serie: Como implementar SCRUM en 10 pasos fáciles. Creación de Kelly Waters y traducida con la autorización correspondiente por su servidor.


La entrada original de este artículo es: Get your backlog in order

Ordena tu "Pila del Producto"
¿Así que quieres implementar Scrum?
¿Y te gusta la idea de hacerlo fácilmente?
Entonces escucha. Este es el paso 1 en mi serie: ¿Cómo implementar Scrum en 10 pasos fáciles.
Este no es solo el primer paso. Es el paso más importante.
A menos que puedas llevar a cabo este paso, no sigas. No lo saltes. Te prometo que te arrepentirás si lo haces. Incluso si no continuas, es probable que este paso te beneficie, a tu equipo y a tu organización.
Así que aquí está.
Primero, ¿dónde deberíamos empezar?
Alineación con el negocio
Primero, antes de nada, debes alinear tu equipo de desarrollo con el negocio.
Si eres parte de una unidad de negocio, eso puede ser natural y directo. Si estas en una organización central de desarrol…

Expresiones Regulares y pruebas en javascript

¿Qué es una expresión regular?
Una expresión regular es una cadena que contiene una combinación de caracteres normales y metacaracteres o metasecuencias especiales. Los caracteres normales coinciden por ellos mismos. Los metacaracteres y metasecuencias son caracteres o secuencias de caracteres que representan ideas como cantidad, posiciones o tipos de caracteres.
Regular Expression Pocket Reference 2nd Ed - Tony Stubblebine - O'Reilly

¿Para qué son útiles las expresiones regulares?
Las expresiones son especialmente útiles para validar información, por ejemplo en formularios de ingreso de datos. Por ejemplo para validar que se ingresó un número de teléfono, puedes usar la siguiente expresión regular.

/^([\+][0-9]{1,3}[ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9 \.\-\/]{3,20})?$/

Parecieran símbolos al azar, pero nada mas lejos de la realidad. Te muestro una tabla básica con los elementos usados para crear expresiones regulares.

Carácter Texto buscado ^Principio de entrada o línea.$Fin de e…