[SOLUCIONADO] Hacer un tree con fechas de SQL
Hola a todos. Estoy pensando en hacer una app basada en registros por dia. Los registros se almacenan por fecha en la DB y hay unos cuantos miles por día. Lo que quiero es hacer un select a las diferentes fechas en SQL y formar un Tree con ExtJS
Ejemplo:
2010
|-> Enero
|->01
|->02
etc
2011
etc
Yo el select para tomar todas las fechas diferentes de lo hago, pero no se como hacer el tree en extjs... alguna ayuda para poder empezar??
Salduos.
Ya solucioné la primera parte, lo que hago es cambiar el formado del id para que me busque datos del folder o del subfolder. Entonces a los primeros folders les asigno valor numerico. En el php pongo if(is_numeric($id)){ y el query secundario filtrando por id. Para el subfolder le pongo ids que empiezan con SF y el id es la fecha. Entonces en php me fijo si empieza con SF, se lo saco y filtro query de usuario para esa fecha.
Esta andando excelente, ya no tengo problemas si el id no esta ordenado de 1 en adelante como en el ejemplo de la página.
Lo que me falta hacer es que cuado hago click en el leaf, este me envie ciertos datos por baseparams para generar el grid en center. Mientras lo voy a buscar, si alguna me da una mano mientras será bienvenida.
Saludos.
Bueno... dejo el script php que genera los datos para el tree.
Explico que mi base de datos tiene una tabla llamada sist_prx donde almaceno registros de acceso a internet por dia, y los traigo a la db desde el LOG de squid (proxy linux)
Los registros almacenen, fecha, hora, usuario (login windows AD), url, host (url parseada), estado (permitido, denegado), categoria (categoria del sitio web) y algun dato mas. Tengo otra tabla que almacena los nombre de usuarios de windows y nombres reales (Sist_usrs)Lo que hago a continuacion, es diferentes selects distinct para ver primero los diferentes meses que hay en los registros. despues uso el id de ese mes para listar los dias disponibles que corresponden al mes. Despues uso el id (SFmes-dia) para listar los "leaf" que son los usuarios de esos dias. Obvio que el arbol se incrementa autoimatico a medida que los dias pasan. A los dias le puse valor SF asi cuando mando el post SF... lo puedo filtrar y se que corresponde al id que filtra usuarios:
utf8_encode($row["nombre"]),
"leaf" => true,
"filtro" => $id,
"login" => utf8_encode($row["usuario"])
));
}
echo json_encode($data);
}
if(is_numeric($id)){
$result= mssql_query("select distinct DATENAME(WEEKDAY, fecha)+ ' ' + Convert(Char(2), fecha, 103) as Fecha, Convert(Char(2), fecha, 103) as fec, fecha as id
FROM Sist_prx
where Convert(Char(2), fecha, 101) = $id
ORDER BY fec
");
$data= array();
while($row= mssql_fetch_array($result)){
array_push($data,array(
"id" => "SF".$row["id"],
"text" => $row["Fecha"],
"files" => $data2
));
}
echo json_encode($data);
}
if($id == "root"){
$result= mssql_query("SELECT DISTINCT(DATENAME(MONTH, fecha)) as text, Convert(Char(2), fecha, 101) as id
FROM sist_prx ORDER BY id ASC");
$data= array();
while($row= mssql_fetch_array($result)){
array_push($data,array(
"id" => $row["id"],
"text" => $row["text"],
"files" => $data2
));
}
echo json_encode($data);
}
?>
El java es el del tutorial de ejemplo:
Ext.ns('com.tree');
com.tree.AjaxTree = {
init: function(){
//code here
var loader = new Ext.tree.TreeLoader({
url: 'getnodos.php'
});
var tree = new Ext.tree.TreePanel({
border: false,
autoScroll:true,
loader: loader
});
var root = new Ext.tree.AsyncTreeNode({
text: 'Registros de Usuarios',
expanded:true,
id: 'root'
});
tree.setRootNode(root);
var win = new Ext.Window({
title:'Tree Panel',
layout:'fit',
width:300,
height:500,
items: tree
});
win.show();
}
}
Ext.onReady(com.tree.AjaxTree.init,com.tree.AjaxTree);
Esto queda así:
https://lh4.googleusercontent.com/-5tOy1AQ6_mY/ThyQBo-lVBI/AAAAAAAAAFE/BULPM-OZjF0/tree.PNG
Falta cambiar iconos, etc... otro detalle es que los nombres de las fechas me aparecen en ingles, pero en el sql server me lo muestra en español. Tengo que ver cual es el problema porque ya probé todo lo que hay y nada funciona. De ultima un Array para cambiar todos los datos y listo.
Saludos.
Listo, ya pude. Usé el ejemplo http://www.quizzpot.com/2009/10/arboles-generados-con-ajax pero dinamico, tomando datos en vivo de la base de datos. Lo que necesioto saber es 2 cosas:
1- No me detecta el id, salvo que se empiece del Nº1. o sea, yo estaba empezando en el mes 06 y no habia manera de que me devuelva valores. Aparentemente detecta la posicion, no el id. Si tengo 3 nodos, von ID: 9-10-11, al enviar node=1 me muestra el node ID 9
2- Como le agrego un nivel mas al ejemplo!!! necesito por lo menos un nivel mas y tambien que al apretar en el leaf me de un valor para corgar un panel al costado.
Por favor, cualquier ayuda se agradecerá!!
Saludos.
Lo que yo tengo en la base de datos son registros de acceso a internet del proxy squid. Entonces lo que quiero hacer es tomar de SQL los diferentes Meses, dias y usuarios para hacer un tree y en base a eso poder mostrar los resultados de acceso.
En SQL hago lo siguiente:
SELECT DISTINCT DATENAME(month, fecha)
FROM Sist_prx //ME DEVUELVE Enero, Febrero, etc
SELECT DISTINCT DATENAME(WEEKDAY, fecha)+ ' ' + DAY(fecha) as Fecha
FROM Sist_prx
ORDER BY Fecha ASC //ME DEVUELVE Lunes 04, Martes 05, etc
SELECT DISTINCT usuario
FROM Sist_prx // ME DEVUELVE Gustavo, pedro, pablo, etc
Ahora, lo que quiero en ExtJs es hacer una base con los meses, al hacer click en un mes, mandar una variable para poder filtrar los dias que existen de ese mes y al hacer click en el dia denuevo mandar una variable con dia y mes para filtrar los distintos usuarios que navegaron ese dia.
Estoy bastante perdido con esto porque no se como llenar un tree con resultados ni como enviar baseParams al hacer click. La verdad es que los ejemplos de sencha.com son malos para el que nunca usó un tree.
Saludos.
Aqui te pongo un ejemplo de como yo hago para cargar el tree y de como se crea
js
tree = new Ext.tree.TreePanel({
border: true,
autoScroll: true,
collapsible: true,
titleCollapse: true,
split: true,
root: new Ext.tree.AsyncTreeNode({
id: '.',
text: 'Inversionista',
qtip: 'Entidades inversionista por organismo.',
expanded: true
}),
title: 'Inversionistas',
dataUrl: "cargarArbolInv",
margins: '3 0 3 3',
region: 'west',
collapseMode: 'mini',
width: 300
});
y la funcion del php
function cargarArbolInvAction() {
$data = array();
$cod = isset($_REQUEST['node']) ? $_REQUEST['node'] : "";
if ($cod == '.') {//Aqui pregunto si el nodo que me mandan es el del AsyncTreeNode que seria la primera vez que cargo el arbol y solo cogeria los organismos, ya despues que despliegue un organismo va y carga sus entidades
$arrayOrg = TbmiOrganismos::GetOrg();
foreach ($arrayOrg as $index => $ent) {
foreach ($arrayOrg as $index1 => $org) {
if ($ent["identidad"] == $org->idestructura) {
array_push($data, array(
"id" => $org->codigo,
"qtip" => $org->denominacion,
"text" => " " . $org->denominacion,
"leaf" => $org->$hoja
));
break;
}
}
}
} else {
$arrayEntdeOrg = TbmiEntidades::GetEntidadesDeUnOrg($cod);
foreach ($arrayEntdeOrg as $index => $org) {
array_push($data, array(
"id" => $org->cod,
"text" => " " . $org->des,
"qtip" => " " . $org->des,
"leaf" => true
));
}
}
echo json_encode($data);
}
Espero que esto te pueda ayudar en algo, cualquier duda me dices
¿Conoces a alguien que pueda responder esta pregunta? Comparte el link en Twitter o Facebook
Es necesario registrarse para poder participar en el foro! Si ya tienes una cuenta puedes entrar y comentar en este foro.