3 octubre, 2016 Deja un comentario

[ASP.NET][GridView] – Como seleccionar una fila

Introducción

He visto en reiteradas oportunidad que una operación simple como es el caso de operar con una fila de un GridView se puede transformarse en algo complejo, mas que nada motivado por la distintas formas que hay para realizar esta acción.

En este articulo veremos las algunas formas de lograrlo y como difieren las técnicas que se puede aplicarse.

Temas que se tratar:

1- Seleccionar una Row

a- Definiendo un CommandField

b- Usando un ImageButton y CommandName

c- Usando el evento RowCommand

2-Uso de DataKeyNames y DataKeys

a- DataKeyNames con campos Múltiples

Para todos los casos planteados partiremos del mismo gridview, el cual se ira modificando para agregarle opciones y ver los distintos temas.

1- Seleccionar una Row

Existen varias formas de realizar una misma tarea, pero veremos aquí las dos mas simples y directas que se suelen encontrar cuando se necesita seleccionar un registro en el control gridview.

1a- Definiendo un CommandField

Iremos realizando los paso de forma visual así se comprende como proceder, remarcando luego como impacta esto en el html del grid

El primer paso será editar las columnas del GridView hasta visualizar el cuadro con las opciones de CommandField disponibles.

Para este caso en particular se agregara solo la opción de selección. Mediante las flechas laterales se puede posicionar el comando. También se dispone de distintos tipos de representación visual, como ser un Link, Button o Image.

Para este caso usaremos un comando del tipo Image, por lo tanto se deberá definir la propiedad “SelectImageUrl”. Si se define del tipo Link y se quiere cambiar el texto, se usaría la propiedad “SelectText”.

El próximo paso será el de definir el evento de selección, para esto solo marcamos el gridview, y yendo a sus propiedades se podrá activar el evento SelectedIndexChanged

El html resultante debería tener resaltadas las siguiente características

Con estos pasos ya estamos listos para capturar la acción de selección del gridview.

1b – Usando un ImageButton y CommandName

En esta alternativa se hará uso de un TemplateField, se prodece de la misma forma del paso 1a, pero se agrega un item diferente

Una vez que esta el témplate, se adapta modificando directamente en el html, incluyendo de esta forma el control ImageButton.

Es muy importante remarcar que el ImageButton deberá tener la propiedad CommandName=”Select” para que esta ejecute el evento SelectedIndexChanged

A nivel de código de la pagina se encontrara la definición del evento

Hay que aclarar que en este caso se uso un ImageButton para corresponder con la acción del punto 1a, en donde se define una imagen, pero si se requiere de un link solo será cuestión de usar un LinkButton, definiendo en este el CommandName=”Select”, es justamente el CommandName quien define que evento será lanzado al presionarse.

1c- Usando el evento RowCommand

Seguramente a estas alturas se preguntaran que cantidad de formas de hacer lo mismo, asi es, y para completarlo una opción extra.

Resulta que al definir un ImageButton (o LinkButton) en un TemplateItem y usar el CommandName=”Select” se habilita un evento adicionar para poder capturar esta acción, si es que el SelectedIndexChanged no nos convence.

Se trata del evento RowCommand.

Hay un pequeño detalle con este evento y se trata de la definición del CommandArgument para determinar que fila lanza la acción.

[C#]

01.protected void gvPerson_RowCommand(object sender, GridViewCommandEventArgs e)
02.{
03.if (e.CommandName == "Select")
04.{
05.//
06.// Se obtiene indice de la row seleccionada
07.//
08.int index = Convert.ToInt32(e.CommandArgument);
09.
10.//
11.// Obtengo el id de la entidad que se esta editando
12.// en este caso de la entidad Person
13.//
14.int id = Convert.ToInt32(gvPerson.DataKeys[index].Value);
15.
16.}
17.
18.}

[VB.NET]

01.Protected Sub gvPerson_RowCommand(sender As Object, e As GridViewCommandEventArgs)
02.
03.If e.CommandName = "Select" Then
04.'
05.' Se obtiene indice de la row seleccionada
06.'
07.Dim index As Integer = Convert.ToInt32(e.CommandArgument)
08.
09.'
10.' Obtengo el id de la entidad que se esta editando
11.' en este caso de la entidad Person
12.'
13.
14.Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(index).Value)
15.End If
16.
17.End Sub

En el ejemplo de la pagina WebForm4.aspx, se podrá probar como ambos eventos, tanto el RowCommand y el SelectedIndexChanged, pueden definirse, aunque lo normal es utilizar solo uno de estos.

2 – Uso de DataKeyNames y DataKeys

Una de las mejores técnicas usada para detectar que entidad se esta editando o seleccionado es por medio de id o código que esta tenga asignada, pero como logar hacerlo sin mostrar el identificador al usuario en una columna ?, es justamente el trabajo de estas dos propiedades que se consigue resolver el problema.

Si se presta atención al html este contaba con al definición de esta propiedad de nombre DataKeyNames

Solo debe definirse que campo del origen de datos identifica a la entidad que se esta trabajando.

Cuando se lance el evento solo será cuestión de tomar la row que ejecuta la acción, y de esta, por el índice recuperar el valor del id de la entidad, en este caso el PersonID.

[C#]

01.protected void gvPerson_SelectedIndexChanged(object sender, EventArgs e)
02.{
03.//
04.// Se obtiene la fila seleccionada del gridview
05.//
06.GridViewRow row = gvPerson.SelectedRow;
07.
08.//
09.// Obtengo el id de la entidad que se esta editando
10.// en este caso de la entidad Person
11.//
12.int id = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Value);
13.
14.
15.}

[VB.NET]

01.Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs)
02.'
03.' Se obtiene la fila seleccionada del gridview
04.'
05.Dim row As GridViewRow = gvPerson.SelectedRow
06.
07.'
08.' Obtengo el id de la entidad que se esta editando
09.' en este caso de la entidad Person
10.'
11.Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(row.RowIndex).Value)
12.
13.
14.End Sub

2a- DataKeyNames con campos Múltiples

En este ejemplo solo se utilizo un valor simple para identificar a la entidad, pero el CommandName puede definir mas de un campo de información.

Por ejemplo que sucede si se quiere enviar el PersonId y el Nombre, esto es tan solo un ejemplo para demostrar las funcionalidad, no tiene una aplicación práctica en este caso, ya que con solo el PersonID seria mas que suficiente.

Para definir el DataKeyNames en el grid es tan simple como separar los campos por una coma.

y en el código solo se toma el valor de la propiedad Values

[C#]

01.protected void gvPerson_SelectedIndexChanged(object sender, EventArgs e)
02.{
03.//
04.// Se obtiene la fila seleccionada del gridview
05.//
06.GridViewRow row = gvPerson.SelectedRow;
07.
08.//
09.// Obtengo el id y el nombre  de la entidad que se esta editando
10.// en este caso de la entidad Person
11.//
12.int id = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Values["PersonID"]);
13.
14.string nombre = Convert.ToString(gvPerson.DataKeys[row.RowIndex].Values["FirstName"]);
15.
16.
17.}

[VB.NET]

01.Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs)
02.'
03.' Se obtiene la fila seleccionada del gridview
04.'
05.Dim row As GridViewRow = gvPerson.SelectedRow
06.
07.'
08.' Obtengo el id y el nombre  de la entidad que se esta editando
09.' en este caso de la entidad Person
10.'
11.Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(row.RowIndex).Values("PersonID"))
12.
13.Dim nombre As String = Convert.ToString(gvPerson.DataKeys(row.RowIndex).Values("FirstName"))
14.
15.
16.End Sub
Categorías:Sin categoría

Crear un Web Service con PHP y MySQL (Introducción)

4 septiembre, 2013 Deja un comentario

Una API (Application Programming Interface o Interfaz de programación de aplicaciones) es un conjunto de funciones y métodos que ofrece una biblioteca que permite su utilización de forma remota como una capa de abstracción. Google, por ejemplo, tiene la Google SOAP Search API que permite a los desarrolladores consultar entre los millones de páginas web indexadas por Google directamente desde una aplicación cualquiera usando un Web Service, a través de los estándar SOAP y WDSL.

Un Web Service o Servicio Web, por su parte, es un sistema software diseñado para soportar la interoperabilidad de máquina a máquina en una red. En el contexto de aplicaciones Web, usualmente se refiere a un conjunto de APIs que se pueden acceder a través de Internet y ejecutar en un sistema remoto que aloja el servicio solicitado. Las máquinas interactúan con el Web service utilizando unos mensajes especiales llamodos SOAP que se han de establecer previamente.

Para conocer cómo se realiza el intercambio de mensajes en los Web Services debemos primero debemos entender los elementos fundamentales que lo componen. Estos son el XML, SOAP, WSDL, y UDDI.

XML (Extensible Markup Language)

Es un subconjunto simplificado del SGML (Standard Generalized Markup Language o Estándar de Lenguaje de Marcado Generalizado) que fue diseñado principalmente para documentos Web. Se caracteriza porque permite crear “etiquetas o tags propias (véase <libro>), habilitando la definición, transmisión, validación, y la interpretación de datos entre aplicaciones y entre organizaciones. Un punto que es importante aclarar es que el HTML y el XML tienen funciones diferentes. El HTML tiene por objeto mostrar información, mientras que el XML se ocupa de la información propiamente dicha (el contenido). Este concepto es importante tenerlo en cuenta, ya que muchas personas al escuchar sobre XML piensan que es el sucesor de HTML.

Ejemplo de un documento XML sobre información de autos:

<?xml version="1.0" encoding="UTF-8"?> 
<vehiculos> 
  <coche> 
      <marca>Toyota</marca> 
      <modelo>Corolla</modelo> 
      <fechaCompra>2002</fechaCompra> 
  </coche> 
  <coche> 
      <marca>Honda</marca> 
      <modelo>Civic</modelo> 
      <fechaCompra>2003</fechaCompra> 
  </coche> 
</vehiculos>

SOAP (Simple Object Access Protocol)

Es un protocolo que permite la comunicación entre aplicaciones a través de mensajes por medio de Internet. Es independiente de la plataforma, y del lenguaje. Está basado en XML y es la base principal de los Web Services. Los mensajes SOAP son documento XML propiamente dicho.

<?xml version="1.0"?>
<soap:Envelope  xmlns:soap="http://www.w3.org/2001/12/soap-envelope" 
        soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> 
    <soap:Header> 
        // Definición de la cabecera del mensaje. Incluye información específica del mensaje, 
        // como puede ser la autenticación.
    </soap:Header> 
    <soap:Body> 
        // Definición o descripción del cuerpo del mensaje, en esta sección se incorpora toda la información 
        // necesaria para el nodo final. Por ejemplo, los parámetros para la ejecución, o la respuesta a una
        // petición.
        <soap:Fault> 
            // Todos los fallos que se puedan producir se deben notificar aquí.
        </soap:Fault> 
    </soap:Body> 
</soap:Envelope>

Explicación del código anterior

  • <?xml version=”1.0″?> Como se puede apreciar, SOAP, es un documento XML, y como tal, debe comenzar con el tag <?xml….?> y la versión correspondiente.
  • <soap:Envelope indica que comienza el envelope (sobre) del mensaje.
  • xmlns:soap = “http://www.w3.org/2001/12/soap-envelope&#8221; que viene a decir que en un mensaje SOAP siempre se debe asociar el elemento envelope al namespace (espacio de nombres) http://www.w3.org/2001/12/soap-envelope.
  • soap:encodingStyle=”http://www.w3.org/2001/12/soap-encoding”&gt; indica dónde se encuentran definidos los tipos de datos utilizados en el documento.
  • <soap:Header> indica el comienzo del Header (encabezado). En esta sección se incluye información específica del mensaje, como puede ser la autenticación.
  • </soap:Header> indica el final del Header (encabezado).
  • <soap:Body> indica el inicio del cuerpo del mensaje, en esta sección se incorpora toda la información necesaria para el nodo final. Por ejemplo, los parámetros para la ejecución, o la respuesta a una petición.
  • <soap:Fault> que se utiliza para que cualquier tipo de fallo que se produzca se notifique en esta sección y que, como se observa, está contenida dentro del cuerpo del mensaje.
  • </soap:Fault> cierra de la sección Fault.
  • </soap:Body> indica el final del cuerpo del mensaje.
  • </soap:Envelope> indica el final del mensaje SOAP.

WSDL (Web Services Description Language)

Es un protocolo basado en XML que describe los accesos al Web Service. Podriamos decir que es el manual de operación del web service, porque nos indica cuales son las interfaces que provee el servicio web y los tipos de datos necesarios para la utilización del mismo.

<?xml version="1.0">
<definitions>
    <types>
        // definición de los tipos de datos utilizados en el Web Service
    </types>
    <message>
        // definición de los métodos y parámetros para realizar la operación. Cada message puede consistir en una o
        // más partes (parámetros)
    </message>
    <portType>
        // definición de las operaciones que pueden ser realizadas, y los mensajes involucrados 
        // (por ejemplo el mensaje de petición y el de respuesta). Es la parte más importante.
    </portType>
    <binding>
        // definiciones de los formatos de los mensajes y detalles del protocolo para cada portType
    </binding>
</definitions>

Explicación del código anterior

  • <?xml version=”1.0″> es otro documento XML, es por esto que debe comenzar con el tag <?xml .. ?>
  • <definitions> indica el comienzo del documento, este tag agrupa a todos los demás.
  • <types> que es dónde se definen los tipos de datos utilizados en el Web Service.
  • </types> que indica el final de la definición de tipos.
  • <message> que es dónde se definen los métodos y parámetros para realizar la operación. Cada message puede consistir en una o más partes (parámetros).
  • </message> que indica el final de la definición de los parámetros.
  • <portType> dónde se definen las operaciones que pueden ser realizadas, y los mensajes involucrados (por ejemplo el mensaje de petición y el de respuesta). Es la parte más importante.
  • </portType> que es el final de la definición de las operaciones y mensajes.
  • <binding> dónde se define el formato del mensaje y detalles del protocolo para cada portType.
  • </binding> que finaliza la definición del formato del mensaje y detalles del protocolo para cada PortType.
  • </definition> que es para indicar el final del documento WSDL

Tenéis un buen ejemplo en el artículo Paso de Parámetros en SOAP con Estructuras complejas dónde se explica como realizar un Web Service con WSDL y tipos de datos simples.

UDDI (Universal Discovery Description An Integration)

Es un modelo de directorios para Web Services. Una especificación para mantener directorios estandarizados de información acerca de los Web Services, sus capacidades, ubicación, y requerimientos en un formato reconocido universalmente. UDDI utiliza WSDL para describir las interfaces de los Web Services.

Dicho de otra manera, es un lugar en el cual podemos buscar cuales son los Servicios web disponibles, una especie de directorio en el cual podemos encontrar los Web Services publicados y publicar los Web Services que desarrollemos.

Crear un Web Service con PHP y MySQL (Introducción)

15 agosto, 2013 Deja un comentario

Una API (Application Programming Interface o Interfaz de programación de aplicaciones) es un conjunto de funciones y métodos que ofrece una biblioteca que permite su utilización de forma remota como una capa de abstracción. Google, por ejemplo, tiene la Google SOAP Search API que permite a los desarrolladores consultar entre los millones de páginas web indexadas por Google directamente desde una aplicación cualquiera usando un Web Service, a través de los estándar SOAP y WDSL.

Un Web Service o Servicio Web, por su parte, es un sistema software diseñado para soportar la interoperabilidad de máquina a máquina en una red. En el contexto de aplicaciones Web, usualmente se refiere a un conjunto de APIs que se pueden acceder a través de Internet y ejecutar en un sistema remoto que aloja el servicio solicitado. Las máquinas interactúan con el Web service utilizando unos mensajes especiales llamodos SOAP que se han de establecer previamente.

Para conocer cómo se realiza el intercambio de mensajes en los Web Services debemos primero debemos entender los elementos fundamentales que lo componen. Estos son el XML, SOAP, WSDL, y UDDI.

XML (Extensible Markup Language)

Es un subconjunto simplificado del SGML (Standard Generalized Markup Language o Estándar de Lenguaje de Marcado Generalizado) que fue diseñado principalmente para documentos Web. Se caracteriza porque permite crear “etiquetas o tags propias (véase <libro>), habilitando la definición, transmisión, validación, y la interpretación de datos entre aplicaciones y entre organizaciones. Un punto que es importante aclarar es que el HTML y el XML tienen funciones diferentes. El HTML tiene por objeto mostrar información, mientras que el XML se ocupa de la información propiamente dicha (el contenido). Este concepto es importante tenerlo en cuenta, ya que muchas personas al escuchar sobre XML piensan que es el sucesor de HTML.

Ejemplo de un documento XML sobre información de autos:

<?xml version=“1.0” encoding=“UTF-8”?>
<vehiculos>
 
<coche>
     
<marca>Toyota</marca>
     
<modelo>Corolla</modelo>
     
<fechaCompra>2002</fechaCompra>
 
</coche>
 
<coche>
     
<marca>Honda</marca>
     
<modelo>Civic</modelo>
     
<fechaCompra>2003</fechaCompra>
 
</coche>
</vehiculos>

 

SOAP (Simple Object Access Protocol)

Es un protocolo que permite la comunicación entre aplicaciones a través de mensajes por medio de Internet. Es independiente de la plataforma, y del lenguaje. Está basado en XML y es la base principal de los Web Services. Los mensajes SOAP son documento XML propiamente dicho.

<?xml version=“1.0”?>
<soap:Envelope  xmlns:soap=http://www.w3.org/2001/12/soap-envelope&#8221;
       
soap:encodingStyle=http://www.w3.org/2001/12/soap-encoding&#8221;>
   
<soap:Header>
        // Definición de la cabecera del mensaje. Incluye información específica del mensaje,
        // como puede ser la autenticación.
   
</soap:Header>
   
<soap:Body>
        // Definición o descripción del cuerpo del mensaje, en esta sección se incorpora toda la información
        // necesaria para el nodo final. Por ejemplo, los parámetros para la ejecución, o la respuesta a una
        // petición.
       
<soap:Fault>
            // Todos los fallos que se puedan producir se deben notificar aquí.
       
</soap:Fault>
   
</soap:Body>
</soap:Envelope>

 

Explicación del código anterior

  • <?xml version=”1.0″?> Como se puede apreciar, SOAP, es un documento XML, y como tal, debe comenzar con el tag <?xml….?> y la versión correspondiente.
  • <soap:Envelope indica que comienza el envelope (sobre) del mensaje.
  • xmlns:soap = “http://www.w3.org/2001/12/soap-envelope&#8221; que viene a decir que en un mensaje SOAP siempre se debe asociar el elemento envelope al namespace (espacio de nombres) http://www.w3.org/2001/12/soap-envelope.
  • soap:encodingStyle=”http://www.w3.org/2001/12/soap-encoding”&gt; indica dónde se encuentran definidos los tipos de datos utilizados en el documento.
  • <soap:Header> indica el comienzo del Header (encabezado). En esta sección se incluye información específica del mensaje, como puede ser la autenticación.
  • </soap:Header> indica el final del Header (encabezado).
  • <soap:Body> indica el inicio del cuerpo del mensaje, en esta sección se incorpora toda la información necesaria para el nodo final. Por ejemplo, los parámetros para la ejecución, o la respuesta a una petición.
  • <soap:Fault> que se utiliza para que cualquier tipo de fallo que se produzca se notifique en esta sección y que, como se observa, está contenida dentro del cuerpo del mensaje.
  • </soap:Fault> cierra de la sección Fault.
  • </soap:Body> indica el final del cuerpo del mensaje.
  • </soap:Envelope> indica el final del mensaje SOAP.

 

WSDL (Web Services Description Language)

Es un protocolo basado en XML que describe los accesos al Web Service. Podriamos decir que es el manual de operación del web service, porque nos indica cuales son las interfaces que provee el servicio web y los tipos de datos necesarios para la utilización del mismo.

<?xml version=“1.0”>
<definitions>
   
<types>
       
// definición de los tipos de datos utilizados en el Web Service
    <
/types>
    <message>
        /
/ definición de los métodos y parámetros para realizar la operación. Cada message puede consistir en una o
       
// más partes (parámetros)
    <
/message>
    <portType>
        /
/ definición de las operaciones que pueden ser realizadas, y los mensajes involucrados
       
// (por ejemplo el mensaje de petición y el de respuesta). Es la parte más importante.
    <
/portType>
    <binding>
        /
/ definiciones de los formatos de los mensajes y detalles del protocolo para cada portType
    <
/binding>
</
definitions>

 

Explicación del código anterior

  • <?xml version=”1.0″> es otro documento XML, es por esto que debe comenzar con el tag <?xml .. ?>
  • <definitions> indica el comienzo del documento, este tag agrupa a todos los demás.
  • <types> que es dónde se definen los tipos de datos utilizados en el Web Service.
  • </types> que indica el final de la definición de tipos.
  • <message> que es dónde se definen los métodos y parámetros para realizar la operación. Cada message puede consistir en una o más partes (parámetros).
  • </message> que indica el final de la definición de los parámetros.
  • <portType> dónde se definen las operaciones que pueden ser realizadas, y los mensajes involucrados (por ejemplo el mensaje de petición y el de respuesta). Es la parte más importante.
  • </portType> que es el final de la definición de las operaciones y mensajes.
  • <binding> dónde se define el formato del mensaje y detalles del protocolo para cada portType.
  • </binding> que finaliza la definición del formato del mensaje y detalles del protocolo para cada PortType.
  • </definition> que es para indicar el final del documento WSDL

 

UDDI (Universal Discovery Description An Integration)

Es un modelo de directorios para Web Services. Una especificación para mantener directorios estandarizados de información acerca de los Web Services, sus capacidades, ubicación, y requerimientos en un formato reconocido universalmente. UDDI utiliza WSDL para describir las interfaces de los Web Services.

Dicho de otra manera, es un lugar en el cual podemos buscar cuales son los Servicios web disponibles, una especie de directorio en el cual podemos encontrar los Web Services publicados y publicar los Web Services que desarrollemos.

Comunicación SOAP

15 agosto, 2013 Deja un comentario

Este artículo va para todos aquellos que se preguntan cómo puede hacer la comunicación SOAP con tipos de datos simples y complejos. Es decir, cómo enviar-recibir parámetros mediante SOAP.

Una de las cosas que todos vemos, o solemos ver, al principio cuando nos metemos en el mundo del los Servicios Web es el XML-RPC (un protocolo de llamada a procedimiento remoto que usa XML para codificar los datos y HTTP para la transmisión de mensajes) pero, si investigáis un poco, descubriréis que muchos lenguajes no se llevan muy bien que digamos con este protocolo.

Seguidamente, uno le echa valor y se decide, por ejemplo, a implementar un Web Service en PHP y, de repente, se encuentra con otro obstáculo. PHP 5.x no es que esté demasiado “maduro” en este tema y además, como se puede comprobar fácilmente, hay escasa documentación.

Después de pelearse y conseguir nuestro primer Servicio Web, Luego uno se también suele meterse en los archivos de descripción WSDL y, normalmente, ya muchos toman la decisión de dejarlo por imposible porque, aunque parecen sencillos, pero no lo son.

Bueno. No hay que ponerse catastrofistas. Una de las grandes aportaciones que nos hace SOAP y WSDL es que tanto el servidor como el cliente, de forma automática, comprueban muchos errores y lo hace todo de forma independiente al usuario. Es por esta razón que nos encontramos tantos problemas para realizar estructuras complejas como son los array asociativos.

Si lo que queremos es crear o gestionar datos simples como cadenas, enteros o fechas, esta tecnología puede ayudarnos mucho pero, si lo que se quiere es gestionar estructuras de elementos complejas como son los arrays asociativos los dolores de cabeza aumentarán considerablemente ya que no existe casi documentación sobre ello, y por si fuera poco, la que hay, o no lo explican bien, o no es del todo veraz.

Dicho esto, recordemos que los Servicios Web se componen de 3 partes básicamente. Definición del archivo WSDL, el archivo PHP del Cliente y el archivo PHP del Servidor. El WSDL es el más importante ya que sin este nunca funcionará.

Por si no habéis tocado mucho el SOAP, primero, haremos un ejemplo con paso de parámetros simples y, a continuación, realizaremos uno con estructuras complejas.

Ejemplo 1: Paso de Parámetros Simples en SOAP

La archivo WSDL (soap.wsdl)

Como se ve a continuación, NO DECLARAMOS NINGÚN TYPES porque al sólo tener que manejar un parámetro simple de tipo string ya lo hace sóla la aplicación.

<?xml version="1.0" encoding="utf-8"?> 
<!-- NOTAS IMPORTANTES --> 
<!-- ***************** --> 
<!-- SI SE CAMBIA EL SERVICIO WEB DE UBICACIÓN SE DEBE SUSTITUIR http://www.islavisual.com/ws POR LA URL QUE PROCEDA. --> 
<!-- SI ADEMÁS SE UTILIZA UN ARCHIVO schema.xsd TAMBIÉN HAY QUE CAMBIARLO DÓNDE APAREZCA. --> 
<definitions name="servicio"  
             targetNamespace='http://www.islavisual.com/ws/soap.wsdl' 
             xmlns          ='http://schemas.xmlsoap.org/wsdl/' 
             xmlns:http     ="http://schemas.xmlsoap.org/wsdl/http/" 
             xmlns:soap     ="http://schemas.xmlsoap.org/wsdl/soap/" 
             xmlns:SOAP-ENC ="http://schemas.xmlsoap.org/soap/encoding/"  
             xmlns:xsd      ='http://www.w3.org/2001/XMLSchema'> 
     
    <!--    AHORA DEBEMOS DEFINIR LO QUE EN SOAP SE DENOMINA MENSAJES. ESTOS MENSAJES SE CORRESPONDEN CON EL NOMBRE DE LA 
            FUNCIÓN Y SUS PARÁMETROS DE LA CLASE DEL SOAP-SERVER.  
            EL name DEL message ES EQUIVALENTE AL NOMBRE DE LA FUNCIÓN.  
            EL name DE CADA part SE CORRESPONDE CON CADA UNO DE LOS PARÁMETROS DE LA FUNCIÓN.  
            EN EL ELEMENTO part: 
                SI QUEREMOS DEFINIR PARÁMETROS DE ENTRADA LO HAREMOS CON EL ATRIBUTO type EN EL MENSAJE QUE TERMINA EN Request. 
                SI QUEREMOS DEFINIR PARÁMETROS DE ENTRADA LO HAREMOS CON EL ATRIBUTO type EN EL MENSAJE QUE TERMINA EN Response.--> 
     
    <!-- MESSAGE estaActivo --> 
    <message name='estaActivoRequest'> 
        <part name='message' type='xsd:string' /> 
    </message> 
    <message name='estaActivoResponse'> 
        <part name='result' type='xsd:string' /> 
    </message> 
    <!-- fin MESSAGE estaActivo --> 
     
    <!--    DEFINICIÓN DE LAS OPERACIONES PERMITIDAS Y MENSAJES INVOLUCRADOS (PETICIÓN Y RESPUESTA, ...). 
            NORMALMENTE TANTO input COMO output TENDRÁN CORRESPONDENCIAS CON LOS MENSAJES DEFINIDOS EN LA ZONA DE MENSAJES 
            ANTES DEFINIDA. --> 
             
    <portType name='servicioPortType'> 
        <!-- OPERACION estaActivo --> 
        <operation name='estaActivo'> 
            <input message='tns:estaActivoRequest' /> 
            <output message='tns:estaActivoResponse' /> 
        </operation> 
        <!-- fin OPERACION estaActivo --> 
    </portType> 
     
    <!--    AHORA ESPECIFICAMOS LOS PROTOCOLOS DE COMUNICACIÓN USADOS. DICHO DE OTRA MANERA ES LA DEFINICIÓN DEL FORMATO DE  
            CADA MENSAJE Y DETALLES DEL PROTOCOLO DE CADA PortType. 
            AQUÍ DECLARAMOS UNA OPERACIÓN, LE ASOCIAMOS LA FUNCIÓN DE LA CLASE Y, SU ENTRADA Y SALIDA --> 
             
    <binding name='servicioBinding' type='tns:servicioPortType'> 
        <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/> 
        <!-- OPERACION estaActivo --> 
        <operation name='estaActivo'> 
            <soap:operation soapAction='http://www.islavisual.com/ws#estaActivo' /> 
            <input> 
                <soap:body use='literal' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='http://www.islavisual.com/ws' /> 
            </input> 
            <output> 
                <soap:body use='literal' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' /> 
            </output> 
        </operation> 
        <!-- fin OPERACION estaActivo --> 
    </binding> 
     
    <!-- AHORA REALIZAMOS LA DEFINICIÓN DEL CONJUNTO DE PUERTOS Y DIRECCIÓN DE LOS MISMOS. --> 
    <service name='servicio'> 
        <port binding='tns:servicioBinding' name='servicioPort'> 
            <soap:address location='http://www.islavisual.com/ws/soapServer.php'/> 
        </port> 
    </service> 
</definitions>

 

La archivo client.php

Podemos declarar las opciones de la conexión estableciendo un array bastante simple:

$options = array( 
    // Opciones frecuentes 
    'trace' => true, 
    'exceptions' => true, 
    'wsdl_cache' => WSDL_CACHE_NONE, 
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS, 
    'soap_version'   => SOAP_1_2, 
 
    // Credenciales de Autentificación para peticiones SOAP. 
    'login' => 'username', 
    'password' => 'password', 
     
    // Codificación de la conexión 
    'encoding'=>'UTF-8', 
     
    // URL del Proxy. No se debe poner aquí el http ó https ya que no funcionaría. 
    'proxy_host' => 'www.islavisual.com',  
    'proxy_port' => 44300, 
     
    // Credenciales de Autentificación para el Proxy. 
    'proxy_login' => NULL, 
    'proxy_password' => NULL);

 

Establecemos la conexión:

$client = new SoapClient("http://www.islavisual.com/ws/soap.wsdl", $options );

 

Hacemos la llamada a la función deseada. En este caso es una función muy simple que sólo nos devuelve el TimeStamp de Unix si recibe el valor ‘Hello’ y NULL si no coincide.

$client->isAlive( new SoapParam("Hello", "message"));

 

Y finalmente procedemos a establecer las cabeceras y la respuesta del Servidor:

header ("Content-Type:text/xml; charset=utf-8"); 
echo $client->__getLastResponse();

 

La archivo server.php

Primero podemos configurar algunas variables del Servidor aunque no es necesario:

ini_set("soap.wsdl_cache_enabled", "1"); 
ini_set("soap.soap.wsdl_cache_dir", "/tmp"); 
ini_set("soap.wsdl_cache_ttl", "86400");

 

Segundo declaramos la clase con las funciones a incorporar a nuestro Web Service:

class SOAPFunctions { 
    private $_SOAPSERVER = NULL; 
    private $_HEADERVARS = ""; 
    private $_params     = array(); 
    private $_USER       = ""; 
    private $_PASSWORD   = ""; 
 
    public function __construct($soapServer_resource){ 
        $this->_SOAPSERVER  = $soapServer_resource; 
        $this->_USER        = $_SERVER['PHP_AUTH_USER']; 
        $this->_PASSWORD    = $_SERVER['PHP_AUTH_PW']; 
    } 
 
    public function isAlive($message){ 
        if($message == "Hello") return time(); 
        else return NULL; 
    } 
}

 

Finalmente establecemos el Constructor de SoapServer y configuramos unas pocas propiedades:

$wsdl = "http://".$_SERVER['SERVER_NAME'].dirname($_SERVER['SCRIPT_NAME'])."/"; 
$soap_server  = new SoapServer($wsdl."soap.wsdl"); 
$soap_server->setClass("SOAPFunctions", $soap_server); 
$soap_server->handle();

 

  • Con setClass le indicamos cuál es la clase que tiene nuestros métodos.
  • Con handle le indicamos que procese la petición SOAP y nos devuelva una respuesta.

 

Ahora si lo queréis probar sólo tendréis que ejecutar o llamar al client.php

 

Como crear un campo que tenga una contraseña o password en sql server?

20 febrero, 2013 Deja un comentario

Muchas gracias al Sr. Augusto.

Como siempre encontrandome con cosas nuevas cada dia o cosas que recordar, mejor ponerlo como apunte para no tener que buscar nuevamente documentacion, seguramente alguna vez te has encontrado con la pregunta de como almaceno un password en sql server? claro y es nuestro deber encriptar las contraseñas o password.
Bueno, en realidad es sencillo, lo apunto para que a la siguiente no se me vaya a olvidar otra vez.
Por alguna razon no he encontrado la documentacion con nuestro boton F1 acerca de las funciones PWDENCRYPT y PWDCOMPARE, si alguien sabe por que, pues digamelo!!!

Bien a la obra las manos,

Para almacenar un valor encriptado de manera asimetrica (que quiere decir asimetrica?, “un poco de google no les haria mal”) tendra que tener un campo con el tipo VARBINARY(longitud), en el caso de ejemplo tengo una tabla llamada

CREATE TABLE Login
(
[IdLogin] [int] IDENTITY(1,1) PRIMARY KEY,
[IdUsuario] [varchar](255)NOTNULL,
[Contrasenia] [varbinary](max)NOT NULL
)

entonces para ingresar un valor se hace

insert into login(IdUsuario, contrasenia)values(‘b@a.com’,PWDENCRYPT(’123456′))

y para buscar o hacer match del usuario cuando este se logee sera…

select *from login where IdUsuario =‘b@a.com’andPWDCOMPARE(’123456′, contrasenia)= 1

Si esta consulta devuelve un registro, obviamente devolvera el registro segun los criterios de la clausula where, pero si no devuelve nada entonces el “usuario o la contraseña no es correcta“.

Para ver mas claramente el uso de estas funciones vea

DECLARE @PASS VARBINARY(MAX)
SELECT @PASS = PWDENCRYPT(’123456′)
SELECT @PASS
SELECT ‘PASS OK!!!’ WHERE PWDCOMPARE(’123456′, @PASS) = 1

Categorías:SQL

[ASP.NET][GRIDVIEW] – COMO SELECCIONAR UNA FILA

7 febrero, 2013 4 comentarios

 

Introducción

He visto en reiteradas oportunidad que una operación simple como es el caso de operar con una fila de un GridView se puede transformarse en algo complejo, mas que nada motivado por la distintas formas que hay para realizar esta acción.

En este articulo veremos las algunas formas de lograrlo y como difieren las técnicas que se puede aplicarse.

Temas que se tratar:

1- Seleccionar una Row

a- Definiendo un CommandField

b- Usando un ImageButton y CommandName

c- Usando el evento RowCommand

2-Uso de DataKeyNames y DataKeys

   a- DataKeyNames con campos Múltiples

Para todos los casos planteados partiremos del mismo gridview, el cual se ira modificando para agregarle opciones y ver los distintos temas.

 

1- Seleccionar una Row

Existen varias formas de realizar una misma tarea, pero veremos aquí las dos mas simples y directas que se suelen encontrar cuando se necesita seleccionar un registro en el control gridview.

1a- Definiendo un CommandField

Iremos realizando los paso de forma visual así se comprende como proceder, remarcando luego como impacta esto en el html del grid

El primer paso será editar las columnas del GridView hasta visualizar el cuadro con las opciones de CommandField disponibles.

Para este caso en particular se agregara solo la opción de selección. Mediante las flechas laterales se puede posicionar el comando. También se dispone de distintos tipos de representación visual, como ser un Link, Button o Image.

Para este caso usaremos un comando del tipo Image, por lo tanto se deberá definir la propiedad “SelectImageUrl”. Si se define del tipo Link y se quiere cambiar el texto, se usaría la propiedad “SelectText”.

El próximo paso será el de definir el evento de selección, para esto solo marcamos el gridview, y yendo a sus propiedades se podrá activar el evento SelectedIndexChanged

El html resultante debería tener resaltadas las siguiente características

Con estos pasos ya estamos listos para capturar la acción de selección del gridview.

 

1b – Usando un ImageButton y CommandName

En esta alternativa se hará uso de un TemplateField, se prodece de la misma forma del paso 1a, pero se agrega un item diferente

Una vez que esta el témplate, se adapta modificando directamente en el html, incluyendo de esta forma el control ImageButton.

Es muy importante remarcar que el ImageButton deberá tener la propiedad CommandName=”Select” para que esta ejecute el evento SelectedIndexChanged

A nivel de código de la pagina se encontrara la definición del evento

Hay que aclarar que en este caso se uso un ImageButton para corresponder con la acción del punto 1a, en donde se define una imagen, pero si se requiere de un link solo será cuestión de usar un LinkButton, definiendo en este el CommandName=”Select”, es justamente el CommandName quien define que evento será lanzado al presionarse.

 

1c- Usando el evento RowCommand

Seguramente a estas alturas se preguntaran que cantidad de formas de hacer lo mismo, asi es, y para completarlo una opción extra.

Resulta que al definir un ImageButton (o LinkButton) en un TemplateItem y usar el CommandName=”Select” se habilita un evento adicionar para poder capturar esta acción, si es que el SelectedIndexChanged no nos convence.

Se trata del evento RowCommand.

Hay un pequeño detalle con este evento y se trata de la definición del CommandArgument para determinar que fila lanza la acción.

[C#]

 

01.protected void gvPerson_RowCommand(object sender, GridViewCommandEventArgs e)
02.{
03.if (e.CommandName == "Select")
04.{
05.//
06.// Se obtiene indice de la row seleccionada
07.//
08.int index = Convert.ToInt32(e.CommandArgument);
09. 
10.//
11.// Obtengo el id de la entidad que se esta editando
12.// en este caso de la entidad Person
13.//
14.int id = Convert.ToInt32(gvPerson.DataKeys[index].Value);
15. 
16.}
17. 
18.}

 

[VB.NET]

01.Protected Sub gvPerson_RowCommand(sender As Object, e As GridViewCommandEventArgs)
02. 
03.If e.CommandName = "Select" Then
04.'
05.' Se obtiene indice de la row seleccionada
06.'
07.Dim index As Integer = Convert.ToInt32(e.CommandArgument)
08. 
09.'
10.' Obtengo el id de la entidad que se esta editando
11.' en este caso de la entidad Person
12.'
13. 
14.Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(index).Value)
15.End If
16. 
17.End Sub

En el ejemplo de la pagina WebForm4.aspx, se podrá probar como ambos eventos, tanto el RowCommand y el SelectedIndexChanged, pueden definirse, aunque lo normal es utilizar solo uno de estos.

 

2 – Uso de DataKeyNames y DataKeys

Una de las mejores técnicas usada para detectar que entidad se esta editando o seleccionado es por medio de id o código que esta tenga asignada, pero como logar hacerlo sin mostrar el identificador al usuario en una columna ?, es justamente el trabajo de estas dos propiedades que se consigue resolver el problema.

Si se presta atención al html este contaba con al definición de esta propiedad de nombre DataKeyNames

Solo debe definirse que campo del origen de datos identifica a la entidad que se esta trabajando.

Cuando se lance el evento solo será cuestión de tomar la row que ejecuta la acción, y de esta, por el índice recuperar el valor del id de la entidad, en este caso el PersonID.

[C#]

01.protected void gvPerson_SelectedIndexChanged(object sender, EventArgs e)
02.{
03.//
04.// Se obtiene la fila seleccionada del gridview
05.//
06.GridViewRow row = gvPerson.SelectedRow;
07. 
08.//
09.// Obtengo el id de la entidad que se esta editando
10.// en este caso de la entidad Person
11.//
12.int id = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Value);
13. 
14. 
15.}

[VB.NET]

01.Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs)
02.'
03.' Se obtiene la fila seleccionada del gridview
04.'
05.Dim row As GridViewRow = gvPerson.SelectedRow
06. 
07.'
08.' Obtengo el id de la entidad que se esta editando
09.' en este caso de la entidad Person
10.'
11.Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(row.RowIndex).Value)
12. 
13. 
14.End Sub

 

2a- DataKeyNames con campos Múltiples

En este ejemplo solo se utilizo un valor simple para identificar a la entidad, pero el CommandName puede definir mas de un campo de información.

Por ejemplo que sucede si se quiere enviar el PersonId y el Nombre, esto es tan solo un ejemplo para demostrar las funcionalidad, no tiene una aplicación práctica en este caso, ya que con solo el PersonID seria mas que suficiente.

Para definir el DataKeyNames en el grid es tan simple como separar los campos por una coma.

y en el código solo se toma el valor de la propiedad Values

[C#]

01.protected void gvPerson_SelectedIndexChanged(object sender, EventArgs e)
02.{
03.//
04.// Se obtiene la fila seleccionada del gridview
05.//
06.GridViewRow row = gvPerson.SelectedRow;
07. 
08.//
09.// Obtengo el id y el nombre  de la entidad que se esta editando
10.// en este caso de la entidad Person
11.//
12.int id = Convert.ToInt32(gvPerson.DataKeys[row.RowIndex].Values["PersonID"]);
13. 
14.string nombre = Convert.ToString(gvPerson.DataKeys[row.RowIndex].Values["FirstName"]);
15. 
16. 
17.}

[VB.NET]

01.Protected Sub gvPerson_SelectedIndexChanged(sender As Object, e As EventArgs)
02.'
03.' Se obtiene la fila seleccionada del gridview
04.'
05.Dim row As GridViewRow = gvPerson.SelectedRow
06. 
07.'
08.' Obtengo el id y el nombre  de la entidad que se esta editando
09.' en este caso de la entidad Person
10.'
11.Dim id As Integer = Convert.ToInt32(gvPerson.DataKeys(row.RowIndex).Values("PersonID"))
12. 
13.Dim nombre As String = Convert.ToString(gvPerson.DataKeys(row.RowIndex).Values("FirstName"))
14. 
15. 
16.End Sub

 

Categorías:ASPX, Sin categoría

Control en textbox VB.NET

Agradesco a un colaborador por esta ayuda.

PrivateSub txtImporte_KeyPress(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtImporte.KeyPress

Dim isDecimal, isMinus, isValidChar AsBoolean

Dim separadorDecimal AsString = Nothing

SelectCase e.KeyChar

Case“.”c, “,”c

‘ Obtenemos el carácter separador decimal existente

‘ actualmente en la configuración regional de Windows.

separadorDecimal = _

Threading.

Thread.CurrentThread. _

CurrentCulture.NumberFormat.NumberDecimalSeparator

‘ Hacemos que el carácter tecleado coincida con el

‘ carácter separador existentente en la configuración

‘ regional.

e.KeyChar = separadorDecimal.Chars(0)

‘ Es un carácter válido.

isDecimal =

True

isValidChar =

True

Case“-“c

‘ Es un carácter válido.

isMinus =

True

isValidChar =

True

Case Else

‘ Sólo se admitirán números y la tecla de retroceso.

Dim isDigit AsBoolean = Char.IsDigit(e.KeyChar)

Dim isControl AsBoolean = Char.IsControl(e.KeyChar)

If ((isDigit) OrElse (isControl)) Then

isValidChar =

True

Else

e.Handled =

True

Return

EndIf

EndSelect

‘ Referenciamos el control TextBox subyacente.

Dim tb AsTextBox = TryCast(sender, TextBox)

‘ Si la conversión ha fallado, abandonamos el procedimiento.

If (tb IsNothing) Then

e.Handled =

True

Return

EndIf

‘ Si es un carácter válido, y el texto del control

‘ se encuentra totalmente seleccionado, elimino

‘ el valor actual del control.

If ((isValidChar) And (tb.SelectionLength = tb.TextLength)) Then

tb.Text =

String.Empty

EndIf

If (isMinus) Then

‘ Admitimos el carácter negativo, siempre y cuando

‘ sea el primer carácter del texto, y no exista ya

‘ ningún otro signo negativo.

If ((tb.Text.Length <> 0) OrElse (tb.Text.IndexOf(“-“c) >= 0)) Then

e.Handled =

True

Return

EndIf

EndIf

If (isDecimal) Then

‘ Si en el control hay ya escrito un separador decimal,

‘ deshechamos insertar otro separador más.

If (tb.Text.IndexOf(separadorDecimal) >= 0) Then

e.Handled =

True

Return

EndIf

EndIf

EndSub

Categorías:VB.NET Etiquetas: