Como modificar una tabla en una situación especial

Hola. Me encuentro atascado en gran problema y necesito de tu ayuda en esto:
1.Existen dos tablas A y B relacionadas por un campo denominado código.
2.La tabla A tiene 5 campos de los cuales el código y el nit son principal y candidato respectivamente
3.La tabla B tiene 5 campos de los cuales cedula y código son principal y candidato respectivamente
4. Ambas tienen establecido la integridad referencial así: la incersion, modificación y retiro están en estado restringido.
Como puedes apreciar necesito que el programa no permita que se dupliquen algunos campos definidos como claves y cuando se trate de ingresar, modificar o retirar se haga de acuerdo a las reglas de integridad referencial, siendo así requiero un ejemplo de como construir un programa que me permita modificar la tabla A, teniendo en cuenta que no debe permitir duplicar el campo código y el nit (si ya existen) y que no use un botón sino que lo haga a través del evento keypress del control text de código y nit y que respete la integridad referencial.
Como anécdota te comento que para el retiro ya lo solucione con un programita que verifica si el código de la tabla A tiene "hijos" en la tabla B, si es así no permite retirarlo y el de incersion también me fucnciona. Gracias por tu ayuda y tiempo

1 Respuesta

Respuesta
1
Antes que nada voy a repasar tus conceptos para asegurarme de haber comprendido bien tu situación:
Tabla A TablaB
(Primaria) (Secundaria)
Codigo (P)- - - - -Código (C) - - - - (Relación uno a uno)
Nit (C) Cedula (P)
OBS: La relación entre ambas tablas es del tipo Uno a Uno. Es decir que en ninguna de las dos tablas puede haber valores repetidos para el campo código. Por otra parte has definido la IR para esta relación de la siguiente forma:
Actualizar: No se permite modificar el campo si hay registros relacionados en B.
Eliminar: No se permite eliminarsi hay registros relacionados en B.
Insertar: No se pueden insertar reg. en B si no hay valor clave coincidente en A.
Además, según tu consulta, deduzco que estás trabajando con un formulario que tiene dos controles txtbox, los cuales tienen su controlsource establecido en los campos Código y Nit de la tabla A.
Para finalizar, deseas controlar la manipulación de datos desde el evento keypress de cada txtbox.
Siendo esta la situación, y teniendo en cuenta que la aplicación de las reglas de IR se producen cuando intentas modificar, eliminar o isertar un registro, situación en la que están involucrados comandos como: insert into, append from, tableupdate, delete, etc, etc, me surge la siguiente duda:
¿Qué tiene que ver el evento keypress del txtbox con estos comandos que te acabo de enunciar?
¿No sería lógico que verifiques la validez del registro antes de ejecutar estos comandos a nivel de formulario en lugar de programarlo dentro de un evento de un objeto del form?
Aguardo tus comentarios.
Nuevamente gracias por dedicar un poco de su tiempo para ayudarme.
Estas son las aclaraciones:
1.La relación es de uno a varios, es decir que el código de la tabla A puede estar repetido varias veces en la tabla B. Los campos que nunca se deben repetir son código y nit dentro de la tabla A y cedula dentro de la tabla B.
2.El controlsource no lo he utilizado para nada en los control text.
3.Si el usuario quisiera hacer una modificación entonces el programa debería de funcionar así : Cuando se carga el formulario se muestran 5 control text, de los cuales el foco se activa en el text1 (que es el código), si se digita algo y "presiona la tecla enter", se activa el evento keypress del control text1, aquí se debe colocar el programa que se encarga de hacer lo siguiente: toma el dato que esta en el text1 y lo busca en la tabla A, si lo encontró debe cargar los demás datos en el resto de los control text (nit, nombre, dirección, ciudad y teléfono). Supongamos que el usuario es un poquito curioso y le da por tratar de cambiar el código o el nit: en este caso se me ocurren esto: que el evento keypress debe tener un código que se encargue de verificar que ese código no este utilizado en la Tabla B y que no este creado en la tabla A si cumple esto debe dejarlo modificar y así mismo debería de ocurrir con el nit...
Gracias por tu ayuda.
Ahora tiene más lógica. Pero entonces el índice del campo código en la tabla B no puede ser candidato ya que no admitiría registros duplicados (3. La tabla B tiene 5 campos de los cuales cedula y código son principal y candidato respectivamente).
Bueno, el código que me pides sería algo así:
Evanto keypress() del txtbox del campo codigo:
* ejemplo *
local lcCodigo
lcCodigo=alltrim(thisform.txtcodigo.value)
if seek(lcCodigo, "tablaA", "codigo")
     * encuentra el valor en campo codigo de la tabla A *
     *******************************************
     * Deshabilita el txtbox Codigo *
     **************************
     thisform.txtboxcodigo.enabled=.F. && No se Puede Modificar
     * Cargar los datos del Formulario *
     *****************************
     * verificamos campo Nit *
     **********************
     local lcNit, llNitState
     lcNit=alltrim(tablaA.nit)
     llNitState=.f.
     * verificamos si la tabla B está abierta *
     *********************************
     * si la tabla la abres desde el entorno de datos omite este bucle *
     if !used("TablaB")
          use tablaB in 0
     endif
     if !seek (lcNit, "tablaB", "nit)
          llNitState=.t.
     endif
     thisform.txtboxNit.enabled=llNitState
     release lcNit, llNitState
else && no se encontro el registro
     && lo que tu quieras...
endif
release lcCodigo
***
***
Observaciones: En el ejemplo utilizo la función alltrim ya que presupongo que son campos del tipo carácter.
Hola.
Tienes razón el campo código de la tabla B esta creado como "normal"
Te agradezco mucho por el ejemplo que me enviaste, ahora me han surgido unas buenas ideas. Sin embargo percibo una situación que no ha sido aclarada del todo. (Disculpame por molestarte tanto).
Supongamos este caso:
Tabla A                                 Tabla B
codigo     1,2,3                     codigo 1,1,2
nit           1,2,3                     cedula  10,11,12
De acuerdo a esta estructura se puede deducir:
1.Que los códigos 1 y 2 de la Tabla A "no" se pueden retirar ni modificar porque tienen hijos en el campo código de la Tabla B.
2.Que el código 3 de la tabla A "si" se puede retirar y modificar porque no tiene hijos en la tabla B. Supongamos que un usuario se le ocurrió modificar el código 3 por el 999 de la tabla A, si entendí bien el programa ejemplo que me acabas de enviar no permitiría eso, pero desde un punto de vista lógico el debería de permita modificarlo.(¿Seria muy penoso tener que decirle al usuario que para resolver el problema debe eliminar el código 3 de la Tabla A y crearlo como 999... etc). Cómo se podría controlar esta situación?... ¿Acaso se tendría que idear una rutina de control de errores y como seria?.
Te agradecería mucho tu colaboración.
Va el ejemplo corregido:
* ejemplo *
local lcCodigo, llcodstate
lcCodigo=alltrim(thisform.txtcodigo.value)
llcodstate=.f.
if seek(lcCodigo, "tablaA", "codigo")
     * encuentra el valor en campo codigo de la tabla A *
     *******************************************
     * Cargar los datos del Formulario *
     *****************************
     * verificamos campo Nit *
     **********************
     local lcNit, llNitState
     lcNit=alltrim(tablaA.nit)
     llNitState=.f.
     * verificamos si la tabla B está abierta *
     *********************************
     * si la tabla la abres desde el entorno de datos omite este bucle *
     if !used("TablaB")
          use tablaB in 0
     endif
     * Buscamos campo Codigo en tabla B *
     *********************************
     if !seek(lcCodigo, "tablaB", "codigo")
          llcodstate=.t.
     endif
     * Habilitas / Deshabilitas TxtBoxCodigo *
     **********************************
     thisform.txtboxcodigo.enabled=llcodstate
     * Buscamos campo Nit en tabla B *
     *****************************
     if !seek (lcNit, "tablaB", "nit)
          llNitState=.t.
     endif
     * Habilitas / Deshabilitas TxtBoxNit *
     ******************************
     thisform.txtboxNit.enabled=llNitState
     release lcNit, llNitState
else && no se encontro el registro
     && lo que tu quieras...
Endif
Release lcCodigo, llcodstate
Algo así.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas