Access - No me deja ir a subformulario

 
Vista:
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por Rafael (225 intervenciones) el 03/11/2020 11:01:56
Saludos.
Tengo un formulario (FRM_CONSUMOS) con un subformulario (lecturas_agua), en el formulario principal en el evento open tengo el siguiente codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub Form_Open(Cancel As Integer)
'declaro las variables
 
Dim db As Database
Dim rs As Recordset
Dim mes_lectura As String
mes_lectura = Me.mes.Value
Set db = CurrentDb()
Set rs = db.OpenRecordset("agua")
'actualizo el campo fecha_lectura
Do While Not rs.EOF
If Fecha_lectura = "" Then
rs.Edit
rs!Fecha_lectura = mes_lectura
rs.Update
End If
rs.MoveNext
Loop
Set rst = Nothing
 
'actualizo los datos del resto de campos con los datos del mes anterior
DoCmd.RunSQL "UPDATE Agua SET Agua.Agua_Actual = [agua_anterior], Agua.Luz_actual = [luz_anterior], Agua.[2agua_actual] = [2agua_anterior] WHERE (((Agua.Fecha_lectura)=[Formularios]![FRM_CONSUMOS]![mes]));"
 
'voy al subformulario para editar los registros y actualizarlos
DoCmd.GoToControl "Lecturas_agua"
DoCmd.GoToRecord , , acLast
DoCmd.GoToControl "actual"
End Sub

El problema que tengo es que cuando tiene que ejecutar la linea de ir a control "Lecturas_agua" me sale el mensaje de que no esta disponible la funcion ir a control.
Espero me puedan sacar de este embrollo.
gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

No me deja ir a subformulario

Publicado por Anonimo (3316 intervenciones) el 03/11/2020 14:46:04
Inténtalo en dos pasos:

.- Paso 1 ==> enviar el foco al subformulario
.- Paso 2 ==> enviar el foco al control.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por Rafael (225 intervenciones) el 03/11/2020 20:35:19
Muchas gracias, Anonimo.
Efectivamente haciéndolo en dos pasos puedo ir al control deseado, pero me surge otro problema que no se como solucionarlo.
Trabajando con una BD sin cinta de opciones personalizada funciona perfectamente pero cuando quiero hacerlo en la Aplicación que estoy desarrollando, la cual tiene las cintas de opciones personalizadas, me da error de compilación en la linea:
rs.Edit
sale el mensaje de error de compilación, no se encontró el método o el dato miembro.

cual puede ser el problema?
gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No me deja ir a subformulario

Publicado por Anonimo (3316 intervenciones) el 03/11/2020 22:54:37
Dependerá del orden de las referencias, si se esta utilizando DAO es correcto (pero Access no lo sabe de momento) y el error es que lo intentará interpretar como ADO.

Una solución a aplicar:

1
2
3
4
5
' Original
Dim rs As Recordset
 
' Nuevo
Dim rs As DAO.Recordset

Pero para algo tan simple como actualizar un campo (con la única condición de que no tenga un valor) yo utilizaría una SQL (seria mas simple)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por Rafael (225 intervenciones) el 04/11/2020 13:06:50
Muchas gracias Anonimo.
He seguido tu consejo y utilizar una SQL:

1
DoCmd.RunSQL "UPDATE Agua SET Agua.Fecha_lectura=[formularios]![FRM_Consumos]![mes] WHERE(((Agua.Fecha_lectura)=""));"

Pero me da error 3075 en tiempo de ejecución: Error de sintaxis en la cadena
No veo donde puede estar el error.
gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No me deja ir a subformulario

Publicado por Anonimo (3316 intervenciones) el 04/11/2020 16:54:11
En el lenguaje SQL se utiliza el ingles y 'Formularios' = castellano, 'Forms' = Ingles

De todas formas la puedes simplificar, no se necesita indicar la tabla origen (el 'apellido') con cada campo, solo es imprescindible si hay mas de una tabla y si tienen un campo coincidente.

Si quieres que te pida confirmación: DOCmd
Si lo quieres hacer de forma transparente (y exclusiva): CurrentDb.Execute

1
2
3
4
5
DoCmd.RunSQL "UPDATE Agua SET Fecha_lectura= Forms!FRM_Consumos!mes WHERE Fecha_lectura)=''"
 
CurrentDb.Execute "UPDATE Agua SET Fecha_lectura= Forms!FRM_Consumos!mes WHERE Fecha_lectura)=''"
 
CurrentDb.Execute "UPDATE Agua SET Fecha_lectura= Forms!FRM_Consumos!mes WHERE Not IsDate(Fecha_lectura)"

En la ultima versión verificamos que el contenido de 'fecha_lectura' es una fecha valida
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por Rafael (225 intervenciones) el 04/11/2020 18:20:34
Buenas tardes Anónimo, vaya día te llevo dando.
He probado con docmd y no me actualiza ningún registro, teóricamente funciona así:
DoCmd.RunSQL "UPDATE Agua SET Fecha_lectura= Forms!FRM_Consumos!mes WHERE((( Fecha_lectura)=''));"

con CurrentDb.Execute si la pongo literal como me indicas me dice que sobra un paréntesis y si se lo quito que son pocos parámetros.

cuando todos los meses anoto las lecturas de los contadores, una vez que he anotado las lecturas del mes se crea un registro solo con los datos de la lectura del mes anterior osea:

mes actual rellenado:
fecha_lectura:octubre
agua_anterior: 250
agua_actual:260
Luz_anterior:250
Luz_actual:260

siguiente mes/registro:
fecha_lectura:
agua_anterior:260
agua_actual:
Luz_anterior:260
luz_actual:

al actualizar los registros del mes a facturar, me copia los valores del mismo para así el siguiente mes tenerlos para solo anotar las lecturas actuales.
pero en la temporada de invierno no hay casi nadie viviendo y solo varian las lecturas de unos pocos y pretendo que me copie los valores anteriores a actuales y evitar tener que anotarlos.
gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No me deja ir a subformulario

Publicado por Anonimo (3316 intervenciones) el 04/11/2020 20:23:35
En mi anterior respuesta es cierto que hay error, pero es en ambas opciones, quedo un resto del original (un paréntesis de cierre sin que exista uno de apertura).

La que evalúa el campo como de tipo DATE, no es correcta, pues (por los datos que has proporcionado ahora) es un campo de texto y (al parecer) solo el nombre del mes, no es una fecha no es evaluable como tal tipo de dato.

Sinceramente creí que la SQL original se creo con el asistente grafico y después se copio la SQL (al parecer no era correcto y lo publicado jamás funciono)

Según el proceso que planteas, una vez que se anotan los que consumen agua o luz, a aquellos que no declaran consumo (no se cumplimenta el campo 'techa_lectura') se les ponen valores por defecto.

Campos a manipular:
.- fecha_lectura
.- agua_actual
.- luz_actual


Se puede hacer en un paso: (la SQL para usarla como gustes)

1
Update Agua Set fecha_lectura = Forms!FRM_Consumos!mes , agua_actual = agua_anterior , luz_actual =  luz_anterior Where fecha_lectura= ''

Yo copiaría el texto en la ventana del editor de consultas (en su vista SQL), le añadiría un punto y coma al final (lo necesita el editor, no la SQL) y en una copia de la tabla experimentaría si funciona de la forma esperada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por Rafael (225 intervenciones) el 04/11/2020 23:35:32
Muy buenas de nuevo.
No se trata de poner valores por defecto, se trata de tomar los valores del mes anterior para el siguiente en una sucesión continua (todos los meses).
las lecturas del mes en curso una vez anotadas, las registro como lecturas anteriores para el próximo mes, así me evito el cometer algún error al transcribirlas manualmente, así mismo no se cumplimenta el campo correspondiente a las lecturas del siguiente mes ya que hay que imprimir el informe con dichos campos en blanco para ser rellenado a mano (lápiz y papel) cuando corresponda leer los contadores.
Lo que pretendo es que una vez introducidas las lecturas de los contadores del mes y haya sacado el informe para rellenar con las lecturas del siguiente mes, mediante un botón de comando o evento que se decida, pueda rellenar las lecturas actuales con las anteriores anotándose a la vez el mes que corresponde, para así si no ha habido consumo no tener que rellenar campo alguno ya que la lectura sera la misma que la anterior, pero ya la tendría anotada.
No se si me he explicado.
No obstante muchas gracias por tus consejos y enseñanzas.
Voy a probar con docmd y con currentDb.execute a ver si soy capaz de hacer lo que pretendo.
te adjunto un ejemplo para que veas como funciona como lo tengo ahora para mejor comprensión.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No me deja ir a subformulario

Publicado por Anonimo (3316 intervenciones) el 05/11/2020 00:38:14
Ojeare lo que has enviado, pero creo que no has entendido el propósito de la SQL que publique ....

También es posible que yo no captase el concepto real de lo que se pretende entre otras cosas porque para hacer lo mismo aplico diferente metodología (a planificar los procesos de otra forma me refiero, no a utilizar uno u otro método, porque todos pueden llevar al mismo destino).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por Rafael (225 intervenciones) el 08/11/2020 00:37:06
Muy buenas de nuevo, he optado por dar otro enfoque al asunto y me he decidido ha cambiar el tipo de datos del campo fecha_lectura de texto a fecha y utilizar o bien DOCMD o CURRENTDB, pero no consigo hallar la sintaxis correcta.
si utilizo DOCMD:
DoCmd.RunSQL "UPDATE Agua SET Agua.Fecha_lectura = [Formularios]![FRM_CONSUMOS]![mes], Agua.Agua_Actual = [agua_anterior], Agua.Luz_actual = [Luz_anterior], Agua.[2agua_actual] = [2agua_anterior] WHERE Not is date([agua.fecha_lectura]);"
Me da error 3075 en Tiempo de ejecución: error en sintaxis, falta operador en la expresión Not Is Date([agua.fecha_lectura])

Si utilizo CURRENTDB:
CurrentDb.Execute "UPDATE Agua SET Fecha_lectura= Forms!FRM_Consumos!mes WHERE Not IsDate(Fecha_lectura)"
Me da error 3061 en tiempo de ejecución: Pocos parámetros, se esperaba 1.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 99
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

No me deja ir a subformulario

Publicado por rambling (225 intervenciones) el 04/11/2020 18:34:36
con este codígo actualizo el siguiente registro, como verás hay otro campo ya que algunos tienen dos contadores de agua.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub Luz_actual_AfterUpdate()
DoCmd.Save
Dim vevalor1 As Long
Dim periodo As String
vevalor1 = [Luz_actual].Value
lectura1.Value = vevalor1
[Consumo_luz] = [Luz_actual] - [Luz_anterior]
DoCmd.GoToControl "mes"
periodo = [Texto17].Value
[mes] = periodo
 
DoCmd.GoToRecord , , acNext
DoCmd.GoToControl "anterior"
 
[Anterior] = lectura
[Luz_anterior] = lectura1
[2agua_anterior] = contador2
 
DoCmd.GoToControl "id"
DoCmd.GoToRecord , , acNext
DoCmd.GoToControl "Lecturas_agua"
DoCmd.GoToRecord , , acLast
If [2agua_anterior] = 0 Then
DoCmd.GoToControl "actual"
Else
DoCmd.GoToControl "2agua_actual"
End If
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar