Access - VBA -> ¿Cómo accedo directamente a un dato?

 
Vista:

VBA -> ¿Cómo accedo directamente a un dato?

Publicado por Sandro (7 intervenciones) el 30/05/2007 19:00:49
Hola a todos.

Estoy haciendo una practica de una base de datos para un proyecto. Es una base de datos de empresa (ya sabeis, compras, ventas...). El problema es que no se cómo actualizar los datos de una tabla a través de un formulario.

Para ser más claro: tengo una tabla 'almacén' que tiene indicado el precio de compra de un artículo. Tengo otra tabla 'compra' que indica que compro más material de dicho artículo. Cómo consigo modificar la cantidad de artículos de mi almacén cuando confirmo una compra (mediante un botón con un si/no), no se como referenciar la consulta o al dato en particular. Si compro un artículo más caro de lo compré antes también debería modificar el precio que tenía con anterioridad, me encuentro con el mismo problema.

Si alguien pudiese ayudarme se lo agradecería, aunque solo sea una orientación.

Gracias de antemano a todos.

Un saludo.
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

RE:VBA -> ¿Cómo accedo directamente a un dato?

Publicado por Enrique (1299 intervenciones) el 30/05/2007 20:42:31
Tu problema se compone de dos partes, una es actualizar las Existencias al efectuar una compra de un artículo y la otra es actualizar el precio de un artículo cuando cambia. Vamos de momento con la primera (esto es solo un ejemplo que te puede servir de orientación, no es la solución real a tu problema):

Tabla: ALMACEN
Campo: Codigo (Númerico)
Campo: Artículo (Texto)
Campo: Existencias (Numérico y Valor predeterminado Cero)

Formulario: Con Origen del Registro la Tabla ALMACEN
Insertas los campos:
Codigo: Con Origen del Control el campo Codigo de la Tabla
Articulo: Con Origen del Control el campo Articulo de la Tabla
Existencias: Con Origen del Control el campo Existencias de la Tabla
Compra: Independiente (SIN Origen del Control)

Botón de Comando y en su Evento Click:
Private Sub Comando1_Click()
Dim Actualiza As String
Actualiza = "UPDATE Almacen SET Existencias = Existencias + Compra WHERE Codigo=" & Me.Codigo
DoCmd.RunSQL Actualiza
Me.Existencias.Requery
End Sub

Ahora tecleas en el campo COMPRA la cantidad comprada del Articulo que muestra el Formulario y al pulsar el botón de comando, la Cantidad comprada se sumará a las Existencias que había en el Campo Existencias de la Tabla.
Intenta adaptarlo a tus necesidades, creo que no es dificil y si te surge alguna duda, lo dices y tratamos de solucionarla.

Un saludo
Enrique
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

RE:VBA -> ¿Cómo accedo directamente a un dato?

Publicado por Sandro (7 intervenciones) el 30/05/2007 21:07:55
OK, muchas gracias, me funciona bien.

Me pide que confirme el elemento escribiendo otra vez el código del artículo, pero me funciona perfectamente.

De verdad, muchas 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

RE:VBA -> ¿Cómo accedo directamente a un dato?

Publicado por Enrique (1299 intervenciones) el 30/05/2007 21:35:46
Hola Sandro:
No debería ocurrir eso, es posible que utlices una Consulta en lugar de una Tabla y le tengas puesto un criterio en el campo Código.

Saludos
Enrique
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

RE:VBA -> ¿Cómo accedo directamente a un dato?

Publicado por sandro (7 intervenciones) el 30/05/2007 22:16:14
Hola.

Es cierto, estaba usando consultas ya que es así como me enseñaron a funcionar con access.

En particular tenia puesto un combobox (cuadro combinado) que usaba la consulta referente al almacén. Yo selecciono el artículo por su nombre y el combobox almacena el código en el registro del artículo de la venta.

Pero lo he intentado directamente con la tabla y me sigue pidiendo el código.

Los únicos criterios que tengo puestos es que no se repitan las referencias del artículo (es clave primaria), y que tanto el precio como la cantidad sean >=0. Todos ellos son requeridos.

A ver si con vuestra ayuda y mis investigaciones personales consigo sacarlo adelante.

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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Sandro (7 intervenciones) el 30/05/2007 23:13:47
Hola otra vez.

No empezar si volver a darte las gracias Enrique (pensareis que soy mu pesao, pero es que me hacía mucha falta la ayuda).

Bueno, he estado intentando con la ayuda de los controles y no he conseguido que me deje de pedir el código. No hay problema si me sale el código una sola vez (puedo decirle al profesor que es una 'confirmación rutinaria'), pero al actualizar tanto la cantidad de articulos como el precio de compra me la pide 2 veces (ya que lo hago cada uno por su cuenta, con dos llamadas diferentes al DoCmd), ¿odría combinar la instrucción en una sola cadena de manera que solo lo pida una vez?

Por otro lado, ante la misma tesitura, pero esta vez formalizando la venta, si vendo más articulos de los que tiene el almacén me da un fallo (lógico, porque ALMACEN no valida una cantidad inferior a 0). He intentado controlar que no se venda más material del disponible con macros (sin exito) y con expresiones (evento), y no ha habido forma de controlarlo.
He intentado reutilizar el código que me indicó Enrique antes y tampoco consigo ningún resultado (buscando en ayuda no he encontrado nada que me lo aclare).
Así que vuelvo a suplicar la ayuda de alguien que sepa más que yo (que no es dificil, porque estoy pegao) de access.

Gracias a todos de antemano.

Un saludo.
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Enrique (1299 intervenciones) el 31/05/2007 18:19:12
Sandro, prueba con estos cambios en el Evento:
Private Sub Comando1_Click()
Dim Actualiza As String
If Me.Existencias = 0 Then
MsgBox "No hay Existencias de este Artículo", vbCritical, "Aviso"
Me.Compras.SetFocus: Me.Compras = Null
Exit Sub
End If
If Me.Existencias < Me.Compra Then
MsgBox "La Compra no puede ser mayor que las Existencias actuales." & _
Chr(10) & "Esta Compra queda reducida a " & Me.Existencias & " Unidades.", vbInformation, "Aviso"
Me.Compra = Me.Existencias
End If
Actualiza = "UPDATE Almacen SET Existencias = Existencias + Compra WHERE Codigo=" & Me.Codigo
DoCmd.RunSQL Actualiza
Me.Existencias.Requery
End Sub

- Si la Existencia actual es CERO, limpia el campo Compra, avisa que no se puede efectuar la compra y sale del Evento sin hacer nada.
- Si la compra es MAYOR, la ajusta a las Existencias que hay (que quedarán a cero), avisa y realiza la actualización.
- Si la nueva compra es MENOR o IGUAL a las Existencias actuales, se realiza la actualización sin indicar nada.

En cuanto a que te pida confirmación del Código, no entiendo porqué pasa ya que desconozco como lo tienes montado, quizás Código sea de tipo texto en lugar de numérico en cuyo caso debes hacer un cambio en la línea del Update para que te quede así:

Actualiza = "UPDATE Almacen SET Existencias = Existencias + Compra WHERE Codigo='" & Me.Codigo & "'"

Saludos
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Sandro (7 intervenciones) el 31/05/2007 21:07:01
Hola a todos.

Gracias Enrique, ya no me pide que introduzca el código. Ciertamente, el código era un texto no un número. Muy agradecido de verdad.

El problema viene con lo de las cantidades. Me lo has puesto de manera que tuviese en el mímo formulario la cantidad (existencias), el problema es que en mi formulario no está. La tengo que extraer directamente de otra tabla.

Creo que lo solucionaría si copiase el contenido de las existencias (que, como he dicho, están en otra tabla) a una variable, en ese caso solo tendría que usar esa variable con el texto que me has dicho.

He intentado hacerlo usando una instrucción SQL
"SELECT Almacen.Cantidad FROM Almacen WHERE Almacen.Codigo = '" & me.Venta_cant & "'"
pero que dice que no es una instrucción sql adecuada, además, no se meter el resultado de esta en una variable, así que... como ya dije no estoy muy puesto en esto.

Si me pudieses ayudar con esto, prometo no molestar más en una buena temporada.

Gracias a todos, en especial a Enrique, con el que empiezo a tener una deuda importante.
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Enrique (1299 intervenciones) el 31/05/2007 21:27:05
Hola de nuevo Sandro:
No es ninguna molestia por mi parte, así que puedes seguir preguntándome cuando quieras.
Yo creía que el Origen del Registro del Formulario tenía la tabla de las Existencias, pero ya veo que no es así sino que es otra tabla distina, en ese caso habrá que trabajar con conexión DAO o ADO para obtener mediante Recordset los valores que necesitas para actualizar. Hoy 31 ya es tarde para ponerme con esto, pero mañana día 1 te diré como hacerlo. Lo que si necesito es que me digas los nombres de las dos Tablas, los nombres de los Campos de cada una y el tipo de campos, así como un pequeño resumen de lo que quieres conseguir, aunque algo ya sé.

Un saludo y hasta pronto
Enrique
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Sandro (7 intervenciones) el 31/05/2007 23:44:28
Gracias Enrique.

Te comento:
Entre las tablas de mi base de datos:
ALMACEN
* Codigo -> Texto. (Código del artículo, Key)
- Denom -> Texto. (Nombre del artículo)
- Cantidad -> Entero. (Existencias del artículo, >=0 )
- Precio_Venta -> Moneda. (Indica el precio de venta)

CLIENTE
* Client_NIF -> Texto. (Código del cliente, Key, 9 caracteres)
- Client_Nombre -> Texto. (Indica el nombre del cliente)

VENTA
* Venta_ID -> Autonum. (Indica el código de la venta, Key)
- Venta_NIF -> Texto. (Clave ajena de ‘Cliente_NIF’ en CLIENTE)
- Venta_Art -> Texto. (Clave ajena de ‘Codigo’ en ALMACEN)
- Venta_Precio -> Moneda. (Precio de venta, se puede modificar, pero no
afecta al campo de la tabla ALMACEN)
- Venta_Cant -> Entero. (Cantidad de elementos que vendemos)
- Venta_Confirm -> Si/No. (Confirma la venta)

Los campos con * son clave primaria. No están puestos todos los campos, solo los que afectan a la operación.

Manejo 3 consultas: consVER_ALMACEN, consVER_CLIENTE y consVENTA. Cada una contiene todos los datos de sus respectivas tablas. Trabajo con consultas porque me enseñaron a hacerlo así, pero yo no veo diferencia si la consulta tiene todos los elementos de la tabla…

Trabajo con un formulario (VENTA), que tiene cuadros de texto enlazados a todos los elementos de la tabla VENTA, salvo Venta_NIF, Venta_Art y Venta_Confirm.
Venta_NIF es un cuadro combinado (cbbClienteVenta) que muestra el nombre del cliente y, al seleccionarlo, almacena en el campo el ‘Client_NIF’.
Venta_Art es otro campo combinado (cbbArtiVenta) que hace lo mismo con la denominación del artículo y almacena el ‘Codigo’.
Por último, un botón (cmdConfirmVenta) es el que desencadena todo el código, haciendo:
- Activa el valor verdadero del ‘Venta_Confirm’ y bloquea todos los demás elementos del formulario (para que no se pueda modificar una compra).
- Actualiza la cantidad de artículos que quedan restando los que hay en el cuadro de texto ‘txtCantiVenta’ (que enlaza con ‘Venta_Cant’ de la tabla VENTA) a los contenidos en ‘Cantidad’, de la tabla ALMACEN. (o al menos eso debería hacer…)
Esto me sale bien como me enseñaste, siempre que la cantidad vendida sea inferior a las existencias que tenemos. Pero me da problemas si se vende más de lo que hay.

Bueno, ahí va todo, espero no haberte liado mucho, he procurado ser lo más explicito posible.
Gracias por la ayuda Enrique.
Un saludo.
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Enrique (1299 intervenciones) el 01/06/2007 20:37:17
Hola Sandro:
He preferido hacerte un pequeño ejemplo en Access 2000 aunque creo que lo podrás convertir a Access 2003 si es tu caso, que te puedes descargar aquí:

http://valsoen.iespana.es/Descargas/Varios/ActualizaExistencias.zip

Solo he puesto unos cuantos campos en las Tablas para probar. Lo que no me convence es el Autonumérico de la Tabla "Ventas" si lo vas a usar de forma visible para el usuario, pero si es de forma interna para llevar el órden de los campos, es otra cosa.

Funciona con la librería de DAO: Microsoft DAO 3.6 Object Library que en mi ejemplo ya está marcada pero posiblemente no lo esté en tu aplicación. Como se trata de "VENTAS" hay un pequeño cambio en el Update (ahora resta en vez de sumar). Si te funciona y consigues adaparlo, después vemos como hacer lo de la actualización del Precio_Venta.

Ya me contarás. Un saludo
Enrique
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Enrique (1299 intervenciones) el 01/06/2007 20:55:07
Sandro, descárgalo de este otro sitio porque desde la Web de iespana no funciona, parece que no le gustan ni los zip, ni los rar.

http://es.geocities.com/ensolva/Descargas/Varios/ActualizaExistencias.zip

Saludos
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por sandro (7 intervenciones) el 02/06/2007 10:55:07
Gracias Enrique.
Al final me ha quedado así:

Set rst = CurrentDb.OpenRecordset("Select Cantidad from Almacen where codigo = '" & Venta_Art & "'")
If rst!Cantidad = 0 Then
MsgBox "No hay existencias de este artículo", vbCritical, "SIN EXISTENCIAS"
'Venta_Art.SetFocus: Venta_Cant = Null
rst.Close: Set rst = Nothing
Exit Sub
ElseIf rst!Cantidad < Me.Venta_Cant Then
MsgBox "No hay suficientes existencias para cubrir el pedido. Solo quedan " _
& rst!Cantidad & " unidades de este artículo. La cantidad se acutalizará " _
& "el casillero correspondiente.", vbInformation, "SIN SUFICIENTES EXISTENCIAS"
Venta_Cant = rst!Cantidad
Exit Sub
Else
sActualizaCanti = "UPDATE Almacen SET Cantidad = Cantidad - Venta_Cant " & _
"where codigo = '" & Me.Venta_Art & "'"
DoCmd.RunSQL sActualizaCanti
End If
rst.Close: Set rst = Nothing

De verdad, muchas gracias porque no sabía ni lo que eran los DAO ni como los podía utilizar (tampoco es que ahora los tenga muy claros, pero lo voy a mirar para el futuro). Me has salvado el pellejo.

Lo de actualizar el precio de venta no es necesario, ya que prefiero que se mantenga el estipulado en la tabla 'ALMACEN'. Así, el que vende puede decidir ofertar algún producto y eso no afecta a la integridad del dato original (El precio de venta original aparece directamente un 25% más caro que el último precio de compra).

Bueno machote. Muchas gracias de verdad.
Si alguna vez vienes por Graná te debo una cerveza (con tapa incluida...).
Un saludo.
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

RE:VBA -> Nueva duda ¿Cómo controlo la venta?

Publicado por Enrique (1299 intervenciones) el 02/06/2007 14:58:46
Hola Sandro:
Me alegro que te haya servido mi pequeña aportación. En cuando a lo de la invitación a esa cervecita con tapa en Graná, no creas que será demasiado complicado ya que estoy a escasos 100 Km de allí, concretamente en la ciudad de Jaén.

Saludos y hasta la proxima.
Enrique
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