⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qimport2dataset.pas

📁 Delphi Advanced Import Component_v2.48.With Full Source.
💻 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 + -