No repetir datos en tablas

Otra vez, modificando la misma tabla de datos estoy en la tablas y quiero que en el mismo campo no se pueda meter el mismo dato pero en otra fila, osea se:
Campos de la tabla: nombre (texto) // id nombre (autonumérico)(clave)
Pues lo que yo quiero es que en nombre no me deje meter dos veces "jose"
1

1 respuesta

Respuesta
1
En el diseño de la tabla puedes poner que el campo esté indexado 'sin repeticiones'. Con eso conseguirás hacer lo que quieres.
Gracias, funciona, la cosa es que todo esto, tanto lo de hoy como lo del otro día es de una misma base de datos, el formulario del otro día tendría que guardar los datos para que no se pierdan, ¿cómo lo relaciona con una tabla para que quede eso guardado?
Gracias
Para que un formulario te guarde la información en una tabla tienes dos formas: asociar el formulario a la tabla (la más sencilla) y programar un botón para que al pulsarlo se actualice la tabla (más complicado).
La más sencilla es asociar el formulario a la tabla. Para ello tienes que poner el nombre de la tabla en las propiedades del formulario 'Origen del registro'.
Una vez que el formulario está asociado a la tabla, tienes que asociar los controles con los campos de la misma. Para ello tienes que poner el nombre que tiene el campo en la tabla en la propiedad 'Origen del control' del control correspondiente.
Lo más sencillo suele ser hacer un formulario automático con una tabla asociada y después modificarlo.
La forma de actualizar los datos vía programación la dejamos para más adelante.
Gracias, genial, mira, puse en mi formulario un botón de comando para que al darle grabara lo que puse en el formulario a esa tabla que asocie, funciona bien, la cosa es cuando sale el nuevo formulario para rellenar, los cuadros de texto (que deberían estar bloqueados y libres al picar la casilla de verificación) que rellene en el anterior están desbloqueados, ¿cómo ago para que al darle a nuevo formulario salgan bloqueados también?
En propiedades, al hacer clic (del botón de comando para nuevo registro) he puesto esto:
On Error GoTo Err_Comando20_Click
    DoCmd.GoToRecord , , acNewRec
Exit_Comando20_Click:
    Exit Sub
Err_Comando20_Click:
    MsgBox Err.Description
    Resume Exit_Comando20_Click
Gracias
Cuando diseñas un formulario defines una serie de controles que van a repetirse para cada registro de la tabla asociada.
Estos controles son el mismo para todos los registros de la tabla, por lo que si en tu formulario presentas más de un registro, el control estará en el mismo estado para todos los registros.
Con esto me refiero a que si tu formulario presenta 4 registros y en 3 el control tiene que estar activado y en 1 no... a saber. No sabremos con seguridad si todos estarán activados o desactivados.
Lo mejor en este caso es que tu formulario sólo presente un registro y te quitas el problema indicado.
Hola, gracias, creo que no me explique bien, mi formulario consta de uno principal con 4 botones de comandos que abren otros sub formularios, cada uno de ellos esta asociado a una tablas para guardar la información.
La cosa es que en uno de estos sub formularios tengo un botón de comando que me guarda los datos y me hace salir, pues bien, yo lo que quiero es que cuando vuelva a picar en el principal para entrar en este no me salga los anteriores datos, sino que salga todo en blanco con los cuadros de textos que devan estar bloqueados, espero que ahora me allá sabido explicar mejor.
Gracias por tu esfuerzo al ayudarme.
No sé si lo que te refieres es que cuando se abra el formulario se mueva siempre a un registro nuevo (uno en blanco).
Para ello, el código de queberías incluir en el formulario es:
Private Sub Form_Load()
    DoCmd.GoToRecord acDataForm, Me.Name, acNewRec
End Sub
Otra cosa diferente sería que quieras que no se puedan visualizar los datos anteriores. En este caso lo más sencillo sería que pongar un filtro al formulario (en las propiedades). El filtro podría ser "1=2" (sin las comillas) y después activar los filtros del formulario.
Al poner una condición imposible, no te enseñará registros de la tabla y siempre presentará un registro nuevo.
Genial, funciona a la perfección, perdona mis tantas preguntas, ahora lo que quiero es un campo en alguna forma numérica que cada vez que se abra el formulario se autogenere, he probado con un cuadro combinado asociado a una tabla con campo autonumérico pero no me aclaro, osea se, al abrir el formulario salga el 1, lo relleno grabo y salgo, al volver salga el dos, lo relleno grabo y salgo.
Esto lo quiero utilizar luego para poder buscar los datos de ese formulario y que me salga todo lo relacionado a el.
Gracias
Lo que estás comentando se puede hacer con un campo autonumérico pero tiene algún inconveniente. Si tu comienzas a grabar un registro y cancelas la inserción, el número que te ha generado ya no vuelve a utilizarse.
Otra forma para hace eso es que tu formulario busque el mayor número generado y ponga el siguiente. Esto podrías hacerlo con el siguiente código:
Private Sub Form_Load()
    Dim aux As Variant
    aux = DMax("nombreDelCampo", "nombreDeLaTabla")
    Me.nombreDelCampo = Nz(aux, 0) + 1
End Sub
De esta forma, si se sale sin guardar el registro, no se utilizaría el número y aparecería de nuevo en la siguiente ejecución.
Me ha dado un fallo, he intentado pegar aquí la imagen pero no hay forma así que te comento, es un recuadro azul de microsoft access
en el pone:
*la expresion no da como resultado el nombre de una macro, de una funcion definida por el usuario o [procedimiento de evento].
*hubo un error al evaluar una funcion, evento o macro
Lo que yo hice fue meterme en el formulario darle a código pegue lo que me comentaste poniendo el nombre de cada cosa, eso si entre las comillas
gracias
Cópiame exactamente el código que has grabado y dime la cabecera que aparece en la ventana.
Perdón, se me olvidaba algo, encima de los dos asteriscos también comenta algo:
La expresión "al cargar" que introdujo como valor de la propiedad de evento produjo un error: se ha detectado un nombre ambiguo:form_load.
Falla todo
Tienes que ir a las propiedades del formulario donde quieres que se ejecute el código (en tu caso el de socios), y poner "[Procedimiento de evento]" en 'al Cargar'. Después tienes que pinchar en un botón con tres puntos "...".
Te llevará a la ventana de Visual Basic y es allí donde tienes que poner el código que te puse:
Private Sub Form_Load()
    Dim aux As Variant
    aux = DMax("nombreDelCampo", "nombreDeLaTabla")
    Me.nombreDelCampo = Nz(aux, 0) + 1
End Sub
Creo que si funciona, y digo creo por que lo que me sale es un desplegable y allí salen los números generados anteriormente, pero no el actual.
Como te comente lo hago mediante un cuadro combinado y el orden de tabulación es el 0, que entiendo sera lo primero en hacerse en el formulario. Otra cosa es que no me sale en pantalla si no se selecciona nada, ¿como puedo hacer para conseguir lo mismo sin el desplegable y que salga automático en pantalla, lo digo porque mientras haya unos 10 registros no sera problemático, pero imaginate con 300 registros que pedazo desplegable saldría.
Gracias
Otra cosa que me ocurre es que cuando estoy en el formulario y le doy a la rueda del ratón me va saliendo todos los registros ¿cómo se puede quitar eso?
Gracias
No sé si lo que quieres es que te presente el formulario vació para insertar un nuevo registro. Si es así, puedes hacerlo fácilmente poniendo en las propiedades del formulario (Filto: 1=2 y FiltroOn: true)
De esta forma no te seleccionará ningún registro de la tabla y sólo te aparecerán los campos para grabar un nuevo registro (así también evitas lo de la rueda del ratón).
Los campos del tipo lista (p.e.: 'cuadro combinado'), se utilizan para consultas o para presentar listas de valores cortitas. Si vas a tener 300 registro ese tipo de campos no es normal.
En su lugar lo lógico sería un textBox, donde introduces directamente el valor que quieras.
Hola, mira cuando en el primer formulario le doy a uno de los botones de comando para que me abra el nuevo formulario todo va bien hasta que asocio este segundo formulario a su tabla, en origen de registro, entonces me sale un recuadro que en la parte superior sale"introduzca el valor del parámetro" y luego me pide "id" y tengo que introducir algo, da igual, incluso que le de la opción aceptar, y entonces funciona, ¿por qué pasa eso? ¿Cómo lo podemos evitar?
Muchísimas gracias
Si te pide algún dato por pantalla al abrir el formulario es porque le falta ese dato.
Puede ser que hayas creado el formulario sobre una consulta, en cuyo caso el dato puede estar faltando en la consulta.
También es posible que hayas puesto en el origen del registro del formulario una consulta (su código SQL).
En cualquiera de los dos casos tendrás que buscar dónde has puesto el 'id' para modificarlo.
Si no lo encuentras y tienes la base de datos en versión anterior a 2007, envíame una copia comprimida en "zip" a [email protected] y te busco dónde está.
Por cierto, si me lo mandas por correo indicame tu nick de aquí para saber qué buscar.
Gracias, ya encontré por que fallaba, pero es algo curioso, ya que ese dato no lo utilizo en mi formulario, vamos, que solo esta en la tabla donde vuelco los datos para evitar esta inconcluencia pero no me sirve pa na.
Otra cosa, hay alguna forma en la que en el formulario me genere un autonumérico con esta extensión nnnn/año donde nnnn es un autonumérico que siempre sera +1 al generar nuevo formulario y año el actual (y que cambie cada vez que cambie el año o yo lo selecciono de una lista)
Gracias
Perdona, en tu anterior post decías lo del filtro y filtro on, filtro se cual es, pero filtro on no lo encuentro
Gracias
Disculpa, problemas de programar en inglés y las traducciones de la gente de Bill Gates.
En Access está traducido por "Permitir Filtros" (en programación es filterOn, de ahí lo que te puse).
Bueno, lo de permitir filtros le puse si (pensé que true seria lo mismo) lo de la ruedita sige igual con lo que me dijiste, cada vez que le doy empieza a cambiar todo.
Supongo que lo del texbox sera cuadro de texto, vale bien, ¿y cómo le puedo generar hay el tipo de autonumérico que te comentaba antes? Si lo voy metiendo a mano, puede que llegue un momento que no me acuerde de cual va.
Gracias
Prueba a poner en el código Visual Basic del formulario lo siguiente:
Private Sub Form_Current()
    Dim aux As Variant
    if me.CurrentRecord <= me.Recordset.recordcount then exit sub
    aux = DMax("nombreDelCampo", "nombreDeLaTabla")
    Me.nombreDelCampo = Nz(aux, 0) + 1
End Sub
Tendrás que cambiar el nombre del campo y de la tabla por los de tu base de datos.
Hola, sigue fallando lo de la ruedecita, cada vez que la muevo cambian los datos.
Otra cosa, el generador autonumérico, funciona, cuando hago pruebas y luego voy a la tabla a borrar esos datos pasa que si el vlor que se deja es 0 luego en el formulario parece que no funciona, no se si me explico ¿hay alguna fiorma para que el valor mínimo no sea más pequeño de 1?
Otra cosa, cuando abres el formulario en vista de formulario, abajo hay como un contador de los reguistros que se van generando, la cosa es que cuando voy a una de las secciones que controlan los botones de comando me abre siempre el primero, la cosa es que si estoy en el registro 20, al darle al comando que sea quiero que me abra el formulario correspondiente al dato 20 ¿me explico?
Muchísimas gracias
La rueda del ratón no va a dejar de funcionarte. Lo único que puedes hacer es que el formulario sólo tenga un registro, en cuyo caso la rueda no puede cambiar a otro.
Para ello lo más sencillo es que en el origen del registro pongas, en lugar del nombre de la tabla a secas, lo siguiente:
select * from nombreDeLaTabla where [nombreCampoClave]=dlookup("max(nombreCampoClave)","nombreDeLaTabla")
Si quieres que no puedan añadir registros, tendrías que desactivar la propiedad 'Permitir Agregar'.
Otra forma sería que, cuando cambies de registro, el propio formulario te lleve al último. Sería incluir:
Private Sub Form_Current()
    DoCmd.GoToRecord acDataForm, Me.Name, acLast
End Sub
Para terminar, si sólo quieres dejar que vayan al último o uno nuevo, puedes poner lo siguiente:
Private Sub Form_Current()
    if me.CurrentRecord > me.Recordset.Recordcount then exit sub
    DoCmd.GoToRecord acDataForm, Me.Name, acLast
End Sub
(En este caso, la rueda del ratón te dejaría moverte entre el último y el nuevo)
Disculpa que no me extienda más, pero ando liadísimo porque estoy preparando un viaje urgente de varios días.
Gracias, lo probare todo y te comento, que tengas buen viaje y no sea nada grave.
No es nada grave, pero la premura del viaje me tiene agobiado.
En 12 días estoy de vuelta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas