Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Almacenar en una tabla mysql una superclave (https://www.clubdelphi.com/foros/showthread.php?t=63035)

Lizette 27-01-2009 06:25:20

Almacenar en una tabla mysql una superclave
 
Hola, tengo un problema, al almacenar los valores de los edits en la tabla mysql, me genera el error: EDatabaseError with message 'A component named PRIMARY already exists'..

Almaceno los datos en 2 tablas, una que es paciente (cuya clave primaria es CvePac)y la otra ficha_identificacion(cuya superclave es CvePac, FichaId), los datos de paciente si me los guarda en su respectiva tabla, pero los de ficha_identificacion no, y me sale ese error..

En mi tabla, tengo como campos llave los dos que son CvePac y FichaId, y no entiendo porque me causa error, espero que alguien me pueda dar una idea, gracias

Neftali [Germán.Estévez] 27-01-2009 09:39:28

Podrías colocar el código que utilizas para guardar o la sentencia SQL.
No acabo de entender bien el error y no se que pinta ahí ese PRIMARY. ¿Es exactamente eso lo que te dice?

Lizette 27-01-2009 16:37:59

Si exactamente eso, tal vez no permite tener dos campos llave, no sé.. Mira aquí esta el código que utilizo para guardar:

Código Delphi [-]
var
 bann:Integer;
 bannd:Integer;
begin

 bann:=0;
 bannd:=0;

 if(completo=0)then
  begin
   bann:=1;
   EditNom.SetFocus;
  end;

 if(completo=15)then
  begin
   bann:=1;
   bannd:=1;
   ADOtblPac.Open;
  with ADOtblPac do
  begin
   ADOtblPac.Insert;
   ADOtblPac.FieldByName('CveCte').AsString:=EditCvePac.Text;
   ADOtblPac.FieldByName('NombreC').AsString:=EditNom.Text;
   ADOtblPac.FieldByName('ApellidoC').AsString:=EditApe.Text;
   ADOtblPac.FieldByName('CalleC').AsString:=EditCalle.Text;
   ADOtblPac.FieldByName('NoC').AsInteger:=StrToInt(EditNo.Text);
   ADOtblPac.FieldByName('CPC').AsInteger:=StrToInt(EditCp.Text);
   ADOtblPac.FieldByName('TelC').AsString:=EditTel.Text;
   ADOtblPac.FieldByName('CdC').AsString:=EditCd.Text;
   ADOtblPac.FieldByName('ColC').AsString:=EditCol.Text;
   ADOtblPac.FieldByName('RfcC').AsString:=EditRfc.Text;
   ADOtblPac.Post;
   ADOtblPac.Refresh;
   ADOtblPac.Close;
  end;

  ADOtblFichaId.Open;
  with ADOtblFichaId do
  begin
   ADOtblFichaId.Insert;
   ADOtblFichaId.FieldByName('CveCte').AsString:=EditCvePac.Text;
   ADOtblFichaId.FieldByName('IdFicha').AsString:=EditHClin.Text;
   ADOtblFichaId.FieldByName('FechaNac').AsString:=EditFNac.Text;
   ADOtblFichaId.FieldByName('LugarNac').AsString:=EditLNac.Text;
   ADOtblFichaId.FieldByName('Ocupacion').AsString:=EditOcup.Text;
   ADOtblFichaId.FieldByName('Escolaridad').AsString:=EditEsc.Text;
   ADOtblFichaId.FieldByName('Sexo').AsString:=ComboSexo.Text;
   ADOtblFichaId.FieldByName('Edocivil').AsString:=ComboEdoCivil.Text;
   ADOtblFichaId.FieldByName('FechaElabExp').AsString:=EditPrimCons.Text;
   ADOtblFichaId.Post;
   ADOtblFichaId.Refresh;
   ADOtblFichaId.Close;
  end;
  
     EditCvePac.Text:=EditVacio.Text;
     EditNom.Text:=EditVacio.Text;
     EditApe.Text:=EditVacio.Text;
     EditCalle.Text:=EditVacio.Text;
     EditNo.Text:=EditVacio.Text;
     EditCp.Text:=EditVacio.Text;
     EditCol.Text:=EditVacio.Text;
     EditTel.Text:=EditVacio.Text;
     EditCd.Text:=EditVacio.Text;
     EditFNac.Text:=EditVacio.Text;
     EditEdad.Text:=EditVacio.Text;
     EditLNac.Text:=EditVacio.Text;
     EditOcup.Text:=EditVacio.Text;
     EditEsc.Text:=EditVacio.Text;
     ComboSexo.Text:=EditVacio.Text;
     ComboEdoCivil.Text:=EditVacio.Text;
     EditRfc.Text:=EditVacio.Text;
     EditPrimCons.Text:=EditVacio.Text;

  end;

  if(bann=0)then
  begin
  if(EditNom.Text=EditVacio.Text)then
   EditNom.SetFocus
  else
  if(EditApe.Text=EditVacio.Text)then
   EditNom.SetFocus
  else
  if(EditCalle.Text=EditVacio.Text)then
   EditApe.SetFocus
  else
  if(EditNo.Text=EditVacio.Text)then
   EditCalle.SetFocus
  else
  if(EditCp.Text=EditVacio.Text)then
   EditNo.SetFocus
  else
  if(EditCol.Text=EditVacio.Text)then
   EditCp.SetFocus
  else
  if(EditTel.Text=EditVacio.Text)then
   EditCol.SetFocus
  else
  if(EditCd.Text=EditVacio.Text)then
   EditTel.SetFocus
  else
  if(EditFNac.Text=EditVacio.Text)then
   EditCd.SetFocus
  else
  if(EditLNac.Text=EditVacio.Text)then
   EditFNac.SetFocus
  else
  if(EditOcup.Text=EditVacio.Text)then
   EditLNac.SetFocus
  else
  if(EditEsc.Text=EditVacio.Text)then
   EditOcup.SetFocus
  else
  if(ComboSexo.Text=EditVacio.Text)then
   EditEsc.SetFocus
  else
  if(ComboEdoCivil.Text=EditVacio.Text)then
   ComboSexo.SetFocus
  else
  if(EditRfc.Text=EditVacio.Text)then
   ComboEdoCivil.SetFocus;
  end;

  if(bannd=1)then
  begin
  if(MessageDlg('Los datos han sido guardados satisfacoriamente, ¿Desea llenar la ficha clínica?', mtConfirmation, [mbYes,mbNo], 1)=mrYes) then
    begin
    showmessage('Ficha Clinica');
    end
   else
    begin
    showmessage('Menu PPAl');
    end;

Utilizo también un archivo en el que se va incrementando las claves, para obtener automaticamente la clave del paciente y la clave de fichaid, con esto me generaria estas dos claves iguales p.e CvePac:000023 y FichaId:000023.. Pero ya tambien le modifique esa parte para que los numeros fueran diferentes y me marca lo mismo, así que creo q ese no es el prob y lo deje igual.. Este es el codigo q utilizo para hacer esto:


Código Delphi [-]
var
Cont : TStringList;
Int: Integer;
comp:String;

Cont1 : TStringList;
Int1: Integer;
comp1:String;
begin
completo:=0;
//PARA CVE PACIENTE
//Deseo que comienze desde el numero:
  Int:= 1;
  if FileExists('C:\CvePac.txt') then begin
//Creo StringList
  Cont:= TStringList.Create;
//Abro fichero
  Cont.LoadFromFile('C:\CvePac.txt');
//leo la primera linea y le sumo 1
  Int:= StrToInt(Cont[0]) + 1;
//Limpio el fichero txt
  Cont.Clear;
//Agrego el nuevo valor
  Cont.Add(IntToStr(Int));
  comp:=IntToStr(Int);
//Actualizo el fichero
  Cont.SaveToFile('C:\CvePac.txt');
//Destrozo lo que quedo en memoria
  Cont.Destroy;
  EditCvePac.Text:=(StringOfChar('0',6-length(comp))+comp);
end else begin
//Este es si no existe el fichero, Creo StringList
  Cont:= TStringList.Create;
//Agrego el nuevo valor por defecto 1
  Cont.Add(IntToStr(Int));
  comp:=IntToStr(Int);
//Grabo el fichero
  Cont.SaveToFile('C:\CvePac.txt');
//Destrozo lo que quedo en memoria
  Cont.Destroy;
  EditCvePac.Text:=(StringOfChar('0',6-length(comp))+comp);
 end;
 //PARA HISTORIA CLINICA (FICHA_ID)
 //Deseo que comienze desde el numero:
  Int1:= 1;
  if FileExists('C:\IdFicha.txt') then begin
//Creo StringList
  Cont1:= TStringList.Create;
//Abro fichero
  Cont1.LoadFromFile('C:\IdFicha.txt');
//leo la primera linea y le sumo 1
  Int1:= StrToInt(Cont1[0]) + 1;
//Limpio el fichero txt
  Cont1.Clear;
//Agrego el nuevo valor
  Cont1.Add(IntToStr(Int1));
  comp1:=IntToStr(Int1);
//Actualizo el fichero
  Cont1.SaveToFile('C:\IdFicha.txt');
//Destrozo lo que quedo en memoria
  Cont1.Destroy;
  EditHClin.Text:=(StringOfChar('0',6-length(comp1))+comp1);
end else begin
//Este es si no existe el fichero, Creo StringList
  Cont1:= TStringList.Create;
//Agrego el nuevo valor por defecto 1
  Cont1.Add(IntToStr(Int1));
  comp1:=IntToStr(Int1);
//Grabo el fichero
  Cont1.SaveToFile('C:\IdFicha.txt');
//Destrozo lo que quedo en memoria
  Cont1.Destroy;
  EditHClin.Text:=(StringOfChar('0',6-length(comp1))+comp1);
 end;

Lizette 27-01-2009 18:30:29

Hola Neftali, mira le cale otra cosa, en la tabla ficha_id de mi bd mysql, tenia como campos llave idficha y cvepac, solo le deje como clave idficha, y ya no me da error y si me lo guardó.. Concluyo que no puedo tener dos campos claves jeje..


La franja horaria es GMT +2. Ahora son las 02:35:59.

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