Autor Téma: TIBCTable nemá vlastnosť Indexes. Čím to nahradiť  (Přečteno 663 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1

Je to kontrola údajov na jedinečnosť/unique. Pred vyvolaním Post. Alebo mi navrhnite iné riešenie.
Mám nasledujúcu funkciu pre FireDAC. Teraz to potrebujem pre IBCDAC.
Kód: Delphi [Vybrat]
  1. function TjstIBCNavigator.CompositeUniqueIndexOK: Boolean;
  2. const  Prefix = 'UQ_';
  3. var
  4.   Fields, sSelect: string;
  5.   I, Idx: Integer;
  6. begin
  7.   var lstField := TStringList.Create;
  8.   var Qry := TIBCQuery.Create(nil);
  9.   Qry.Connection := FIBCTable.Connection;  Qry.Transaction := FIBCTable.Transaction;
  10. l
  11.   try
  12.     for var FDIndex := 0 to FIBCTable.Indexes.Count - 1 do
  13.     begin
  14.       if Copy(FIBCTable.Indexes[FDIndex].Name, 1, Length(Prefix)) = Prefix then
  15.       begin
  16.         Fields := FIBCTable.Indexes[FDIndex].Fields;
  17.         Idx := FindDelimiter(';', Fields, 1);
  18.         if Idx = 0 then Continue;
  19. l
  20.         QryText(Idx, Fields, sSelect, lstField);
  21.         Qry.SQL.Text := sSelect;
  22. l
  23.         for I := 0 to lstField.Count - 1 do
  24.           Qry.ParamByName(lstField[I]).Value := FIBCTable.FieldByName(lstField[I]).Value;
  25. l
  26.         if FIBCTable.State = dsEdit then
  27.           Qry.ParamByName('PRIMARYKEY').AsInteger := FIBCTable.Fields.Fields[0].AsInteger;
  28. l
  29.         if Qry.Active then
  30.           Qry.Refresh
  31.         else
  32.           Qry.Open;
  33. l
  34.         if not Qry.IsEmpty then
  35.         begin
  36.           var UniqueDialog := TFaultUniqueDialog.Create(FDataSource.DataSet, FPrmIDFoc, FPrmCurrentYear);
  37.           UniqueDialog.ShowFaultDialog(Serpar_AnalSerPeriod);
  38.           Exit(False);
  39.         end;
  40.       end;
  41.     end;
  42.   finally
  43.     Qry.Free;
  44.     lstField.Free;
  45.   end;
  46. l
  47.   Result := True;
  48. end;
No FIBCTable nepozná Indexes. Nepodarilo sa mi k tomu nič nájsť.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:TIBCTable nemá vlastnosť Indexes. Čím to nahradiť
« Odpověď #1 kdy: 24-08-2022, 14:39:40 »
Pýtam sa ináč: Ako môžem v TIBCTable zistiť názvy jedinečných indexov? Má vôbec takú možnosť?
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:TIBCTable nemá vlastnosť Indexes. Čím to nahradiť
« Odpověď #2 kdy: 12-02-2023, 16:48:23 »
Už som si to našiel
Kód: Delphi [Vybrat]
  1. SELECT RI.RDB$INDEX_NAME
  2. FROM RDB$INDICES RI
  3. WHERE RI.RDB$UNIQUE_FLAG = 1 AND RI.RDB$RELATION_NAME = 'FOCS'
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7413
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:TIBCTable nemá vlastnosť Indexes. Čím to nahradiť
« Odpověď #3 kdy: 12-02-2023, 20:41:11 »
Pre záujemcov upresňujem
Kód: Delphi [Vybrat]
  1. SELECT
  2.   RI.RDB$INDEX_NAME, RS.RDB$FIELD_NAME
  3. FROM RDB$INDICES RI
  4.   INNER JOIN RDB$INDEX_SEGMENTS RS ON RS.RDB$INDEX_NAME = RI.RDB$INDEX_NAME
  5. WHERE RI.RDB$UNIQUE_FLAG = 1 AND RI.RDB$RELATION_NAME = 'FOCS'
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.