Access - Clave primaria compuesta (uno de los campos de esta clave es un contador)

 
Vista:
sin imagen de perfil

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 22/09/2017 18:20:42
Hola a todos. Mi duda es cuando realizo una tabla, que tiene 2 campos para la clave primaria (clave primaria compuesta) y uno de los campos es un contador. Voy a poner un ejemplo:

Una base de datos de un recetario de cocina con 2 tablas, las cuales serían:
1º tabla "Platos" con los campos: identificador_plato, nombre, tiempo_preparacion, dificultad
2º tabla "Pasos" con los campos: identificador_plato, numero_paso, explicación

A la hora de hacer un formulario en el que se implican ambas tablas, me gustaría, que por cada plato, el número de pasos se repitiera (1, 2, 3, 4, 5, ...). Pongo un ejemplo real para aclararlo:

Tabla "Platos":
1, bechamel, 30, fácil

Tabla "Pasos":
1, 1, calentar aceite
1, 2, añadir harina
1, 3, remover hasta que no se pegue
1, 4 echar leche hirviendo
1, 5 remover hasta que desaparezcan los grumos
1, 6 cocinar a fuego medio 15 minutos
1, 7 echar sal y nuez moscada
Tabla "Platos":
2, tortilla de patatas, fácil

Tabla "Pasos":
2, 1, cortar patatas
2, 2, freir patatas
2, 3, batir los huevos
2, 4, mezclar las patatas y los huevos
2, 5, utilizando una sarten, calentar por ambas caras la mezcla

Aquí viene mi duda ¿se podría hacer de alguna forma en un formulario de Access, que por cada plato nuevo (tabla "Platos"), el campo "numero_paso" (tabla "Pasos") volviera a contar desde 1 sin hacerlo manualmente?

Un saludo y muchas 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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Anonimo (3322 intervenciones) el 22/09/2017 22:05:55
Si, basta que se cuenten solo los pasos que se asignan a esa particular ID

En las funciones de dominio se utilizan tres parámetros:

.- El primero ==> el campo sobre el que se efectúa 'algo' (para contar se acostumbra aponer un asterisco, pues contara REGISTROS no dato de ese campo u cualquiera otro)

.- El segundo ==> referencia al conjunto donde están los elementos (se lo conoce por dominio y suele ser una tabla o consulta)

.- El tercero ==> la condición que ha de cumplirse (es este punto en el que se pone como condición que sea 'igual' al plato que nos interesa)
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 22/09/2017 23:27:14
Gracias por la respusta. Entiendo que son las funciones y también sus parámetros, pero nunca he visto nada así en Access ¿tienes algún video, web, apunte, etc donde se usen expresamente en Access? El problema está en que no se como implementarlo en Access.
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 23/09/2017 00:02:17
Vale, ya ví un video, donde se muestra lo que comentas:
. Gracias por iluminarme amigo anónimo :P
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 23/09/2017 09:19:58
¿Sabes que se tendría que escribir en el 3º parámetro, para que cogiera el id del plato actual y vaya cambiando a medida que vas seleccionando diferentes platos?
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Anonimo (3322 intervenciones) el 23/09/2017 14:50:36
Exactamente lo mismo que se obtendría si se generase una consulta con ese origen de datos y se le aplica una (o mas) condiciones

Las condiciones (en las consultas creadas por el asistente de Access que generaría la SQL) se pueden ver (y copiar) si ponemos la consulta en su 'vista SQL' y copiamos lo que continua al 'Where'.

En fin, hay que comparar el campo de la tabla (u origen de datos: dominio) con el dato externo, ateniéndose a los diversos tipos de campo (cada tipo de campo requiere su particular sintaxis) para que Access lo pueda entender, podría ser algo como:

AAA= DCount ("*", "el_dominio", "Plato = " & Me.Plato )


Aquí se parte de un supuesto, de que (dada la relación que los une) el campo 'Plato' esta presente (posiblemente invisible) en el formulario y que se le denomino 'Plato', la referencia: Me.Plato implica al plato del que se desea obtener la cuenta de pasos (sus registros relacionados)
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 23/09/2017 16:52:04
He intentado meterlo en un campo del formulario (este campo no forma parte de las tablas).
DCont

Pero no aparece ningún dato
DCont2
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Anonimo (3322 intervenciones) el 23/09/2017 19:04:15
La sintaxis que puse como ejemplo no tenia el formato adecuado para ser utilizada 'fuera' de VBA, será difícil que funcione y creo que no hará lo que deseas.

Utilizar esa expresión (o cualquiera) como origen de datos para un cuadro de texto, lo convertirá de facto en un objeto independiente y (tal como esta expresada) daría el mismo valor para todos los registros (no diferencia entre el primero el ultimo o uno intermedio).

Punto uno:
En ese formulario puede que no este presente el dato referente, lo filtra el formulario principal (de forma interna pues el campo relacional).

Punto dos:
La sintaxis para referirse a un objeto (fuera de VBA y en un formulario/informe) es el nombre del campo encerrado entre corchetes, algo como esto (que seguiría sin ser valido si no se le añade el campo relacional aunque sea oculto):
= DCount ("*", "el_dominio", "Plato = " & [Plato] )

Para que funcionase adecuadamente (o como supongo que se desea) y numere a cada registro de forma independiente, lo adecuado seria que hubiera en ese subconjunto un orden (el orden puede ser cualquier dato único y ascendente por ejemplo vale una fecha/hora: la de su creación si se ha guardado)

El código posteado tenia como supuesta misión calcular ese dato al generar el registro (no de forma posterior) y asi lograr que se conservasen los pasos en su orden lógico

Posibilidades con los datos actuales y si se dan las condiciones:
Suponiendo que (actualmente) exista un campo que mantenga ese orden (puede valer el de la fecha hora de su creación) habría que generar una doble condición, que contase los elementos de ese subconjunto (el subconjunto seria el ID del plato) y a la vez que su 'supuesto numero de orden' fuera igual o inferior al numero de orden del registro actual.

Asi en un supuesto subconjunto (los datos del subformulario) se podría aplicar la función DCount con esa doble condición

También existe la alternativa de utilizar la función SUM condicionada (la condición seria que si es igual o inferior al orden del registro actual devuelva un uno, si no lo es un cero).

Dudo hasta que punto seria útil mi colaboración, porque creo que estamos entrando en un terreno que es posible sea desconocido (al menos de momento) y para ello me baso en la libre interpretación que se ha hecho de mi respuesta anterior.
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 23/09/2017 19:47:02
Gracias por tu colaboración. La cuestión es mi desconocimiento de VBA y de Access en general, por es es difícil ahora hacerme una idea de lo que planteas. Por eso me estoy viendo unos cursos de YouTube y sacar un poco en claro como se trabaja con este programa. Por cierto el curso es: https://www.youtube.com/watch?v=Bs8JhUpZo8w&index=1&list=PLC3E8FA619DF71898 por si alguien aparece por aquí y le interesa.

Tal y como lo veo yo, una vez un plato está creado y se le quieren añadir un paso, lo que yo haría con un lenguaje de programación (supongo que, cuando tenga conocimiento de VBA lo podría hacer) sería lo siguiente:

1º paso: Realizar consulta, para sacar la cantidad de pasos que hay en la tabla "Pasos", para un plato x en concreto (Id_plato). Este dato lo guardo en una variable (llamada "numeroPasos" por ejemplo).
numeroPasos = SELECT COUNT(*) FROM pasos WHERE id_plato = x

2º paso: Al rellenar el siguiente registro de la tabla "Pasos" utilizo la variable "numeroPasos" sumandole uno, que tiene el número de pasos del plato x.
INSERT INTO pasos (id_plato, numero_paso, explicación) VALUES (x, numeroPasos + 1, "una explicación cualquiera")
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Anonimo (3322 intervenciones) el 23/09/2017 22:20:10
Cuando alcances un poco de altura mas altura programando, te darás cuenta que el método que ahora te parece sencillo y propones: o lo complicas mas o no te será útil.

No se le puede asignar de forma directa a una variable el calculo efectuado con una SQL de seleccion y seria mas sencillo utilizar lo propuesto: una función de dominio (que internamente genera los pasos de crear un recordset, hacer los cálculos y devolver un resultado)

La inserción de un nuevo elemento si se puede hacer con una consulta de acción, pero para utilizarla no es preciso conocer VBA, se puede hacer a cualquier nivel con el generador de consultas.

El resto es plantearse de que 'hablamos' con una maquina que básicamente para ella todo se reduce a números (matemáticas) y mas internamente aún a dos simples estados: activo/inactivo
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 23/09/2017 23:28:01
¿Por qué habría que complicarlo más y no sería útil?
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Anonimo (3322 intervenciones) el 24/09/2017 00:27:27
Has interpretado mi respuesta de forma muy libre, tan libre que parece un calcetín al que han dado la vuelta.

Creo que a continuación se clarifican las causas pero solo si se tiene el nivel adecuado (algo que se logra con el estudio y dedicación) se puede interpretar de forma correcta.

Intenta entender el como y el porque y después si quieres copia (así cuando copies podrás interpretar y posiblemente mejorar lo copiado)
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 24/09/2017 08:45:05
Jajaja, me ha encantado eso del calcetín. Perdona, si que entendí mal. Ahora ya te entiendo. No estoy copiando código de ningún sitio, los 2 pasos que escribí, es como lo haría utilizando PHP y MySQL a la hora de hacer lo mismo pero en un desarrollo web. De todas formas sigo viendo cursos de Access y VBA. No te preocupes, muchas gracias por todo.
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 24/09/2017 12:13:42
He conseguido lo que quería. Puede que la implementación sea algo chapucera por mi parte, pero estoy aprendiendo. Comento lo que he realizado:

Paso1:
He añadido un campo de nombre "contador" al subformulario "pasos", que tendrá como origen de control la función de dominio siguiente:

=DCont ( "*" ; "[Pasos]" ; "[Pasos].[Id_plato] =" & [Id_plato] )

Esta función DCont sería como una consulta SQL utilizando una sentencia "Select" junto con la función "Count": "SELECT COUNT(*) FROM pasos WHERE id_plato = x". Donde x sería cualquier identificador de plato existente en la tabla "Platos".

La función DCont recibe 3 argumentos:

1º: asterisco (*) recoge todos los campos de la tabla.
2º: selecciona la tabla "Pasos" .
3º: dentro de la tabla "Pasos" seleccionar el campo "Id_plato" y este se iguala al plato actual del formulario.

Nota: el caracter ampersand (&) se utiliza para concatenar.

Esto lo que realizaría, sería contar todos los registros que existen en la tabla "Pasos" del plato que se está mostrando actualmente en el formulario.
paso1
imagen 1

Paso2:
Creo un "Procedimiento de evento" en el evento "Antes de insertar" en el subformulario "pasos".
paso2
imagen 2

Este procedimiento guarda en el campo "numero_paso" del subformulario "pasos" el valor que tiene el campo "contador" (en la imagen 1 puede verse donde está el campo "contador").
paso3
imagen 3

Paso3:
Aquí se aprecia como funciona el subformulario "Pasos" al insertar registros nuevos:

Primero. El campo "explicación" consigue el foco, pero no se escribe nada.
paso4
imagen 4

Segundo. Se escribe texto en el campo "explicación". El campo "Contador" guarda el número de registros, que existe en tabla "pasos" con el "id_plato" del plato actual. Como no hay ningún paso aún, el campo "contador" obtiene el valor 0. Por último el campo "numero_paso" recibe el valor del campo "Contador" (que es 0) automáticamente.
paso5
imagen 5

Tercero. El campo "explicación" del siguiente registro consigue el foco, pero no se escribe nada en el.
paso6
imagen 6

Cuarto. Se escribe texto en el campo "explicación". El campo "Contador" cambia su valor de 0 a 1 (ya hay un paso en la tabla "pasos" para este plato) y el campo "numero_paso" guarda el valor del campo "Contador" (valor 1).
paso7
imagen 7

Gracias "anónimo", sin tu ayuda no podría haber hecho esto. Por cierto, créate una cuenta, que he intentado enviarte un mensaje por privado y no puedo.
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

Clave primaria compuesta (uno de los campos de esta clave es un contador)

Publicado por Ignacio (15 intervenciones) el 25/09/2017 17:01:53
Aún más sencillo, sin necesidad de crear un campo adicional en el formulario:

En el "Procedimiento de evento" del evento "Antes de insertar" en del formulario "pasos"
evento

Se escribe lo siguiente:
numero_paso = DCount ("*", "Pasos", "Id_plato =" & Me.Id_plato) + 1

Esto hace lo siguiente:
Cada vez que inserte un nuevo registro en la tabla "pasos", dar al campo "numero_paso" de ese registro el valor el total de pasos, que tiene el plato, que actualmente está siendo mostrado en el formulario (Me.Id_plato), sumándole el valor 1.

Reitero, que la función DCount es como hacer una consulta SQL con la instrucción SELECT y la función COUNT (siendo x el número que identifica al plato actual del formulario):
SELECT COUNT(*) FROM pasos WHERE Id_plato = x
y luego sumarle uno
codigo_evento
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