** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Dividir entre filas de una tabla
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Dividir entre filas de una tabla

 Responder Responder
Autor
Mensaje
pepecasique Ver desplegable
Nuevo
Nuevo


Unido: 19/Julio/2023
Localización: caracas
Estado: Sin conexión
Puntos: 1
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita pepecasique Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Dividir entre filas de una tabla
    Enviado: 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
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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. 



Arriba
Juanmasp Ver desplegable
Habitual
Habitual


Unido: 21/Abril/2006
Estado: Sin conexión
Puntos: 122
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Juanmasp Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
lunasoft Ver desplegable
Habitual
Habitual
Avatar

Unido: 04/Noviembre/2014
Localización: Graz
Estado: Sin conexión
Puntos: 100
Opciones de entrada Opciones de entrada   Gracias (1) Gracias(1)   Cita lunasoft Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 25/Julio/2023 a las 11:22
Buenos días:

la respuesta a tu duda la encuentras en: 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
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable