Imprimir página | Cerrar ventana

Dividir entre filas de una tabla

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86740
Fecha de impresión: 27/Marzo/2026 a las 04:08


Tema: Dividir entre filas de una tabla
Publicado por: pepecasique
Asunto: Dividir entre filas de una tabla
Fecha de publicación: 19/Julio/2023 a las 01:16
Saludos a todos!
Tengo una tabla con unos 1000 registros entre los cuales tengo IdOperacion (clave unica), fecha y precio. Necesito dividir el precio del campo precio correspondiente al IdOperacion 3 entre el correspondiente al IdOperacion 2, sea mediante sql, vba o campo calculado y asi hasta el registro 1000. Mis conocimientos alcanzan hasta hacer esto :

SELECT IdOperacion, Fecha, Open,
(SELECT Open FROM Operaciones WHERE IdOperacion = IdOperacion - 1) / Open AS Resultado
FROM Operaciones

Pero con eso obtengo este error: "Ha escrito una subconsulta que puede devolver mas de un campo sin utilizar la palabra reservada EXISTS en la clausula FROM de la consulta principal. Corrija la instruccion SELECT de la subconsutla para solicitar un unico campo " y de alli no he podido pasar. Agradezco de antemano cualquier comentario
Trabajo con Access 2016 32 bits



Respuestas:
Publicado por: Antonalo
Fecha de publicación: 24/Julio/2023 a las 11:08
Yo trataría de averiguar cual es el precio del registro anterior mediante



 DLookup("Precio", "Operaciones", "IdOperacion =" & (Me.IdOperacion - 1))


y luego dividiría el precio del registro actual entre el valor hallado mediante la expresión anterior

Sin embargo, veo el problema de que si eliminas un registro, el siguiente, si fuera autonumérico, no va a encontrar me.IdOperacion -1. 





Publicado por: Juanmasp
Fecha de publicación: 24/Julio/2023 a las 14:46
Yo lo haría así  (lo escribo directamente sin probar)

SELECT IdOperacion, Fecha, Open, Open / OpenAnterior AS Resultado
FROM Operaciones INNER JOIN (SELECT IdOperacion AS IdAnterior, Open AS OpenAnterior FROM Operaciones) AS OpAnterior ON IdOperacion = IdAnterior - 1


Las operaciones que no tengan una operación anterior, no se mostrarán (para eso habría que cambiar un par de cosas)

Espero que te sirva


Publicado por: lunasoft
Fecha de publicación: 25/Julio/2023 a las 11:22
Buenos días:

la respuesta a tu duda la encuentras en:  https://accessaplicaciones.com/ejemplos.html#sq03" rel="nofollow - Tecsys Proyectos Informáticos S.L. (accessaplicaciones.com)

Si utilizas subconsultas, el proceso se va a ralentizar una barbaridad.
Mihura propone usar una función para realizar estas operaciones.

La función en tu caso sería esta:

'---------------------------------------------------------------------------------------------
' Autor : JUANJO LUNA -Lunasoft- usando ejemplo de JESUS MANSILLA CASTELLS -Mihura-
' Fuente: https://accessaplicaciones.com/ejemplos.html#sq03
'---------------------------------------------------------------------------------------------
Public Function RT_DividirSQL(nDato) As Double
'variable que no se pierde entre las distintas llamadas
Static nDIVISION As Double
    
     If IsNull(nDato) Or nDIVISION = 0 Then 'si nDato es nulo o cero: Funcion = cero y inicializar
         RT_DividirSQL = 0
        GoTo Inicializar
     End If
     

     RT_DividirSQL = nDato / nDIVISION
     
Inicializar:
     nDIVISION = Nz(nDato, 0)

End Function
 

El uso de Static te permite almacenar el valor del registro anterior. y con los if devolvemos 0 en caso de desbordamiento (divisiones nulas)

Para que funcione correctamente, debemos usar una consulta con un primer registro NULO que inicialice la variable static. Por eso en el sql comenzaremos con un where 1=0 UNION y la consulta en sí.

La consulta sql quedaría así:

SELECT Operaciones.IdOperacion, Operaciones.Fecha, Operaciones.Precio, RT_DividirSQL(null) AS Division
FROM Operaciones WHERE 1=0
UNION SELECT Operaciones.IdOperacion, Operaciones.Fecha, Operaciones.Precio,RT_DividirSQL([Precio]) AS Division
FROM Operaciones;


Termino diciendo que en el fondo la respuesta es de Mihura, que se ha molestado en leer tu pregunta y guiarme para llegar a la respuesta correcta con fines didácticos, ya que tenía interés por aprender este tipo de lógica.

MUUUUUUUchas gracias maestro.


-------------
Juanjo Luna (Lunasoft)
Microsoft MVP 2023

----------------

https://www.luna-soft.es/

https://www.youtube.com/ACCESSoTOTAL

https://github.com/ACCESSoTOTAL



Imprimir página | Cerrar ventana