viernes, 1 de febrero de 2008

JS Administrar tablas Parte 1

1 - Articulo
2 - Ejemplo

Próximo artículo (Programación en tres capas con VS 2005 o superior). Resumen. Podemos apreciar que siempre se habla de programación a tres capas, pero que mejor que hacerlo orientado a objetos, resultado de un análisis y diseño bien realizado, que permite separar, los métodos de una clase y ponerlos en las distintas capas. Una vez escuche que: microsoft, al definir una herramienta de programación, no permitía programar a tres capas y orientada a objetos. Esto es una rotunda mentira, la filosocía de programación orientada a objetos no tiene que ver con un seudo lenguaje, claro está que una herramienta de desarrollo que facilite esta tarea, siempre es bien recibida. Otra vez escuche que LINQ presentaba problemas al programar orientado a objetos (Esto también es mentira, se puede definir perfectamente una capa de acceso a datos con linq y definir en clases de esta capa, los métodos que realizan las solicitudes a la base de datos). El próximo articulo, amigos míos, biene bueno.

ARTICULO

Siempre tenemos algunos problemas al definir el comportamiento funcional de una aplicación Web, generalmente cuando tenemos que realizar la definición de una nueva fila en una tabla, realizamos una solicitud al servidor para que refreque la página y agrege la fila deseada. Luego, cuando tenemos la información cargada, nviamos la información a servidor para que tome la información de las columnas u las procese para realizar una acción.
Ahora en este pequeño artículo veremos como, en el cliente, podemos agregar una nueva fila o quitar una fila de una tabla. para dejarla lista para ser procesada ya sea un un envio al servidor o por una captura de información de la misma y envío de información a través de ajax con un formato definido.
En este artículo veremos como agregar o quitar nodos y como capturar la información que se ha definido, el traspaso de la información al servidor a través de una función o método en ajax o ajaxpro se los dejo a ustedes. Ya hemos publicado artículos de como de debe pasar la información al servidos.



EJEMPLO

Lo primero que debemos considerar antes de hacer cualquier cosa es definir la tabla con la cual vamos a trabajar, y dependiendo de donde vamos a agregar la información debemos de considerar el nodo en cuestión, es decir:
- Si trabajamos con un control fuera de la tabla, debemos trabajar con la tabla directamente.
- Si trabajamos dentro de la tabla, lo mejor y para que nos funcione en todos lados, buscaremos el tbody de la misma para agregar un nuevo nodo.

Se debe considerar que cuando se programa, lo tbody no se definen en muchos casos, pero si muchos navegadores lo agregan y esto puede ser un problema.

Al final de las líneas de código voy a agregar el html en esta hoja para que vean el comportamiento funciónal.

Lo primero que debemos hacer es definir la tabla que utilizaremos y en la primera fila agregaremos dos combos que nos permitirán agregar la información a la tabla

<table border="1" cellpadding="0" cellspacing="0" id="tbl" width="350px">
<tr>
<td>Selecccione cargo</td>
<td>Seleccione perfil</td>
</tr>
<tr>
<td>
<select id="sltCargo">
<option></option>
<option value="1">Ingeniero</option>
<option value="2">Analista Orgánico</option>
<option value="3">Analista Programador</option>
<option value="4">Programador</option>
</select>
</td>
<td>
<select id="sltPerfil" onchange="javascript:funNodoAgregar(document.getElementById('sltCargo'), this);">
<option></option>
<option value="1">Senior</option>
<option value="2">Medio</option>
<option value="3">Junior</option>
</select>
</td>
</tr>
</table>

Ahora agregaremos en una zona de script, la función que nos permitirá, primero, identificar en que nodo debemos agregar el nuevo elemento y luego agregar el elemento, para ello, primero recorreremos los nodos hasta llegar al definido con tegName TBODY, como se muestra a continuación:


function funObtenerPadre(oObjeto, strObjeto){
var oPadre = oObjeto.parentNode;
for (i=0; i<10;>
if (oPadre.tagName==strObjeto){ break; }
else{ oPadre = oPadre.parentNode; }
}
return oPadre;
}

La función antes descrita debe ser llamada desde otra función, la cual estará encargada de agregar el nuevo nodo, para ello debemos hacer la siguiente acción:


function funNodoAgregar(oCargo, oPerfil){
if (oCargo.options[oCargo.selectedIndex].text!='' &&
oPerfil.options[oPerfil.selectedIndex].text!=''){
var ooCargo = document.createElement("SELECT");
var ooPerfil = document.createElement("SELECT");
var tb = funObtenerPadre(oCargo, 'TBODY');
ooCargo = oCargo.cloneNode(true);
ooPerfil = oPerfil.cloneNode(true);
oCargo.id = oCargo.options[oCargo.selectedIndex].value;
oPerfil.id = oPerfil.options[oPerfil.selectedIndex].value;
oPerfil.onchange="";
var tr = document.createElement("TR");
var td1 = document.createElement("TD");
var td2 = document.createElement("TD");
td1.appendChild(ooCargo);
td2.appendChild(ooPerfil);
tr.appendChild(td1);
tr.appendChild(td2);
tb.appendChild(tr);
}
}



Comentemos el código:

Primero vamos a crear dos objetos de tipo SELECT, los cuales se cargarán clonando los controles al hacer click en el segundo select, luego crearemos los objetos que vamos a agregar a la tabla, como son los TD's y el TR.
Al ir definiendo cada objeto, debemos ir colocándolo dentro de cada óbjeto padre, es decir, los SELECT dentro de los TD's, los TD's dentro del TR y el TR dentro del objeto rescatado de la tabla como padre, que en este caso es el TBODY.


JS Administrar tablas Parte 2

Este artículo se encuentra asociado al de JS Administrar tablas Parte 1, en esta ocación, lo que haremos será crear una función que permita eliminar un registro de tabla y de mofificar la función que agrega los datos.
El comportamiento va a ser el mismo que utilizamos para insertar un registro, es decir, vamos a verificar, en este caso si se ha seleccionado vacio dentro de un select y cuando esto ocurra lo que aremos será eliminar la fila de la tabla.



Primero crearemos la función de borrado que llamará a la función que nos retornará la información del nodo padre y abuelo que se necesita para realizar el borrado de los datos, esta quedaría de la siguiente forma:



function funNodoEliminar(oEliminar){
var oPadre = funObtenerPadre(oEliminar, 'TR');
var oAbuelo = funObtenerPadre(oEliminar, 'TBODY');
oAbuelo.removeChild(oPadre);
}


A continuación realizaremos una modificación en la función que agrega nodos a la tabla, quedando esta de la siguiente forma:


function funNodoAgregar(oCargo, oPerfil){
if (oCargo.id != 'sltCargo'){
funNodoEliminar(oCargo);
}else if (oPerfil.id != 'sltPerfil'){
funNodoEliminar(oPerfil);
}else{
if (oCargo.options[oCargo.selectedIndex].text!='' &&
oPerfil.options[oPerfil.selectedIndex].text!=''){
var ooCargo = document.createElement("SELECT");
var ooPerfil = document.createElement("SELECT");
var tb = funObtenerPadre(oCargo, 'TBODY');
ooCargo = oCargo.cloneNode(true);
ooPerfil = oPerfil.cloneNode(true);
oCargo.id = oCargo.options[oCargo.selectedIndex].value;
oPerfil.id = oPerfil.options[oPerfil.selectedIndex].value;
var tr = document.createElement("TR");
var td1 = document.createElement("TD");
var td2 = document.createElement("TD");
td1.appendChild(ooCargo);
td2.appendChild(ooPerfil);
tr.appendChild(td1);
tr.appendChild(td2);
tb.appendChild(tr);
}
}
}



Si se observa ahora se controla la llamada de cada uno de los select del código html, pero si para esto se debe agregar tanto en el select de cargo como de perfil la llamada al a la función funNodoAgregar, quedando el código html de la siguiente forma:






<table border="1" cellpadding="0" cellspacing="0" id="tbl" width="350px">
<tr>
<td>Selecccione cargo</td>
<td>Seleccione perfil</td>
</tr>
<tr>
<td>
<select id="sltCargo" onchange="javascript:funNodoAgregar(this, document.getElementById('sltPerfil'));">
<option></option>
<option value="1">Ingeniero</option>
<option value="2">Analista Orgánico</option>
<option value="3">Analista Programador</option>
<option value="4">Programador</option>
</select>
</td>
<td>
<select id="sltPerfil" onchange="javascript:funNodoAgregar(document.getElementById('sltCargo'), this);">
<option></option>
<option value="1">Senior</option>
<option value="2">Medio</option>
<option value="3">Junior</option>
</select>
</td>
</tr>
</table>


La función de búsqueda del nodo padre se mantiene


Si probamos, ahora podremos ver que se puede agregar, como eliminar filas, cuando se ha seleccionado un cargo y un perfil.

Ahora lo que nos falta hacer es capturar la información de la tabla, para esto utlizaremos el método getElementByTagName, el cual rescatará la información. Ahora bie´n, mensionamos que podríamos pasarle la información a un método de ajax, nosotros en este caso vamos a crear un método que preparará la información para pasarla, esta función se observa a continuación.

function funSelectRescatar(){
var sXml = "<root>";
var lista = document.getElementsByTagName('select');
for (i=0; i<lista.length;i++){

if (lista[i].options[lista[i].selectedIndex].text!=''){
sXml += "<" + lista[i].options[lista[i].selectedIndex].text + ">";
sXml += lista[i].options[lista[i].selectedIndex].value;
sXml += "</" + lista[i].options[lista[i].selectedIndex].text + ">";

}
sXml += "</root>";

alert(sXml);

}

Lo ultimo que nos queda es realizar la llamada a la función que estará definida de la siguiente forma en el código html

<input id="btnEnviar" name="btnEnviar" type="button" value="Enviar" onclick="javascript:funSelectRescatar();"/>
Ustedes pueden trabajar un poco más el código expuesto, ya que yo les he entregado solo las pautas generales, como lo he venido haciendo en todos mis artículos.

Espero que el ejercicio les gustara.


JS Expresiones Regulares

1 - Articulo
2 - Ejemplo


ARTICULO

Como bien sabemos, dentro de javascript, podemos codificar cualquier tipo de función que se amolde a nuestros requisitos, pero podemos perder un tiempo precioso al momento de no conocer todas las opciones de posibilidades de validación que podemos crear.

Si bien es cierto, los validadores de .NET nos permiten mejorar este tema, ya que podemos agregar fácilmente tipos de validadotes de fechas, de números, expresiones regulares, validadotes de existencia de datos, etc. Pero si tenemos que estar haciendo esto en cada una de las interfaces y debemos hacer un cambio de formato de fechas por ejemplo, vamos a ir corrigiendo expresiones regulares por cada una de las interfaces en donde hayamos agregado uno de estos controles???.

Para este tema existe un control que permite asociar funciones javascript creadas por el usuario y centralizar estas en .NET, pero a veces también es un problema.

Ahora, para los que nos gusta mantener un control del código del cliente, les comunico, que hace mucho tiempo esto ha cambiado, ya que podemos definir nuestras propias expresiones regulares en javascript y, podemos llamar estas desde uno de los métodos de html de clientes.

Explico esto, por que antes de encontrarme con esta forma de trabajar, yo definía como 5 funciones para realizar una validación de fecha, lo cual ahora se concentra en una sola función.

La forma de trabajar con expresiones regulares en javascript es muy simple y solo requiere de una variable que concentre la expresión, luego utilizando el método test de javascript, verificamos si el texto que pasamos cumple con la función y este me retorna un resultado (Verdadero o Falso).

Se acabaron las funciones de 20 líneas, ahora todo rápido jejejeje.
Ahora veremos un ejemplo simple de como definir una expresion regulara para ser utlizada en javascript, definiremos una función que permitirá realizar la validación de formato de correo. Ahora bien, ustedes podrán poder esta función dentro del js que quieran y utilizarla en cualquier página que haga una llamada a este js.
primero crearemos una variable que tendrá definida la expresion regular como se muestra a continuación:

var filter=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;

La definición de expresiones regulares en javascript, siempre deben empezar en /^ y terminar en *$/; este punto es muy importante!!!.

Lo que exista dentro de estos símbolos será la expresión regular

Ahora bien, ya tenemos definida la expresión, ahora debemos conocer como funciona, para ello, vamos a definir la condición, esto es muy facil

If (¡filter.test(‘texto a validar’))
{

//accion a seguir
}

Si desean ver la función completa, la fueden obtener a continuación

function funValidarEmail(oEmail){
var bOk = true;
var s = oEmail.value;

// se define una expresion regular con la cual se evaluará el formato del email
var filter=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;

// verificamos que el email cumpla con el formato requerido
if (!filter.test(s)){
alert('mensaje de error');
oEmail.value="";
oEmail.focus();
bOk = false;
}
return bOk;
}

Comentemos el código.

Como buen desarrollador, si tenemos una función que retorna valor y este debe ser devuelto, siempre definiremos una función con valor verdadero para retornar, en el caso de que la opción no se cumpla se cambia el valor (esta variable es bOK). A esta función, le pasamos el objeto que deseamos controlar en html, es por esto que se observa te la variavle de entrada tiene propiedades asociadas, como el value, focus(), etc. Si no se cumple la validación podemos retornar un mensaje, limpiar el objeto de html y posicionarnos en el.
Bueno como ven, ya no necesito crear una función específica con un array para guardar los caracteres que debo validar, me basta con la Expresion regular.
A continuación adjunto otras definiciones de expresiones regulares.
chauuu....

1 - Validación de teléfono con formato 99-999-9999

var filter =/^\d{2}-\d{3}-\d{4}$/;


2 - validación de texto con caracteres permitidos a-z, A-Z, 0-9, '.', '-', ' '
PD la definición w representa string


var filter =/^\w+([-+.+ +1+2+3+4+5+6+7+8+9+0]\w+)*$/;


Espero que se diviertan con las regular expressions