lunes, 15 de julio de 2013

Cursores en SQL Server

Aquí se muestra cómo crear un cursor que tome de una Base de Datos una gran cantidad de registros para tratarlos uno a uno de forma rápida y automática  sin necesidad de tener que ejecutar una instrucción por cada registro.

En primer lugar declaramos la transacción y creamos las variables correspondientes:
begin transaction
    -- declaramos las variables
      DECLARE @intcodigorecepcion as integer
   DECLARE @strnumerodoc as nvarchar(13)
   DECLARE @datFechaPago as datetime
   DECLARE @i INTEGER --Contador
  

Declaración del cursor.
declare facturas INSENSITIVE cursor for

Select de extracción los datos, los campos que extrae y su orden son importantes por que son los que posteriormente se asignarán a las variables.

select datFechaPago,strNumDocDC, intCodRecepcion from dbo.tbVidaContableExpediente where datFechapago is not NULL and strNumDocDC in (select strnumdocucon from dbo2.tbFacturas where strNumeroFactura like '2012%' and datFechaPago is NULL and srnumdocucon is not NULL)   
      
Apertura del cursor
open facturas

Comienzo del blucle
SELECT @i = @@CURSOR_ROWS

-- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro
    
Se mete cada valor de la select anterior en su campo correspondiente teniendo en cuenta su orden. @strIntCodigorecepcion se le asigna el primer campo de la select, a @strnumerodoc se le asigna el segundo campo de la select, etc.

fetch next from facturas into @datFechaPago, @strnumerodoc, @intcodigorecepcion
            WHILE @i > 0
            BEGIN
                  SELECT @i = @i - 1

Condición para la modificación (opcional) en este caso sólo modifica el registro si el numero de documento obtenido existe en una tabla concreta.

IF (select count(*) from dbo.tbdocumentocontable where strnumerodocumento = @strnumerodoc) > 0

Actualización, aqui es donde finalmente modifica cada registro que cumpla las condiciones con los valores previamente obtenidos de la select

UPDATE dbo2.tbfacturas set datFechaPago=@datFechaPago where intnfacturadocumenta=@intcodigorecepcion and strnumDocuCon = @strnumerodoc    

También se permitre sacar por pantalla información relevante
print @strnumerodoc 
                                               
Avanzamos al siguiente registro
fetch next from facturas into @datFechaPago, @strnumerodoc, 
@intcodigorecepcion

END

cerramos el cursor
close facturas
deallocate facturas

Cerramos la transacción
commit  Transaction


El Cursor completo quedaría así


begin transaction
    -- declaramos las variables
      DECLARE @intcodigorecepcion as integer
      DECLARE @strnumerodoc as nvarchar(13)
      DECLARE @datFechaPago as datetime
      DECLARE @i INTEGER 
    
      declare facturas INSENSITIVE cursor for
          
select datFechaPago,strNumDocDC, intCodRecepcion from dbo.tbVidaContableExpediente where datFechapago is not NULL and strNumDocDC in (select strnumdocucon from dbo2.tbFacturas where strNumeroFactura like '2012%' and datFechaPago is NULL and srnumdocucon is not NULL)      
            open facturas
            SELECT @i = @@CURSOR_ROWS
        -- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro
      fetch next from facturas into @datFechaPago, @strnumerodoc, @intcodigorecepcion
            WHILE @i > 0
            BEGIN
                  SELECT @i = @i - 1
UPDATE dbo2.tbfacturas set datFechaPago=@datFechaPago where intnfacturadocumenta=@intcodigorecepcion and strnumDocuCon = @strnumerodoc                                               
            -- Avanzamos otro registro
fetch next from facturas into @datFechaPago, @strnumerodoc,@intcodigorecepcion
            END
-- cerramos el cursor
close facturas
deallocate facturas
commit  Transaction





lunes, 8 de julio de 2013

Visual Basic .NET: Crear campos y propiedades


En este articulo aprenderemos a programar en VB.NET una clase con campos y propiedades, también aprenderemos a:

Crear una propiedad de sólo lectura.

Crear una propiedad que toma un parámetro.

Usar un array de instancias de clase como fuente de un control DataGrid.

Las propiedades contienen las características de los objetos a los que pertenecen. Por ejemplo la clase coche tiene la propiedad color para indicar el color del coche. O una caja de texto tiene las propiedades alto y ancho que especifica sus dimensiones en la pantalla.

Existe también una interacción entre las propiedades de una clase y el comportamiento del objeto. Al mover una caja de texto (un comportamiento) cambia su ubicación (una propiedad). Veremos este modelo en varias ocasiones en el diseño orientado a objetos.

martes, 2 de julio de 2013

Depurar un procedimiento almacenado de SQL Server 2005


Desde la versión 2005 de SQL Server no se pueden depurar procedimientos almacenados directamente desde el SQL Management Studio, pero  si se pueden depurar desde Visual Studio 2005. Para ello el proceso es bastante sencillo.
Creo un nuevo proyecto de Visual Studio 2005  y Desde el explorador de servidores:

Depurar un procedimiento almacenado de SQL Server 2005

Se añade una conexión:


Añadir conexión

Se eligen los parámetros de conexión a la Base de datos deseada.

parámetros de conexión a SQL Server

se elige el procedimiento a depurar.

Depurar un procedimiento almacenado

 Se colocan los parámetros correspondientes  (sin poner ningún tipo de comillas en los char) y  se pulsa OK


Depurar un procedimiento almacenado

Con esto ya se puede entrar en modo depuración:   Se avanza paso a paso con F11

Depurar un procedimiento almacenado

Se puede depurar casi como un programa de .NET y se puede ver el valor que van tomando las variables.
El único inconveniente es que tambien hay que tener instalado Visual Studio 2005 o superior.


martes, 25 de junio de 2013

Escribir un programa orientado a objetos (II)

Esto es una continuación del artículo anterior sobre como Crear un primer programa orientado a objetos sencillo.

En este artículo aprenderemos a


§ Usar una clase en una aplicación.
§ Usar las herramientas de Microsoft Visual Studio .NET  para crear la definición de una clase

Uso la  clase CHospital en una aplicación


Como se ha dicho anteriormente una clase es una plantilla de un objeto. Por ejemplo un coche genérico es una clase, mientras que un coche concreto es un objeto (instancia de la clase).
Para poner los datos en los campos y propiedades, hay que crear una instancia de la clase en la memoria, esta acción se conoce como instanciación. Cuando se crea una instancia, se reserva una sección de memoria para mantener los campos del objeto. Si se crea otra instancia de la clase, se reserva otra sección de la memoria para sus campos.
Por ejemplo podemos tener n instancias de la clase coche y cada una de ellas representará un coche concreto con sus atributos particulares (propiedades) marca, modelo, color, etc.

Vamos a crear dos instancias de la clase
CHospital en el proyecto Hospital, y se mostrarán los datos de cada hospital, así que tendrán que crearse dos instancias por separado  de la clase CHospital. En lugar de crear una interfaz elegante, se escribirá sólo el suficiente código para ver si la clase está trabajando como se esperaba.
  

Driver de Pruebas


La creación de un pequeño programa  para probar una clase se llama Driver. Es una buena idea  probar  la clase un poco con el Driver antes de agregarla a un programa más amplio. Se utiliza el Driver para probar la clase sin la interferencia del resto del código del programa.

Crear una instancia de CHospital


1. En el Explorador de soluciones, hacer doble clic en Form1 para abrirlo en el Windows
Diseñador de formularios. Si Form1 se abre en el editor de código, seleccionar Ver Diseñador.

Crear un entorno visual similar al mostrado a continuación

Escribir un programa orientado a objetos



2. Agregar el siguiente código para el evento
SelectedIndexChanged del combo superior

Private Sub CboHospitales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CboHospitales.SelectedIndexChanged

        Dim Hospital1_grupo As CHospital
        Hospital1_grupo = New CHospital()

End Sub

3. Agregar el código siguiente para establecer las propiedades  del hospital inmediatamente después del código introducido en el paso 2:

Hospital1_grupo.Telefono = "914567894"
Hospital1_grupo.Direccion = "Recoletos 23"
Hospital1_grupo.NumSalas  = 28

Cuando se crea la instancia de CHospital , sus campos contienen los valores especificados en la definición de clase. Los campos de dirección y teléfono son una cadena vacía, el número de salas es 0. Tener en cuenta que no hay diferencia en el código del cliente si se utiliza un campo o una propiedad.

4. Agregar el código siguiente  para crear otra instancia de la clase
CHospital.

Dim Hospital2_grupo As CHospital = New CHospital()

Hospital2_grupo.Telefono = "912346578".
Hospital2_grupo.Direccion = "Bravo Murillo 324"
Hospital2_grupo.NumSalas = 12

En este caso, se utiliza una sintaxis diferente para declarar e inicializar una variable de la Clase CHospital. Visual Basic  permite la declaración y la inicialización en la misma declaración. La declaración e iniciación en la misma sentencia tiene las siguientes ventajas:

§  Los programadores tienen menos probabilidades de olvidarse de inicializar la  variable.
§  Cuando una clase define un constructor con parámetros, los campos se  pueden
inicializar al mismo tiempo.

Usar una instancia de la Clase CHospital


5. Agregar el código siguiente para mostrar algunos de los textos de los dos libros.

Dim Informe As String

Informe = "Hospital de " & Hospital1_grupo.Direccion & "Con Telefono" & Hospital1_grupo.Telefono & "Tiene" & Hospital1_grupo.NumSalas & "Salas"

MessageBox.Show(Informe)

Informe = "Hospital de " & Hospital2_grupo.Direccion & "Con Telefono" & Hospital2_grupo.Telefono & "Tiene" & Hospital2_grupo.NumSalas & "Salas"

MessageBox.Show(Informe)

En este fragmento de código se puede ver que hay dos instancias independientes de la clase  CHospital. Es posible hacer referencia a estas instancias utilizando las variables Hospital1_grupo  y Hospital2_grupo. El concepto orientado a objetos permite que cada instancia pueda ser referenciada por separado y se conoce como identidad. Esto no significa que haya que crear una variable para cada instancia. La creación de tantas variables es difícil de manejar si se necesitan cientos de instancias de una clase. Identidad significa que se puede hacer referencia a cada instancia por separado cuando sea necesario.

Al crear una instancia
CHospital, los campos de Hospital1_grupo  han cambiado y se ha llamado al método AltaMedicoHos.

 Más tarde se ha  recuperado el valor de la propiedad Direccion. El valor de la dirección se ha mantenido sin cambios después de llamar al método AltaMedicoHos.  El hecho de que el valor se mantuviera sin cambios demuestra el concepto de estado de los objetos, la idea de que los campos  conservan su valores entre llamadas a métodos.

Se puede  comparar la forma en como funciona el método AltaMedicoHos, un método tiene   las declaraciones de las variables. Después de que el método AltaMedicoHos termina, las variables salen de ámbito y se pierden sus valores.

6. Presionamos F5 para ejecutar el código. Al hacer clic en el botón Mostrar página. Los resultados se muestran aquí:

programa orientado a objetos



Al hacer clic en Aceptar y, a los títulos de los libros se muestran en un cuadro de mensaje, como se muestra aquí:

Hacer clic en Aceptar y, a continuación, cerrar la aplicación.
Hemos creado una clase,
CHospital, y dos instancias de la misma.


Cómo usar el visor de Clases


El entorno de programación permite obtener una vista del árbol de la estructura de clases del proyecto, los espacios de nombres y clases. La Vista de clases puede compartir la misma ventana que el Explorador de soluciones. En el menú Ver, hacer clic en Vista de clases para abrir la Vista de clases. La Vista de clases ampliado se muestra a continuación.



visor de clases


El nodo de más alto nivel representa el proyecto, Hospital. El siguiente nivel de nodos representa los espacios de nombres en el proyecto. Un proyecto puede contener varios espacios de nombres, en este caso, sólo hay uno. El espacio de nombres del proyecto consta de tres clases: la clase que hemos creado,
CHospital, otra que crearemos posteriormente CPersona y la clase para el formulario Windows Forms, frmPrincipal. La clase CHospital contiene cuatro campos privados, representados por bloques de color azul con un candado. La clase también contiene las cuatro respectivas propiedades. Representadas por una mano sosteniendo un formulario. Además, la clase contiene un método, AltaMedicoHos con dos parámetros objeto que devuelven un booleano. El método está representado por un bloque de color púrpura.
Todas las clases en Visual Basic son implícitamente un objeto de una clase base


Añadir el método UbicarPaciente  a la clase CHospital


1. Añadir el siguiente código a la clase CHospital:

Esto crea un array de códigos de Sala para el hospital y su propiedad para acceder a él.
Private m_salas() As String

Public Property Sala(ByVal i As Integer) As Integer
        Get
            Return m_salas(i)
        End Get
        Set(ByVal value As Integer)
            m_salas(i) = value
        End Set
    End Property

Public Function UbicarPaciente(ByVal Nom_Paciente As CPersona, ByVal Cod_Sala As CHospital, ByVal i As Integer) As Boolean

        Dim Reg As RDO.rdoResultset
        Dim strSQL As String

        Reg = Nothing

        On Error GoTo Errores_UbicarPaciente
        strSQL = "INSERT INTO dbo.tbPacSal (strId_PAC,strID_SAL) VALUES (" & Nom_Paciente.Codigo & "," & Cod_Sala.Sala(i) & ")"

        glbBaseDatos.Execute(strSQL)
        Reg.Close()

        Return True

Errores_UbicarPaciente:
        Return False
 End Function

Crear el programa Hospital


Ahora es el momento de escribir el código y probar la aplicación completa.

Conectar a la base de datos el combo box para mostrar el campo strNombre de TbHospital


Resumen


Para

Crear una instancia de una clase
Inicializar la variable usando la palabra new

Dim Hospital1 as New CHospital()

Establecer una propiedad de la instancia

Dim Hospital1 as New CHospital()
Hospital1.Salas = 25

Llamar a un método de la clase.

Dim Hospital1 as New CHospital()
Dim Num_Sala As String
Num_Sala = Hospital1.Sala(3)



lunes, 17 de junio de 2013

Escribir un programa orientado a objetos (I)


Se trata de una serie de artículos prácticos para crear un primer Programa Orientado a Objetos con Visual Basic .Net se comienza con un programa sencillo y se le van añadiendo complejidad con nuevos elementos.


Con este artículo aprenderemos a:



Decidir las clases que debe tener el programa.

Crear una clase con variables, propiedades y métodos.


Los bloques principales de un programa orientado a objetos son las clases, un objeto es una ocurrencia concreta de una clase (un coche concreto es una ocurrencia concreta de la clase coche genérica). Un objeto al ser concreto toma atributos concretos definidos en sus propiedades (en un coche sería el color, modelo, etc.) y métodos que son las acciones que tienen permitido hacer (en un coche los métodos serían acelerar, frenar, girar).


Diseñaremos e implementaremos las clases usando propiedades y métodos. A continuación, declararemos e inicializaremos las variables de las clases. Por último, implementaremos una solución llamando a los métodos, propiedades y a las variables de la clase.


Hospital: Un primer Programa Orientado a Objetos


En la construcción de un sistema de información para el control hospitalario se revelaron los siguientes conceptos:

- Hospital: con los datos, Nombre, Dirección y Teléfono

- Sala: con los datos, Número y Cantidad de camas

- Médico: con los datos, Identidad, Nombre y Especialidad

- Paciente: con los datos, Identidad, Nombre, Dirección y Fecha de nacimiento.

Por otra parte, las relaciones reveladas entre dichos conceptos son:

-Cada hospital tiene varias salas. Todas y cada una de ellas pertenecen a un hospital (y sólo a uno).

-Cada médico trabaja en un único hospital, todo hospital tiene al menos 10 médicos.

-Un paciente puede estar internado; si lo está, estará en una sala y sólo en una.

-La capacidad máxima de camas que puede tener una sala es de cinco pacientes.

-Cada paciente puede ser atendido por más de un médico (pero por lo menos por uno) y a su vez un médico puede atender a varios pacientes.

Se trata de implementar un programa que permita la gestión de un grupo de hospitales.

El programa tendría varias pestañas para añadir/cambiar/eliminar los datos correspondientes, la pestaña paciente sería la más compleja y sería de este tipo:

Escribir un programa orientado a objetos


lunes, 10 de junio de 2013

SQL Server: restaurar una base de datos a partir de una copia de seguridad

Esto es un pequeño manual de cómo hacer con SQL Server una copia de seguridad de una Base de Datos y cómo restaurarla sobre otra machacándola (si queremos que sea nueva, la creamos vacía y machacamos sobre ella).

Antes de nada hacemos una copia de seguridad de la Base de Datos que posteriomente restauraremos.

Hacer una copia de seguridad

En primer lugar elegimos la base de datos de la que realizaremos la copia de seguridad.
Sobre ella, botón derecho del ratón…-> Back Up.

restaurar una base de datos a partir de una copia de seguridad