Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Integridad Referencial Paradox (https://www.clubdelphi.com/foros/showthread.php?t=87532)

marcial 19-01-2015 13:44:25

Integridad Referencial Paradox
 
Hola a todos:

A ver si alguien me puede ayudar en lo siguiente: Utilizo Delphi 5 y estoy tratando de migrar una base de datos paradox a Firebird. Leo las estructuras de las tablas Paradox y migro los campos e indices (indexDefs) sin problema, pero no consigo encontrar cómo migrar la Integridad Referencial entre tablas Paradox porque no se la instrucción o instrucciones que leen la estructura de la Int.Referencial. Otra cosa buena sería conocer el diseño de registro de los ficheros .VAL que se definen con el DatabaseDesktop y que almacenan la Int.Referencial para poder intentar por ahí.

Si alguien puede darme alguna idea de cómo acerlo le estaría muy agradecido.
Marcial.

marcial 19-01-2015 18:01:05

Perdón, aunque supongo que lo habeis entendido, quise decir Integridad Referencial.

marcial 19-01-2015 22:26:09

Hola a todos:
Respondo yo mismo. He conseguido cargar en un Memo la información de la Int.Referencial de una tabla paradox así:


Código Delphi [-]
procedure GetRintDesc(Table: TTable; Lines: TStrings);
var
  hCur: hDBICur;
  RIDesc: RINTDesc;
  rslt: DBIResult;
  B: Byte;
  Temp: string;
begin
  Check(DbiOpenRIntList(Table.DBHandle, PChar(Table.TableName), nil, hCur));
  try
    Lines.Clear;
    Check(DbiSetToBegin(hCur));
    rslt := DBIERR_NONE;
    while (rslt = DBIERR_NONE) do begin
      rslt := DbiGetNextRecord(hCur, dbiNOLOCK, @RIDesc, nil);
      if (rslt <> DBIERR_EOF) then begin
        Check(rslt);
        Lines.Add('RI Number: ' + IntToStr(RIDesc.iRintNum));
        Lines.Add('RI Name: ' + RIDesc.szRintName);
        case RIDesc.eType of
          rintMASTER: Lines.Add('RI Type: MASTER');
          rintDEPENDENT: Lines.Add('RI Type: DEPENDENT');
        else
          Lines.Add('RI Type: UNKNOWN');
        end;
        Lines.Add('RI Other Table Name: ' + RIDesc.szTblName);
        case RIDesc.eModOp of
          rintRESTRICT: Lines.Add('RI Modify Qualifier: RESTRICT');
          rintCASCADE: Lines.Add('RI Modify Qualifier: CASCADE');
        else
          Lines.Add('RI Modify Qualifier: UNKNOWN');
        end;
        case RIDesc.eDelOp of
          rintRESTRICT: Lines.Add('RI Delete Qualifier: RESTRICT');
          rintCASCADE: Lines.Add('RI Delete Qualifier: CASCADE');
        else
          Lines.Add('RI Delete Qualifier: UNKNOWN');
        end;
        Lines.Add('RI Fields in Linking Key: ' + IntToStr(RIDesc.iFldCount));
        Temp := '';
        for B := 0 to (RIDesc.iFldCount)  do
          Temp := Temp + IntToStr(RIDesc.aiThisTabFld[b]) + ', ';
        SetLength(Temp, Length(Temp) - 2);
        Lines.Add('RI Key Field Numbers in Table: ' + Temp);
        Temp := '';
        for B := 0 to RIDesc.iFldCount - 1 do
          Temp := Temp + IntToStr(RIDesc.aiOthTabFld[b]) + ', ';
        SetLength(Temp, Length(Temp) - 2);
        Lines.Add('RI Key Field Numbers in Other Table: ' + Temp);
        Lines.Add('');
      end;
    end;
  finally
    Check(DbiCloseCursor(hCur));
  end;
end;
y la llamada :

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
GetRintDesc(Cabeceras, Memo1.Lines);
end;


"Cabeceras" es el nombre de la tabla a consultar. No olvideis poner en el USES: BDE

Gracias a todos por intentarlo.

ElKurgan 20-01-2015 10:26:38

Gracias a ti por publicar la solución

saludos


La franja horaria es GMT +2. Ahora son las 13:59:25.

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