procedure OdczytajIndeksy ;
begin
  SetLength(klucze,0) ;
  Transakcja.Active:=true ;
  Pytanie.Close ;
  Pytanie.SQL.Clear ;
  Pytanie.SQL.Add('select a.*, b.rdb$field_name field from rdb$relation_constraints a, rdb$index_segments b where a.rdb$index_name=b.rdb$index_name and a.rdb$constraint_type in (''PRIMARY KEY'',''FOREIGN KEY'')') ;
  Pytanie.ExecQuery ;
  while not Pytanie.Eof do
  begin
    SetLength(klucze,high(klucze)+2) ;
    if trim(Pytanie.FieldByName('rdb$constraint_type').AsString)='PRIMARY KEY' then
    begin
      klucze[high(klucze)].do_nazwy:=trim(Pytanie.FieldByName('rdb$index_name').AsString) ;
      klucze[high(klucze)].od_nazwy:=trim(Pytanie.FieldByName('rdb$relation_name').AsString) ;
    end
    else begin
      klucze[high(klucze)].do_nazwy:=trim(Pytanie.FieldByName('rdb$index_name').AsString) ;
      klucze[high(klucze)].od_nazwy:=trim(Pytanie.FieldByName('rdb$relation_name').AsString)+'_'+trim(Pytanie.FieldByName('Field').AsString) ;
    end ;
    ModData.Pytanie.Next ;
  end ;
end ;


function ZmienNazwyIndeksow(aTekst : string) : string;
var pozycja2, pozycja1,i : integer ;
    jest : boolean ;
begin
  pozycja1:=pos('::',aTekst) ;
  while pozycja1>0 do
  begin
    pozycja2:=Pos('::',Copy(aTekst,pozycja1+2,length(aTekst)))+pozycja1+1 ;
    jest:=false ;
    for i:=0 to high(klucze) do
      if klucze[i].od_nazwy=Copy(atekst,pozycja1+2,pozycja2-2-pozycja1) then
      begin
        jest:=true ;
        aTekst:=Copy(aTekst,1,pozycja1-1)+klucze[i].do_nazwy+Copy(aTekst,pozycja2+2,length(aTekst)) ;
        break ;
      end ;
    if not jest then raise Exception.Create('Błędne zapytanie SQL') ;
    pozycja1:=pos('::',aTekst) ;
  end ;
  Result:=aTekst ;
end ;
