/
YakuninAV
/
Convertors
Обзор
Документация
Войти
/
YakuninAV
/
Convertors
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Estimate/EstReaderWriterV2.pas
299 строк
11 KB
YakuninAV
begin with gitflick
31 июл 2026, 15:21
31 июл 2026, 15:21
1dc0fc6
Код
Авторство
О чём код?
{*******************************************************} { } { Estimates Import & Export } { } { Copyright (C) 2019 ДатаБазис Девелопмент } { } {*******************************************************} unit EstReaderWriterV2; {$I mormot.defines.inc} interface uses {$IFDEF ISDELPHIXE2} System.SysUtils, System.Classes, {$ELSE} SysUtils, Classes, StrUtils, {$ENDIF} mormot.core.base, mormot.core.variants, mormot.core.os, mormot.core.unicode, mormot.core.text, DBDIntfs, DBDStrUtils, EstTypes, EstIntfsV2, EstIntfsV3, EstimatesV2; type /// Базовый класс реализующий интерфейс чтение смет в пользовательском формате и преобразование их унифицированный документ TEstimateReaderV2=class(TInterfacedObject, IEstimateReaderV2) private /// Функция возвращает значение параметров чтения function GetOptions: Variant; /// Процедура устанавливает значение параметров чтения procedure SetOptions(Value: Variant); strict protected FOptions: Variant; POptions: PDocVariantData; FNotifier: IDBDNotifierV1; FFileName: TFileName; FDoc: IEstimateDocumentV2; protected function DoRead: Boolean; virtual; abstract; function GetText: RawUTF8; virtual; abstract; public /// Опции и параметры чтения смет property Options: Variant read GetOptions write SetOptions; /// Текст, прочитанный из файла (потока) property Text: RawUTF8 read GetText; /// Конструктор constructor Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1=nil); /// Прочитать сметы из файла function Read(const FileName: TFileName; var Doc: IEstimateDocumentV2): Boolean; overload; virtual; /// Прочитать сметы из потока function Read(const Stream: TStream; var Doc: IEstimateDocumentV2): Boolean; overload; virtual; end; /// Базовый класс реализующий интерфейс сохранение сметных документов из унифицированного документа в пользовательский формат TEstimateWriterV2=class(TInterfacedObject, IEstimateWriterV2) private function GetOptions: Variant; procedure SetOptions(Value: Variant); protected FError: string; FOptions: Variant; POptions: PDocVariantData; FFileName: TFileName; FDoc: IEstimateDocumentV2; FNotifier: IDBDNotifierV1; function DoWrite: Boolean; virtual; abstract; function Notify(const MsgKind: TDBDMessageKind; const MsgCode: Integer; const MsgText: string): Boolean; inline; public /// Опции и параметры вывода смет property Options: Variant read GetOptions write SetOptions; /// Конструктор constructor Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1=nil); class procedure addOperand(const op: TEstimateOperationType; const Val: Double; var Formula: string); /// Функция возвращает текст ошибки function Error: string; /// Записать сметы в файл function Write(const FileName: TFileName; Doc: IEstimateDocumentV2): Boolean; overload; virtual; /// Записать сметы в поток function Write(const Stream: TStream; Doc: IEstimateDocumentV2): Boolean; overload; virtual; end; TEstWriterV3=class(TInterfacedObject, IEstWriterV3) private function GetOptions: Variant; procedure SetOptions(Value: Variant); protected FError: string; FOptions: Variant; POptions: PDocVariantData; FFileName: TFileName; FDoc: IEstimateDocumentV2; FNotifier: IDBDNotifierV1; function DoWrite: Boolean; virtual; abstract; function Notify(const MsgKind: TDBDMessageKind; const MsgCode: Integer; const MsgText: string): Boolean; inline; public /// Опции и параметры чтения смет property Options: Variant read GetOptions write SetOptions; /// Конструктор constructor Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1=nil); /// Функция возвращает текст ошибки function Error: string; /// Записать сметы в файл // FileName - полное имя файла в который будет выеден сметный документ // Doc - интерфейс сметного документа function Write(const FileName: TFileName; Doc: IEstDocPackageV3): Boolean; overload; /// Опции и параметры вывода смет end; implementation { TEstimateReaderV2 } constructor TEstimateReaderV2.Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1); begin inherited Create; SetOptions(aOptions); if aNotifier<>nil then FNotifier := aNotifier else FNotifier := TDBDNotifier.Create(nil); end; function TEstimateReaderV2.GetOptions: Variant; begin Result:=FOptions; end; function TEstimateReaderV2.Read(const FileName: TFileName; var Doc: IEstimateDocumentV2): Boolean; begin Result := False; if FileName='' then FNotifier.Log(dmkErrorInfo,1,'Имя файла должно быть задано') else if not FileExists(FileName) then FNotifier.Log(dmkErrorInfo,2,'Файл "' + FileName + '" не найден') else begin FFileName:=FileName; FDoc:=Doc; FNotifier.Log(dmkInformation, 0,'Начинается загрузка файла "' + FFileName + '"'); Result := DoRead; if Result then begin Doc:=FDoc; FNotifier.Log(dmkInformation, 0,'Загрузка файла "' + FFileName + '" завершена успешно'); end; end; end; function TEstimateReaderV2.Read(const Stream: TStream; var Doc: IEstimateDocumentV2): Boolean; begin Result := False; end; procedure TEstimateReaderV2.SetOptions(Value: Variant); begin if _Safe(Value) <> @DocVariantDataFake then begin if _Safe(FOptions).Count<>0 then TDocVariantData(FOptions).Reset else FOptions:=_Obj([]); TDocVariantData(FOptions).InitCopy(Value,[]); end; POptions:=_Safe(FOptions); if POptions^.Count=0 then FOptions:=Variant(DocVariantDataFake); end; { TEstimateWriterV2 } class procedure TEstimateWriterV2.addOperand(const op: TEstimateOperationType; const Val: Double; var Formula: string); begin if Formula='' then Formula := Utf8ToString(DoubleToStr(val)) else Formula := Formula + EstimateOperationTypeToChar(op) + Utf8ToString(DoubleToStr(val)); end; constructor TEstimateWriterV2.Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1); begin inherited Create; SetOptions(aOptions); FError:=''; if aNotifier<>nil then FNotifier := aNotifier else FNotifier := TDBDNotifier.Create(nil); end; function TEstimateWriterV2.Error: string; begin Result:=FError; end; function TEstimateWriterV2.GetOptions: Variant; begin Result:=FOptions; end; function TEstimateWriterV2.Notify(const MsgKind: TDBDMessageKind; const MsgCode: Integer; const MsgText: string): Boolean; begin if Assigned(FNotifier) then Result:=FNotifier.Log(MsgKind,MsgCode,MsgText) else Result:=True; end; procedure TEstimateWriterV2.SetOptions(Value: Variant); begin FOptions:=Value; POptions:=_Safe(FOptions); // if POptions^.Count=0 then FOptions:=Variant(DocVariantDataFake); end; function TEstimateWriterV2.Write(const Stream: TStream; Doc: IEstimateDocumentV2): Boolean; begin end; function TEstimateWriterV2.Write(const FileName: TFileName; Doc: IEstimateDocumentV2): Boolean; begin Result := False; if FileName='' then FNotifier.Log(dmkErrorInfo,1,'Имя файла должно быть задано') else begin FDoc:=Doc; FFileName:=FileName; Result := DoWrite; end; end; { TEstReaderV3 } { constructor TEstReaderV3.Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1); begin inherited Create; SetOptions(aOptions); if aNotifier<>nil then FNotifier := aNotifier else FNotifier := TDBDNotifier.Create(nil); end; function TEstReaderV3.GetOptions: Variant; begin Result:=FOptions; end; function TEstReaderV3.Read(const FileName: TFileName; var Doc: IEstDocPackageV3): Boolean; begin Result := False; if FileName='' then FNotifier.Log(dmkErrorInfo,1,'Имя файла должно быть задано') else if not FileExists(FileName) then FNotifier.Log(dmkErrorInfo,2,'Файл "' + FileName + '" не найден') else begin FFileName:=FileName; FDoc:=Doc; FNotifier.Log(dmkInformation, 0,'Начинается загрузка файла "' + FFileName + '"'); Result := DoRead; if Result then begin Doc:=FDoc; FNotifier.Log(dmkInformation, 0,'Загрузка файла "' + FFileName + '" завершена успешно'); end; end; end; procedure TEstReaderV3.SetOptions(Value: Variant); begin if _Safe(Value) <> @DocVariantDataFake then begin if _Safe(FOptions).Count<>0 then TDocVariantData(FOptions).Reset else FOptions:=_Obj([]); TDocVariantData(FOptions).InitCopy(Value,[]); end; POptions:=_Safe(FOptions); if POptions^.Count=0 then FOptions:=Variant(DocVariantDataFake); end; } { TEstWriterV3 } constructor TEstWriterV3.Create(const aOptions: Variant; const aNotifier: IDBDNotifierV1); begin inherited Create; SetOptions(aOptions); FError:=''; if aNotifier<>nil then FNotifier := aNotifier else FNotifier := TDBDNotifier.Create(nil); end; function TEstWriterV3.Error: string; begin Result:=FError; end; function TEstWriterV3.GetOptions: Variant; begin Result:=FOptions; end; function TEstWriterV3.Notify(const MsgKind: TDBDMessageKind; const MsgCode: Integer; const MsgText: string): Boolean; begin if Assigned(FNotifier) then Result:=FNotifier.Log(MsgKind,MsgCode,MsgText) else Result:=True; end; procedure TEstWriterV3.SetOptions(Value: Variant); begin FOptions:=Value; POptions:=_Safe(FOptions); end; function TEstWriterV3.Write(const FileName: TFileName; Doc: IEstDocPackageV3): Boolean; begin Result := False; if FileName='' then FNotifier.Log(dmkErrorInfo,1,'Имя файла должно быть задано') else begin FFileName:=FileName; Result := DoWrite; end; end; end.