{************************************************************************} { } { Borland Delphi Visual Component Library } { InterBase Express core components } { } { Copyright (c) 1998-2000 Inprise Corporation } { } { InterBase Express is based in part on the product } { Free IB Components, written by Gregory H. Deatz for } { Hoagland, Longo, Moran, Dunst & Doukas Company. } { Free IB Components is used under license. } { } { The contents of this file are subject to the InterBase } { Public License Version 1.0 (the "License"); you may not } { use this file except in compliance with the License. You } { may obtain a copy of the License at http://www.Inprise.com/IPL.html } { Software distributed under the License is distributed on } { an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either } { express or implied. See the License for the specific language } { governing rights and limitations under the License. } { The Original Code was created by InterBase Software Corporation } { and its successors. } { Portions created by Inprise Corporation are Copyright (C) Inprise } { Corporation. All Rights Reserved. } { Contributor(s): Jeff Overcash } { } {************************************************************************} unit IBBatchMove; {$Mode Delphi} interface uses {$IFDEF LINUX } unix, {$ELSE} Windows, {$ENDIF} SysUtils, Graphics, Classes, Controls, Db, IB, IBCustomDataSet, IBDatabase, IBTable; type TBatchMode = (batAppend, batUpdate, batAppendUpdate, batDelete, batCopy); { TBatchMove } TIBBatchMove = class(TComponent) private FIBLoaded: Boolean; FDestination: TIBTable; FSource: TIBCustomDataSet; FMode: TBatchMode; FAbortOnKeyViol: Boolean; FAbortOnProblem: Boolean; FTransliterate: Boolean; FRecordCount: Longint; FMovedCount: Longint; FKeyViolCount: Longint; FProblemCount: Longint; FChangedCount: Longint; FMappings: TStrings; FKeyViolTableName: TFileName; FProblemTableName: TFileName; FChangedTableName: TFileName; FCommitCount: Integer; procedure SetMappings(Value: TStrings); procedure SetSource(Value: TIBCustomDataSet); procedure InternalExecute (BatchMode: TBatchMode; FieldCount: Word); protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Execute; public property ChangedCount: Longint read FChangedCount; property KeyViolCount: Longint read FKeyViolCount; property MovedCount: Longint read FMovedCount; property ProblemCount: Longint read FProblemCount; published property AbortOnKeyViol: Boolean read FAbortOnKeyViol write FAbortOnKeyViol default True; property AbortOnProblem: Boolean read FAbortOnProblem write FAbortOnProblem default True; property CommitCount: Integer read FCommitCount write FCommitCount default 0; property ChangedTableName: TFileName read FChangedTableName write FChangedTableName; property Destination: TIBTable read FDestination write FDestination; property KeyViolTableName: TFileName read FKeyViolTableName write FKeyViolTableName; property Mappings: TStrings read FMappings write SetMappings; property Mode: TBatchMode read FMode write FMode default batAppend; property ProblemTableName: TFileName read FProblemTableName write FProblemTableName; property RecordCount: Longint read FRecordCount write FRecordCount default 0; property Source: TIBCustomDataSet read FSource write SetSource; property Transliterate: Boolean read FTransliterate write FTransliterate default True; end; implementation uses IBIntf; { TIBBatchMove } constructor TIBBatchMove.Create(AOwner: TComponent); begin inherited Create(AOwner); FIBLoaded := False; CheckIBLoaded; FIBLoaded := True; FAbortOnKeyViol := True; FAbortOnProblem := True; FTransliterate := True; FMappings := TStringList.Create; end; destructor TIBBatchMove.Destroy; begin if FIBLoaded then FMappings.Free; inherited Destroy; end; procedure TIBBatchMove.Execute; type TFieldMap = array of Word; var SourceActive, DestinationActive: Boolean; BatchMode: TBatchMode; I: Integer; FieldCount: Word; FieldMap: TFieldMap; DestName, SourceName: string; procedure GetMappingNames; var P: Integer; Mapping: string; begin Mapping := FMappings[I]; P := Pos('=', Mapping); {MBCS OK} if P > 0 then begin DestName := Copy(Mapping, 1, P - 1); SourceName := Copy(Mapping, P + 1, 255); end else begin DestName := Mapping; SourceName := Mapping; end; end; begin if (Destination = nil) or (Source = nil) or (Destination = Source) then IBError(ibxeInvalidBatchMove, [nil]); SourceActive := Source.Active; DestinationActive := Destination.Active; FieldCount := 0; FieldMap := nil; try Source.DisableControls; Destination.DisableControls; Source.Open; Source.CheckBrowseMode; Source.UpdateCursorPos; BatchMode := FMode; if BatchMode = batCopy then begin Destination.Close; if FMappings.Count = 0 then Destination.FieldDefs := Source.FieldDefs else begin Destination.FieldDefs.Clear; for I := 0 to FMappings.Count - 1 do begin GetMappingNames; with Source.FieldDefs.Find(SourceName) do Destination.FieldDefs.Add(DestName, DataType, Size, Required); end; end; Destination.IndexDefs.Clear; Destination.CreateTable; BatchMode := batAppend; end; Destination.Open; Destination.CheckBrowseMode; if FMappings.Count <> 0 then begin FieldCount := Destination.FieldDefs.Count; SetLength(FieldMap, FieldCount); for I := 0 to FMappings.Count - 1 do begin GetMappingNames; FieldMap[Destination.FieldDefs.Find(DestName).FieldNo-1] := Source.FieldDefs.Find(SourceName).FieldNo; end; end; if FRecordCount > 0 then begin Source.UpdateCursorPos; FMovedCount := FRecordCount; end else begin FMovedCount := MaxLongint; end; Source.CursorPosChanged; try InternalExecute (BatchMode, FieldCount); finally if DestinationActive then Destination.First; end; finally if not DestinationActive then Destination.Close; if not SourceActive then Source.Close; Destination.EnableControls; Source.EnableControls; end; end; procedure TIBBatchMove.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if Operation = opRemove then begin if Destination = AComponent then Destination := nil; if Source = AComponent then Source := nil; end; end; procedure TIBBatchMove.SetMappings(Value: TStrings); begin FMappings.Assign(Value); end; procedure TIBBatchMove.SetSource(Value: TIBCustomDataSet); begin FSource := Value; if Value <> nil then Value.FreeNotification(Self); end; procedure TIBBatchMove.InternalExecute (BatchMode: TBatchMode; FieldCount: Word); begin end; end.