storeToURL в режиме совместного доступа

Автор siti, 6 октября 2022, 18:22

0 Пользователи и 2 гостей просматривают эту тему.

siti

В приложенном файле настроено сохранение листа в формате csv макросом после выполнения сохранения документа.
В режиме совместного доступа сохранение перестает работать.
Как быть?

bigor

Цитата: siti от  6 октября 2022, 18:22В режиме совместного доступа сохранение перестает работать.
у меня работает, открыт в режиме совместного пользования, правда только одним пользователем.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

siti

#2
Одного пользователя достаточно.
То есть у вас когда нажимаете сохранить файл, каждый раз создается новый csv с уникальным именем файла?
А если тестовый файл расшарить, сохранить, закрыть, открыть и потом понажимать кнопку сохранить. Тоже каждый раз csv появляются?

bigor

Я пропустил, что макрос на событие повешан  :-[ и повесил его на кнопку. Кнопкой он всегда отрабатывает, по событию не могу сейчас сказать, завтра посмотрю
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

bigor

Проверил. Макрос отрабатывает всегда. Вот только путь куда он сохраняет меняется. Добавьте в msgbox вывод aURL и ищите там
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

siti

#5
Цитата: Bigor от  7 октября 2022, 08:09Проверил. Макрос отрабатывает всегда. Вот только путь куда он сохраняет меняется. Добавьте в msgbox вывод aURL и ищите там
Вон оно чего оказалось  ???
В совместном режиме меняется выдача пути на системную temp директорию аля C:\Users\898F~1\AppData\Local\Temp\lu20652u1bd5q.tmp\
GlobalScope.BasicLibraries.LoadLibrary("Tools")
Tools.Strings.DirectoryNameoutofPath

А как можно получить  верный путь к файлу в совместном режиме?

mikekaganski

#6
Попробуйте использовать свойство Location вместо URL.

Sub SaveBackupCSV  ' создание бекапа
    oDoc=ThisComponent

        GlobalScope.BasicLibraries.LoadLibrary("Tools")
        Dim aURL as string
        dim sUrl as string
        Dim oProp(1) As New com.sun.star.beans.PropertyValue
          aURL = Tools.Strings.DirectoryNameoutofPath(oDoc.url, "/")+"/Backup/"+CDateToIso(date)+Int(100 * Rnd)+"-Бекап.csv"
        oProp(0).Name = "FilterName"
        oProp(0).Value = "Text - txt - csv (StarCalc)"
        oProp(1).Name = "FilterOptions"
        oProp(1).Value = "44,34,34,1,,0,true,true,false,false,false,0"       
       
        oDoc.storeToURL(aUrl, oProp())  ' сохраняем бекап
        MsgBox "Произведен экспорт в файл обмена с сайтом"

End Sub

В коде есть часто встречающаяся проблема.

ЦитироватьaURL = Tools.Strings.DirectoryNameoutofPath(oDoc.url, "/")+"/Backup/"+CDateToIso(date)+Int(100 * Rnd)+"-Бекап.csv"

Эта строчка берёт URL и отправляет в функцию DirectoryNameoutofPath, которая работает не с URL, а с системными путями. И это большая разница! Например, в URL может быть запрос или фрагмент, которые могут содержать слэш. И DirectoryNameoutofPath вернёт неправильный путь.

Всегда преобразуйте между URL и системными путями в соответствии с контекстом. В LibreOffice Basic для этого есть ConvertFromURL и ConvertToURL.
С уважением,
Михаил Каганский

siti

Цитата: mikekaganski от  7 октября 2022, 09:24Попробуйте использовать свойство Location вместо URL.
Супер! Работает!

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

siti

Цитата: mikekaganski от  7 октября 2022, 09:24Эта строчка берёт URL и отправляет в функцию DirectoryNameoutofPath, которая работает не с URL, а с системными путями. И это большая разница!
А в случае с oDoc.Location такая же беда возможна?

mikekaganski

Цитата: siti от  7 октября 2022, 09:58А в случае с oDoc.Location такая же беда возможна?
Конечно: ведь Location - это тоже URL.

Корректная обработка:

aPath = ConvertFromURL(oDoc.Location)
aFileRelName = GetPathSeparator()+"Backup"+GetPathSeparator()+CDateToIso(date)+Int(100 * Rnd)+"-Бекап.csv"
aURL = ConvertToURL(Tools.Strings.DirectoryNameoutofPath(aPath, GetPathSeparator())+aFileRelName)
С уважением,
Михаил Каганский

mikekaganski

#10
Цитата: mikekaganski от  7 октября 2022, 10:10Корректная обработка: ...

Или даже лучше:

factory = CreateUnoService("com.sun.star.uri.UriReferenceFactory")
baseRef = factory.parse(oDoc.Location)
relRef = factory.parse("Backup/"+Format(now, "YYYYMMDDHHMMSS")+"-Backup.csv")
resultRef = factory.makeAbsolute(baseRef, relRef, True, com.sun.star.uri.RelativeUriExcessParentSegments.REMOVE)
aURL = resultRef.getUriReference()
С уважением,
Михаил Каганский

economist

Цитата: siti от  7 октября 2022, 09:52в режиме совместного доступа оказывается не сохраняются (ну или как то специфически сохраняются правки в макросах).

Да, макросы сохраняются по принципу: "Кто последний тот и папа". Можно поправить макрос, отладить его и даже сохранить. Но если после вас закроет/сохранит файл тот, кто открывал файл раньше вашего сохранения макроса - ваши правки макроса удалятся. Так что да, в режиме Сервис - Совместно... - править макросы нельзя.

Но зато их можно хотя бы посмотреть и пошагово отладить ошибку, в отличие от MS Excel, где макросы вообще не увидишь без отмены Общего доступа. А отменять его в Excel часто страшно, т.к. многие сеансы фантомно висят, и фиг "выгонишь" пользователей. Легко можно увидеть себя в неск. экземплярах.

Для "техподдержки" по макросам Calc - возможность видеть макросы в режиме Совместно... - очень удобна, хоть и выглядит как баг. Будет печально если возможность видеть и понарошку править макросы в Совместно... залочат, как в Excel. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Цитата: mikekaganski от  7 октября 2022, 11:39Или даже лучше:
И для полноты картины "родными" методами  :)
  arr=Split(oDoc.Location, "/")
  arr(Ubound(arr))="Backup/" & Format(now, "YYYYMMDDHHMMSS") & "-Backup.csv"
  aUrl=Join(arr, "/")
Владимир.

mikekaganski

Цитата: sokol92 от  7 октября 2022, 15:28И для полноты картины "родными" методами

Хмм... это именно те методы, которыми не надо пользоваться, потому что:

Цитата: mikekaganski от  7 октября 2022, 09:24в URL может быть запрос или фрагмент, которые могут содержать слэш

;)
С уважением,
Михаил Каганский

sokol92

#14
Здравствуйте, Михаил! Мы говорим об oDoc.Location? Ошибка может возникнуть, если имя файла (без учета папки) содержит слеш (/)? Я считал, что так не бывает. Или речь не о схеме file: ?
Владимир.