Section |
---|
Column |
---|
| Задача | Получить номер из нумератора в бизнес-процессе DocsVision для дальнейшей вставки его в карточку документа. |
---|
Решение | Использовать специальный сценарий на языке c#. |
---|
Файл | нет |
---|
Для версии | 4.5 |
---|
|
|
Текст сценария
Code Block |
---|
|
/*
Сценарий получения номера из нумератора для факсов
В нумераторе должна быть хотябы одна зона! Береться первая!
*/
// подключение системных библиотек
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)
{
process.LogMessage( "Формирование номера счета...");
// ========================================================================================
//
// исходные данные
//
// принцип формирования имени зоны нумератора: MYYYYmm YYYY - номер года, mm - номер месяца
// ========================================================================================
// получение переменной для номера
ProcessVariable oVarNumber = process.GetVariableByName( "cAccNumber" ); // переменная для полного номера
ProcessVariable oVarDate = process.GetVariableByName( "dDateTime" ); // текущее дата/время
//
string cNumeratorName = "Нумератор входящих счетов"; // полное наименование нумератора
string cNumeratorPrefix = "СВ-"; // префикс полного номера документа
string cFormat = "0000"; // формат номера нумератора
// ========================================================================================
// получение шлюза к DV
DVGate oGate = (DVGate)process.GetGateByName("DocsVision");
// получаем сессию
DVGate dvGate = (DVGate)process.Gates[DVGate.GateID];
UserSession oSession = dvGate.Session;
int lNumber, i = 0;
string cID, cNumber, cZoneName;
DateTime dCurrent = (DateTime)oVarDate.Value;
// Поиск нумератора
SearchQuery oQuery = new SearchQueryClass();
oQuery.AttributiveSearch.CardTypeQueries.AddNew( "{959FF5E2-7E47-4F6F-9CF6-E1E477CD01CF}" )
.SectionQueries.AddNew( "{7A357C7B-7C36-48C8-8008-294B00F48AB2}" )
.ConditionGroup.Conditions
.AddNew( "Name", FieldTypeEnum.FIELD_STRING,
ConditionOperationEnum.CONDITION_OPERATION_STREQUALS, cNumeratorName );
// получить нумератор
CardDataCollection oNumerators = oSession.CardManager.FindCards( oQuery.GetText( true, null ));
if ( oNumerators.Count == 0 )
{
process.LogMessage( "Ошибка нумератора: Нет нумератора с именем - " + cNumeratorName);
return;
}
// получение карточки нумератора
INumeratorCard oNumerator = ( INumeratorCard )oSession.CardManager.get_Card( oNumerators[0].ID );
// формируем имя нумератора по дате
cZoneName = "M" + dCurrent.ToString( "yyyyMM" );
// присвоить пустое значение нумератору
NumeratorZone oZone = null;
// ищем по всем зонам нужную нам
for( i = 0; i < oNumerator.Zones.Count; i ++ )
{
// если нашли - вываливаемся
if( oNumerator.Zones[i].Name == cZoneName )
{
oZone = oNumerator.Zones[i];
break;
}
}
// если нумератора нет, то создаем новую зону с нужным именем
if ( oZone == null ) oZone = oNumerator.Zones.AddNew( cZoneName );
// Находим свободный номер
lNumber = oZone.GetNumber( "", true, out cID );
// Записываем номер в переменную по нашему формату...
cNumber = cNumeratorPrefix + dCurrent.ToString( "yyMM-" ) + lNumber.ToString( cFormat );
oVarNumber.Value = cNumber;
process.LogMessage ("Присвоен номер: " + cNumber );
}
}
} |
Использование сценарий
1. Создаем в процессе функцию "Сценарий".
2. Вставляем в нее текст сценария.
3. Определяем в сценарии параметры (ID нумератора, разрядность номера, переменная в которую записать полученный номер и так далее).