Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   relacionar campos (https://www.clubdelphi.com/foros/showthread.php?t=75303)

chalo 12-08-2011 04:04:13

relacionar campos
 
buenas...mi consulta es la siguiente,
estoy trabajando con delphi 7 y con access 2007.
tengo dos tablas: contactos y categorias.
en contactos tengo los siguientes campo.
@idcontacto / @id_categoria / nombre / direccion / telefono
1 1 gonzalo mendoza 4333222
2 2 diego catamarca 4443332..

@id contacto:clave primaria
@categoria: clave foranea.

y en categorias tengo:

@id_categoria / descripcion
1 familiares
2 amigos...


y lo que deseo hacer es insertar un registro en la tabla contactos. entonces lo que entiendo es que de alguna forma debo saber el id_categoria para poder insertar el registro en ese campo.

entonces lo que hago es lo siguiente atraves de unos edit y tcombobox, en el combobox cargo todos las categorias como una lista atravez de la propiedad tcombobox.items.add(....) eso me sale perfecto porque me muestra bien la lista de la tabla categorias. entonces hago:

dmcontactos.tblcontactos.insert;
dmcontactos.tblcontactosIDCONTACTOS.asinteger:= id;
dmcontactos.tblcontactosNOMBRE.asstring:= edit1.text;
dmcontactos.tblcontactosDIRECCION.asstring:= edit2.text;
dmcontactos.tblcontactosTELEFONO.asvariant:= edit3.text;
dmcontactos.tblcontactosID_CATEGORIA.asvariant:= tcombobox.text;
dmcontactos.tblcontactos.post;

entonces el problema se produce solo en la parte del tcombobox, por que me dice el campo tiene que tener alguna relacion con la otra tabla y dice
key violation no se puede cambiar o agregar el registro por que se necesita un registro relacionado en la tabla 'CATEGORIAS'

podrian ayudarme por favor?
gracias.
chalo.

ecfisa 12-08-2011 05:18:52

Hola Chalo.

Primeramente esta línea es muy peligrosa:
Cita:

dmcontactos.tblcontactosID_CATEGORIA.asvariant:= tcombobox.text;
Al asignarle valores al TField como AsVariant te aceptará casi cualquiera sin protestar. Pero la lógica indica que debería ser un entero y eso es igual a problemas.
Tanto es así que le estás asignando la propiedad Text (AnsiString) desde un TComboBox.

En cuanto a como seleccionar la categoría, si ya están ingresadas, sería más sencillo en lugar de TEdit y TComboBox usar TDBEdit y TDBLookupComboBox.

Pone tres DBEdits y en cada uno las siguientes propiedades:
  • DBEdit1->DataSource = dsContactos (DataSource de contactos)
  • DBEdit1->DataField = nombre
  • DBEdit2->DataSource = dsContactos (DataSource de contactos)
  • DBEdit2->DataField = direccion
  • DBEdit3->DataSource = dsContactos (DataSource de contactos)
  • DBEdit3->DataField = telefono
El campo @id_contacto no es necesario ingresarlo por que supongo que será autoincremental.

Y para ingresar valores en @categoria, al TDBLookupComboBox, asignale las siguientes propiedades:
  • DataSource = dsContactos (DataSource de contactos)
  • DataField = @categoria (campo que recibe la selección)
  • ListSource = dsCategoria (DataSource de categoria)
  • ListField = descripcion (campo que se muestra)
  • KeyField = @id_categoria (campo id de categoria)
Todo esto lo haces desde el Object Inspector sin una línea de código.

De esa forma al campo @categoria de la tabla contactos, solo se le podrán asignar valores existentes en la tabla categorias.

Un saludo.


La franja horaria es GMT +2. Ahora son las 16:24:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi