📄 ibtable.pas
字号:
Query.Database := Database;
Query.transaction := Transaction;
Query.SQL.Text := 'Create Table ' + {do not localize}
QuoteIdentifier(DataBase.SQLDialect, FTableName) +
' (' + FieldList; {do not localize}
for I := 0 to IndexDefs.Count - 1 do
with IndexDefs[I] do
if ixPrimary in Options then
begin
Query.SQL.Text := Query.SQL.Text + ', CONSTRAINT ' + {do not localize}
QuoteIdentifier(DataBase.SQLDialect, Name) +
' Primary Key (' + {do not localize}
FormatFieldsList(Fields) +
')'; {do not localize}
end;
Query.SQL.Text := Query.SQL.Text + ')'; {do not localize}
Query.Prepare;
Query.ExecQuery;
finally
Query.Free;
end;
end;
procedure InternalCreateIndex;
var
I: Integer;
begin
for I := 0 to IndexDefs.Count - 1 do
with IndexDefs[I] do
if not (ixPrimary in Options) then
AddIndex(Name, Fields, Options);
end;
begin
CheckInactive;
InitFieldsList;
InternalCreateTable;
InternalCreateIndex;
end;
procedure TIBTable.DeleteTable;
var
Query: TIBSQL;
begin
CheckInactive;
Query := TIBSQL.Create(self);
try
Query.Database := DataBase;
Query.Transaction := Transaction;
Query.SQL.Text := 'drop table ' + {do not localize}
QuoteIdentifier(DataBase.SQLDialect, FTableName);
Query.Prepare;
Query.ExecQuery;
finally
Query.Free;
end;
end;
procedure TIBTable.EmptyTable;
var
Query: TIBSQL;
begin
if Active then
CheckBrowseMode;
Query := TIBSQL.Create(self);
try
Query.Database := DataBase;
Query.Transaction := Transaction;
Query.SQL.Text := 'delete from ' + {do not localize}
QuoteIdentifier(DataBase.SQLDialect, FTableName);
Query.Prepare;
Query.ExecQuery;
if Active then
begin
ClearBuffers;
DataEvent(deDataSetChange, 0);
end;
finally
Query.Free;
end;
end;
procedure TIBTable.DataEvent(Event: TDataEvent; Info: Longint);
begin
if Event = dePropertyChange then begin
IndexDefs.Updated := False;
FRegenerateSQL := True;
end;
inherited DataEvent(Event, Info);
end;
{ Informational & Property }
function TIBTable.GetCanModify: Boolean;
begin
Result := True;
if (FTableName = '') or FReadOnly
or FSystemTable or FMultiTableView then
Result := False;
end;
function TIBTable.InternalGetUpdatable: Boolean;
var
Query : TIBSQL;
begin
Database.InternalTransaction.StartTransaction;
Query := TIBSQL.Create(self);
try
Query.Database := DataBase;
Query.Transaction := Database.InternalTransaction;
Query.SQL.Text := 'Select RDB$SYSTEM_FLAG, RDB$DBKEY_LENGTH ' + {do not localize}
'from RDB$RELATIONS where RDB$RELATION_NAME = ' + {do not localize}
'''' + {do not localize}
FormatIdentifierValue(Database.SQLDialect,
QuoteIdentifier(DataBase.SQLDialect, FTableName)) + ''''; {do not localize}
Query.Prepare;
Query.ExecQuery;
if (Query.Current[0].AsInteger <> 0) or
(Query.Current[1].AsInteger <> 8) then
Result := False
else
Result := True;
finally
Query.Free;
Database.InternalTransaction.Commit;
end;
end;
function TIBTable.FieldDefsStored: Boolean;
begin
Result := StoreDefs and (FieldDefs.Count > 0);
end;
function TIBTable.IndexDefsStored: Boolean;
begin
Result := StoreDefs and (IndexDefs.Count > 0);
end;
procedure TIBTable.SetParams;
var
i: Integer;
begin
if (MasterSource = nil) or (MasterSource.DataSet = nil) or
(not MasterSource.DataSet.Active) or (FMasterFieldsList.Count = 0) then
exit;
for i := 0 to FMasterFieldsList.Count - 1 do
QSelect.Params.ByName(FMasterFieldsList.Strings[i]).Value :=
MasterSource.DataSet.FieldByName(FMasterFieldsList.Strings[i]).Value;
end;
procedure TIBTable.MasterChanged(Sender: TObject);
begin
CheckBrowseMode;
SetParams;
ReQuery;
end;
procedure TIBTable.MasterDisabled(Sender: TObject);
begin
DataEvent(dePropertyChange, 0);
ReQuery;
end;
function TIBTable.GetDataSource: TDataSource;
begin
Result := FMasterLink.DataSource;
end;
procedure TIBTable.SetDataSource(Value: TDataSource);
begin
if IsLinkedTo(Value) then IBError(ibxeCircularDataLink, [Self]);
if FMasterLink.DataSource <> Value then
DataEvent(dePropertyChange, 0);
FMasterLink.DataSource := Value;
end;
function TIBTable.GetMasterFields: string;
begin
Result := FMasterLink.FieldNames;
end;
procedure TIBTable.SetMasterFields(const Value: string);
begin
if FMasterLink.FieldNames <> Value then
DataEvent(dePropertyChange, 0);
FMasterLink.FieldNames := Value;
end;
procedure TIBTable.DoOnNewRecord;
var
I: Integer;
begin
if FMasterLink.Active and (FMasterLink.Fields.Count > 0) then
for I := 0 to FMasterLink.Fields.Count - 1 do
IndexFields[I] := TField(FMasterLink.Fields[I]);
inherited DoOnNewRecord;
end;
function TIBTable.FormatFieldsList(Value: String): String;
var
FieldName: string;
i: Integer;
begin
if Database.SQLDialect = 1 then
begin
Value := QuoteIdentifier(Database.SQLDialect, Value);
Result := StringReplace (Value, ';', ', ', [rfReplaceAll]); {do not localize}
end
else
begin
i := 1;
Result := ''; {do not localize}
while i <= Length(Value) do
begin
FieldName := ExtractFieldName(Value, i);
if Result = '' then {do not localize}
Result := QuoteIdentifier(Database.SQLDialect, FieldName)
else
Result := Result + ', ' + QuoteIdentifier(Database.SQLDialect, FieldName); {do not localize}
end;
end;
end;
procedure TIBTable.ExtractLinkFields;
var
i: Integer;
DetailFieldNames: String;
begin
FMasterFieldsList.Clear;
FDetailFieldsList.Clear;
i := 1;
while i <= Length(MasterFields) do
FMasterFieldsList.Add(ExtractFieldName(MasterFields, i));
i := 1;
if IndexFieldNames = '' then {do not localize}
DetailFieldNames := FPrimaryIndexFields
else
DetailFieldNames := IndexFieldNames;
while i <= Length(DetailFieldNames) do
FDetailFieldsList.Add(ExtractFieldName(DetailFieldNames, i));
end;
procedure TIBTable.GetDetailLinkFields(MasterFields, DetailFields: TList);
var
i: Integer;
Idx: TIndexDef;
begin
MasterFields.Clear;
DetailFields.Clear;
if (MasterSource <> nil) and (MasterSource.DataSet <> nil) and
(Self.MasterFields <> '') then {do not localize}
begin
Idx := nil;
MasterSource.DataSet.GetFieldList(MasterFields, Self.MasterFields);
UpdateIndexDefs;
if IndexName <> '' then
Idx := IndexDefs.Find(IndexName)
else if IndexFieldNames <> '' then {do not localize}
Idx := IndexDefs.GetIndexForFields(IndexFieldNames, False)
else
for i := 0 to IndexDefs.Count - 1 do
if ixPrimary in IndexDefs[i].Options then
begin
Idx := IndexDefs[i];
break;
end;
if Idx <> nil then
GetFieldList(DetailFields, Idx.Fields);
end;
end;
procedure TIBTable.SetReadOnly(Value: Boolean);
begin
CheckInactive;
FReadOnly := Value;
end;
procedure TIBTable.SetTableName(Value: String);
begin
if not (csReading in ComponentState) then
begin
if Value <> FTableName then
begin
CheckInactive;
ResetSQLStatements;
FRegenerateSQL := True;
FTableName := Value;
IndexName := ''; {do not localize}
IndexFieldNames := ''; {do not localize}
FPrimaryIndexFields := ''; {do not localize}
DataEvent(dePropertyChange, 0);
end;
end
else
if Value <> FTableName then
FTableName := Value;
end;
function TIBTable.GetIndexField(Index: Integer): TField;
var
I, Count: Integer;
FieldNames, FieldName: String;
begin
Result := nil;
FieldName := ''; {do not localize}
FieldNames := IndexFieldNames;
if FieldNames = '' then {do not localize}
begin
for I := 0 to IndexDefs.Count - 1 do
if (IndexDefs[i].Name = FIndexName) then
begin
FieldNames := IndexDefs[i].Fields;
break;
end;
end;
for I := 0 to Index do
begin
Count := Pos(';', FieldNames); {mbcs OK} {do not localize}
if Count = 0 then
FieldName := FieldNames
else begin
FieldName := Copy(FieldNames, 0, Count - 1);
System.Delete(FieldNames, 1, Count);
end;
end;
if FieldName <> '' then {do not localize}
Result := FieldByName(FieldName)
else
IBError(ibxeIndexFieldMissing, [nil]);
end;
procedure TIBTable.SetIndexField(Index: Integer; Value: TField);
begin
GetIndexField(Index).Assign(Value);
end;
function TIBTable.GetIndexFieldCount: Integer;
var
I, Index: Integer;
FieldNames: String;
done: Boolean;
begin
FieldNames := IndexFieldNames;
if FieldNames = '' then {do not localize}
begin
for I := 0 to IndexDefs.Count - 1 do
if (IndexDefs[i].Name = FIndexName) then
begin
FieldNames := IndexDefs[i].Fields;
break;
end;
end;
if FieldNames = '' then {do not localize}
Result := 0
else
begin
done := False;
Result := 1;
while not done do
begin
Index := Pos(';', FieldNames); {mbcs ok} {do not localize}
if Index <> 0 then
begin
System.Delete(FieldNames, 1, Index);
Inc(Result);
end else
done := True;
end;
end;
end;
function TIBTable.GetTableNames: TStrings;
begin
FNameList.clear;
GetTableNamesFromServer;
Result := FNameList;
end;
procedure TIBTable.GetTableNamesFromServer;
var
Query : TIBSQL;
begin
if not (csReading in ComponentState) then begin
ActivateConnection;
Database.InternalTransaction.StartTransaction;
Query := TIBSQL.Create(self);
try
Query.GoToFirstRecordOnExecute := False;
Query.Database := DataBase;
Query.Transaction := Database.InternalTransaction;
if (TableTypes * [ttSystem, ttView] = [ttSystem, ttView]) then
Query.SQL.Text := 'Select RDB$RELATION_NAME from RDB$RELATIONS' {do not localize}
else if ttSystem in TableTypes then
Query.SQL.Text := 'Select RDB$RELATION_NAME from RDB$RELATIONS' + {do not localize}
' where RDB$VIEW_BLR is NULL' {do not localize}
else if ttView in TableTypes then
Query.SQL.Text := 'Select RDB$RELATION_NAME from RDB$RELATIONS' + {do not localize}
' where RDB$SYSTEM_FLAG = 0' {do not localize}
else
Query.SQL.Text := 'Select RDB$RELATION_NAME from RDB$RELATIONS' + {do not localize}
' where RDB$VIEW_BLR is NULL and RDB$SYSTEM_FLAG = 0'; {do not localize}
Query.Prepare;
Query.ExecQuery;
while (not Query.EOF) and (Query.Next <> nil) do
FNameList.Add (TrimRight(Query.Current[0].AsString));
finally
Query.Free;
Database.InternalTransaction.Commit;
end;
end;
end;
procedure TIBTable.SwitchToIndex();
begin
FSwitchingIndex := True;
InternalTableRefresh;
FSwitchingIndex := False;
end;
procedure TIBTable.InternalTableRefresh();
var
DBKey: TIBDBKey;
begin
CheckActive;
DBKey := CurrentDBKey;
FRegenerateSQL := True;
Reopen;
if DBKey.DBKey[0] <> 0 then
InternalGotoDBKey(DBKey);
end;
procedure TIBTable.GenerateSQL;
var
i: Integer;
SQL: TStrings;
OrderByStr: string;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -