Imprimir página | Cerrar ventana

RECORRER LINEAS FORMULARIOS

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=86193
Fecha de impresión: 26/Marzo/2026 a las 17:28


Tema: RECORRER LINEAS FORMULARIOS
Publicado por: jvob
Asunto: RECORRER LINEAS FORMULARIOS
Fecha de publicación: 12/Diciembre/2021 a las 08:39
Dentro de un Formulario continuo he de recorrer cada una de las lineas existentes y calcular los Precios de Venta.

He probado con estos dos rutinas:

Dim Rst As DAO.Recordset
Set Rst = Me.RecordsetClone
While Not Rst.EO  
   Call CALCULOPVP
Rst.MoveNext
Wend
Rst.Close
Set Rst = Nothing

y con esta otra:

Dim bucle As Integer
Dim i As Integer
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
   Call CALCULOPVP
DoCmd.GoToRecord , , acNext
Next

Me funcionan bien las dos, pero en el momento que dentro del CALL, encuentran que abro otros formularios para extraer los datos para calcular el PVP, el proceso, se me queda en la primera linea sin hacer el recorrido por cada una de las lineas del Formulario Principal.
Os agradeceria si puedieseis indicarme otra forma de trabajo para que me pudiese funcionar.





-------------
jvob



Respuestas:
Publicado por: main
Fecha de publicación: 12/Diciembre/2021 a las 10:46
Hola
Podrias poner el codigo que realizas con "CALCULOPVP"
Saludos


Publicado por: jvob
Fecha de publicación: 13/Diciembre/2021 a las 06:36
Este el codigo que hay en el CALL con la llamda a otrso formularios que contienen los datos complementarios para realizar el Calculo:

***************************
'--  RUTINA CALCULO PVP -- *
'***************************
Sub CALCULOPVP()
'*
Dim AREAPRODUCTO As Double
Dim AreaMaterial As Double
Dim UnidadesHoja As Double
Dim UnidadesMaterial As Double
Dim TOTALMTS2 As Double
'*
AREAPRODUCTO = ((Me.AnchoProducto / 1000) + (Me.AnchoSangrado / 1000)) * ((Me.AltoProducto / 1000) + (Me.AltoSangrado / 1000))
'*
AreaMaterial = Me.AMaterial
UnidadesHoja = Nz(Int([AreaMaterial] / [AREAPRODUCTO]))
If UnidadesHoja = 0 Then
    UnidadesHoja = 1
Else
End If
'*
Dim ValorDecimal As Double
Dim ParteEntera As Long
Dim ParteDecimal As Double
ValorDecimal = Nz([UNIDADESTOTALES] / [UnidadesHoja])
ParteEntera = Int(ValorDecimal)
ParteDecimal = ValorDecimal - ParteEntera
If ParteDecimal <> 0 Then
    UnidadesMaterial = ParteEntera + 1
Else
    UnidadesMaterial = ParteEntera
End If
TOTALMTS2 = 0
'*
If Me.GranFormato = "SI" Then
    If AreaMaterial < Me.AreaMinima Then
        AreaMaterial = Me.AreaMinima
    Else
    End If
Else
End If
'*
Dim SELECTORUNIDADES As Double
Dim SUMAGASTOSIMPRESION As Double
Dim SELECTORUNIDAD As Double
Dim SUMAGASTOSMATERIALES As Double
If GranFormato = "SI" Then
    SUMAGASTOSIMPRESION = SUMACOSTESIMPRESION
    SELECTORUNIDADES = Round(TOTALMTS2, 3)
    SELECTORUNIDAD = Round(TOTALMTS2, 3) / UNIDADESTOTALES
Else
    SUMAGASTOSIMPRESION = SUMACOSTESIMPRESION
    SELECTORUNIDADES = Round(UnidadesMaterial, 3)
    SELECTORUNIDAD = Round(UnidadesMaterial, 3) / UNIDADESTOTALES
End If
Me.Recalc
'*
If Me.GranFormato = "SI" Then
    SUMAGASTOSMATERIALES = SUMAMATERIALES
    SUMACOSTESMATERIALES = CosteMateriales
Else
    SUMAGASTOSMATERIALES = SUMAMATERIALES
    SUMACOSTESMATERIALES = CosteMateriales
End If
Me.Recalc
'*
DoCmd.OpenForm "COMPUESTOIMPRESIONTRABAJOINICIO"
DoCmd.OpenForm "COMPUESTOPREPOSTIMPRESIONTRABAJO"
'*
DoCmd.OpenForm "COMPUESTOPREPOSTIMPRESIONPRODUCTO"
DoCmd.OpenForm "COMPUESTOCOSTESIMPRESIONPRODUCTO"
'*
DoCmd.OpenForm "COMPUESTOCOSTESIMPRESIONMATERIAL"
DoCmd.OpenForm "COMPUESTOPREPOSTIMPRESIONMATERIAL"
DoCmd.OpenForm "COMPUESTOMATERIALESINICIO"
'*
Me.Recalc
Dim TOTAL1 As Double
Dim TOTAL2 As Double
TOTAL1 = Nz(Me.SUMAPRODUCTO * Me.UNIDADESTOTALES)
TOTAL2 = Nz(Me.SUMAMATERIAL * SELECTORUNIDADES)
Me.PVPLINEA = Nz(Me.SUMATRABAJO) + Nz(TOTAL1) + Nz(TOTAL2)
Me.Refresh
'*
DoCmd.Close acForm, "COMPUESTOIMPRESIONTRABAJOINICIO"
DoCmd.Close acForm, "COMPUESTOPREPOSTIMPRESIONTRABAJO"
'*
DoCmd.Close acForm, "COMPUESTOPREPOSTIMPRESIONPRODUCTO"
DoCmd.Close acForm, "COMPUESTOCOSTESIMPRESIONPRODUCTO"
'*
DoCmd.Close acForm, "COMPUESTOCOSTESIMPRESIONMATERIAL"
DoCmd.Close acForm, "COMPUESTOPREPOSTIMPRESIONMATERIAL"
DoCmd.Close acForm, "COMPUESTOMATERIALESINICIO"
'*
si necesitas mas informacion dimelo y te la indico.
Un saudo



-------------
jvob


Publicado por: main
Fecha de publicación: 13/Diciembre/2021 a las 10:05
Hola
Dento de la llamada a CALCULOPVP no veo necesidad de poner ningún Me.Recalc ni tampoco el Me.Refresh que pones despues de la linea Me.PVPLINEA = Nz(Me.SUMATRABAJO) + Nz(TOTAL1) + Nz(TOTAL2).
Si deduzco bien Me.PVPLINEA es el único campo del formulario que actualizas  para cada registro

Prueba esto

Dim Rst As DAO.Recordset
Set Rst = Me.RecordsetClone
Rst.MoveFirst
Do Until Rst.EOF 
   Call CALCULOPVP
Rst.MoveNext
Loop
Rst.Close
Set Rst = Nothing
Me.Requery


Publicado por: jvob
Fecha de publicación: 13/Diciembre/2021 a las 11:23
Me sique haciendo lo mismo. Solo calcula el PVP del primer registro.
Cuando le doy al boton del calculo noto que abre los Forms que tengo para recoger datos por cada uno de los productos dentro del Form principal. Pero solo calcula la primera linea y no avanza con las siguientes lineas.
Si elimino los Calcs y el Refresh no me hace bien los calculos, por eso fue el motivo de intercalarlos. He probado eliminarlos pero tampoco realiza bien el proceso.
Si lo ves conveniente te podria mandar el proceso para que lo vieses personalmente en tu ordenador.



-------------
jvob


Publicado por: main
Fecha de publicación: 13/Diciembre/2021 a las 12:33
Hola, puedes enviarmelo si quieres no hay problema
O bien colgarlo en la nube y poner el enlace aqui en el foro para que otros miembros puedan ayudarte. Asi todos veran la solución.
Prueba a cambiar la linea
Me.PVPLINEA = Nz(Me.SUMATRABAJO) + Nz(TOTAL1) + Nz(TOTAL2)
Por estas
Rst.edit
Rst!PVPLINEA = Nz(Rst!SUMATRABAJO) + Nz(TOTAL1) + Nz(TOTAL2)
Rst.update

Sinó tendrias que sincronizar el registro del formularo con el del recordset
Algo asi

Dim Rst As DAO.Recordset
Set Rst = Me.RecordsetClone
Rst.MoveFirst
Do Until Rst.EOF
Me.Bookmark = Rst.Bookmark
   Call CALCULOPVP
Rst.MoveNext
Loop
Rst.Close
Set Rst = Nothing
Me.Requery
Saludos



Publicado por: jvob
Fecha de publicación: 13/Diciembre/2021 a las 16:46
No se como podria subirlo a la nube dime los pasos a seguir. O bien dime tu correo y te lo mando.



-------------
jvob


Publicado por: main
Fecha de publicación: 13/Diciembre/2021 a las 19:04
Probaste algo de lo que te comente?
¿Que es lo que no te funcioa?
Utimamente las normas del foro son asi.
Tengo en el foro,como todos, un canal de  mensajes-
dirijete a el
Saludos


Publicado por: jvob
Fecha de publicación: 14/Diciembre/2021 a las 04:54
He probado el eliminar las actualizaciones que me dijiste del Call y el Refresh y sigue sin funcionar. Solo actualiza la primera linea del Formulario.



-------------
jvob


Publicado por: jvob
Fecha de publicación: 14/Diciembre/2021 a las 04:56
En este foro es la primera vez que entrado aunque ya hacia tiempo que estaba dado de alta. Donde se encuentra el canal de mensajes para poder acceder

-------------
jvob


Publicado por: main
Fecha de publicación: 14/Diciembre/2021 a las 12:53
Prueba lo que te envie ayer a las 12:33 y comentas
Los mensajes los tienes en la parte superior izquierda de la pagina

Saludos


Publicado por: jvob
Fecha de publicación: 14/Diciembre/2021 a las 15:26
He probado lo que me dijiste ayer y me sigue haciendo lo mismo. Se queda en el primer producto.



-------------
jvob


Publicado por: joanka
Fecha de publicación: 14/Diciembre/2021 a las 15:38
Hola,

Prueba con este código:

On Error Resume Next

Application.Echo False

Dim n As Long
n = Me.CurrentRecord
Me.Recordset.MoveFirst
Do While Not Me.Recordset.EOF

Call CALCULOPVP

Me.Recordset.MoveNext

Loop

Me.Recordset.MoveFirst

If n > 1 Then Me.Recordset.Move n - 1

Application.Echo True

Exit Sub


Publicado por: jvob
Fecha de publicación: 15/Diciembre/2021 a las 03:43
Gracias por tu ayuda. 
He probado este codigo que me has mandado pero no me hace nada. Se queda sin calcular nada.
El problema me viene que en el CALL al llamar a otros Forms. nse queda en la primera linea sin continuar con las siguientes del Formulario Pincipal.
Parace ser que el puntero no avanza con las lineas siguientes del formulario a calcular.
Si elimino la llamada a los formularios donde he de extraer datos para calculos me funciona perfectamente.


-------------
jvob


Publicado por: Mihura
Fecha de publicación: 15/Diciembre/2021 a las 08:20
El módulo CalculoPVP tienes que rehacerlo, de forma que tire directamente de las tablas de datos (usando recordsets) y no de los campos de unos formularios.

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: main
Fecha de publicación: 15/Diciembre/2021 a las 09:28
Hola de nuevo
Si  pones, como esxpuse, la instrucción
Me.Bookmark = Rst.Bookmark
el formulario debería sincronizarse con el del recordset y si podrias dejar la intrucion que tienes
Me.PVPLINEA = Nz(Me.SUMATRABAJO) + Nz(TOTAL1) + Nz(TOTAL2)
Pero si no lo haces asi, el registro del formulario siempre sera el mismo. Y por eso lo que hay que modificar es el recordset con la instruccion que te puse:
Rst.edit
Rst!PVPLINEA = Nz(Rst!SUMATRABAJO) + Nz(TOTAL1) + Nz(TOTAL2)
Rst.update
Claro está que los campos PVPLINEA y SUMATRABAJO tienen que ser parte del registro del formulario.

Tambien podrias probar el abrir esos formularios, si quieres no visibles, al cargar o abrir el formulario principal, cerrandolos al descargarlo evitando tener que abrirlos durante la ejecución del codigo.



Saludos



Publicado por: joanka
Fecha de publicación: 15/Diciembre/2021 a las 10:12
De nada, tienes que hacerlo tal y como te indica Mihura, con Recordset en las tablas, al abrir los formularios, estás perdiendo el foco en el formulario continuo.


Publicado por: main
Fecha de publicación: 15/Diciembre/2021 a las 10:50
Hola
Si los formularios se abren no visibles, el foco estaria en el formulario continuo, imprescindible para ejecutar el procedimiento.



Publicado por: jvob
Fecha de publicación: 15/Diciembre/2021 a las 11:22
Como puedo seleccionar y extraer los datos con recordsets directamente de las tablas?. Me podrias indicar con algún ejemplo como he de hacerlo ya que nunca he utilizado esta forma.
Gracias


-------------
jvob


Publicado por: jvob
Fecha de publicación: 15/Diciembre/2021 a las 16:33
No se como tratar el proceso como me indicas. De cada uno de los formularios que extraigo datos hay que sumar los totales de cada uno de los registros existentes que en alguno de ellos pueden haber varios conceptos.
Soy algo nuevo en Acces y no se como realizar todo esto que me indicas.
Me podrias indicar como he de realizarlo.
Gracias


-------------
jvob


Publicado por: jvob
Fecha de publicación: 15/Diciembre/2021 a las 18:06
podria subir la aplicacion a la nube y podrias verla directmente

-------------
jvob


Publicado por: jvob
Fecha de publicación: 15/Diciembre/2021 a las 18:08
Podrias indicarme como puedo hacerlo. No estoy muy fuerte en Access

-------------
jvob


Publicado por: main
Fecha de publicación: 16/Diciembre/2021 a las 10:48
Hola para subirlo a la nube tendrás que abrir una cuenta y registrarte bien en DropBox ó en OneDrive, por ejemplo.

Es gratuito

Saludos


Publicado por: joanka
Fecha de publicación: 16/Diciembre/2021 a las 11:09
Hola,

He estado mirando el CALCULOPVP y no consigo ver el por qué de abrirlos, no estás cogiendo ningún dato de esos formularios para insertarlos el el formulario continuo.

Has probado simplemente a eliminar las líneas de abrir y cerrar los formualarios?


Publicado por: jvob
Fecha de publicación: 16/Diciembre/2021 a las 18:27
No se como realizarlo de esa forma. Te agradeceria muchisimo si me indicases la forma de hacerlo. Gracias

-------------
jvob


Publicado por: joanka
Fecha de publicación: 16/Diciembre/2021 a las 18:53
Hola,

Primero, has eliminado estas líneas en CALCULOPVP y probado si te funciona el código?

DoCmd.OpenForm "COMPUESTOIMPRESIONTRABAJOINICIO"
DoCmd.OpenForm "COMPUESTOPREPOSTIMPRESIONTRABAJO"
DoCmd.OpenForm "COMPUESTOPREPOSTIMPRESIONPRODUCTO"
DoCmd.OpenForm "COMPUESTOCOSTESIMPRESIONPRODUCTO"
DoCmd.OpenForm "COMPUESTOCOSTESIMPRESIONMATERIAL"
DoCmd.OpenForm "COMPUESTOPREPOSTIMPRESIONMATERIAL"
DoCmd.OpenForm "COMPUESTOMATERIALESINICIO"
DoCmd.Close acForm, "COMPUESTOIMPRESIONTRABAJOINICIO"
DoCmd.Close acForm, "COMPUESTOPREPOSTIMPRESIONTRABAJO"
DoCmd.Close acForm, "COMPUESTOPREPOSTIMPRESIONPRODUCTO"
DoCmd.Close acForm, "COMPUESTOCOSTESIMPRESIONPRODUCTO"
DoCmd.Close acForm, "COMPUESTOCOSTESIMPRESIONMATERIAL"
DoCmd.Close acForm, "COMPUESTOPREPOSTIMPRESIONMATERIAL"
DoCmd.Close acForm, "COMPUESTOMATERIALESINICIO"

Segundo, todos los elementos del código en CALCULOPVP, pertenecen al formulario continuo en el que estás trabajando?

Tercero, prueba a reproducir solo una parte del código de CALCULOPVP, para ver que te reccorre el formulario y te hace los cambios, por ejemplo:

Dim AREAPRODUCTO As Double
Dim AreaMaterial As Double
Dim UnidadesHoja As Double
Dim UnidadesMaterial As Double
Dim TOTALMTS2 As Double
'*
AREAPRODUCTO = ((Me.AnchoProducto / 1000) + (Me.AnchoSangrado / 1000)) * ((Me.AltoProducto / 1000) + (Me.AltoSangrado / 1000))
'*
AreaMaterial = Me.AMaterial
UnidadesHoja = Nz(Int([AreaMaterial] / [AREAPRODUCTO]))
If UnidadesHoja = 0 Then
    UnidadesHoja = 1
Else
End If




Imprimir página | Cerrar ventana