From 493cf2effdb418f10f2ae77cec0786c5cef0bbcc Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Wed, 8 Oct 2003 21:31:42 +0000 Subject: [PATCH] =?utf8?q?Se=20agregan=202=20tipos=20de=20orden=20predefin?= =?utf8?q?idos=20para=20los=20servicios:=20AI=5FSERVICIO=5FORDEN=5FLONG=5F?= =?utf8?q?HIJOS=20y=20AI=5FSERVICIO=5FORDEN=5FLONG=5FNOMBRE.=20El=20primer?= =?utf8?q?o=20est=C3=A1=20pensado=20para=20ordenar=20las=20tablas=20de=20s?= =?utf8?q?ervicios=20realizando=20un=20balance=20de=20carga,=20ya=20que=20?= =?utf8?q?ordena=20haciendo=20un=20calculo=20que=20predice=20la=20cantidad?= =?utf8?q?=20de=20renglones=20que=20ocupar=C3=A1=20cada=20hijo.=20El=20seg?= =?utf8?q?undo=20est=C3=A1=20pensado=20para=20ordenar=20los=20contenidos?= =?utf8?q?=20de=20una=20tabla,=20para=20que=20aparezcan=20los=20nombres=20?= =?utf8?q?mas=20largos=20abajo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- doc/uml.xmi | 99 +++++++++++++++++++++++++---------------- lib/AI/DBTreeObject.php | 2 +- lib/AI/Error.php | 6 +++ lib/AI/Servicio.php | 65 ++++++++++++++++++++++++++- 4 files changed, 131 insertions(+), 41 deletions(-) diff --git a/doc/uml.xmi b/doc/uml.xmi index 45fd219..77312b5 100644 --- a/doc/uml.xmi +++ b/doc/uml.xmi @@ -10,7 +10,7 @@ - + @@ -20,6 +20,11 @@ + + + + + @@ -136,69 +141,84 @@ Sólo se obtienen las secciones que todavía no pertenecen a ningún grupo. Si s - - - - - - + - - - - - - - + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + - - - - + + + + + + + + @@ -215,7 +235,7 @@ x2c:get" name="hijos" static="0" scope="202" /> - + @@ -225,7 +245,7 @@ x2c:get" name="hijos" static="0" scope="202" /> - + @@ -240,7 +260,7 @@ x2c:get" name="hijos" static="0" scope="202" /> - + @@ -251,9 +271,10 @@ x2c:get" name="hijos" static="0" scope="202" /> + - + @@ -276,9 +297,9 @@ x2c:get" name="hijos" static="0" scope="202" /> - + diff --git a/lib/AI/DBTreeObject.php b/lib/AI/DBTreeObject.php index 7877b99..994f8f5 100644 --- a/lib/AI/DBTreeObject.php +++ b/lib/AI/DBTreeObject.php @@ -85,7 +85,7 @@ class AI_DBTreeObject extends AI_DBObject { * @access public */ function cargarHijos($db, $soloHabilitados = true, $orden = 'nombre') // ~X2C - { + { $id_field = $this->conf['id']; $id_padre = $this->conf['padre']; $tabla = $this->conf['base'].'.'.$this->conf['tabla']; diff --git a/lib/AI/Error.php b/lib/AI/Error.php index 1dc3915..3af3bef 100644 --- a/lib/AI/Error.php +++ b/lib/AI/Error.php @@ -48,6 +48,12 @@ define('AI_ERROR_NO_RESULTADOS', 1); */ define('AI_ERROR_TIENE_HIJOS', 2); +/** + * Error que indica que el tipo de orden usado no es válido. + * Es un error no esperado. + */ +define('AI_ERROR_ORDEN_INVALIDO', 3); + // +X2C Class 469 :AI_Error /** * @package AI diff --git a/lib/AI/Servicio.php b/lib/AI/Servicio.php index 85ac3a2..9fb5e8c 100644 --- a/lib/AI/Servicio.php +++ b/lib/AI/Servicio.php @@ -38,6 +38,18 @@ require_once 'AI/Error.php'; */ define('AI_SERVICIO_CONFFILE', dirname(__FILE__).'/Servicio.ini'); +/** + * Trae los servicios en un orden según la longitud de los hijos. + * La longitud de los hijos se calcula prediciendo la cantidad de + * renglones que va a ocupar cada hijo y sumándolos para un mismo padre. + */ +define('AI_SERVICIO_ORDEN_LONG_HIJOS', 1); + +/** + * Trae los servicios en un orden según la longitud del nombre. + */ +define('AI_SERVICIO_ORDEN_LONG_NOMBRE', 2); + // +X2C Class 413 :AI_Servicio /** * Servicio. @@ -158,7 +170,58 @@ class AI_Servicio extends AI_DBTreeObject { } // -X2C - + // +X2C Operation 539 + /** + * Carga hijos de un servicio. Si hubo error devuelve un PEAR_Error, si no hubo error, devuleve un array de objetos (los hijos). + * + * @param mixed $db Base de datos o resultado a usar. + * @param bool $soloHabilitados Si es true, sólo trae los servicios habilitados. + * @param mixed $orden Indica el orden en que se deben traer los hijos. Puede ser AI_SERVICIO_ORDEN_CANT_HIJOS, AI_SERVICIO_ORDEN_LONG_NOMBRE o un campo arbitrario. + * + * @return mixed + * @access public + */ + function cargarHijos($db, $soloHabilitados = true, $orden = false) // ~X2C + { + if (!is_a($db, 'db_result')) { + if (is_int($orden)) { + $id_field = $this->conf['id']; + $id_padre = $this->conf['padre']; + $id = intval($this->$id_field); + if ($orden === AI_SERVICIO_ORDEN_LONG_HIJOS) { + $query = " + SELECT A.*, SUM(CEIL(LENGTH(B.nombre) / 22)) as RENGLONES + FROM {$this->conf['base']}.{$this->conf['tabla']} AS A, + {$this->conf['base']}.{$this->conf['tabla']} AS B + WHERE A.$id_field = B.$id_padre + AND A.$id_padre = $id"; + if ($soloHabilitados) { + $query .= " AND A.{$this->conf['habilitado']} = 1"; + } + $query .= " GROUP BY A.$id_field ORDER BY RENGLONES DESC"; + } elseif ($orden === AI_SERVICIO_ORDEN_LONG_NOMBRE) { + $query = " + SELECT * + FROM {$this->conf['base']}.{$this->conf['tabla']} + WHERE $id_padre = $id"; + if ($soloHabilitados) { + $query .= ' AND ' . $this->conf['habilitado'] . ' = 1'; + } + $query .= ' ORDER BY LENGTH(nombre)'; + } else { + return new AI_Error(AI_ERROR_ORDEN_INVALIDO, + "Tipo de órden incorrecto [orden=$orden]"); + } + $result = $db->query($query); + if (DB::isError($result)) { + return $result; + } + return parent::cargarHijos($result, $soloHabilitados, $orden); + } + } + return parent::cargarHijos($db, $soloHabilitados, $orden); + } + // -X2C } // -X2C Class :AI_Servicio -- 2.43.0