Проверка записи справочника на используемость

10 0

В системе DIRECTUM записи справочников в какой-то момент времени могут иметь статус "черновика". Выделить такие записи можно с помощью признака "Утверждена" / "Не утверждена". Неутвержденные записи нельзя использовать в карточках документов или других справочников. Например, запись справочника "Персоны" неактуальна без введенных паспортных данных, и должна быть сохранена неутвержденной.

С другой стороны, если запись уже где-то используется, то ее нельзя ни удалять, ни делать "черновиком". Например, персона может использоваться в справочнике "Работники" или в карточках документов. 

Кроме того, может возникнуть потребность программной проверки записи справочника на используемость в каких-либо записях справочников или типов документов. Например, для того, чтобы выводить пользователю сообщение о том, что данная запись уже используется, вместе с перечнем всех мест использования.

В подобных ситуациях можно взять за основу следующие вычисления: 

REF_NAME = "код_типа_справочника_в котором_происходят_вычисления"
Recvs = SQL("EXECUTE sp_executesql N'
-- Источник вызова
select
  1, rav.Kod, rav.Vid, rav.Razd
from
  dbo.MBRecvAn as ra
  join dbo.MBVidAn as va on
    ra.VidAn = va.Vid
    and va.Kod like @VA
  join dbo.MBVidAnRecv as rav on
    rav.Kod = ra.Kod
where
  ra.Type = @VAT
union
select
  2, etr.Kod, etr.TypeID, etr.Razd
from
  dbo.MBRecvEDoc as re
  join dbo.MBVidAn as va on
    re.VidAn = va.Vid
    and va.Kod like @VA
  join dbo.MBEDocTypeRecv as etr on
    etr.Kod = re.Kod
where
  re.Type = @VAT', N'@VA varchar(50), @VAT varchar(1)', @VAT = А, @VA = " & REF_NAME)

// Если нашли реквизиты ТС и ТКЭД с заданным типом справочника
if Assigned(Recvs)
  // Определить, к какому разделу относится реквизит
  LabelsT = "Т;С;Р;О;Н;М;Q;W;U;R;I;Y;B;H;L;M;N;P;O;S;T;V;X;Z"
  NumT = ";2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24"
  QueryList = CreateStringList()
  QueryList.Delimiter = " union "
  Template = "select
                top 1 1
              from
                dbo.%s
              where
                %s = %s
                and %s = %s"

  foreach RecvInfo in CSubString(Recvs; '|')
    CompType = SubString(RecvInfo;";"; 1)
    RecvCode = SubString(RecvInfo;";"; 2)
    CompTypeID = SubString(RecvInfo;";"; 3)
    Section = SubString(RecvInfo;";"; 4)
    if CompType = 1
      Field = "Vid"
      if Section == "Ш"
        Table = "MBAnalit"
      else
       Table = "MBAnValR" & SubString(NumT; ";"; FindSubString(Section; LabelsT; ";"))
      endif
    else
      Field = "TypeID"
      if Section == "Ш"
        Table = "SBEDoc"
      else
        Table = "SBEDocValR" & SubString(NumT; ";"; FindSubString(Section; LabelsT; ";"))
      endif
    endif
    
    // Формируем запрос на проверку используемости по текущему реквизиту
    QT = Format(Template; ArrayOf(Table; Field; CompTypeID; RecvCode; Object.ID))
    QueryList.Add(QT)
  endforeach

  Res = SQL(QueryList.DelimitedText)
  if Assigned(Res)
    // Запись используется, какие-то вычисления
  endif
  QueryList = nil
endif

 

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий