Llenar campo de Tabla con calculo de consulta
Ojala me puedas ayudar otra vez... Tengo la siguiente duda: tengo una tabla con los campos: Proyecto, Periodo y Indicador. Cada proyecto posee varios periodos, y cada periodo posee un Indicador distinto. EJ: Proyecto ALPHA Periodo 1 Indicador 0.5, Proyecto ALPHA Periodo 2 Indicador 0.7... Proyecto BETA Periodo 1 Indicador 0.1, Proyecto BETA Periodo 2 Indicador 0.3, etc.
Ahora, para calcular el campo Indicador para cada periodo por proyecto, me vi en la necesidad de crear una consulta para manejar solo un tipo de proyecto, por ejemplo, solo el proyecto ALPHA, otra para solo para el BEta, etc. En cada una de ellas puedo calcular el Indicador respectivo para cada periodo, pero el problema es que no puedo pasar ese valor calculado (del Indicador) a la tabla Principal (en donde se encuentran todos los proyectos juntos) y almacenarlo en sus respectivos periodos. Ojala me puedas ayudar.
Ahora, para calcular el campo Indicador para cada periodo por proyecto, me vi en la necesidad de crear una consulta para manejar solo un tipo de proyecto, por ejemplo, solo el proyecto ALPHA, otra para solo para el BEta, etc. En cada una de ellas puedo calcular el Indicador respectivo para cada periodo, pero el problema es que no puedo pasar ese valor calculado (del Indicador) a la tabla Principal (en donde se encuentran todos los proyectos juntos) y almacenarlo en sus respectivos periodos. Ojala me puedas ayudar.
1 respuesta
Respuesta
1
1
Anónimo
Debes transferir el resultado de la consulta a un textbox (que está vinculado a un campo de la base de datos) por ej. si lo haces a través de un botón de comando (calcular)
Texto0 es el textbox donde va a cargarse (desde una consulta) el resultado del cálculo.
Abres la consulta que tienes realizada en modo sql, copias todo y lo pegas entre las comillas de la línea que dice sql=...
¿Cuándo ejecutas la consulta, el resultado tiene un titulo (indicador?), luego ese titulo es el que va en la línea rs1. Fields("indicador")
Instalas un botón en el formulario que sea calcular y ejecute lo siguiente
Private Sub calcular_Click(Cancel As Integer)
Dim rs1 As Object
Dim sqlcommand As String
sql= ""
Set rs1 = CurrentDb().OpenRecordset(sql)
If rs1.RecordCount = 1 Then
texto0= rs1.Fields("")
end if
end sub
Notas: rs1 es un objeto recordset (es decir en este caso un conjunto de registros de la base de datos )
sql es un comando sql (es el lenguaje de access para las consultas)
El resultado de la consulta va al objeto recordset con el comando set.
Como el resultado tiene que dar 1 solo registro (hay un solo textbox para recibirlo), esta el if rs1. Recordcount
texto0=rs1. Fields("indicador") transfiere el dato del registro 1 del recorset1 del campo indicador al textbox texto0
Saludos. Jorge
Texto0 es el textbox donde va a cargarse (desde una consulta) el resultado del cálculo.
Abres la consulta que tienes realizada en modo sql, copias todo y lo pegas entre las comillas de la línea que dice sql=...
¿Cuándo ejecutas la consulta, el resultado tiene un titulo (indicador?), luego ese titulo es el que va en la línea rs1. Fields("indicador")
Instalas un botón en el formulario que sea calcular y ejecute lo siguiente
Private Sub calcular_Click(Cancel As Integer)
Dim rs1 As Object
Dim sqlcommand As String
sql= ""
Set rs1 = CurrentDb().OpenRecordset(sql)
If rs1.RecordCount = 1 Then
texto0= rs1.Fields("")
end if
end sub
Notas: rs1 es un objeto recordset (es decir en este caso un conjunto de registros de la base de datos )
sql es un comando sql (es el lenguaje de access para las consultas)
El resultado de la consulta va al objeto recordset con el comando set.
Como el resultado tiene que dar 1 solo registro (hay un solo textbox para recibirlo), esta el if rs1. Recordcount
texto0=rs1. Fields("indicador") transfiere el dato del registro 1 del recorset1 del campo indicador al textbox texto0
Saludos. Jorge
1) ¿Para relacionar el cuadro de texto texto0 (en donde voy a tener el resultado) con un campo de la tabla principal lo hago en origen de control?
2) Tengo un formulario y dentro de éste tengo como subformulario la consulta de un proyecto, mostrando sus campos incluyendo el de Indicador ya calculado por periodo. Para almacenarlos en la Tabla principal, ¿el botón Calcular (junto al texto0) lo creo dentro del subformulario o en el formulario? ¿Cómo sabe el botón que estamos trabajando con esa consulta?
2) Tengo un formulario y dentro de éste tengo como subformulario la consulta de un proyecto, mostrando sus campos incluyendo el de Indicador ya calculado por periodo. Para almacenarlos en la Tabla principal, ¿el botón Calcular (junto al texto0) lo creo dentro del subformulario o en el formulario? ¿Cómo sabe el botón que estamos trabajando con esa consulta?
Al ejecutar el botón Calcular según el código que anterior, me tira un error en la linea Set rs1 = CurrentDb().OpenRecordset(sql), ¿qué puede ser?
Donde dice:
dim sqlcommand as string , es:
dim sql as string
Es correcta la parte1, debes vincular el textbox al campo indicador de la base de datos (donde se va a almacenar el valor calculado) en la opción origen de control.
Luego que lo vincules esto funciona así, cambias el valor (lo escribes) y automáticamente se cambia en la base de datos. ¿Pero cómo hacer para que se calcule automáticamente?
Para ello usas el procedimiento que te pasé: Te lo explico un poco
La línea
sql="(acá va la consulta)"
Es la de la consulta que calcula el indicador (una consulta que tira el indicador para un proyecto determinado, para un periodo determinado, ya la habias creado segun comentaste). Dicha consulta la editas en modo diseño y copias todo el código (debe empezar con un select.... y termina en un ;
La línea set rs1... Ejecuta dicha consulta y el resultado lo coloca en un recordset, que podría verse como una matriz de datos (cuyas columnas son los campos de la consulta)
La línea texto0=rs1.fields("indicador")
Hace que el valor calculado, el indicador, pase al text0 y de ahí se graba en la base.
dim sqlcommand as string , es:
dim sql as string
Es correcta la parte1, debes vincular el textbox al campo indicador de la base de datos (donde se va a almacenar el valor calculado) en la opción origen de control.
Luego que lo vincules esto funciona así, cambias el valor (lo escribes) y automáticamente se cambia en la base de datos. ¿Pero cómo hacer para que se calcule automáticamente?
Para ello usas el procedimiento que te pasé: Te lo explico un poco
La línea
sql="(acá va la consulta)"
Es la de la consulta que calcula el indicador (una consulta que tira el indicador para un proyecto determinado, para un periodo determinado, ya la habias creado segun comentaste). Dicha consulta la editas en modo diseño y copias todo el código (debe empezar con un select.... y termina en un ;
La línea set rs1... Ejecuta dicha consulta y el resultado lo coloca en un recordset, que podría verse como una matriz de datos (cuyas columnas son los campos de la consulta)
La línea texto0=rs1.fields("indicador")
Hace que el valor calculado, el indicador, pase al text0 y de ahí se graba en la base.
Me funciona lo anterior pero solo para el primer registro, es decir, una vez en el formulario, con el primero registro, al hacer click en el botón me entrega el resultado correcto del indicador, pero al pasar al siguiente registro, al hacer click en el botón mantiene el resultado anterior y no calcula el nuevo, ¿qué puede ser?
Muy agradecido por tu tiempo y paciencia, saludos
Muy agradecido por tu tiempo y paciencia, saludos
El sql que estás ejecutando es el mismo para cada registro. Luego el resultado que da es el mismo. Ahí esta el error. Debes ver qué parámetros debes pasarle, como ser contenidos de algún textbox.
Por ejemplo si el sql es:
sql="Select indicador from tabla1 where obra='ayelen' and periodo='4' "
Luego SIEMPRE va a dar el mismo resultado, no importando el registro donde estés parado. Cada vez que ejecuta el código, el resultado es el mismo.
En ese caso, debería haber un par de textbox (cuyo origen sea la tabla correspondiente):
text1= textbox donde iria el nombre de la obra
text2=periodo
el sql seria algo así:
sql="Select indicador from tabla1 where obra='" & text1 & " and periodo=" & text2 & "'"
el símbolo & concatena (une ) cadenas de caracteres
Como dentro de una definición de caracteres el texto está entre comillas dobles, no puedes usarlas, por ello se reeemplazan en el código por las comillas simples.
sql= " ...... 'ayelen' ...........'4'........."
una opcion para controlar el VBA, es poner:
msgbox (sql)
Después de la línea de asignación para que muestre un mensaje con el contenido del sql, de esa forma puedes chequear sea correcto.
Saludos. Jorge
Por ejemplo si el sql es:
sql="Select indicador from tabla1 where obra='ayelen' and periodo='4' "
Luego SIEMPRE va a dar el mismo resultado, no importando el registro donde estés parado. Cada vez que ejecuta el código, el resultado es el mismo.
En ese caso, debería haber un par de textbox (cuyo origen sea la tabla correspondiente):
text1= textbox donde iria el nombre de la obra
text2=periodo
el sql seria algo así:
sql="Select indicador from tabla1 where obra='" & text1 & " and periodo=" & text2 & "'"
el símbolo & concatena (une ) cadenas de caracteres
Como dentro de una definición de caracteres el texto está entre comillas dobles, no puedes usarlas, por ello se reeemplazan en el código por las comillas simples.
sql= " ...... 'ayelen' ...........'4'........."
una opcion para controlar el VBA, es poner:
msgbox (sql)
Después de la línea de asignación para que muestre un mensaje con el contenido del sql, de esa forma puedes chequear sea correcto.
Saludos. Jorge
Demasiado agradecido, aunque me queda una ultima consulta relacionado a lo anterior: tengo un formulario que contiene 2 subformularios dentro de el. Cada subformulario tiene la información de cada proyecto, con su indicador calculado (en vista de registro único). En el formulario principal tengo un cuadro combinado con los nombres de los proyectos, por lo que al momento de elegir uno, se activa el subformulario respectivo al proyecto seleccionado y muestra la información en vista de registro único, y así sucesivamente con el resto de los proyectos.
Ahora mi pregunta es si es que se puede crear un textbox dentro del formulario principal que muestre el valor del campo indicador, obtenido del subformulario activo correspondiente al proyecto seleccionado en el cuadro combinado, y luego, al seleccionar otro proyecto, el mismo textbox muestre la información del campo indicador de otro subformulario que estará activo, descartando los demás inactivos.
Ejemplo: Proyecto A, Indicador = 8 ; Proyecto B, Indicador = 2
En el formulario principal el cuadro combinado mostraría los nombres de los proyectos, y al momento de seleccionar uno, por ejemplo el proyecto A, se activa el subformulario del mismo mostrando Indicador = 8, y la idea es que ese valor aparezca en un textbox en el formulario principal. Luego al elegir el proyecto B, se activa el subformulario del mismo, desactivándose el del A, apareciendo el valor de su Indicador = 2 en el mismo textbox anterior del formulario principal. El motivo de esto es para guardar aquel valor del textbox, mediante un botón de comando, en otra tabla.
Demasiado agradecido por tu tiempo, espero tu respuesta, gracias
Ahora mi pregunta es si es que se puede crear un textbox dentro del formulario principal que muestre el valor del campo indicador, obtenido del subformulario activo correspondiente al proyecto seleccionado en el cuadro combinado, y luego, al seleccionar otro proyecto, el mismo textbox muestre la información del campo indicador de otro subformulario que estará activo, descartando los demás inactivos.
Ejemplo: Proyecto A, Indicador = 8 ; Proyecto B, Indicador = 2
En el formulario principal el cuadro combinado mostraría los nombres de los proyectos, y al momento de seleccionar uno, por ejemplo el proyecto A, se activa el subformulario del mismo mostrando Indicador = 8, y la idea es que ese valor aparezca en un textbox en el formulario principal. Luego al elegir el proyecto B, se activa el subformulario del mismo, desactivándose el del A, apareciendo el valor de su Indicador = 2 en el mismo textbox anterior del formulario principal. El motivo de esto es para guardar aquel valor del textbox, mediante un botón de comando, en otra tabla.
Demasiado agradecido por tu tiempo, espero tu respuesta, gracias
Crea un modulo, y en el declara una variable que se llama indicador.
Global indicador
Esto hace que dicha variable pueda ser utilizada en todos los formularios.
En el subformulario crea un evento (por ej al hacer doble click) que transfiera el valor del indicador seleccionado [subformulario1]. Indicador a la variable indicador.
Luego, al activar el form principal un evento que transfiera el valor de la variable indicador al textbox corresp y de ahí a la base
¿Es algo así lo que planteas?.
Global indicador
Esto hace que dicha variable pueda ser utilizada en todos los formularios.
En el subformulario crea un evento (por ej al hacer doble click) que transfiera el valor del indicador seleccionado [subformulario1]. Indicador a la variable indicador.
Luego, al activar el form principal un evento que transfiera el valor de la variable indicador al textbox corresp y de ahí a la base
¿Es algo así lo que planteas?.
Pero como podría hacer que un textbox reciba el valor de un campo de un subformulario cuando éste esta activo (activado por la elección del proyecto en el cuadro combinado), y una vez que elija otro proyecto en el cuadro combinado, en el mismo textbox aparezca el valor del campo del nuevo subformulario ahora activo.
Actualmente lo tengo con textbox separados, es decir, un textbox (dentro del formulario principal) para cada subformulario que muestre el valor del campo de el. Pero cuando elijo un proyecto en el cuadro combinado, el subformulario respectivo se activa y me arroja el valor en el textbox correspondiente, pero el resto de los textbox me arroja #Error al no estar los otros subformularios activos. Entonces como podría hacer para que un solo textbox reconociera cual subformulario esta activo y me arroje el valor del campo respectivo.
Habia pensado con If subformulario1. Enabled = True then textbox = valorcampo ... else if subformulario2. Enabled = True then textbox = valorcampo.... y asi pero no funciona al estar todos activos. También había pensado, si utilizo para cada subformulario un textbox, utilizar solo el que tenga un numero, ya que el resto de los textbox saldrá el #Error, pero no se como referenciar ese #Error porque no es lo mismo que null. También lo otro era poner en el origen de control del textbox: [SubFormulario1].[Formulario]![Indicador] Or [SubFormulario2].[Formulario]![Indicador] Or ... etc pero no funciona. Ojala me puedas ayudar a salir adelante. Te puedo explicar de nuevo si no quedo claro,. Gracias
Actualmente lo tengo con textbox separados, es decir, un textbox (dentro del formulario principal) para cada subformulario que muestre el valor del campo de el. Pero cuando elijo un proyecto en el cuadro combinado, el subformulario respectivo se activa y me arroja el valor en el textbox correspondiente, pero el resto de los textbox me arroja #Error al no estar los otros subformularios activos. Entonces como podría hacer para que un solo textbox reconociera cual subformulario esta activo y me arroje el valor del campo respectivo.
Habia pensado con If subformulario1. Enabled = True then textbox = valorcampo ... else if subformulario2. Enabled = True then textbox = valorcampo.... y asi pero no funciona al estar todos activos. También había pensado, si utilizo para cada subformulario un textbox, utilizar solo el que tenga un numero, ya que el resto de los textbox saldrá el #Error, pero no se como referenciar ese #Error porque no es lo mismo que null. También lo otro era poner en el origen de control del textbox: [SubFormulario1].[Formulario]![Indicador] Or [SubFormulario2].[Formulario]![Indicador] Or ... etc pero no funciona. Ojala me puedas ayudar a salir adelante. Te puedo explicar de nuevo si no quedo claro,. Gracias
Por eso te decía que utilices una variable global. Crea un módulo y pon en él, el siguiente código:
Global indicador
Este comando crea una variable (indicador en este caso) que es global (no asociada a un formulario). A esta variable le puedes asignar un valor desde cualquier form.
Luego de asignado un valor a la variable (cuando haces click en el textbox corresp. Del formulario origen), y vas al nuevo form, puedes consultar el valor de la variable y asignárselo al textbox nuevo.
O sea
1) form1.text1 -> indicador Paso el valor de form1.text1 al indicador
2) indicador -> form2.text2 Paso el valor del indicador al form2.text2
Saludos. Jorge
Global indicador
Este comando crea una variable (indicador en este caso) que es global (no asociada a un formulario). A esta variable le puedes asignar un valor desde cualquier form.
Luego de asignado un valor a la variable (cuando haces click en el textbox corresp. Del formulario origen), y vas al nuevo form, puedes consultar el valor de la variable y asignárselo al textbox nuevo.
O sea
1) form1.text1 -> indicador Paso el valor de form1.text1 al indicador
2) indicador -> form2.text2 Paso el valor del indicador al form2.text2
Saludos. Jorge
- Compartir respuesta
- Anónimo
ahora mismo