📄 qimport2dataset.pas
字号:
unit QImport2DataSet;
interface
uses QImport2, Db, Classes, IniFiles;
type
TQImport2DataSet = class(TQImport2)
private
FSource: TDataSet;
FGoToFirstRecord: boolean;
//---
FSkipCounter: integer;
FImportCounter: integer;
//---
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
function CheckProperties: boolean; override;
procedure StartImport; override;
function CheckCondition: boolean; override;
function Skip: boolean; override;
procedure FillImportRow; override;
function ImportData: TQImportResult; override;
procedure ChangeCondition; override;
procedure FinishImport; override;
procedure DoLoadConfiguration(IniFile: TIniFile); override;
procedure DoSaveConfiguration(IniFile: TIniFile); override;
public
constructor Create(AOwner: TComponent); override;
published
property Source: TDataSet read FSource write FSource;
property SkipFirstRows default 0;
property GoToFirstRecord: boolean read FGoToFirstRecord
write FGoToFirstRecord default true;
end;
implementation
uses {$IFDEF WIN32}QImport2StrIDs{$ENDIF}
{$IFDEF LINUX}QImport2Consts{$ENDIF}, QImport2Common, SysUtils;
{ TQImport2DataSet }
constructor TQImport2DataSet.Create(AOwner: TComponent);
begin
inherited;
SkipFirstRows := 0;
FGoToFirstRecord := true;
end;
procedure TQImport2DataSet.DoLoadConfiguration(IniFile: TIniFile);
begin
inherited;
with IniFile do begin
SkipFirstRows := ReadInteger(DATA_SET_OPTIONS, DATA_SET_SKIP_LINES, SkipFirstRows);
end;
end;
procedure TQImport2DataSet.DoSaveConfiguration(IniFile: TIniFile);
begin
inherited;
with IniFile do begin
WriteInteger(DATA_SET_OPTIONS, DATA_SET_SKIP_LINES, SkipFirstRows);
end;
end;
procedure TQImport2DataSet.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (AComponent = FSource) and (Operation = opRemove) then FSource := nil;
end;
procedure TQImport2DataSet.StartImport;
begin
Source.DisableControls;
if FGoToFirstRecord then Source.First;
FSkipCounter := 0;
FImportCounter := 0;
end;
function TQImport2DataSet.CheckCondition: boolean;
begin
Result := not Source.Eof and
((ImportRecCount = 0) or (FImportCounter < ImportRecCount));
end;
function TQImport2DataSet.Skip: boolean;
begin
Result := not Source.Eof and (FSkipCounter < SkipFirstRows);
Inc(FSkipCounter);
end;
procedure TQImport2DataSet.FillImportRow;
var
i, k: integer;
DField, SField: TField;
begin
FImportRow.ClearValues;
for i := 0 to FImportRow.Count - 1 do begin
k := Map.IndexOfName(FImportRow[i].Name);
if (k > -1) or IsCSV or (ImportDestination = qidUserDefined) then begin
DField := DataSet.FindField(Map.Names[k]);
SField := Source.FindField(Map.Values[Map.Names[k]]);
if Assigned(DField) and Assigned(SField) then
FImportRow.SetValue(Map.Names[k], SField.AsString, SField.IsBlob);
end;
DoUserDataFormat(FImportRow[i]);
end;
end;
function TQImport2DataSet.ImportData: TQImportResult;
begin
Result := qirOk;
try
try
if Canceled and not CanContinue then begin
Result := qirBreak;
Exit;
end;
DataManipulation;
except
on E:Exception do begin
try
DestinationCancel;
except
end;
DoImportError(E);
Result := qirContinue;
Exit;
end;
end;
finally
if (CommitRecCount > 0) and not CommitAfterDone and
((ImportedRecs + ErrorRecs) mod CommitRecCount = 0) then
DoNeedCommit;
end;
end;
procedure TQImport2DataSet.ChangeCondition;
begin
Source.Next;
Inc(FImportCounter);
end;
procedure TQImport2DataSet.FinishImport;
begin
try
if not Canceled then
begin
if CommitAfterDone then
DoNeedCommit
else if (CommitRecCount > 0) and ((ImportedRecs + ErrorRecs) mod CommitRecCount > 0) then
DoNeedCommit;
end;
finally
Source.EnableControls;
end;
end;
function TQImport2DataSet.CheckProperties: boolean;
var
i: integer;
begin
Result := false;
if not Assigned(DataSet) then
raise EQImportError.Create({$IFDEF WIN32}QImportLoadStr(QIE_NoDataSet){$ENDIF}
{$IFDEF LINUX}QIE_NoDataSet{$ENDIF});
if not Assigned(Source) then
raise EQImportError.Create({$IFDEF WIN32}QImportLoadStr(QIE_NoSource){$ENDIF}
{$IFDEF LINUX}QIE_NoSource{$ENDIF});
if Map.Count = 0 then
raise EQImportError.Create({$IFDEF WIN32}QImportLoadStr(QIE_MappingEmpty){$ENDIF}
{$IFDEF LINUX}QIE_MappingEmpty{$ENDIF});
for i := 0 to Map.Count - 1 do begin
if not Assigned(DataSet.FindField(Map.Names[i])) then
raise EQImportError.CreateFmt({$IFDEF WIN32}QImportLoadStr(QIE_FieldNotFound){$ENDIF}
{$IFDEF LINUX}QIE_FieldNotFound{$ENDIF}, [Map.Names[i]]);
if not Assigned(DataSet.FindField(Map.Values[Map.Names[i]])) then
raise EQImportError.CreateFmt({$IFDEF WIN32}QImportLoadStr(QIE_SourceFieldNotFound){$ENDIF}
{$IFDEF LINUX}QIE_SourceFieldNotFound{$ENDIF},
[Map.Values[Map.Names[i]]]);
end;
if not Result then Result := true;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -