Está en la página 1de 13

APLICACIÓN COMPRAS EN SQLSERVER 2005

(Libro de apoyo: Iniciación a las bases de datos con Access 2002. Eduardo Mora, Marta
Zorrilla, Joaquín Díaz de Entresotos. Díaz de Santos, 2003)

A continuación se presentan los pasos para construir una aplicación sobre la base de datos COMPRAS.
Esta constará de formularios que permitan la gestión y consulta de datos y de informes que permitan la
impresión y/o visualización de datos con un formato preestablecido.
Con objeto de construir de forma rápida la aplicación, se utilizará Access como herramienta de desarrollo,
evitando así aprender una herramienta y lenguaje de programación nuevos. Generalmente este tipo de
aplicaciones se construyen con herramientas denominadas RAD (Desarrollo Rápido de Aplicaciones) como
Visual Basic .Net, C# .Net, Power Builder, J2EE, u otros.
Centrándonos en Access, se tienen dos posibilidades, crear un proyecto Access con lo que Access se
conecta vía OLEDB a SQL Server 2005 o crear una base de datos Access y vincular vía ODBC las tablas
que se encuentran en SQL Server u otro gestor (ver capítulo 9 del libro “Iniciación a las bases de datos con
Access 2002”). En la primera opción, Access solo contiene objetos de aplicación, es decir, formularios,
informes y módulos de programación en lenguaje “Visual Basic para Access”; mientras que en la segunda,
Access actúa sobre el motor jet.

PROYECTOS ACCESS
Pasos para desarrollar el prototipo de aplicación sobre la base de datos COMPRAS.
1. Crear Nuevo Proyecto (datos existentes). Access solicita autentificación en SQL Server y
seleccionar la base de datos para establecer el vínculo a través de OLEDB.

Figura 1.1. Establecer conexión

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 1


Una vez conectados se observarán los objetos de Access: tablas, consultas (funciones y
procedimientos almacenados y vistas) y diagramas que se encuentran en SQL Server (desde este
entorno se puede hacer lo mismo que desde el “MS SQL Server Management Studio” y los
Formularios, informes, macros y módulos que residen en el fichero Access con extensión adp.
2. Decidir los formularios que se van a diseñar en función de la estructura de tablas que se dispone y
de las necesidades del cliente, en nuestro caso: artículos, proveedores y pedidos con sus líneas. La
aplicación debe incluir, al menos, los formularios que permitan gestionar todas las tablas aunque
también puede contener otros de solo consulta atendiendo así las necesidades de los distintos roles
de usuarios.
3. Decidir los informes, impresos que se ofrecerá a la organización o al cliente. En nuestro caso el
catálogo de artículos, la factura del pedido y las compras realizadas a cada proveedor por año.
4. Para realizar controles en los formularios e informes se podrá hacer uso de macros y de módulos de
Visual Basic.
a. Macros, son ciertos automatismos y controles que permite definir Access sin tener que
programar. Estos se ejecutan cuando se produce el evento al cual se asignan.
b. Módulos de VB: para definir funcionalidades generales de la aplicación. En cada formulario
se programa lo específico de él, como se verá en el formulario de pedidos y el subformulario
de líneas.

Formularios
Todos los formularios, así como los informes, tienen asociado una consulta o vista. Esta se puede definir
antes, en el entorno de consultas, o bien se construye utilizando el asistente del formulario. Cuando se trata
de información de una sola tabla, se puede actuar de la segunda forma, pero en general, por las razones de
seguridad que ya hemos comentado, se aconseja crear la vista.
1. Artículos: este formulario no tiene nada especial, se utilizará el asistente seleccionando la vista
GestionArticulos, creada para la gestión de todos los campos de la tabla. El botón “Catálogo de
artículos” se pondrá posteriormente, una vez se haya definido el informe que éste debe mostrar.
Propiedades modificadas en el formulario de Artículos:
a) Selectores de registro = No
b) Separadores de registro = No
c) Índice de tabulación y Punto de tabulación (orden que sigue el cursor al rellenar los campos)
d) Tipo recordset = snapshot actualizable (permite consultar y actualizar la información. Se usará
siempre en formularios de gestión de datos)
e) Nº máx. registros = 1000 (máximo número de registros que se traen del servidor al cliente)
f) Asignar formato moneda al campo precio unitario.

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 2


Figura 1.2. Formulario de Artículos

2. Formulario Proveedores: Del mismo modo que artículos, se selecciona con el asistente la vista
GestionProveedores. Además se realizan las siguientes mejoras:
• Crear cuadro combinado para el campo procepro (opción Cambiar a → cuadro combinado). En
propiedades → carpeta Datos → “tipo origen de la fila” = lista de valores y en “origen de la
fila”= UE; No UE. Establer la propiedad “Limitar a lista”=si.
• Campo “mailpro” con propiedad “Es hipervínculo” = Sí (carpeta Todas). En los datos anteponer
mailto: o http:// si queréis que se active el programa del correo o el navegador al pulsar sobre
él.
• Campo código postal, se puede establecer la máscara de entrada = 00000;; (carpeta Datos). El
cero indica número obligatorio y el 9, número opcional. Hay asistente para su definición.
• Campo teléfono y fax, también se les puede aplicar máscara – si se quiere guardar el formato
hay que tener en cuenta que los espacios y otros símbolos ocupan lugar por lo que hay que
dimensionar el campo adecuadamente.

Figura 1.3. Formulario de proveedores

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 3


3. Formulario Pedidos:
Como este formulario requiere trabajar con dos tablas (pedidos y líneas) y presentar información
adicional de las otras dos (proveedores y artículos) se crearán dos vistas con los datos que queremos
que presente el formulario.
• Crear vistas EncabezadoPedido y DetallePedido como se muestra en la Figura 1.4 y Figura 1.5.

Figura 1.4. Vista Encabezado del pedido

Figura 1.5. Vista detalle del pedido

• Crear formulario con el asistente seleccionando ambas vistas. Access creará un formulario con
un subformulario vinculados por el campo “numped”. En esta pantalla se realizarán varias
modificaciones para que presente el aspecto de la Figura 1.6:
a) Se ordenarán los campos.
b) Se comprobará si la fecha del pedido en el proceso de alta toma la fecha del día de la BD, si
no asignar a la propiedad “Valor predeterminado” = Ahora().

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 4


c) Se creará un desplegable para el proveedor de forma que se facilite su elección. El cuadro
combinado tendrá las siguientes propiedades: “tipo origen de la fila”=
Tabla/Vista/ProcAlmacenado y “Origen de la fila” = SELECT codigpro , nombrpro FROM
Proveedores, “Columna dependiente” = 1, “Número de columnas” = 2, “Ancho de columnas” =
2 cm; 6 cm, “Ancho de lista=10”
d) Se establecerá el campo del código del proveedor como el primer campo a rellenar (punto de
tabulación = 0)
e) Se bloquearán todos campos del proveedor, a excepción del código, para evitar que
modifique esta información a través de esta pantalla. Además se quitará a estos campos el
punto de tabulación para evitar que el cursor entre en el campo y cause malestar al usuario.
f) Se establecerá el IVA al 16 por defecto (propiedad valor predeterminado).
g) Se fijará en el formulario que la actualización de datos corresponde solo a la tabla pedidos
(propiedad “tabla única” = pedidos). Esto se requiere siempre que nos apoyemos en una vista
en la que participen campos de más de una tabla. Si no se establece así, la vista es de solo
lectura.

Figura 1.6. Formulario de Pedidos

h) Se programará para que cuando se proceda al alta de un pedido se le asigne el siguiente


número y la fecha prevista a 15 días de la fecha del pedido (ver procedimiento
Form_BeforeInsert que se encuentra en el cuadro “Código asociado al formulario de
EncabezadoPedido“).
i) Se establecerá el código VB restante del formulario a través de los eventos de los objetos que
se indican en el cuadro siguiente, a excepción del botón Factura que se realizará con el
asistente.

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 5


Option Compare Database
Private Sub btn_factura_Click()
'Este código es creado por el Asistente para botones de comando.

On Error GoTo Err_btn_factura_Click


Dim stDocName As String
stDocName = "Factura"
DoCmd.OpenReport stDocName, acViewPreview, , "numped = " + CStr(Me.numped)

Exit_btn_factura_Click:
Exit Sub
Err_btn_factura_Click:
'Si el usuario cancela la acción, no mostrar un mensaje de error.
Const conErrDoCmdCancelled = 2501
If (Err = conErrDoCmdCancelled) Then
Resume Exit_btn_factura_Click
Else
MsgBox Err.Description
Resume Exit_btn_factura_Click
End If
End Sub

Private Sub codigpro_AfterUpdate()


'ejecuta el comando de salvar el registro de pedido para que se actualice y
'muestre la información del proveedor
RunCommand acCmdSaveRecord
End Sub

Private Sub codigpro_BeforeUpdate(Cancel As Integer)


'Muestra un mensaje si el cuadro combinado proveedor está en blanco.
Dim strMsg As String, strTitle As String
Dim intStyle As Integer
If IsNull(Me!codigpro) Or trim(Me!codigpro) = "" Then
strMsg = "Debe elegir un valor de la lista Proveedor."
strTitle = "Proveedor requerido ... "
intStyle = vbOKOnly
MsgBox strMsg, intStyle, strTitle
Cancel = True
End If
End Sub

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 6


Private Sub Form_BeforeInsert(Cancel As Integer)
If IsNull(Me!fentrped) Then
Me!fentrped = DateAdd("d", 15, Now())
End If
If IsNull(Me!numped) Then
Me!numped = DMax("[numped]", "pedidos", "[numped]>0") + 1
End If
Me!codigpro.SetFocus
End Sub

Código asociado al formulario de EncabezadoPedido

• En el subformulario DetalleLineas:
a) Se establecerá un cuadro combinado para localizar el artículo (del mismo modo que en el
proveedor pero en este caso vinculando el código y ocultándolo, es decir, que el tamaño de la
primera columna sea 0 y el número de columnas sea 2).
b) Se establecerá el artículo como primer campo a rellenar (punto de tabulación=0), dejando al
número de línea sin él.
c) Se asignará el precio del artículo en la línea con el precio que tiene éste en la tabla de
artículos y se establecerá en automático el número siguiente de línea que le aplique al pedido
(procedimiento codigart_AfterUpdate).
d) Se ocultará el campo numped.
e) Se pondrá el formato moneda al campo precio y al total por línea.
f) Se ocultarán los botones de desplazamiento.

Option Compare Database

Private Sub codigart_AfterUpdate()


On Error GoTo Err_Codigart_AfterUpdate
Dim strFilter As String

If IsNull(preunlin) Then
strFilter = "codigart = " & trim(Me!codigart)
Me!preunlin = DLookup("preunart", "articulos", strFilter)
End If

If IsNull(Me!numlin) Then
Me!numlin = IIf(IsNull(DMax("numlin", "lineas", "numped=" &
Form_EncabezadoPedido.numped)), 1, DMax("numlin", "lineas", "numped=" &
Form_EncabezadoPedido.numped) + 1)
End If

Exit_Codigart_AfterUpdate:
Exit Sub

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 7


Err_Codigart_AfterUpdate:
MsgBox Err.Description
Resume Exit_Codigart_AfterUpdate
End Sub

Código asociado al formulario de DetallePedido

• En el formulario EncabezadoPedido:
g) A continuación, se creará un campo calculado que presente el valor del pedido completo.
Para ello se creará un campo de texto y se indicará en la propiedad “origen del control” =
[DetallePedido Subformulario]![ImporteNeto]*(1+[ivaped]/100)
donde ImporteNeto será un campo del pie del subformulario que hace la suma del importe por línea
(ImporteNeto = Suma([totallin] ). Ver Figura 1.7

Figura 1.7. Formulario de Pedidos en vista de diseño

h) Por último, se creará el botón de imprimir Factura. Este visualizará la factura del pedido que
se muestra en pantalla (debe crearse el informe previamente). Esto se le indicará al informe
por código según se muestra en el evento clic de este botón btn_factura_Click.

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 8


Informes
Para crear informes se deben realizar consultas/vistas o bien procedimientos almacenados que devuelvan
los datos que se solicitan. Se harán tres ejemplos: dos con vistas, Catálogo de artículos y Pedidos y otro
con procedimiento almacenado, Compras a proveedores por año.
• El Informe Catálogo de artículos recoge todos los datos de la tabla artículos. Se crea una vista
con los campos a mostrar, ver Figura 1.8, con nombre CatalogoArticulos. A continuación se crea
el botón que llama a este informe desde el formulario de Artículos.

Figura 1.8. Informe Catálogo de artículos

• El Informe Factura se apoya en la consulta Factura que se muestra en la Figura 1.9

Figura 1.9. Vista para obtener las facturas

Se utilizará el asistente para generar el informe y en vista de diseño se colocará la información al gusto del
usuario, ver Figura 1.10, de forma que por un lado estén los datos del encabezado y por otro los de la línea.
Nótese que aparece el encabezado de grupo numped por el que la información que se presenta en esa

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 9


zona sólo se muestra una vez por cada número de pedido (numped) distinto, mientras que en detalle se
presenta cada fila devuelta por el Select.

Figura 1.10. Informe Factura en vista de diseño

• El Informe de proveedores por año, se apoya en un procedimiento almacenado


“Compras_por_año_proveedor” que se presenta a continuación. Este tiene dos parámetros de
entrada: fecha de inicio y de fin, por lo que para su ejecución será necesario pasarle dos
valores. Esto se hará con un formulario específico.

create Procedure "Compras_por_Año_Proveedor" @FechaInicio datetime, @FechaFin


datetime
AS
SELECT Proveedores.nombrpro, DATENAME(yy,fechaped) as año, sum(importe) as Importe
FROM Pedidos ,Proveedores
WHERE
Pedidos.codigpro = Proveedores.codigpro and
Pedidos.importe is not null and
Pedidos.fechaped Between @FechaInicio And @FechaFin
Group by Proveedores.nombrpro, DATENAME(yy,fechaped)
order by proveedores.nombrpro

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 10


Este formulario tendrá dos campos que les denominaremos [fecha_ini] y [fecha_fin] (propiedad “Nombre”) y
un botón que al ser pulsado llamará al informe creado previamente “Compras_por_Año_proveedor”.

Figura 1.11. Formulario para el informe Compras por año proveedor

El informe creado “Compras_por_Año_proveedor” tiene el aspecto que muestra la Figura 1.12. Se crea
utilizando el asistente.

Figura 1.12. Informe “Compras por año proveedor” en vista de diseño

Seleccionando el informe y accediendo a la propiedad “input parameters” de la carpeta Datos, se pondrá el


siguiente texto, para que al abrise tome como parámetros de entrada los indicados en el formulario creado:
@FechaInicio datetime = Forms![compras por año y proveedor]![Fecha_ini] , @FechaFin
datetime = Forms![compras por año y proveedor]![fecha_fin]

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 11


La propiedad InputParameters se utiliza para especificar o determinar los parámetros de entrada que se
pasan a una instrucción SQL de la propiedad OrigenDelRegistro (RecordSource) de un formulario o informe
o un procedimiento almacenado cuando se utiliza como el origen de registros de un formulario o informe
dentro de un proyecto de Microsoft Access (.ADP).

Pantalla principal
Se creará una pantalla principal con los botones que permiten acceder a las distintas opciones de menú
como se muestra en la Figura 1.13.

Figura 1.13. Formulario principal

Barra de herramientas
A continuación se creará una barra de herramientas con las opciones necesarias para la gestión de datos:
insertar y borrar datos pues modificar se realiza directamente sobre el registro que se muestra en la pantalla
y buscar utilizando la opción de filtro por formulario con establecer filtro y quitar filtro o su alternativa de filtro
de servidor por formulario y aplicar filtro de servidor. Se elegirá una u otra en función de si se decide traer
directamente los datos o solicitar previamente una condición de búsqueda con idea de reducir el tráfico de
datos por la red (aplicaciones cliente/servidor). Para realizar esto último se debe establecer a Sí la
propiedad de formulario Filtro de Servidor por Formulario.
Finalmente se establecerá la barra de tipo menú para que se utilice con la barra de herramientas de la
aplicación.

Figura 1.14. Barra de herramientas para la aplicación

Por último, se accederá a la opción de menú Herramientas – Inicio y se establecerá como ventana de inicio
el formulario principal y como barra de menú, la creada anteriormente, como se muestra en la Figura 1.15.
Se deshabilitarán todas las opciones para que el usuario final no tenga acceso a los objetos de la base de
datos Access. Para abrir en modo diseño este proyecto, a partir de este momento, se debe pulsar doble clic
sobre el fichero Access al tiempo que se tiene pulsada la tecla de mayúsculas.

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 12


Figura 1.15. Barra de herramientas para la aplicación

Gestión de errores
En los formularios, los errores que provienen del gestor, cuando se atenta contra la estructura, deben ser
traducidos. Esto se puede realizar utilizando el evento Error y sustituyendo el mensaje que muestra en
inglés por otro en versión castellana. Lamentablemente no se puede capturar el mensaje original, para ello
habría que realizar toda la programación vía OLEDB en vez de utilizar las vinculaciones que ofrecen los
asistentes.
Los mensajes de los disparadores se muestran tal y como se escribieron en el trigger.

Private Sub Form_Error(DataErr As Integer, Response As Integer)


Const conDuplicateKey = 3022
Const conRequired = 515
Dim strMsg As String

If DataErr = conDuplicateKey Then


Response = acDataErrContinue 'sustituir msg de error
strMsg = "El código del artículo debe ser único. Comprueba los datos."
MsgBox strMsg
ElseIf DataErr = conRequired Then
Response = acDataErrContinue
strMsg = "Todos los campos son obligatorios excepto la fecha de baja."
MsgBox strMsg
Else
Response = acDataErrDisplay 'mostrar el msg de error
End If
End Sub

Marta E. Zorrilla Pantaleón Bases de Datos - 08/09 13

También podría gustarte