Перебор документов архива
-
- Новый участник
- Сообщения: 14
- Зарегистрирован: 26 янв 2011, 12:30
- Используемое ПО: Lotsia PDM PLUS
Перебор документов архива
Здравствуйте, работаю с передачей документов от одного пользователя к другому, с созданием новой версии для каждого. Организовано это без лишних премудростей - в шаблоне работы идет действие с выбором документа архива для текущего объекта и создание для него новой версии с примечанием (ну и раздача прав). Проблема в том что документов может быть несколько и автовыборка файла соответственно не производится. Как вариант - архивировать файлы и прикладывать их единым архивом, но это не удобно. Вот наткнулся на запрос который перебирает дочерние объекты, а можно ли так же сделать с документами архива что бы решить мою задачу?
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 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)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 14
- Зарегистрирован: 26 янв 2011, 12:30
- Используемое ПО: Lotsia PDM PLUS
Re: Перебор документов архива
Я думал написать в шаблоне действие над переменными, по подобию примера (который есть в хелпе):
Если такое получится, то далее в шаблоне я предполагаю передавать по очереди эти ID файлов в действие, которое бы создавало для каждого новую версию.
Только вот не знаю как переиначить запрос, что бы выборка шла на файлы (их ID). Может ли кто переписать этот запрос на выбор из таблицы ID файлов по ID текущего объекта?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 файлов в действие, которое бы создавало для каждого новую версию.
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Перебор документов архива
вот посмотри скриптик из действия по кнопке - у нас используется для локализации файлов электронного архива в личные каталоги пользователей - в него передается id объекта (карточки документа) и по нему выбирается самая свежая версия приложенного файла электронного архива и копируется в указанный каталог.
Просто посмотри на саму идею не вдаваясь в подробности
Просто посмотри на саму идею не вдаваясь в подробности

Код: Выделить всё
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)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 14
- Зарегистрирован: 26 янв 2011, 12:30
- Используемое ПО: Lotsia PDM PLUS
Re: Перебор документов архива
Замечательно конечно, но мне бы понять что мне где дописать у себя =\
Вот например прямой запрос в sql:
А вот как бы это теперь перенести в лоцию...
И да, второй вопрос тогда - а как собственно получить id текущего объекта в лоции?
Вот например прямой запрос в sql:
Всё выбирается правильно, у объекта с указаным id находятся прикрпленные файлы (их id)select id
from lsdbo.File1
where object_reference_ID=100000081001024
А вот как бы это теперь перенести в лоцию...
И да, второй вопрос тогда - а как собственно получить id текущего объекта в лоции?
- Anderyt
- Активный участник
- Сообщения: 777
- Зарегистрирован: 15 июл 2004, 13:15
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Тюмень
- Контактная информация:
Re: Перебор документов архива
если речь идет о шаблонах докоборота, то удобнее формироватья массив напрямую из запроса, без форм массива. это проще в настройке.
в действии над переменными надо сделать две функции:
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 - это ИД объекта, вложенного в карту. на его месте может быть другая числовая переменная, содержащая ИД нужного объекта
в действии над переменными надо сделать две функции:
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 - это ИД объекта, вложенного в карту. на его месте может быть другая числовая переменная, содержащая ИД нужного объекта
лучше день потерять, потом за пять минут долететь!
-
- Новый участник
- Сообщения: 14
- Зарегистрирован: 26 янв 2011, 12:30
- Используемое ПО: Lotsia PDM PLUS
Re: Перебор документов архива
2 Anderyt
А почему лучше работать с видами, чем с таблицами, не просветите?
Я вот уже создал методом проб и ошибок запрос где все обрабатывается как надо, только у меня Идшники идут в строку, из которой потом выцепляю по 15 символов циклом и т.д.
Сейчас осталась только одна проблема - не удается получить ID текущего объекта: ни Текущий_объект.ID, ни просто Объект.ID не работают. В первом случае мне пишет что выражение просто неверно, а во втором (я назначил это действие на кнопку что б было удобнее разбираться) - при нажатии кнопки ID становится пустым (по умолчанию, до нажатия кноки он = 1 ).
А почему лучше работать с видами, чем с таблицами, не просветите?
Я вот уже создал методом проб и ошибок запрос где все обрабатывается как надо, только у меня Идшники идут в строку, из которой потом выцепляю по 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: Перебор документов архива
под текущим объектом подразумевается что?Andrey000 писал(а):Сейчас осталась только одна проблема - не удается получить ID текущего объекта
если это объект, который в данный момент уже вложен в карту и его можно посмотреть на вкладке Документы у текущей задачи, то в приведенное выше выражение вместо Текущий_объект.ID нужно вставить <название документа-объекта>.ID.
и в принципе все.
если текущего объекта еще не видно на вкладке Документы - то с точки зрения карты понятия "текущий объект" в данный момент просто не существует...
если проблема останется - лучше прямо здесь (если не получается спросить у теххелпа) привести выражение, которое выдает ошибку. чтобы можно было предметно говорить..
лучше день потерять, потом за пять минут долететь!
-
- Новый участник
- Сообщения: 14
- Зарегистрирован: 26 янв 2011, 12:30
- Используемое ПО: Lotsia PDM PLUS
Re: Перебор документов архива
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: Перебор документов архива
а, ну отлично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: Перебор документов архива
Я имел в виду ИД объекта. А вообще любой ИД может быть короче 15 символов. Типы объектов и атрибуты тоже могут импортироваться из текстового файла (есть в главном меню пункт Импорт структуры данных). И отрицательные тоже могут быть - посмотри предопределенные типы объектов и атрибуты - у них минусовые ИД.Anderyt писал(а):ого.. это ИД объекта? или ИД типа объекта или атрибута?
"Лучше меньше, да лучше" (C)
-
- Новый участник
- Сообщения: 14
- Зарегистрирован: 26 янв 2011, 12:30
- Используемое ПО: Lotsia PDM PLUS
Re: Перебор документов архива
Да, спасибо, просто я реализовал так что уже в действии, стандартными средствами лоции находится последняя версия.еще раз обращаю внимание, что обращение к lsdbo.File_V не дает ИД версии документа. версии документа хранятся в lsdbo.file_ver_v.