20/01/2010, 12:52
|
| | Fecha de Ingreso: agosto-2007
Mensajes: 268
Antigüedad: 17 años, 4 meses Puntos: 2 | |
Respuesta: Store Procedure Ok: Mira el proceso te lo voy a explicar mas o menos. Con un pequeño ejemplo:
Tengo 3 tablas:
Ventas
Detalle de ventas
Detalle de pagos
Esto esta en una base de datos en la tienda. La base de datos es operativa. La idea es mantener esta base de datos con tan solo 3 meses de informacion, es decir, si estamos en enero tener la informacion solamente de Noviembre, Diciembre y Enero. esto para que el acceso a datos sea más rapido. y la respuesta del servidor tambien.
Mi aplicacion ya tiene una herramienta que verifica las fechas y borra la informacion tres meses hacia atras. Ahora, el detalle es el siguiente, dependiendo de la epoca del año, la base de datos crece esto debido a las ventas que hay en la misma. En ocasiones el servidor me indica el siguiente error cuando corro esta aplicacion desde la aplicacion. "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding", por lo mismo la informacion se va quedando resagada y llega un momento en el que esa informacion al no depurarse se vuelve "basura". Ahora bien, yo pense que puedo crear un store procedure en la base de datos que haga toda la funcion que realiza el aplicativo, esto con el fin de mejorar el performance y evitar en medida de lo posible el error. Un ejemplo de lo que hago es:
Tabla Ventas:
Venta (PK)
Cliente
Importe
Descuento
Impuesto
Fecha
Tabla Detalle de venta
id (PK)
Venta(FK)
Articulo
Cantidad
Precio Unitario
Descuento
Impuesto
Tabla detalle de pagos
id(PK)
Venta (FK)
Forma de pago
Monto del pago
Ingreso/Egreso
Fecha
Mi aplicativo hace mas o menos lo siguiente
Dim recordsetVenta As ADODB.Recordset
Dim recordsetDetalle As ADODB.Recordset
Dim recordsetPagos As ADODB.Recordset
Set recordsetVenta = New ADODB.Recordset
recordsetVenta.CursorType = adOpenForwardOnly
recordsetVenta.LockType = adLockReadOnly
recordsetVenta.Open "SELECT venta FROM ventas WHERE fecha <= '" & Date - 100 & "'", Connection, , , adCmdText
While Not recordsetVenta.EOF
Set recordsetDetalle = New ADODB.Recordset
recordsetDetalle.CursorType = adOpenForwardOnly
recordsetDetalle.LockType = adLockReadOnly
recordsetDetalle.Open "SELECT * FROM [detalle venta] WHERE venta = " & recordsetVenta("venta"), Connection, , , adCmdText
If Not recordsetDetalle.EOF Then
Connection.Execute "DELETE FROM [detalle venta] WHERE venta = "& recordsetVenta("venta")
End If
Set recordsetPagos = New ADODB.Recordset
recordsetPagos.CursorType = adOpenForwardOnly
recordsetPagos.LockType = adLockReadOnly
recordsetPagos.Open "SELECT * FROM [detalle pagos] WHERE venta = " & recordsetVenta("venta"), Connection, , , adCmdText
If Not recordsetPagos.EOF Then
Connection.Execute "DELETE FROM [detalle pagos] WHERE venta = "& recordsetVenta("venta")
End If
Connection.Execute "DELETE FROM [ventas] WHERE venta = "& recordsetVenta("venta")
recordsetVenta.MoveNext
Wend
Estoy simulando una operacion muy sencilla, realmente la base de datos interactua con mas tablas y básicamente ese es el concepto. ¿Tienes alguna sugerencia? |