Последняя версия DataExpress 3 beta от 2 ноября 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Вопросы, связанные с конструктором приложений баз данных DataExpress.
user
Заглянувший
Сообщения: 8
Зарегистрирован: Пн авг 13, 2018 10:15 am

Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение user » Чт ноя 08, 2018 5:09 pm

Приветствую.

Есть таблица сотрудников.
И есть справочник документов (отсканированные PDF-файлы), которые хранятся в БАЗЕ.
К каждому сотруднику прикреплены один или несколько документов.

Сейчас, чтобы просмотреть скан документа по определенному сотруднику, нужно:
1.Редактировать запись сотрудника.
2. Редактировать ссылку на нужный документ.
3. Открыть справочник документов.
4. Редактировать нужный документ в справочнике документов.
5. В поле Скан нажать правую кнопку и выбрать "Открыть".

Я сделал кнопку "Просмотреть документ". По нажатии на кнопку хочу сохранять выделенный документ во временный файл.
И открывать его модулем Exec.

Как написать скрипт, который бы выполнял все эти действия?

БД в прикрепленном файле.
SOTR.zip
БД
(165.42 КБ) 8 скачиваний

Аватара пользователя
Гocть
Эксперт
Сообщения: 1248
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение Гocть » Чт ноя 08, 2018 7:26 pm

Примерно так:

Код: Выделить всё

function MoveFileEx(FN:PChar; NFN:Pchar; Fl:cardinal):boolean;
external 'MoveFileExA@kernel32.dll stdcall';

function FRewritable(f:string):boolean;
var fileStream:TFileStream;
begin
  try
    fileStream := TFileStream.Create(f, fmOpenWrite);
    result:=true;
  except
    result:=false;
  finally;
  if fileStream<> nil then
    begin
      fileStream.Free;
      fileStream:=nil;
    end;
  end;
end;

function AutoNumFileName(FFName:string;WithReplace:boolean):string;
var Path,FileNameNoExt,FileExt,NewName:string;
i:integer;

begin
if FileExists(FFName)=false then
begin
  result:=FFName;
  exit;
end;

Path := ExtractFilePath(FFName);
FileNameNoExt := ExtractFileNameOnly(FFName);
FileExt := ExtractFileExt(FFName);

i := 0;
NewName := FFName;
while FileExists(NewName) do
   if WithReplace then
      begin
        if FRewritable(NewName) then
          begin
            result:=NewName;
            exit;
          end
      else
        begin
          inc(i);
          NewName:=Path+FileNameNoExt+'('+IntToStr(i)+')'+FileExt;
          result:=NewName;
        end;
      end
  else
    begin
      inc(i);
      NewName:=Path+FileNameNoExt+'('+IntToStr(i)+')'+FileExt;
      result:=NewName;
    end;
end;

procedure ViewDoc(Sender: TObject);
var
  PFm,DFm: TdxForm;
  F:TdxFile;
  FN:string;
begin
try
  PFm:=Self.Forms['Документы'];
  DFm:=TdxForm.Create('СправочникДокументов');
  if PFm['Документ']=null then exit;
  DFm.OpenRecord(PFm['Документ']);
  F:=DFm.Files['Скан документа'];
  FN:=AutoNumFileName(GetTempDir+ExtractFileName(F.SourceFileName),true);
  F.SaveToFile(FN);
  MoveFileEx(FN,'',4);
  ShellExecute('open','"'+FN+'"','','',10);
except
  MsgBox(' ',ExceptionToString(ExceptionType,ExceptionParam));
finally
 DFm.Free;
end;
end;

procedure Form_Create;
begin
  dxButton1.OnClick :=@ ViewDoc;
end;
Фрилансер. Разработка на заказ. Консультирование.

user
Заглянувший
Сообщения: 8
Зарегистрирован: Пн авг 13, 2018 10:15 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение user » Пт ноя 09, 2018 5:42 pm

Премного благодарен.

user
Заглянувший
Сообщения: 8
Зарегистрирован: Пн авг 13, 2018 10:15 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение user » Пт ноя 09, 2018 5:48 pm

С целью обеспечения конфиденциальности сканы документов хранятся в БД.

Однако при просмотре файлы со сканами пишутся в каталог с временными файлами, там и остаются после завершения работы.
Как бы их все удалить (например, по маске) после окончания работы программы?

Аватара пользователя
Гocть
Эксперт
Сообщения: 1248
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение Гocть » Пт ноя 09, 2018 6:33 pm

Функция MoveFileEx помечает файлы на удаление после перезагрузки компьютера. Этого не достаточно?
user писал(а):Как бы их все удалить (например, по маске) после окончания работы программы?

Корректно удалять таким способом не получится. В момент закрытия программы файл может быть открыт.
Фрилансер. Разработка на заказ. Консультирование.

user
Заглянувший
Сообщения: 8
Зарегистрирован: Пн авг 13, 2018 10:15 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение user » Пн ноя 12, 2018 7:55 am

Это да. Файлы могут быть открыты.
Можно попробовать удалить то что удаляется (например, по маске) при старте программы.
А затем - после окончания работы программы.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1248
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение Гocть » Пн ноя 12, 2018 8:52 am

Это все условности и не даст должного результата. Если на то дело пошло, можно спокойно восстановить удаленные файлы и никакая конфиденциальность не поможет, также никто не запрещает открытый документ "сохранить как". Возможно в качестве папки вывода использовать флешку, но каждый раз ее нужно будет сжигать :) Для серьезной защиты нужны серьезные инструменты.
Фрилансер. Разработка на заказ. Консультирование.

user
Заглянувший
Сообщения: 8
Зарегистрирован: Пн авг 13, 2018 10:15 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение user » Пн ноя 12, 2018 10:58 pm

Восстановить конечно можно, и Сохранить как можно. Здесь вопрос больше не в безопасности, а в экологичности.
Просто не хочется, чтобы просмотренные документы болтались у пользователя на диске (даже во временном каталоге).

Можно конечно написать командный файл и удалять такие файлы по маске перед запуском программы и после завершения программы.

Можно создавать во временном каталоге папку типа DEXXXX.DOCS и сохранять файлы туда, а перед выходом пробовать удалять все подобные папки с файлами.

Аватара пользователя
Гocть
Эксперт
Сообщения: 1248
Зарегистрирован: Пн ноя 27, 2017 8:02 am

Re: Открыть файл из справочника (ссылка на справочник документов в подчиненной форме)

Сообщение Гocть » Чт ноя 15, 2018 8:31 pm

Код: Выделить всё

var
  Server: THttpServer;
  SS:TStringStream;

procedure HandleRequest(Sender: TObject; var ARequest: TFPHttpConnectionRequest; var AResponse: TFPHttpConnectionResponse);
begin
  if SS = nil then
  begin
    AResponse.Content := '<html><head><meta charset="utf-8"><head><body>'+
    '<b style="color:red">Ошибка! Отсутствует документ для вывода.'+
    ' Нажмите кнопку "Печать" в DataExpress</body></html></b>';
  end
  else
  begin
    AResponse.ContentType := 'application/pdf';
    AResponse.ContentStream := SS;
    AResponse.SendContent;
    SS.Free;
    SS := nil;
  end;
end;

procedure ViewDoc(Sender: TObject);
var
  PFm,DFm: TdxForm;
  F:TdxFile;
begin
  try
    PFm:=Self.Forms['Документы'];
    DFm:=TdxForm.Create('СправочникДокументов');
  if PFm['Документ']=null then exit;
    DFm.OpenRecord(PFm['Документ']);
    F:=DFm.Files['Скан документа'];
    SS:=TStringStream.Create('');
    F.SaveToStream(SS);
    SS.Position:=0;
    ShellExecute('','http://localhost:54321','','',10);
  except;
    MsgBox(' ',ExceptionToString(ExceptionType,ExceptionParam));
  finally
    DFm.Free;
end;

end;

procedure Form_Create;
begin
  Server := THttpServer.Create;
  Server.Port:=54321;
  Server.OnRequest := @HandleRequest;
  Server.Start;
  dxButton1.OnClick :=@ ViewDoc;
end;

procedure Form_Destroy;
begin
  Server.Free;
end;

Как правило, популярные PDF-читалки во время установки добавляют в браузеры свои плагины для просмотра PDF прямо на странице (если нет, то можно установить/переустановить PDF просмотрщик с установкой флага с названием типа "установить плагин для web").
Процедура передает браузеру поток данных (т.е. файла как такового вообще не существует). Сразу после выдачи, поток уничтожается (можно увидеть при попытке обновления страницы).

Пицот рублей ;)
Фрилансер. Разработка на заказ. Консультирование.