Operaciones entre registros

Quisiera que me ayuden en dos consultas:
¿1. Cómo puedo llevar a cabo operaciones entre dos registros de un mismo campo de una misma tabla?. Por ejemplo sacar la diferencia de un registro a otro (para todos los registros) . O sumar el registro 5 con el registro 7 de la misma tabla y del mismo campo. Espero que se pueda.
¿2. Cómo puedo sacar la desviación estándar de varios campos que correspondan a un solo registro? Por ejemplo tengo una tabla con 5 campos numéricos y un campo de fecha. Cada registro corresponde a una fecha distinta. Quiero sacar la desviación estándar de cada uno de los registros, basándome en las observaciones de los campos 5 numéricos de la tabla. Es decir una desviación para cada registro.
Respuesta
1
Primero, sería conveniente que describieras bien en dónde deseas aplicar lo que preguntas: ¿En código de Visual Basic, en una consulta, en un formulario, etc.? Porque no es muy clara tu pregunta.
Te puedo comentar lo siguiente:
1. No es recomendable manipular o acceder a los registros por su número de registro, en su lugar lo que debes hacer es buscar los valores que necesitas por medio de algún otro campo del mismo registro, por ejemplo la "Clave". Observa este caso:
#Registro - Clave, Nombre, Calificacion
1 - 5, "Diana", 10
2 - 11, "Carlos", 8
3 - 3, "Jose", 10
4 - 2, "Juan", 5
5 - 7, "Karen", 9
Si nos referimos siempre a Juan mediante su número de registro (4) entonces cuando alguna vez cambie el orden de los registros, Juan dejará de ser el registro 4 y tomará otra posición. Por eso, es mejor localizar a Juan por su clave (2), así si alguna vez está en otra posición, siempre lo encontraremos (por supuesto, la clave debe ser única en toda la tabla).
Entonces, para buscar un elemento en la tabla de calificaciones, usamos la función DLOOKUP que usa 3 argumentos (parámetros):
- Campo que se desea devolver
- Tabla en la que se busca
- Criterio de búsqueda
Entonces, para buscar la calificación de Juan, tengo que utilizar algo así:
=dlookup("Calificacion","Alumnos","Clave=2")
Si DLookup encuentra la clave indicada, me devuelve 2.
De esta forma puedo sumar la calificación de Juan, de Karen y de Carlos:
=dlookup("Calificacion","Alumnos","Clave=2") + dlookup("Calificacion","Alumnos","Clave=7") + dlookup("Calificacion","Alumnos","Clave=11")
Si lo hicimos bien, me devolverá 22. Te recomiendo que busques más información en la ayuda de Access respecto a la función "DLookup", y úsala de forma moderada porque afecta al rendimiento de tus programas.
De la segunda pregunta, no me sé las funciones de probabilidad y estadística, pero en principio, si puedes sumar 3 campos de esta forma:
suma = [campo1] + [campo2] + [campo3]
Entonces también puedes meter los 3 campos en tu función de desviación estándar.
Gracias por contestar a mi anterior pregunta David, tal vez no te aclatre si la operación entre registros la buscaba hacer desde visual, una consulta o un formulario. La verdad es que me interesaba saber cualquiera de las posibilidades. El problema que tengo es que no es una solución aislada la que quiero. Seré más específico. Tengo una tabla con los campos Fecha, Monto de crédito. Ahora bien, debo realizar una tabla que me de la variación de los datos mes a mes, es decir una operación repetitiva entre el registro en que me encuentro (ordenado por fecha) y la fecha anterior (en este caso la base ingresa un dato cada mes). En otro caso similar debo sacar el promedio entre la fecha actual y dos observaciones más anteriores (proceso de medias móviles con un rezago de do periodos). Es por esto que si bien el método de lookup u otro parecido me servirían para hacer una operación entre dos registros, no veo como me podría servir para generalizarlo a todos los registros. Ojala me puedas ayudar en esto, no importa si la solución debe realizarse por código de visual... solo quiero la mejor solución =) Un saludo
Mauricio
Para lograr lo que buscas, necesitas recorrer tu tabla desde Visual Basic e ir guardando o acumulando los datos de tus campos. Por ejemplo, considera el siguiente caso:
Dim rs As DAO.Recordset, Total As Integer
Set rs = CurrentDb.OpenRecordset("Alumnos")
rs.MoveFirst
Total = 0
Do While Not rs.EOF
Total = Total + CInt(rs("Calificacion"))
rs.MoveNext
Loop
MsgBox "El promedio de los alumnos es: " & CStr(Total / rs.RecordCount)
rs.Close
Si observas, la única forma de ir acumulando el valor de los registros anteriores es sumando uno a uno. Algo similar para lo que necesitas (sólo con dos valores) sería así:
Dim rs As DAO.Recordset, Diferencia As Integer, Anterior As Integer
Set rs = CurrentDb.OpenRecordset("Alumnos")
rs.MoveFirst
Anterior = rs("Calificacion")
Total = 0
Do While Not rs.EOF
Diferencia = Abs(Anterior - CInt(rs("Calificacion")))
MsgBox "La diferencia de calificación entre este alumno y el anterior es:" & CInt(Diferencia)
Anterior = rs("Calificacion")
Diferencia = 0
rs.MoveNext
Loop
Rs. Close
En este otro ejemplo, se va guardando la calificación del alumno anterior ANTES de pasar al siguiente, para calcular su diferencia contra el alumno actual que se está procesando.
Estos son sólo unos tips para que te des una idea e implementes dicho ejemplo en tu caso real, no puedo ayudarte más, hay que usar la lógica y la imaginación :-)
Se me escapó un error en el último ejemplo: elimina la sentencia "Total = 0"
Muchas gracias. Creo que con los ejemplos que me mandaste ya tengo suficiente material como para aplicarlos por mi mismo. Si tengo otra consulta distinta te estaré molñestando más adelante gracias.
Mauricio

3 respuestas más de otros expertos

Respuesta
1
Reponse:
Entiendo que estamos hablando de ver el resultado en Consultas ¿vale?:
1.- Sacar la diferencia de un registro a otro:
SELECT Numeros.numero1, Numeros.numero2, [numero1]-[numero2] AS Resta
FROM Numeros;
O lo que es lo mismo:
Resta:[numero1]-[numero2]
Si numero1 es mayor que numero2 te dará el resultado con valor negativo.
2.- Sumar el registro 5 con el registro 7:
La única opción que veo es añadir un campo que nos cuente los registros en la consulta, este seria el campo:
RowNum: (Select Count (*) FROM [ClientesA] as Temp WHERE [Temp].[NombreCompañía] < [ClientesA].[NombreCompañía])+1
Y aplicando el Criterio 5 Or 7 sobre RowNum me sacará solo esos dos registros. La cuestión de la suma viene a ser igual que la resta [numero1]+[numero2] AS Suma
3.- Desviación estándar, bien, aquí me has pillado, teóricamente en una consulta se puede usar algo parecido a lo descrito en este ejemplo:
Puede usar las funciones DDesvEst (DStDev) y DDesvEstP (DStDevP) para especificar criterios en la fila Criterio de una consulta de selección. Por ejemplo, puede crear una consulta sobre la tabla Pedidos y la tabla Productos con el fin de presentar todos los productos para los que los gastos de envío estén por encima del promedio más la desviación estándar de gastos de envío. La fila Criterio situada bajo el campo Gastos de envío contendrá la siguiente expresión:
>(DStDev("[Gastos de envío]", "Pedidos") + DAvg("[Gastos de envío]", "Pedidos"))
Pero a mi no me funciona.
En VB no he terminado de probarlo pero lo veo más claro:
Dim dblX As Double, dblY As Double
' Estimación de muestra
dblX = DStDev("[Gastos de envío]", "Pedidos", "[PaísDestinatario] = 'España'")
' Estimación de población.
dblY = DStDevP("[Gastos de envío]", "Pedidos", "[PaísDestinatario] = 'España'").
PromedioCarga: DProm("[Carga]", "[Pedidos]")
Y la verdad, si tienes que hacer cálculos estadísticos lo mejor será que uses un Formulario de Tablas dinámicas:
Los formularios de tabla dinámica se crean en Microsoft Access utilizando el Asistente para tablas dinámicas. El asistente utiliza Microsoft Excel para crear la tabla dinámica y Microsoft Access para crear un formulario en el que la incrusta.
Gracias por tus respuestas. Fueron de mucha utilidad. Si tengo más dudas te estaré molestando nuevamente, por el momento muchas gracias
Mauricio
Respuesta
1
Primero que ya lo tendrás es tener la tabla o tablas definidas, y mejor con datos para probar, una vez tienes esto...
Crea una consulta basada en esa tabla, utilizando por ejemplo el asistente para consultas, seleccionas todos los campos.
Luego grabas la consulta y la abres en vista diseño,
en una columna en blanco pones en la linea campo:
diferencia:nombre_campo1 - nombre_campo2
nombre_campo1 es un nombre de tu tabla
y nombre_campo2 también
Al abrir la consulta tendrás una columna nueva llama diferencia con la diferencia de los dos campos.
De la misma manera puedes hacer lo de la desviación estándar. Busca en la ayuda de access por DDesvEst (DStDev) y DDesvEstP (DStDevP)
Para ver cómo funciona lo de las desviaciones standard. Es un poco complejo.
Respuesta
1
Por tus preguntas imagino que has usado mucho Excel y poco Access...
La premesa básica de Excel y Access es bien distitna y lo que el uno hace bien y fácil al otro le cuesta mucho.
Consulta1: En Access, a diferencia de Excel en donde sabes en que fila están los datos, la única forma de encontrar un dato es buscándolo es decir si lo que necesitas es buscar el registro que diga mesa y restarlo con el que diga silla, lo puedes hacer (y no de forma sencilla) pero si necesitas coger el registro 5
Menos el 7 no se puede.
Consulta2: Estuve cacharreandole un poco y no encontré como, me imagino que en últimas hasta podrías diseñar un procedimiento en Visual que hiciera lo que necesitas, pero no se si valga la pena el esfuerzo.
En resumen, creo que tienes dos opciones:
1. Llevar los datos a Excel y trabajarlos allá.
2. Transponer la estructura de tu tabla, es muy fácil restar dos campos y obtener la desviación estándar de una columna.
Lamento no poder ayudarte más.
Gajimenb
Gracias por tu ayuda... lo de transponer la tabla ya lo había pensado y creo que seria lo mejor... ahhh aunque acá no debería hacer preguntas pues te agradecería si sabes como vincular un archivo protegido de excel con uno de access ya que cuando esta protegido no permite la actualizacón de datos. Gracias
Mauricio

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas