19 de mayo de 2014

Instalando Limesurvey con Wordpress

Primero descargar la version de Limesurvey a utilizar, tal como especifico Zinnia se utilizara la versión limesurvey192plus-build120919 la cual se descarga de acá
http://www.limesurvey.org/en/archived-releases/viewcategory/24-archived-releases

porque no utilizar la mas reciente? porque no es compatible ni con el php ni el Mysql que estamos utilizando, están abajo de la pagina las especificaciones.

1. Lo descargan y luego lo decomprimen, quedense solo con la carpeta limesurvey, cópienla y coloquenla en el directorio de archivos de su servidor(cada quien sabe donde se alojan sus directorios).

2. ahora se debe configurar el config.php, este archivo esta en el directorio raíz


lo que mas nos importa es esto:

$databasetype       =   'mysql';       

$databaselocation   =   'localhost';  
$databasename       =   'limesurvey';  
$databaseuser       =   'tu usuario de la base de datos';       
$databasepass       =   'tu password de la base de dats';            
$dbprefix           =   'lime_';      
$rooturl            =   "http://{$_SERVER['HTTP_HOST']}/limesurvey";

fijense que el /limesurvey corresponde al nombre de la carpeta que copiaron en su directorio de archivos a publicar...por ultimo y muy importante, por defecto el usuario y password de Limesurvey son:

$defaultuser        =   'admin';           
$defaultpass        =   'password';       

ustedes sabrán si lo cambian.

3. nos metemos a http://localhost/limesurvey/admin/install/ y crean la base de datos.

y luego dejan que Limesurvey cree las tablas necesarias


deberian tener algo como esto


4. ahora debemos ir de nuevo a la carpeta Limesurvey y busquen el archivo install y cambien el nombre por old.instal


5. ahora ya deberian poder empezar a utilizar Limesurvey con esto http://localhost/limesurvey/admin/

pueden cambiar la configuración aquí:


modificar su usuario


y crear nuevos, eso dependerá del DAE


Luego deben descargar el plugin SurveyPress de esta direccion
http://wordpress.org/plugins/surveypress/

lo agregan al Wordpress y luego lo configuran, en mi caso me sirve esta configuracion:


Para comprobar, salgan de Wordpress y vuelvan a ingresar con su usario, no deberia darles ningun problema, sino ahi esta Google.

14 de mayo de 2014

WordPress no pudo establecer una conexión segura con WordPress.org

si te aparece este error al querer intalar un theme o plugin en Wordpress:

Warning: Ha sucedido un error inesperado. Algo fue mal con WordPress.org o con la configuración de este servidor. Si continuas teniendo problemas, por favor prueba en los foros de soporte. (WordPress no pudo establecer una conexión segura con WordPress.org. Por favor, contacta con el administrador de tu servidor.) in C:\Apache2.2\htdocs\wp-includes\update.php on line 119

lo que debes hacer es ir a la carpeta wp-includes y abrir el archivo de texto class-http, ahi debes modificar esta parte: 
de  'sslverify' => true, 
cambialo a   'sslverify' => false,

guarda todo y reinicia tu server, es todo.

26 de abril de 2014

Consejos con ASP.NET


Mientras cree cualquier sitio web, debe mantener en mente algunos puntos para mejorar su rendimiento.

1.) Configure el debug=false de la siguiente manera:

< compilation default Language="c#" debug="false" >

2.) Use Server.Transfer en vez de Response.Redirect.

3) Compruebe siempre Page.IsValid cuando se utilizan controles Validator.

4) Use Foreach loop en lugar de For loop para String Iteration.

5) Utilizar la validación del lado cliente donde sea posible.

6.)Verifique “Page.IsPostBack”. Para evitar la repetición de la ejecución de código.

7.)GIF y PNG son similares, pero PNG normalmenteson de menor tamaño. (Es verdad, pero algunos navegadores no apoyar el formato PNG)

8.)Usar el AppOffline.htm cuando se actualiza binarios.

9.)Desactivar Tracing, a menos que sea requerido. (por defecto esta desactivada, uselo en las páginas en las que es necesario)

< trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/ >

10.)Precompile las páginas y desactivar AutoEventWireup; colocar el atributo AutoEventWireup en false en el archivo Machine.config.

11.)Apague el estado de la sesión, si no es necesario.

< sessionstate timeout="20" cookieless="false" mode="Off" stateconnectionstring="tcpip=127.0.0.1:42424" sqlconnectionstring="data source=127.0.0.1;Trusted_Connection=no" >

12.)Seleccione el modo de Release (versión final) antes de hacer la construcción para su aplicación.

14.)Deshabilitar Viewstate cuando no se requiere.

EnableViewState="false"

15.)Evite frecuentes viajes de ida y vuelta a la base de datos.

16.)Use caché para mejorar el rendimiento de su aplicación.

17.)Validar todos los ingresos recibidos de los usuarios.

18.)Utilice método Finally para matar a los recursos.

19.) Use el StringBuilder en lugar del String ya que ocupan una posición de memoria diferente en cada momento de la modificación. 

20.) Nunca use directamente el Objeto; primero obtenga el valor del objeto en la variable local que usara. Se tarda más tiempo entonces la lectura de variables.

21.)Evite las excepciones: Use la condición if (si se trata de comprobar la condición adecuada)

22.)Optimización de código: Evite el uso de código como x = x +1; es siempre mejor usar x + = 1.

23.)Técnicas de Acceso a datos: DataReaders proporciona un método rápido y eficaz de recuperación de datos. DataReader es mucho más rápido de DataSets en lo que refiere al rendimiento

24.)Como siempre, evitar las variables de sesión, ya que cada página ASP se ejecuta en un subproceso diferente y pide período de sesiones se serializa una por una. Así pues, este pondra mas lenta la aplicación. En lugar de las variables de sesión se puede utilizar la colección QueryString o variables ocultas en la forma que tiene los valores

25.)Habilite buffering mejorará el rendimiento.

< % response.buffer=true % > 
< % response.flush=true % > 


26.)Utilice el control Repeater en lugar de DataGrid, DataList, porque es eficiente, personalizable y programable.

27.)Las Lista de datos(Data listing) consumen más tiempo para grandes volúmenes de datos cuando se recupere datos de la base de datos.

Paginación mostrará sólo los datos en particular, sino tomar la carga de todos los datos. 
Buscar sólo los datos que se necesita para la página actual.


28.)Evite los JavaScript y CSS en linea(Inline)

29.)Utilizan un solo archivo CSS en lugar de múltiples archivos CSS.

Lo posible se deben combinar todas las clases CSS basado en un solo css. Archivo como mucho. Archivos CSS provocará una gran cantidad de solicitudes, independientemente del tamaño de los archivos. 

. archivos CSS normalmente se almacena en caché de los navegadores, así que un único y fuerte. css no causa de una larga espera en cada solicitud de página. 

En línea. Clases CSS podría hacer HTML pesados, por lo que de nuevo: seguir adelante con un archivo de single.css

30) Reducir el tamaño de las cookies.

31.) Comprimir CSS, JavaScript e imágenes.

Compresores en línea están disponibles, para comprimir el archivo por favor se refiere siguientes web y reemplazar el contenido de su archivo con optimizar el código.

32.)Use Cache apropiadamente.

33.) No haga las variables public or proteted, trate de mantenerlo private y use public/proteted como propiedades.

34.)Use strString=string.Empty en lugar de strString="" [Y tal vez en lugar de strString=null tambien (?)]

35.) Hacer sus paginas lo más ligero posible. La idea es tratar de evitar márgenes innecesarias, por ejemplo, uso de elementos div en lugar de tablas.

36.)Escribir mensajes estáticos en div y hacerlo visible cuando sea necesario. Esto es más rápido que dejar que el servidor establezer la propiedad Text en el label o div.

37.)Recuperar datos de la base de datos en una sola vez, si es posible. Asi no se hacen muchos viajes a la base de datos. Para ello, se combinan los campos de datos de diferentes tablas y seleccionarlos.

26 de marzo de 2014

Serialize C#

En muchas de nuestras aplicaciones cuando la funcionalidad que damos se vuelve cada día mayor es necesario intercambiar información digamos más compleja que un simple dato de tipo carácter o numérico, podemos pensar quizá en los datos completos de un empleado (nombre, edad, domicilio, RFC, foto, etc...) o incluso una colección de ellos. Este intercambio puede ser entre aplicaciones, a nivel de Base de datos, usando la misma plataforma que la nuestra o incluso una distinta y con plataforma me refiero no solo al sistema operativo, sino que también a la tecnología con la que estamos desarrollando. ¿Qué sucederá cuando necesitemos comunicarnos con una aplicación echa en Java por poner un ejemplo?



Pues bien, la serialización viene al rescate, ya tenemos el escenario, nuestro problema está en la mesa. Tenemos nuestras clases, instancias concretas de esas clases y necesitamos almacenar y transmitir esa información. Aquí empezare a hacer hincapié que la serialización no es la panacea y que ahora debamos grabar así siempre en la Base de Datos o mandar de esa forma la información a otros sistemas, NO AHÍ COSAS BUENAS O MALAS, existen necesidades especificas y soluciones y está en nosotros saber identificar cuando debemos usar una pistola o un matamoscas.
Empezaremos con la serialización en formato binary, serializar es el proceso de crear un stream de bytes a partir de un objeto (una instancia concreta). Supongamos que tenemos una clase que se llama Empleado.


Si nosotros queremos serializar un objeto de esa clase necesitamos agregar el atributo [Serializable] a nuestra clase, si intentáramos serializar una clase que no tiene este atributo se generara una excepción.


Retomando lo que veníamos platicando si serializar es colocar nuestra instancia concreta en un stream de bytes ¿qué mas necesitamos?

1)Una instancia de nuestra clase Empleado

2)Un objeto de tipo stream que es donde almacenaremos nuestra instancia en un formato diferente, en este caso usaremos un objeto de tipo FileStream, esta clase nos proporciona nada menos que 15 constructores, usaremos lo necesario y eso es solo indicar el nombre del archivo que se generara y el modo en que estamos creando el objecto que es Create.

3)Requerimos por ultimo especificar la forma en que vamos a serializar,para serailizar en formato binary requerimos un objecto de tipo BinaryFormatter, este objecto nos permitira con el metodo “Serialize” serializar nuestra instancia concreta en el archivo stream que creamos, es decir lo vaciamos.


Hasta aquí hemos visto como convertir nuestra información de un objeto , ahora ¿qué sucede cuando necesitamos recuperar el objeto que serializamos?

1) Requerimos una variable del tipo de nuestra clase (NO una instancia).

2) Requerimos nuevamente un objeto de tipo stream para esta vez abrir el archivo que se genero y que contiene nuestra información serializada.

3) Requerimos nuevamente el objeto de tipo BinaryFormatter para esta vez con su metodo “Deserialize” deserealizar nuestra información y por ultimo hacer un cast de la información que hemos deserializado y setearlo a la variable que creamos en el paso 1


Comentarios :

I)BinaryFormatter es la mejor opción para serializar y deserializar objectos que solo seran interpretados por aplicaciones desarrolladas en .NETFrameWork
II)Existen otros "formateadores" XML , SOAP y Custom Serialization que son mas adecuados para ambientes que involucran sistemas operativos y aplicaciones ajenas al NetFrameWork e incluso a Windows y que nos permiten mayor flexibilidad.
III)Es una buena practica hacer nuestras clases serializables, aun cuando no tengamos claro si se usara, el dicho es "si ahi duda haslas serializables".

Los espacios de nombre utilizados fueron :
System.Runtime.Serialization.Formatters
System.Runtime.Serialization.Formatters.Binary
System.IO

Y regresando a la mecanica de plantear problemas dejo la pauta para la parte II con lo siguiente :
¿y si quiero que algunos miembros no sean serializables?
¿Como evitar problemas de compatibilidad entre versiones de mis clases?¿que pasa si agrego una nueva propiedad despues de que las clases ya estan siendo consumidas?
¿cual es la mejor practica para propiedades calculadas?

11 de marzo de 2014

Validación no-intrusiva en ASP.NET 4.5

Unobtrusivevalidation_error

1.- Deshabilitar la validación no-intrusiva página  por página

Esto habilitará la validación tradicional de versiones anteriores de ASP.NET Web Forms (hasta la 4.0).
Hacerlo de esta manera, a mano, es tedioso si tienes más de un par de páginas con validadores, pero es muy sencillo. Simplemente tendremos que añadir esta línea al evento Load de tu página:
   1: Page.UnobtrusiveValidationMode = System.Web.UI.UnobtrusiveValidationMode.None;

2.- Deshabilitar la validación no-intrusiva para toda la aplicación

Para conseguirlo tenemos que agregar una línea a nuestro archivo de configuración web.config, colocándola en el nodo appsettings, así:
   1: <appSettings>
   2:     <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
   3: </appSettings>

15 de abril de 2013

Apuntes de Transact SQL


Para los siguientes ejemplos de Transact SQL la tabla a utilizar se llama empleado y la estructura es esta:



PROCEDIMIENTOS ALMACENADOS T-SQL

Mostrare el código T-SQL de procedimientos almacenados que realizan las acciones de agregar datos, modificar datos, eliminar datos y seleccionar datos sobre los registros de la tabla empleado, al invocar al procedimiento almacenado se retornara un mensaje indicando la acción que realizo el procedimiento, a la vez muestro el código en VB para ejecutar los procedimientos en el cual se mostrara en un label el mensaje que los procedimiento almacenados retornen.

*****  Agregar registros a la tabla empleados(Procedimiento AgregarDatos) *****

USE [registro]
GO
if OBJECT_ID('AgregarDatos','p')is not null
drop proc AgregarDatos
go

CREATE PROCEDURE AgregarDatos
@nombres varchar(50),
@cargo varchar(50)='No Value',
@departamento varchar(50)='No Value',
@jefe varchar(50)='No Value',
@mensaje varchar(100) output
AS
SET NOCOUNT ON

IF (@nombres='')
BEGIN
SELECT @mensaje='Ingresar como minimo el nombre del empleado'
RETURN
END

BEGIN TRY
BEGIN TRAN
INSERT INTO empleado VALUES(@nombres, @cargo, @departamento, @jefe)
COMMIT
SELECT @mensaje='Registro ingresado correctamente en Base de Datos !!!'
END TRY

BEGIN CATCH
ROLLBACK
SELECT @mensaje='Registro no ingresado en Base de Datos !!!'
END CATCH

·         Ejecucion del procedimiento almacenado en codigo VB

Using cnn As New SqlConnection(conexion)
 Try
  cnn.Open()
   Using cmd As New SqlCommand("AgregarDatos", cnn)
         cmd.CommandType = CommandType.StoredProcedure
         cmd.Parameters.AddWithValue("@nombres", "Jose Armando Flores")
         cmd.Parameters.AddWithValue("@cargo", "Gerente de Mantenimiento")
         cmd.Parameters.AddWithValue("@departamento", "Bodega")
         cmd.Parameters.AddWithValue("@jefe", "Gerente General")
         cmd.Parameters.AddWithValue("@estado", "Plaza Permanente")
                     cmd.Parameters.Add("@mensaje", SqlDbType.VarChar, 100)
         cmd.Parameters("@mensaje").Direction = ParameterDirection.Output
         cmd.ExecuteNonQuery()
         Label1.Text = CStr(cmd.Parameters("@mensaje").Value)
    End Using
   Catch ex As Exception
          MsgBox(ex.Message)
  End Try
   End Using


*****  Modificar registros a la tabla empleados(Procedimiento ModificarDatos) *****

USE [registro]
GO
IF OBJECT_ID('ModificarDatos','p')is not null
DROP PROC ModificarDatos
GO

CREATE PROC ModificarDatos
@codigo int,
@nombres varchar(50),
@cargo varchar(50),
@departamento varchar(50),
@jefe varchar(50),
@mensaje varchar(100) output
AS
SET NOCOUNT ON

IF (@codigo='')
BEGIN
SELECT @mensaje='Favor ingresar el codigo del empleado a modificar'
RETURN
END

IF exists (select * from empleado where Codigo=@codigo)
BEGIN TRY
BEGIN TRAN
UPDATE empleado SET Nombres=@nombres, Cargo=@cargo, Departamento=@departamento, Jefe=@jefe WHERE Codigo=@codigo
COMMIT
SET @mensaje='El registro fue actualizado correctamente  !!!'
END TRY

BEGIN CATCH
ROLLBACK
SET @mensaje='El registro no fue actualizado !!!'
END CATCH
ELSE
BEGIN
SET @mensaje='El registro no existe en la base de datos !!!'
END

·         Ejecucion del procedimiento almacenado en codigo VB

Using cnn As New SqlConnection(conexion)
      Try
        cnn.Open()
      Using cmd As New SqlCommand("ModificarDatos", cnn)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("@codigo", 48)
            cmd.Parameters.AddWithValue("@nombres", "Jose Armando Flores")
            cmd.Parameters.AddWithValue("@cargo", "Gerente de Mantenimiento")
            cmd.Parameters.AddWithValue("@departamento", "Bodega")
            cmd.Parameters.AddWithValue("@jefe", "Gerente General")
            cmd.Parameters.AddWithValue("@estado", "Plaza Permanente")
            cmd.Parameters.Add("@mensaje", SqlDbType.VarChar, 100)
            cmd.Parameters("@mensaje").Direction = ParameterDirection.Output
            cmd.ExecuteNonQuery()
            Label1.Text = CStr(cmd.Parameters("@mensaje").Value)
     End Using
           Catch ex As Exception
            MsgBox(ex.Message)
       End Try
     End Using


*****  Eliminar registros a la tabla empleados(Procedimiento EliminarDatos) *****

USE registro
GO
IF OBJECT_ID('EliminarDatos','p')is not null
DROP PROC EliminarDatos
GO

CREATE PROCEDURE EliminarDatos
@codigo int,
@mensaje varchar(100) output
AS
SET NOCOUNT ON

IF (@codigo='')
BEGIN
SELECT @mensaje='Favor ingresar el codigo del empleado a eliminar'
RETURN
END

IF EXISTS (select * from empleado where Codigo=@codigo)
BEGIN TRY
BEGIN TRANSACTION
DELETE FROM empleado WHERE Codigo=@codigo
COMMIT
SELECT @mensaje='Registro eliminado correctamente de Base de Datos !!!'
END TRY

BEGIN CATCH
ROLLBACK
set @mensaje='Registro no fue eliminado de la Base de Datos !!!'
END CATCH
ELSE
BEGIN
SET @mensaje='Registro no se puede eliminar pues no existe !!!'
END

·         Ejecucion del procedimiento almacenado en codigo VB

Using cnn As New SqlConnection(conexion)
   Try
      cnn.Open()
    Using cmd As New SqlCommand("EliminarDatos", cnn)
         cmd.CommandType = CommandType.StoredProcedure
         cmd.Parameters.AddWithValue("@codigo", 49)
         cmd.Parameters.Add("@mensaje", SqlDbType.VarChar, 100)
         cmd.Parameters("@mensaje").Direction = ParameterDirection.Output
         cmd.ExecuteNonQuery()
         Label1.Text = CStr(cmd.Parameters("@mensaje").Value)
    End Using
   Catch ex As Exception
         MsgBox(ex.Message)
   End Try
    End Using


*****  Mostrar registros de la tabla empleados(Procedimiento MostrarDatos) *****

USE [registro]
GO
IF OBJECT_ID('MostrarDatos','p')is not null
DROP PROCEDURE MostrarDatos
GO

CREATE PROCEDURE MostrarDatos
@estado varchar(50)
AS
SET NOCOUNT ON
BEGIN
select * from empleado where Estado=@estado
END

·         Ejecucion del procedimiento almacenado en codigo VB

Using sql As New SqlConnection(conexion)
   Try
    sql.Open()
     Using cmd As New SqlCommand("MostrarDatos", sql)
           cmd.CommandType = CommandType.StoredProcedure
           cmd.Parameters.AddWithValue("@estado", "plaza permanente")
               Dim da As New SqlDataAdapter(cmd)
               Dim dt As New DataTable
                da.Fill(dt)
                DataGridView1.DataSource = dt
                End Using
    Catch ex As Exception
                MsgBox(ex.Message)
    End Try
 End Using


Funciones T-SQL

Mostrare el código T-SQL de funciones  que  devuelven valores ya sea escalares o bien de tabla, a la vez muestro el código en VB para ejecutar las , en el código VB se mostraran los resultados en un DataGridView la información de tablas y en un label la información de la función escalar

*****  Mostrar registros de la tabla empleados(Funcion MostrarRegistros) *****

USE registro
GO
IF OBJECT_ID('MostrarRegistros')is not null
DROP FUNCTION MostrarRegistros
GO

CREATE FUNCTION MostrarRegistros(
@estado varchar(50)
)
RETURNS TABLE
AS
RETURN
(select * from empleado where Estado=@estado)


·         Ejecucion de la funcion desde SQL

USE registro
GO
SELECT * FROM dbo.MostrarRegistros('Plaza Permanente')
GO


·         Ejecucion de la funcion en codigo VB

Dim sql As New SqlConnection(conexion)
sql.Open()
Dim cmd As New SqlCommand("select * from MostrarRegistros(@parametro)", sql)
cmd.Parameters.AddWithValue("@parametro", "Plaza Permanente")
 Dim da As New SqlDataAdapter(cmd)
 Dim dt As New DataTable
   da.Fill(dt)
   DataGridView1.DataSource = dt


*****  Funcion Escalar(Funcion BuscarNombre) *****

USE registro
GO
IF OBJECT_ID('BuscarNombre')is not null
DROP FUNCTION BuscarNombre
GO

CREATE FUNCTION BuscarNombre(
@codigo int
)RETURNS varchar(50)
AS
BEGIN
DECLARE @nombres varchar(50)
SELECT @nombres=nombres FROM empleado WHERE codigo=@codigo
RETURN @nombres
END


·         Ejecucion de la funcion desde SQL

USE registro
GO
DECLARE @nombres varchar(50)
SET @nombres=dbo.BuscarNombre(1)
PRINT @nombres

·         Ejecucion de la funcion en codigo VB

Using cnn As New SqlConnection(conexion)
 Try
      cnn.Open()
   Using cmd As New SqlCommand("SELECT dbo.BuscarNombre(@codigo)", cnn)
         cmd.Parameters.AddWithValue("@codigo", 1)
         Label1.Text = CStr(cmd.ExecuteScalar())
   End Using
 Catch ex As Exception
         MsgBox(ex.Message)
 End Try
  End Using


*****  Funcion en Linea(Funcion Mostrar) *****

Esta funcion creara una tabla y devolvera el resultado que concuerde con el parametro enviado a la funcion, en el codigo VB se mostraran los resultados en un DataGridView.

USE registro
GO
IF OBJECT_ID('Mostrar')is not null
DROP FUNCTION Mostrar
GO

CREATE FUNCTION Mostrar(
@estado varchar(50)
)
RETURNS @tablita TABLE(
codigo int,
nombres varchar(50),
cargo varchar(50),
dpto varchar(50),
jefe varchar(50)
)
AS
BEGIN
INSERT INTO @tablita
SELECT codigo, nombres, cargo, departamento, jefe
FROM empleado
WHERE estado=@estado
RETURN
END

·         Ejecucion de la funcion desde SQL

USE registro
GO
SELECT * FROM dbo.Mostrar('Plaza Permanente')
GO

·         Ejecucion de la funcion en codigo VB

Dim sql As New SqlConnection(conexion)
sql.Open()
Dim cmd As New SqlCommand("select * from Mostrar(@parametro)", sql)
cmd.Parameters.AddWithValue("@parametro", "Plaza Permanente")
 Dim da As New SqlDataAdapter(cmd)
 Dim dt As New DataTable
   da.Fill(dt)
   DataGridView1.DataSource = dt


TRIGGERS y Vistas T-SQL

Se creara un trigger que guarde en un tabla llamada ActualizacionesEmpleado los datos del empleado que se ha actualizado, asi como la fecha en que se actualizo y el usuario que actualizo los datos, luego mediante una vista se mostraran los datos en un DataGridView utilizando VB.NET

·         Codigo T-SQL del trigger DatosActualizados sobre la tabla empleado

USE [registro]
GO
IF OBJECT_ID('DatosActualizados')is not null
DROP TRIGGER DatosActualizados
GO

CREATE TRIGGER DatosActualizados
on empleado
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
INSERT INTO ActualizacionesEmpleado
select *,getdate(),SYSTEM_USER from INSERTED
END

·         Codigo T-SQL de la vista VistaActualizaciones

USE registro
GO
IF OBJECT_ID('VistaActualizaciones')is not null
DROP VIEW VistaActualizaciones
GO

CREATE VIEW VistaActualizaciones
AS
SELECT * FROM ActualizacionesEmpleado
GO

·         Ejecución de la Vista en código VB

Using sql As New SqlConnection(conexion)
   Try
      sql.Open()
        Dim da As New SqlDataAdapter("select * from VistaActualizaciones", sql)
        Dim dt As New DataTable
        da.Fill(dt)
        DataGridView1.DataSource = dt

   Catch ex As Exception
        MsgBox(ex.Message)
   End Try
End Using