Access - DLOOKUP

 
Vista:
sin imagen de perfil

DLOOKUP

Publicado por Paulina (91 intervenciones) el 29/01/2023 03:32:55
Buenas noches quisiera saber si puedo buscar un precio de una tabla de acuerdo al tipo de cliente.

En mi formulario hay una etiqueta y esa se llama tipocliente.

En mi tabla viene el codigo del producto y el precio y tipocliente

Es decir, dlookup tiene que buscar: tipocliente, codproducto y precio que le corresponde con la etiqueta que esta en mi formulario


precio = Dlookup ("precio", "tprecios", "(codproducto)" & "tipocliente"

Algo asi, pero no se como
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
sin imagen de perfil

DLOOKUP

Publicado por Paulina (91 intervenciones) el 29/01/2023 04:13:13
En mi formulario hay una CUADRO DE TEXTO* y esa se llama tipocliente.
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

DLOOKUP

Publicado por Anonimo (3316 intervenciones) el 29/01/2023 12:36:22
Las funciones de dominio comparten el método de aplicación y para ello constan de tres partes:

.- En la primera definen el resultado a obtener (un dato con DLookup, el mayor del conjunto con DMax ....)
.- En la segunda el conjunto donde están esos datos (tabla, consulta, ..... )= el dominio
.- En la tercera las condiciones que han de cumplir los datos (que el nombre sea Pepe, que el dia sea lunes que el precio sea inferior a ...)

Para obtener el dato condicionado, el conjunto de condiciones (al evaluarlo) ha de devolver un TRUE

Analizando lo publicado:
... precio = Dlookup ("precio", "tprecios", "(codproducto)" & "tipocliente" ...

"precio " como dato a devolver define a un campo de ese conjunto (en principio es correcto)
"tprecios" se da por supuesto que es una tabla, también cumple la condición
"(codproducto)" & "tipocliente" esta parte no sirve al no cumplir las mínimas reglas (no es una condición)

Una condición es básicamente una comparación y devuelve como respuesta (SI/NO, TRUE/FALSE), si hay más de una condición se han de unir con AND (que es excluyente) o con OR (que es incluyente)

La condicion deberia ser algo como: "codproducto =" & el_código_de_un_producto
Y finalizar con el paréntesis ')' que indica el final de la función de dominio:

1
precio = Dlookup ("precio", "tprecios", "codproducto =" & 123456)

Aun desconociendo los datos reales en la tabla, creo que no funcionara, con la excepción de que el dato 'tipocliente' sea un coeficiente a aplicar al precio, esto es:
Tipo1 = sin descuentos ( = 1)
TIpo2 = descuento un 5% (= 0.95)
Tipo3 = descuento un 20% (= 0.8)

En este caso el precio se calcularía así (el dato tipocliente se obtendría de la tabla clientes):

1
precio = Dlookup ("precio", "tprecios", "codproducto =" & 123456) * tipocliente

Hay un método alternativo, que en 'tprecios' exista un campo por cada tipo de cliente (Precio1 = 1000, Precio2 = 950, Precio3 = 800)
Lo que permite precios independiente (habrá precios que pueden reducirse en base a un coeficiente y otros con limite para no entrar en perdidas)

En este caso (seleccionar uno de varios campos en el mismo registro) en la función de dominio (y en cualquier búsqueda de ese precio) habrá que indicarle que devuelva el del campo que corresponda en función de 'tipocliente'

De este tipo de busqueda (selección del campo adecuado en función de un dato externo) hay un ejemplo reciente en el que la seleccion utiliza una funcion (Choose) que devuelve el nombre del campo para el DLookup

Tomando como referente lo anterior seria algo así:

1
precio = Dlookup (Choose(tipocliente,"precio1", "precio2", "precio3", ....), "tprecios", "codproducto =" & 123456)
La función Choose devuelve el nombre del campo de la tabla (precio1 // precio2 //precio3 // ....) en función de 'tipocliente', esto es:

Choose evalúa el dato 'tipocliente' y...

Si 'tipocliente' = 1 devuelve el primer dato como parámetro
precio = Dlookup ("precio1", "tprecios", "codproducto =" & 123456)

Si 'tipocliente' = 2 devuelve el segundo dato como parámetro
precio = Dlookup ("precio2", "tprecios", "codproducto =" & 123456)

Si 'tipocliente' = 3 devuelve el tercer dato como parámetro
precio = Dlookup ("precio3", "tprecios", "codproducto =" & 123456)

Tú eres quien decide que método es el mas adecuado o bien describe el que has planificado para poder 'traducírselo' a Access, existen mas posibilidades, por ejemplo: duplicar los registros y añadir un campo en ellos (el tipo de cliente) que se utilizará en la condición quedando algo como:

1
precio = Dlookup ("precio", "tprecios", "codproducto =" & 123456 & " AND tipocliente = " & 321)

Sea el método que sea ha de cumplir -la condición indispensable- de devolver un resultado correcto y repetible.

Es muy probable que tras leer esto surjan dudas (no te quedes con ellas), publícalas para aclararlas:
Al dar una respuesta es fácil caer en el error de que quien pregunta ya alcanzo un determinado nivel (nivel que lograra mas tarde)
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 03/02/2023 01:00:47
Buenas tardes, una disculpa por no contestar antes, pero he vuelto a hacer todo mi archivo varias veces, gracias por la explicación, pero el código de producto es tipo texto, no es necesario "123456" entonces quito eso y me quedo solo con tipo cliente, quedando asi:

Precio_Unidad = DLookup("Precio_unidad", "Tbl_PreciosClientes", "Clave='" & Me.TipoCliente & "'")

Pero me manda error en TipoCliente.

No se que estoy haciendo mal, no me quiero rendir.
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

DLOOKUP

Publicado por Anonimo (3316 intervenciones) el 03/02/2023 02:01:12
No aprecio logica en lo publicado y tampoco se conocen los datos reales (los tipos de datos) ni la estructura de la tabla implicada.

En esto:
Precio_Unidad = DLookup("Precio_unidad", "Tbl_PreciosClientes", "Clave='" & Me.TipoCliente & "'")

Se le esta solicitando que localice y devuelva el valor que hay en el campo 'Precio_unidad' de la tabla 'Tbl_PreciosClientes' del registro cuyo campo 'Clave' sea igual a un dato que esta en el cuadro de texto 'TipoCliente'.

Esto es: tiene que haber una tabla que se llame Tbl_PreciosClientes' en la que sus registros tengan por lo menos dos campos ('Precio_Unidad' y 'Clave') y lo normal es que tenga mas pero no interfieren.

Así no se resolverá tener un precio diferente para cada tipo de cliente (que pueden ser 'contado', 'Fin de mes', 'consumo interno' o 'mayorista') y cumplirse que es un dato de tipo texto.

Publica la estructura de esa tabla y serán mas realistas las guías para solucionar el/los problemas y así podrás disponer de mas tiempo libre.

Por cierto para comparar elementos han de tener cualidades comparables, no tendría sentido comparar un zumo de manzana y una traviesa de ferrocarril solo porque ambos tienen un origen común (un árbol).

No se debe perder de vista que los tipos no se definen en los cuadros de texto, se definen las tablas al diseñarlas y en este caso concreto, [Clave] en la tabla y [TipoCliente] en el formulario han de ser del mismo tipo (texto/numero/fecha...) o se generara un error en tiempo de ejecución.

Si son del mismo tipo y se comparan no dará error, simplemente lo encuentra o no lo encuentra, DLookup cuando no localiza un dato devuelve un NULL (y no es un error, si no hay pues eso ===>>> nada)
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 03/02/2023 04:44:01
Captura-de-pantalla-2023-02-02-213907
Captura-de-pantalla-2023-02-02-214011

Ya de estar tanto cambie y cambie no se que esta pasando.
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 03/02/2023 04:47:57
En la tabla preciosclientes, voy a quitar la columna producto
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

DLOOKUP

Publicado por Anonimo (3316 intervenciones) el 03/02/2023 11:47:57
Por lo que leo, aprecio que no tienes una idea clara sobre lo que necesitas para obtener el resultado que deseas.

En la imagen que has publicado aparece una tabla [Tbl_PreciosClientes] y por los datos que se muestran hay dos registros por producto (diferenciados por el campo [Tipocliente]) para poder aplicar un precio diferente.

Personalmente eliminaría el campo [Id_PrecioCliente] porque su utilidad es cuestionable, es un autonumérico que si bien define al registro como único, carece de sentido porque en esa estructura de datos para obtener el precio de un producto para un tipo de cliente, hacen falta dos referencias (campos) para lograr definir como 'unico' a un producto cualquiera.

Tendría mas sentido que el campo [Clave] fuera el Id que define al producto y en lugar de utilizar dos registros (uno por precio) se utilizasen dos campos (o mas, una tabla admite mas de doscientos campos) cada uno con su precio y como el tipo de cliente es una letra, se utiliza esa letra para definir el precio (por ejemplo: [Precio_E] y [Precio_T])

El registro tendría estos campos (y mas, esto es un esquema muy simplificado)

Tbl_Productos
Clave ==>> el codigo del producto (indexado sin repeticiones)
Producto ==>> La descripción
Precio_E ==> el precio para clientes tipo 'E' (Moneda)
Precio_T ==> el precio para clientes tipo 'T' (Moneda)

Conocido el tipo de cliente, si quiere comprar un kilo de arroz el precio a aplicar y obtenido con la función (o cualquier otro método) se obtendría así:

1
= Dlookup("Precio_" & [tipocliente]; "Tbl_Productos"; "CLave= '" & [Clave] & "'")

Que Access interpretará así si el cliente es tipo 'T' y la clave es 'ARR'

1
= Dlookup("Precio_T"; "Tbl_Productos"; "CLave= 'ARR'")

O así si el cliente es tipo 'E' y la clave es 'ARR'

1
= Dlookup("Precio_E"; "Tbl_Productos"; "CLave= 'ARR'")

Sobre las tablas para gestionar productos hay mucha información publicada, porque cada tipo de producto tiene unos requerimientos (sea por su caducidad, exigir control sobre los lotes de fabricacion, por ....)

En función del tipo del producto habrá mas o menos campos para permitir una gestión correcta.
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 05/02/2023 03:57:16
Muchas gracias por contestar, sigo probando, ya que como dijiste cambié la tabla de productos y eliminé id_precioClientes, por lo tanto ya no tenía caso tener la tabla de preciosclientes, quedando así:

Captura-de-pantalla-2023-02-04-205133

Y gracias por tu paciencia, no entendía hace unos días nada, pero absolutamente nada de access, ahora por lo menos ya se lo básico y como moverme un poco dentro del programa. Nunca lo había usado, y menos códigos de programació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

DLOOKUP

Publicado por Anonimo (3316 intervenciones) el 05/02/2023 10:53:39
Me alegra que entendieses el 'porque' se utiliza esa estructura para poder aplicar el 'como' se ha de programar para obtener un resultado acorde.

Un ID no tiene la obligación de ser numérico, si bien es cierto que los números son mas precisos, lo único que precisa un ID es que el valor en ese campo de la tabla no repita y definir como único a ese registro en la tabla.

Dado que el actual campo CLAVE cumple con esas características puede asumir el atributo de 'llave' y eliminar el campo Id Producto en la tabla productos (que supongo es numérico) y (personalmente) le asignaría ese nombre y atributo al actual campo 'Clave'.

El nombre no es mas que un nemotécnico y con el paso del tiempo (al revisar el código) apreciaras las ventajas.

La diferencia entre un dato numérico y uno de texto esta en que el numero es un dato concreto y se evalúa en un único paso, a un texto hay que evaluarlo carácter a carácter, cada tipo de dato tiene sus ventajas e inconvenientes por ello coexisten.

Si el producto es Arroz y su nemotécnico es ARR, para distinguir los diferentes tipos se puede considerar que ARR es la familia y añadirle una terminación (dos, tres caracteres ..), será mas útil que un numero y continuar siendo valido como ID.

Para este uso, el ID alfanumérico supera al numérico ya que permite filtros, por ejemplo, que comiencen por 'ARR_' :

ARR_SU ==> adecuado para Sushi
ARR_LG ==> arroz largo
ARR_BO ==> el adecuado para Risotto o Paella
....
Cada tipo de arroz en un registro, todos juntos en la tabla y al mismo tiempo independientes.

Si no has definido aún el método para crear IDs nemotécnicos (fáciles de recordar) este punto es el ideal, un buen nemotécnico hace que la aplicación sea mas ergonómica.
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 08/02/2023 00:31:22
Gracias de verdad por tu ayuda, paso a paso se va armando mi base.

Por el momento no es necesario añadir mas a los productos, pero es bueno saber lo que me comentas.

Gracias por explicarme a detalle para poder entender un poco mas.
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
Imágen de perfil de Eduardo

DLOOKUP

Publicado por Eduardo (317 intervenciones) el 29/01/2023 14:30:47
Si tipocliente es texto la instrucción es

1
precio = DLookup("precio", "tprecios", "codproducto='" & Me.tipocliente & "'")

Si no es texto la instrucción

1
precio = DLookup("precio", "tprecios", "codproducto=" & Me.tipocliente)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

DLOOKUP

Publicado por Paulina (91 intervenciones) el 03/02/2023 01:12:10
Gracias por tu respuesta, pero me quedo en tipocliente, ya le di vueltas y vueltas y no veo que pasa, ya le di relacion, origen del control, solo que sea que esta el tipo en formulario y el precio en subformulario.

No lo se =(
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 03/02/2023 01:17:48
la macro la estoy poniendo después de actualizar clave.
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
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

DLOOKUP

Publicado por Norberto (80 intervenciones) el 30/01/2023 09:50:46
Hola:

El tercer parámetro de la función DLookUp (y del resto de las funciones de dominio agregado) es del tipo condicional. Si el valor de búsqueda se encuentra en una variable o en un campo de formulario (como suele ser habitual) la sintaxis sería:

Condición numérica:
"CampoCondición = " & VariableNumérica

Condición de texto:
"CampoCondición = '" & VariableTexto & "'" (justo antes de la primera comilla de cierre va una comilla simple, igual que entre las dos últimas)

Condición de fecha:
"CampoCondición = #" & Format(VariableFecha, "mm/dd/yyyy") & "#"

Un saludo,

Norberto.
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 03/02/2023 01:16:03
Gracias, lo tomar'e en cuenta
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
Imágen de perfil de Eduardo

DLOOKUP

Publicado por Eduardo (317 intervenciones) el 05/02/2023 13:21:21
Paulina le recomiendo que tome un curso de Access, en la web hay varios gratis, ahora, si quiere uno personalizado me puede contactar a [email protected], aprenderá desde el nivel básico hasta avanzado.
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

DLOOKUP

Publicado por Paulina (91 intervenciones) el 08/02/2023 00:34:07
Hola Eduardo, estoy viendo muchos videos, que se pueden considerar como tutoriales, por falta de tiempo no puedo en estos momentos tomar un curso, que me gustaría mucho, porque en los videos dan muchos códigos de programación que me gustaría entendelos.

Mas adelante tomare tu consejo, 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