Переименовать файл в DocsVision нужно в несколько этапов.
В карточке файла, в карточке файла с версиями и в каждой версии файла.
Пример бизнес-процесса, который заменяет в названии файла одну последовательность знаков на другую. Немного модифицировав его можно использовать и просто для переименования.
Ссылка на xml процесса и проект в VS2008
Задача переименования файлов в процессе часто встречается в проектах?
Как решаете?
Встречалась один раз. Но было очень надо :)
ОтветитьУдалитьПомог ваш сценарий на C#, который нам был выслан очень давно, большое спасибо!
Если можно, приведу его тут:
// подключение системных библиотек
using System;
using System.Xml;
// подключение библиотек СУБП
using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.ObjectManager;
namespace DVScriptHost
{
class DVScript
{
public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
{
try
{
// переменная процесса - карточка файла (тип - файл DV)
ProcessVariable oFile = process.GetVariableByName("Стратегический план_файл ");
// переменная процесса - новое имя файла (строка)
ProcessVariable oFileName = process.GetVariableByName("Название Стратегического плана_строка ");
process.LogMessage("Получили переменные");
// приводим тип
DVFileCard dvFile = (DVFileCard)oFile.Value;
process.LogMessage("Получили файл");
// получаем шлюз
DVGate oGate = (DVGate)process.Gates[DVGate.GateID];
process.LogMessage("Получили шлюз");
// получаем сессию
UserSession oSession = oGate.Session;
process.LogMessage("Получили сессию");
// получаем данные карточки
CardData oData = oSession.CardManager.get_CardData(dvFile.ID);
process.LogMessage("Получили данные карточки файла");
oData.Description = oFileName.Value.ToString();
// получаем основную секцию
SectionData oSection = oData.Sections["B4562DF8-AF19-4D0F-85CA-53A311354D39"];
process.LogMessage("Получили секцию");
// строка (в этой секции она всегда одна)
RowData oRow = oSection.FirstRow;
process.LogMessage("Получили строку");
oRow.set_Value("FileName", oFileName.Value.ToString());
// получаем идентификатор карточки файла с версиями (VersionedFileCard)
string sVFCardID = oRow.get_Value("FileID").ToString();
process.LogMessage("Идентификатор карточки файла с версиями: " + sVFCardID);
// получаем системный объект - карточку файла с версиями
VersionedFileCard oVFCard = (VersionedFileCard)oSession.CardManager.get_Card(sVFCardID);
process.LogMessage("Получили системный объект - карточку файла с версиями");
// у карточки файла с версиями, получаем текущую версию
FileVersion oCurVer = oVFCard.CurrentVersion;
process.LogMessage("Получили текущую версию");
// переименовываем
oCurVer.Name = oFileName.Value.ToString();
oVFCard.Name = oFileName.Value.ToString();
process.LogMessage("Файл переименован");
IFile oRawFile = (IFile)oCurVer;
oRawFile.Name = oFileName.Value.ToString();
}
catch (Exception ex)
{
// запись в журнал ошибки исполнения
process.LogMessage("Ошибка выполнения скрипта: " + ex.Message);
}
return;
}
}
}
Да, алгоритм тот же, что и в нашем примере.
ОтветитьУдалитьВ примере переименовываются все версии файла, а в этом коде только текущая, - видимо для решения задачи этого было достаточно...
У нас задача переименования файлов встает в тот момент, когда создается очередной цикл согласования, а загружаемый документ имеет расширение, отличное от предыдущего (например, на 1 цикле был документ "Договор.doc", а на второй исполнитель прислал "Договор.pdf").
ОтветитьУдалитьРешили проблему, прикрутив свою софтину непосредственно к БД (правим dvsys_files).
Dv 4.1.1640