Перебор документов архива

Здесь обсуждаем систему TDM/PDM/Workflow Lotsia PDM PLUS (PartY PLUS).
Ответить
Andrey000
Новый участник
Сообщения: 14
Зарегистрирован: 26 янв 2011, 12:30
Используемое ПО: Lotsia PDM PLUS

Перебор документов архива

Сообщение Andrey000 »

Здравствуйте, работаю с передачей документов от одного пользователя к другому, с созданием новой версии для каждого. Организовано это без лишних премудростей - в шаблоне работы идет действие с выбором документа архива для текущего объекта и создание для него новой версии с примечанием (ну и раздача прав). Проблема в том что документов может быть несколько и автовыборка файла соответственно не производится. Как вариант - архивировать файлы и прикладывать их единым архивом, но это не удобно. Вот наткнулся на запрос который перебирает дочерние объекты, а можно ли так же сделать с документами архива что бы решить мою задачу?
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Перебор документов архива

Сообщение Александр »

Вот наткнулся на запрос который перебирает дочерние объекты, а можно ли так же сделать с документами архива что бы решить мою задачу?
Windows Scripting Host (WSH) - из Лоции и все ресурсы компании в твоем распоряжении... - ничего сложного, с одной стороны у тебя в Лоции в запросе из скрипта к БД (ADO (ActiveX Data Objects)) есть названия файлов электронного архива (сокращенные и полные плюс пути) см тему http://www.lplm.ru/phpBB2/viewtopic.php ... 4&start=30 (там есть запрос на перебор всех документов электронного архива) в другом - из того же скрипта но на объектах WSH у тебя все функции работы с файловой системой - ты знаешь где лежит как называется и куда положить - вроде ничего сложного - прочитал там - обработал там (скопировал и создал новые версии) - положил туда

если я конечно правильно понял задачу

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Andrey000
Новый участник
Сообщения: 14
Зарегистрирован: 26 янв 2011, 12:30
Используемое ПО: Lotsia PDM PLUS

Re: Перебор документов архива

Сообщение Andrey000 »

Я думал написать в шаблоне действие над переменными, по подобию примера (который есть в хелпе):
f_EmbeddedSQLSelect ( this , ' select A_V.object_ID, O_R.description
FROM
LSDBO.attrib_value_view A_V ,
LSDBO.object_reference_view O_R,
LSDBO.value_string_view V_S
WHERE
V_S.value = ~'' + NomerD + '~'
and O_R.id=A_V.object_ID
and V_S.id=A_V.value_id
and V_S.attrib_ID = 100000081500028
and A_V.attrib_ID =100000081500028
' , '' , ' Form1 ' ) +f_RetrieveForm ( this , '' , ' Form1 ' )+f_FormDataToArray ( this , ' Form1 ' )
Только вот не знаю как переиначить запрос, что бы выборка шла на файлы (их ID). Может ли кто переписать этот запрос на выбор из таблицы ID файлов по ID текущего объекта?

Если такое получится, то далее в шаблоне я предполагаю передавать по очереди эти ID файлов в действие, которое бы создавало для каждого новую версию.
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Перебор документов архива

Сообщение Александр »

вот посмотри скриптик из действия по кнопке - у нас используется для локализации файлов электронного архива в личные каталоги пользователей - в него передается id объекта (карточки документа) и по нему выбирается самая свежая версия приложенного файла электронного архива и копируется в указанный каталог.
Просто посмотри на саму идею не вдаваясь в подробности :wink:

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

Sub GetPath
'прочтем данные из Лоции
    a_Object_id=LsVars.GetVarValue("a_Object_id")

'прочтем данные из БД
    If DataBase.ADODB_Connected Then                                                                                                              ' если подключиться удалось работаем иначе нет
'попробуем найти файл заказа (последний файл по дате и по версии)
      id_Order = DataBase.GetSingleData("select id from lsdbo.ric_get_objChild(" & cStr(a_object_id) & ",'Doc') where Description='Заказ'")
      PathAchOrder=vbnullstring
      FileNameOrder=vbnullstring
      if id_Order<>"" Then 'IsNumeric(id_Order) Then
        PathAchOrder = DataBase.GetSingleData("select top(1) st1.Path+Empl.name+'\'+case when patindex('%.%_',fl1.file_name)=0 then fl1.file_name+fv1.ver_label else substring(fl1.file_name, 1, patindex('%.%_',fl1.file_name)-1)+fv1.ver_label+substring(fl1.file_name, patindex('%.%_',fl1.file_name),len(fl1.file_name)-patindex('%.%_',fl1.file_name)+1) end from LSDBO.File1 fl1 left join LSDBO.EmplUsers Empl on fl1.author_id=Empl.id left join LSDBO.file_ver fv1 on fl1.id=fv1.file_id left join LSDBO.Storage st1 on fl1.storage_id=st1.id where fl1.object_reference_id=" & cStr(id_Order) & " order by fv1.ver_label desc, fl1.cd desc")
        FileNameOrder = DataBase.GetSingleData("select top(1) fv1.orig_filepath from LSDBO.File1 fl1 left join LSDBO.EmplUsers Empl on fl1.author_id=Empl.id left join LSDBO.file_ver fv1 on fl1.id=fv1.file_id left join LSDBO.Storage st1 on fl1.storage_id=st1.id where fl1.object_reference_id=" & cStr(id_Order) & " order by fv1.ver_label desc, fl1.cd desc")
      end if

'прочтем пути менеджера
        id = DataBase.GetSingleData("select LSDBO.Ric_Get_Numeric_atr(" & cStr(a_object_id) & ",100004060300000)")
        mPath = DataBase.GetSingleData("select LSDBO.Ric_Get_String_atr(" & cStr(id) & ",100040101800000)")                       ' строка с локальными путями пользователя
'прочтем пути филиала
        id = DataBase.GetSingleData("select sid from lsdbo.ric_get_filials() where id=(select filial_id from lsdbo.cd_GetParm)")
        fPath = DataBase.GetSingleData("select LSDBO.Ric_Get_String_atr(" & cStr(id) & ",100040101800000)")                        ' строка с общими путями компании (филиала)
        Set rs = Nothing                                                                                  'убьем объекты
      End If
      Set cn = Nothing
    End If
    If trim(mPath)<>"" then 'если пути пользователя определены - работаем дальше  
      PathLocOrder=sXML.Get_Key(mPath, "Order") ' локальный путь размещения файлов заказов  

'восстановим начальные имена файлов 
      if trim(FileNameOrder)<>"" then  FileNameOrder=Right(FileNameOrder, Len(FileNameOrder)-InStrRev(FileNameOrder,"\"))

      Set fObj = CreateObject("Scripting.FileSystemObject")
       
'скопируем файлы из электронного каталога в каталог пользователя с переименованием
'файл ЗАКАЗА (Ордер/Счет *.xls)  
      If FSO.CheckExists(PathLocOrder,1) Then                                                             ' если существует пользовательский каталог...   
        If trim(PathAchOrder)<>"" Then                                                                             ' есть ли указатель на файл в принципе?
          If FSO.CheckExists(PathAchOrder, 2) and trim(PathAchOrder)<>"" Then           ' если есть файл в электронном архиве...
            If (fObj.FileExists(PathLocOrder & "\" & FileNameOrder)) then
              rMsg = MsgBox ("Файл" & vbcr & PathLocOrder & "\" & FileNameOrder & vbcr & "существует." & vbcr & vbcr & "Заменить?" , vbYesNo + vbExclamation + vbSystemModal, "Локализация файлов заказа")
              if rMsg = 1 then fObj.copyfile PathAchOrder, PathLocOrder & "\" & FileNameOrder, True                 ' скопировать файл из электронного архива в локальный каталог с переименованием 
            Else
              fObj.copyfile PathAchOrder, PathLocOrder & "\" & FileNameOrder, True                 ' скопировать файл из электронного архива в локальный каталог с переименованием 
            End if
          End if
      End if 
...
и т.д.

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Andrey000
Новый участник
Сообщения: 14
Зарегистрирован: 26 янв 2011, 12:30
Используемое ПО: Lotsia PDM PLUS

Re: Перебор документов архива

Сообщение Andrey000 »

Замечательно конечно, но мне бы понять что мне где дописать у себя =\

Вот например прямой запрос в sql:
select id
from lsdbo.File1
where object_reference_ID=100000081001024
Всё выбирается правильно, у объекта с указаным id находятся прикрпленные файлы (их id)

А вот как бы это теперь перенести в лоцию...

И да, второй вопрос тогда - а как собственно получить id текущего объекта в лоции?
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Re: Перебор документов архива

Сообщение Anderyt »

если речь идет о шаблонах докоборота, то удобнее формироватья массив напрямую из запроса, без форм массива. это проще в настройке.
в действии над переменными надо сделать две функции:

1. для строковой переменной Ver_IDs:
f_ExecSQLSelect_3 ( select id
from lsdbo.file_ver_v
where file_id in
(
select id
from lsdbo.file_v
where object_reference_id = ' + Текущий_объект.ID +'', '' , ';' , '' , 10 )
2. для переменной типа массив:
f_StringToArray ( Ver_IDs , ';' )
ИД документа - не совсем то же самое, что ИД версии, надежнее работать с версиями, поэтому запрос так изменился. и работать нужно с видами, а не таблицами (_v добавлено для этого)
Текущий_объект.ID - это ИД объекта, вложенного в карту. на его месте может быть другая числовая переменная, содержащая ИД нужного объекта
лучше день потерять, потом за пять минут долететь!
Andrey000
Новый участник
Сообщения: 14
Зарегистрирован: 26 янв 2011, 12:30
Используемое ПО: Lotsia PDM PLUS

Re: Перебор документов архива

Сообщение Andrey000 »

2 Anderyt

А почему лучше работать с видами, чем с таблицами, не просветите?

Я вот уже создал методом проб и ошибок запрос где все обрабатывается как надо, только у меня Идшники идут в строку, из которой потом выцепляю по 15 символов циклом и т.д.

Сейчас осталась только одна проблема - не удается получить ID текущего объекта: ни Текущий_объект.ID, ни просто Объект.ID не работают. В первом случае мне пишет что выражение просто неверно, а во втором (я назначил это действие на кнопку что б было удобнее разбираться) - при нажатии кнопки ID становится пустым (по умолчанию, до нажатия кноки он = 1 ).
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Перебор документов архива

Сообщение Старик Крупский »

Andrey000 писал(а): А почему лучше работать с видами, чем с таблицами, не просветите?
Оно не лучше - оно по факту. Из документации:
"Пользователи, кроме администратора, не могут обращаться к таблицам. Обращение пользователей производится к представлениям таблиц – view".
"Лучше меньше, да лучше" (C)
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Re: Перебор документов архива

Сообщение Anderyt »

Andrey000 писал(а):Сейчас осталась только одна проблема - не удается получить ID текущего объекта
под текущим объектом подразумевается что?
если это объект, который в данный момент уже вложен в карту и его можно посмотреть на вкладке Документы у текущей задачи, то в приведенное выше выражение вместо Текущий_объект.ID нужно вставить <название документа-объекта>.ID.
и в принципе все.
если текущего объекта еще не видно на вкладке Документы - то с точки зрения карты понятия "текущий объект" в данный момент просто не существует...
если проблема останется - лучше прямо здесь (если не получается спросить у теххелпа) привести выражение, которое выдает ошибку. чтобы можно было предметно говорить..
лучше день потерять, потом за пять минут долететь!
Andrey000
Новый участник
Сообщения: 14
Зарегистрирован: 26 янв 2011, 12:30
Используемое ПО: Lotsia PDM PLUS

Re: Перебор документов архива

Сообщение Andrey000 »

2 Anderyt по идее да, всё должно было быть так просто, но видимо шаблон работ на котором я тестировал был слишком стар и замучен. На новом всё получилось.

В итоге я сделал так:

в шаблоне действие над переменными, присваиваем строковой переменной выражение:
f_ExecSQLSelect ( 'select id
from lsdbo.File_V
where object_reference_ID=' + Объект.ID +'
' , '' , '')
Далее в нужный момент эта переменная выдается в отдельное действие над объектами, где из нее, при помощи манипуляций, выцепляем ИДшники по одному, циклом:
Tmp15 = Set ( right ( tmp , 15) )
ID_doc = Set ( Number ( tmp15 ) )
Position = Set ( Pos( Tmp , Tmp15 ) )
Doc = SetByID ( ID_doc )
Tmp = Set ( Replace( Tmp , Position , 15 , '' ) )
Ну и далее в этом цикле уже создание версий, описание, права.

Конечно есть подозрение что мой способ не самый легкий =)
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Перебор документов архива

Сообщение Старик Крупский »

Я бы не ориентировался на 15 символов в айдишнике, а ориентировался бы на номер позиции разделителя. 15 символов не аксиома. Вам никогда не приходилось пользоваться импортом объектов из файла, например? Так вот, айдишник может быть длиной ДО 15 знаков (то есть и 14, и 5, и 9...), а может быть и отрицательным.
"Лучше меньше, да лучше" (C)
Аватара пользователя
Anderyt
Активный участник
Сообщения: 777
Зарегистрирован: 15 июл 2004, 13:15
Используемое ПО: Lotsia PDM PLUS
Откуда: Тюмень
Контактная информация:

Re: Перебор документов архива

Сообщение Anderyt »

Andrey000 писал(а):2 Anderyt по идее да, всё должно было быть так просто, но видимо шаблон работ на котором я тестировал был слишком стар и замучен. На новом всё получилось.
а, ну отлично :-)
еще раз обращаю внимание, что обращение к lsdbo.File_V не дает ИД версии документа. версии документа хранятся в lsdbo.file_ver_v. другое дело, что ИД документа и ИД его первой версии (#00) совпадают. версии 01 и последующие будут иметь уже другие ИД. и запросом к file_v их не вытащить в принципе. то есть нужно убедиться, что у всех документов будут только версии 00, не будет 01, 02 и тд, что никто не будет создавать версию 01, а потом удалять 00 и тд..

у меня для обработки цикла используется обычно такие выражения в действии над объектами:

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

Var_version = SetByID ( number(mid(var_IDs, 1, pos(var_IDs, ';')) ) )
Var_IDs = Set ( mid(var_IDs, pos(var_IDs, ';')+1, len(var_IDs)) )
конструкции немного другие, сложно сказать, сложнее они или легче.. главное, чтобы результат был правильный, и чтобы везде в подобных случаях использовались одни и те же конструкции, чтобы было легче разбираться и сопровождать систему :-)
Старик Крупский писал(а):Я бы не ориентировался на 15 символов в айдишнике, а ориентировался бы на номер позиции разделителя. 15 символов не аксиома. Вам никогда не приходилось пользоваться импортом объектов из файла, например? Так вот, айдишник может быть длиной ДО 15 знаков (то есть и 14, и 5, и 9...), а может быть и отрицательным
ого.. это ИД объекта? или ИД типа объекта или атрибута?
просто вроде как анализ строки с поиском разделителя работать может не так быстро, как вырезание определенного числа символов из строки (в моем примере идет именно поиск разделителя)... или нет?
разница конечно мизерная, но все таки..
лучше день потерять, потом за пять минут долететь!
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Перебор документов архива

Сообщение Старик Крупский »

Anderyt писал(а):ого.. это ИД объекта? или ИД типа объекта или атрибута?
Я имел в виду ИД объекта. А вообще любой ИД может быть короче 15 символов. Типы объектов и атрибуты тоже могут импортироваться из текстового файла (есть в главном меню пункт Импорт структуры данных). И отрицательные тоже могут быть - посмотри предопределенные типы объектов и атрибуты - у них минусовые ИД.
"Лучше меньше, да лучше" (C)
Andrey000
Новый участник
Сообщения: 14
Зарегистрирован: 26 янв 2011, 12:30
Используемое ПО: Lotsia PDM PLUS

Re: Перебор документов архива

Сообщение Andrey000 »

еще раз обращаю внимание, что обращение к lsdbo.File_V не дает ИД версии документа. версии документа хранятся в lsdbo.file_ver_v.
Да, спасибо, просто я реализовал так что уже в действии, стандартными средствами лоции находится последняя версия.
Ответить