Calc – współdzielenie pliku

Gotowe szablony, skrypty, makropolecenia i rozszerzenia. Tutaj możesz pochwalić i podzielić się swoją twórczością z innymi użytkownikami
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Calc – współdzielenie pliku

Post autor: andro »

witam,
Potrzebuję pomocy przy napisaniu makra, które pozwoliłoby blokować rekord po jego zapisie z jednoczesnym wymuszaniem zapisu kompletnego rekordu.
Szczegółowo działa to tak:
Jest kilkunastu użytkowników, którzy korzystają z jednego Rejestru.
Zakładam, że Rejestr jest czysty. Wchodzi użytkownik, dodaje nowy rekord, zapisuje i makro w tym momencie blokuje możliwość edycji, czy też usunięcia zapisanego rekordu.
Wchodzi następny użytkownik, widzi zapisany rekord ale oczywiście nie może go ani usunąć, ani zmodyfikować. Dodaje swój rekord (bo tylko taką ma możliwość) zapisuje i makro blokuje modyfikację, czy też usunięcie. Natomiast gdyby użytkownik ten chciał dodać kolejny swój rekord, to oczywiście może.
No i tak w kółko.
W Excelu napisane makro działa, natomiast w calcu już nie.
Będę wdzięczny za pomoc
W załączeniu wspomniany Rejestr sporządzony w Excelu
Załączniki
Kopia Rejestr - Kopia-1.xlsm
(18.9 KiB) Pobrany 301 razy
Ostatnio zmieniony pn lip 20, 2020 8:31 am przez Rafkus, łącznie zmieniany 3 razy.
Powód: Zmieniono nazwę wątku, temat nieco się rozlazł, myślę że obecna nazwa będzie bardziej adekwatna. Orginalna nazwa to: Blokada arkusza po zapisie
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Ciekawostka:
Nawet bez twojego makra, bez usuwania blokady w dość prosty sposób udało mi się w Libre Calc dodać nowe rekordy, zmodyfikować poprzednie a nawet je usunąć.
Jak to zrobić:
Kliknij na komórkę nagłówkową - którąś z A1 : E1
Z menu Dane wybierz Formularz
i to wszystko, w wywołanym oknie możesz dokonać dowolne zmiany
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Tak, faktycznie, można to zrobić. Jednak chodzi o to, żeby nic nie można było zrobić oprócz wstawienia nowego wiersza. Temu właśnie to makro służy. Niestety napisane jest pod Excela i Libre nie działa.
libreoffice 6.1.4.2 Win 10
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Przekonwertowałem makro Excela na język LO, jednak wyrzuca błąd składni

Private Sub CommandButton1_Click()
Dim i&, w&, ost&
For i = 1 To 5
If Me.Controls("Textbox" & i) = "" Then
MsgBox "Uzupełnij dane w formularzu!", vbCritical, "Informacja"
Exit Sub
End If
Next
With Sheets("Arkusz1")
ost = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.Unprotect "abc"
For w = 1 To 5
.Cells(ost, w).Value = Me.Controls("TextBox" & w).Value
Next
Dim oSheet as Object[n]oSheet = ThisComponent.CurrentController.ActiveSheet[n]oSheet.getCellRangeByName($1)("A" & ost & ":E" & ost).Borders.LineStyle = xlContinuous
.Protect "abc"
End With
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub TextBox1_Change()

End Sub
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Zobacz mój drugi eksperyment (pierwszy tworzyłem na twoim pliku i niestety pojawił się błąd :( i cała praca poszła w ...)

Zastrzegam nie jestem programistą/informatykiem tylko samoukiem... więc nie daję gwarancji.
Ogólnie język programowania makr w exelu i calca różni się nieco od siebie (jak gwara kaszubska od gwary śląskiej) dlatego makra stworzone w jednym programie mogą nie działać w drugim.



PS. kolejna rozbieżność między OO a LO, przy chronionym arkuszu moje makro nie dopisuje nowych wartości w OO
Edit: (wymaga zastosowania poleceń: .Unprotect oraz .Protect)
Ostatnio zmieniony pn lip 06, 2020 7:39 am przez Rafkus, łącznie zmieniany 1 raz.
Powód: nowa wersja pliku poniżej
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Wstawiłem moje makro do twojego pliku, możesz sprawdzić efekt.
Plik został zapisany w OO
Ostatnio zmieniony wt lip 07, 2020 11:56 am przez Rafkus, łącznie zmieniany 2 razy.
Powód: Nowsza wersja pliku poniżej
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Doświadczenie czasami pokazuje, że ów samouk zupełnie sobie daje radę :), jak widać na tym przykładzie
Bardzo Ci dziękuję za pomoc. Pomimo, że jak piszesz, zapisałeś w OO, u mnie LO, działa normalnie.
Wprowadzałem w zasadzie wszystkie typy danych (od dat, po liczby i nazwy) i funkcjonuje to, jak powinno.
Przejrzawszy Twoje makro, widzę, że to nieco inna bajka w stosunku do VBA.
Jeszcze raz bardzo dziękuję.
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Blokada arkusza po zapisie

Post autor: Jermor »

Dołączam się do postu. Podsyłam ci zmodyfikowane przeze mnie makro @Rafkus'a.
Ponieważ jak napisałeś różne osoby w różnym momencie będą zmieniały dane, to wydaje się być sensownym aby rejestrować kto i kiedy wprowadził dane.
Może będziesz chciał wprowadzić zasadę, że tylko ten kto dodał dane może je usunąć lub zmodyfikować i wówczas taka informacja może być przydatna.
W kod makra wplotłem polecenia print, które wyprowadzają informacje o tym kto i kiedy utworzył rekord. Sygnaturę "kiedy" możesz sam utworzyć korzystając z funkcji Daty i czasu.
Zmodyfikowałem nieco komunikat o niewypełnionym polu, dodając do niego informację, które pole jest niewypełnione.
Ponadto zamiast przeglądać kolejne komórki w celu znalezienia ostatniego używanego wiersza, wykorzystałem funkcje GetLastUsedRow znajdującą się w standardowej bibliotece pakietu TOOLS- MISC, która zwraca numer ostatniego użytego w arkuszu wiersza.
Ostatnio zmieniony wt lip 07, 2020 8:08 pm przez Jermor, łącznie zmieniany 1 raz.
Powód: Usunąłem załączony plik. Właściwa i zmieniona wersja jest w dalszym poście.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Z ciekawości uruchomiłem i dostałem komunikat:
Błąd uruchomieniowy języka BASIC.
Nie zdefiniowano procedury lub funkcji.
wyskakuje on przy linijce

Kod: Zaznacz cały

   i=1+getLastUsedRow(Doc) 
------------------------
Edit:
1. pomogło wejście do wyżej wymienionej biblioteki (ale tylko do następnego uruchomienia programu)
2. pomogło skopiowane tej funkcji do makr stosowanych w tym piku

Czy jest jakiś kruczek żeby wskazać w której bibliotece znajduje się dana funkcja getLastUsedRow (żeby nie musieć jej kopiować)??
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Blokada arkusza po zapisie

Post autor: Jermor »

Z rozpędu, bo u mnie działało opuściłem taki kod:
Dim oLibs As Object

Kod: Zaznacz cały

oLibs = GlobalScope.BasicLibraries
'load useful / required libaries
LibName="Tools" 'from LO Macros & Dialogs collection
If oLibs.HasByName (LibName) AND (Not oLibs.isLibraryLoaded(LibName)) Then
oLibs.LoadLibrary(LibName)
End If
Formalnie wystarczyłoby wpisać:

Kod: Zaznacz cały

GlobalScope.BasicLibraries.LoadLibrary("Tools")
ale ten pierwszy kod pozwala dołączyć dowolną, np. także własną bibliotekę.
To przydaje się np. gdy tworzymy własne funkcje zapisane we własnej bibliotece a nie w bibliotece Standard. Uruchomienie makra ładuje bibliotekę tylko raz.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Blokada arkusza po zapisie

Post autor: Jermor »

Z bibliotekami jest tak:
Zawsze są dostępne biblioteki Standard znajdujące się w dokumencie i kontenerze Moje Makra. Nie trzeba ich oddzielnie uaktywniać.
W edytorze Basica można zobaczyć wszystkie kontenery bibliotek. Klikniecie w znak + biblioteki otwiera ją i jednocześnie uaktywnia (zmienia się postać ikonki reprezentującej bibliotekę). Biblioteka uaktywniona w ten sposób jest dostępna do końca sesji oprogramowania OpenOffice.
Aby załadować wybraną bibliotekę używa się polecenia GlobalScope.BasicLibraries.LoadLibrary("nazwa biblioteki")
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

@Jermor, czytasz w moich myślach :). Tak, właśnie o takiej funkcjonalności, pozwalającej na sprawdzenie logu Rejestru, czy też zawsze przeniesienie do ostatniego wiersza, myślałem. Bardzo Dziękuję.
Żeby naświetlić, w jakich warunkach ma funkcjonować Rejestr - kilka zdań. Otóż będzie on w otoczeniu sieciowym, w którym użytkownicy będą mogli dopisywać rekordy.
Problemem jest wielodostęp. W Rejestrze, który stworzyłem w LO Base był zawsze problem z blokadą jednego użytkownika przez drugiego, czasami zwykłe pozostawienie otwartego dokumentu LO powodowało jakieś błędy w dostępie, więc użytkownik musiał je zamknąć, żeby inny mógł wejść do Rejestru. Takie różne cuda. Nie wiem do końca czym były spowodowane. Może javą, do której owe komunikaty się odnosiły.
W przypadku cala zapewne nie będzie inaczej. Tak sobie myślę, że może dobrym wyjściem byłoby stworzyć system logowania użytkowników do Rejestru. Wówczas każdy z nich miałby przypisany login oraz hasło. W przypadku próby otwarcia Rejestru, który byłby w użyciu, inny użytkownik otrzymywałby stosowny komunikat.
Co do administrowania Rejestrem, to są dwa wyjścia:
pierwsze - użytkownik może tylko dodawać rekordy, natomiast modyfikacje (po zapisie) byłyby możliwe tylko przez osobę zarządzającą.
Ponieważ Rejestr pełni funkcję nadawania numeracji dla powiedzmy umów, więc usunięcie rekordu (chociażby swojego) przez użytkownika, gdy wpisany jest już po nim następny rekord, spowodowałoby totalny bałwan.
drugie - użytkownik może usunąć, zmodyfikować swój rekord tylko do czasu, gdy nie będzie po nim żadnego innego. To też jest rozwiązaniem. Wówczas odpada funkcja administrowania tym wszystkim.
Co o tym sądzicie?
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Mówisz i masz coś takiego...
Polecenie Doc.DocumentProperties.ModifiedBy "zwraca kto" ostatni dokonał zapisu w danym pliku.
Tak naprawę to jest Imię Nazwisko zabrane z Danych Użytkownika z menu Opcje.
Ostatnio zmieniony ndz lip 12, 2020 4:06 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: Lepsza wersja będzie poniżej
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Blokada arkusza po zapisie

Post autor: Jermor »

Szanowny @Rafkus. To nie do końca jest tak. Sam się na tym sparzyłem. W tym miejscu jest rzeczywiście informacja o tym, kto ostatni zmodyfikował dokument. Tylko, że jest to informacja zanim się ten dokument zapisze, czyli informacja o poprzedniku. Dość długo szukałem skąd wyciągnąć informację, kto jest użytkownikiem pakietu i zostanie zapisany jako ostatni modyfikujący. I znalazłem to.
Podsyłam zatem plik zmodyfikowany w ten sposób, że gdy pakiet nie ma wpisanego użytkownika (dla uproszczenia sprawdzam tylko imię, ale w komentarzu podaję nazwy stosownych pól dla nazwiska i inicjałów), to pojawia się komunikat, że z aplikacji można skorzystać dopiero po wpisaniu danych (w moim przypadku wystarczy tylko imię)
Ponadto już tylko z formalnej poprawności, zmieniłem zakotwiczenie przycisku na "do strony". Uniknie się dzięki temu przypadkowego usunięcia przy usuwaniu wiersza z komórką do której był zakotwiczony.

Teraz co do pytania @andro. Nie sądzę, żeby twoja koncepcja była do końca dobra. Chyba, że o czymś nie wiem. Możliwość wielodostępu związana jest z ustawieniem współużytkowania dokumentu. Każdy użytkownik przy otwieraniu dokumentu jest o tym informowany ale pracuje na swojej kopii. Dopiero gdy chce zapisać dokument pojawiają się pytania o wybór jakie dane mają zostać zapisane w przypadku równoległych wpisów do tych samych komórek. Tutaj może być tak dość często. Dopisywanie danych odbywa się zawsze na końcu aktualnego zestawienia. Przy stanie jaki jest obecnie, ostateczne dane zostaną zapisane dopiero gdy użytkownik wybierze "Zapisz". W tym czasie inny użytkownik, który otworzył dokument przed tym zapisem, ustawia swoje rekordy także na końcu zestawienia w takiej samej pozycji jak ten pierwszy. W momencie, gdy będzie zapisywał swoje dane, trzeba podjąć decyzje, co do tego, które dane są ważniejsze. Wybrane dane ważniejsze są zapisywane a te mniej ważne tracone.
Dlatego sądzę, że system powinien działać inaczej.
Po wypełnieniu formatki, powinien być otwierany plik arkusza rejestrowego, w celu dopisania na końcu nowych danych, następnie plik rejestru powinien zostać zapisany i zamknięty.
Podczas otwierania pliku można otrzymać informację, że plik jest w użyciu, właśnie przez procedurę zapisywania danych przez kogoś innego, i zaprogramować oczekiwanie na możliwość otwarcia pliku np. po 30 sekundach oczekiwania. Należałoby też przewidzieć możliwość doraźnego zapisywania wprowadzanych danych na wypadek awarii systemu i scalania ich w późniejszym terminie.
Załączniki
Kopia Rejestr - Kopia-1A.ods
(18.85 KiB) Pobrany 271 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

@Jermor, zauważyłem jak zachowuje się polecenie Doc.DocumentProperties.ModifiedBy i dlatego wykorzystałem prostą sztuczkę:
Makrem wpisałem pięć danych z okna dialogowego do arkusza
Makrem zapisałem zmiany (wykorzystałem nagrane makro wykorzystujące polecenie ".uno:Save")
do kolejnych dwóch kolumn wstawiłem kto chwilkę temu zapisał dokument oraz datę.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Blokada arkusza po zapisie

Post autor: Jermor »

Też o tym myślałem. Jednak co będzie gdy gość wprowadzi pozycję (jedną lub więcej) i uzna, że to nie mało sensu wobec czego zechce wyjść z programu bez zapisywania? Dlatego szukałem możliwości znalezienia identyfikacji oprogramowania a nie samego dokumentu. Dzięki temu już w momencie wywoływania okna można stwierdzić czy dane użytkownika są wprowadzone i w razie czego zażądać ich wprowadzenia.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Dziękuję Wam za zainteresowanie i pomoc. Jutro sprawdzę, jak to wszystko działa w rzeczywistym środowisku.
libreoffice 6.1.4.2 Win 10
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Testy przeprowadzone, jednak bez sprawdzania jak się zachowuje plik, przy próbie otwarcia przez innego użytkownika, w przypadku jego zajętości. Jutro to sprawdzę.
Co do identyfikacji użytkownika, to funkcjonalność ta jest w zasadzie prawidłowa. Z początku myślałem raczej o systemie loginów i haseł. Inaczej mówiąc: w chwili otwarcia pliku wyświetla się panel logowania i tam użytkownik, który został wcześniej zdefiniowany, podaje swoje dane logowania.
Jeśli walidacja danych będzie pozytywna, wówczas użytkownik ujrzy formularz wprowadzania danych. To są moje takie pomysły, jednak nie wiem, czy są możliwe do realizacji.
Dlaczego o tym piszę? Oczywiście Twoje rozwiązanie @Jermor jest bardzo dobre i fajnie, że wyprzedzasz o wielki krok moje oczekiwania, czy sugestie. Jednak zastanawiam się co będzie jeśli użytkownik zamiast swoich prawdziwych danych, pozwalających go zidentyfikować, napisze mi np. Kubuś Puchatek :) W takiej sytuacji szukaj sobie kto to jest. Oczywiście to są takie dywagacje. Generalnie, z tym można żyć.
Co do informacji o zajętości pliku. Nie wiem, czy można byłoby coś takiego zrobić, że użytkownik, który próbuje otworzyć zajęty już wcześniej plik, otrzyma informację o jego zajętości oraz kto go użytkuje w danym czasie.
Z praktyki wiem, że są różni ludzie: wiek, umiejętności, które powodują, że czasami gość wejdzie w Rejestr i siedzi tam czasami godzinami, a następny dobija się i nie może dopisać rekordu. Czas bardzo często odgrywa bardzo dużą rolę. Teraz wpadło mi, więc dopisuję: może jakiś komunikat przypominający po jakimś czasie o konieczności zamknięciu Rejestru....
Nie do końca zrozumiałem to:
„Po wypełnieniu formatki, powinien być otwierany plik arkusza rejestrowego, w celu dopisania na końcu nowych danych, następnie plik rejestru powinien zostać zapisany i zamknięty.”
Co do Twojego pomysłu @Rafkus, bardzo mi się podoba ta funkcjonalność. Czasami jest tak, że użytkownik dzwoni aby mu usunąć, bo albo się pomylił, albo zupełnie niepotrzebnie dodał rekord. To by załatwiało problem.
Rozumiejąc, że to jest faza projektu, zadam może niemądre pytanie: log Rejestru rozumiem, że można, a nawet winno się, umieścić w innym, np. ukrytym arkuszu….?
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Odnośnie identyfikacji użytkownika to myślałem "troszkę" o tym.
W dokumencie OO/LO można dodać własną ? kontrolkę?: z menu plik wybierz Właściwości, popatrz na kartę Właściwości Użytkownika tam można dodać własną właściwość i nadać jej jakąś wartość. Odkryłem jak można zmieniać makrem tą wartość.

Kod: Zaznacz cały

 Dim oDocumentProperties As Variant
 Dim oUserDefinedProperties As Variant
  oDocumentProperties = ThisComponent.getDocumentProperties()
  oUserDefinedProperties = oDocumentProperties.getUserDefinedProperties()  
  if oUserDefinedProperties.Uzytkownik = "" then oUserDefinedProperties.Uzytkownik = "nieznany"

W dokumencie dodałem właściwość "Uzytkownik" powyższym kodem nadałem tam wartość "nieznany".
Dzięki takiemu rozwiązaniu mogłem dodać opcję logowania. Oczywiście dla chcącego nic trudnego, ktoś obeznany może zmienić tą wartość bez makra. :|
Jeśli chodzi o współużytkowanie niestety nie mam na to żadnego prostego pomysłu. Jak plik jest u kogoś otwarty to zazwyczaj dostaję komunikat o niemożliwości otwarcia pliku, ew. otwiera w trybie tylko do odczytu.
Jeśli chodzi o zapisanie logu rejestru w innym arkuszu to jest to możliwe:

Kod: Zaznacz cały

Doc=ThisComponent
  Ark = Doc.Sheets.getByName("Arkusz1")     ' definicja arkusza
  Ark.getCellByPosition(0, 0).string   =  "Witaj"     'definicja pozycji   
Czyli do Arkusza1 do pozycji (0,0) został wpisany tekst "Witaj", pozycja(0,0) to tak naprawdę komórka A1. Zmieniając w kodzie nazwę arkusza i pozycję można dowolnie zmieniać punkt docelowy.
W załączniku nowa wersja pliku. Eksperymentowałem z wielostronicowym (bo są aż dwie) oknem dialogowym. Strona 1 to wcześniejsze okno już znane, strona 2 to okno logowania. Mam nadzieję, że dasz radę rozeznać się tym...
---------------------------------
Edit:
W makrze haslo_ok zalecam zamienić linijkę:

Kod: Zaznacz cały

print "wybierz użytkownika"
na:
MsgBox "wybierz użytkownika",0
Polecenie print wyświetla okno komunikatu, ale posiada również przycisk anuluj, którego naciśniecie powoduje przerwanie wykonywanie makra i przejście do okna BASIC, w zamienniku tego efektu nie ma.
Print jakoś łatwiej mi się pisze :lol:
Ostatnio zmieniony pt lip 10, 2020 7:39 am przez Rafkus, łącznie zmieniany 1 raz.
Powód: Usunięty plik, nowsza wersja jest poniżej
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Blokada arkusza po zapisie

Post autor: Jermor »

Najpierw o logowaniu. @andro masz rację. Najlepiej aby każdy użytkownik przedstawił się systemowi.
Ja w swoich rozważaniach skupiłem się, chyba niepotrzebnie, na użytkowniku oprogramowania, czyli na kogo ono jest zarejestrowane. A jak słusznie zauważyłeś użytkownik może próbować dodawać pozycje z dowolnego stanowiska.
Stąd powinien istnieć wykaz identyfikatorów i haseł dla osób upoważnionych. To rodzi jednak kolejne zadania. Powinien istnieć moduł kontrolujący kto otwiera dokument i dopuszczający do jego użytkowania. Ponadto należy opracować jakiś system zmiany haseł.To nawet nie jest jakoś nadzwyczajnie trudne. W najprostszym przypadku loginy jak i hasła mogą być przechowywane bezpośrednio w makrach.
Aby uniknąć możliwości nieupoważnionego dostępu do tych danych całość oprogramowania powinna zostać zapisane w bibliotece o własnej nazwie. Powinno to się zrobić choćby z tego powodu, że makro używa polecenia zdejmowania i nakładanie ochrony hasłem a hasło to jest w tym wypadku jawnie podawane jako parametr tej czynności. Tylko biblioteki, które mają nazwę inną niż "Standard" mogą być chronione oddzielnym hasłem. To sprawi, że dostęp do takich bibliotek (w celu ich edycji bądź tylko podglądu) jest ograniczony.
Jermor pisze:Po wypełnieniu formatki, powinien być otwierany plik arkusza rejestrowego...
Mam tu na myśli, że istnieje plik rejestru, nie zawierający żadnych makr. To co mamy w tej chwili, jest tylko modułem rejestrującym (formatką). Jest to samodzielny plik do wykorzystania na przewidzianych do tego stanowiskach. Po wprowadzeniu i zatwierdzeniu danych, makro otwiera ten właściwy rejestr i w nim, na końcu dopisuje wprowadzone dane, po czym rejestr zostaje zapisany i zamknięty. W ten sposób każdy, kto na swoim stanowisku wypełnia formatkę i ją zatwierdza, dopisuje wprowadzone dane zawsze na końcu rejestru. Plik formatki może pełnić rolę logu, czyli kopii wprowadzonych danych. Nawet gdy osoba niepowołana podejrzy loginy umieszczone w logu, nie może ich wykorzystać nie znając haseł.

@Rafkus słusznie zauważa, że plik, który jest już otwarty przez innego użytkownika, nie może być ponownie otwarty do "pełnego" wykorzystywania. Można go otworzyć w trybie "tylko do odczytu". Ale w parametrach "Narzędzia -> Współużytkuj arkusz kalkulacyjny..." można ustawić możliwość równoległej pracy wielu użytkowników na tym samym arkuszu. Przy czym "tym samym" oznacza pracę na kopii pobranego arkusza. Opis jak to funkcjonuje można przeczytać wywołując przycisk "Pomoc" w oknie dialogowym otwartym wyżej wspomnianym poleceniem.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Co do zabezpieczeń danych użytkowników - w zupełności @Jermor masz rację. Fajnie byłoby, aby taką funkcjonalność Rejestr posiadał. Co prawda działa to i tak, jednak w praktyce zawsze się znajdzie człowiek, który będzie chciał dowiedzieć się więcej, niż powinien wiedzieć.
Co do wielodostępu, to spokojnie może to tak funkcjonować, jak zrobił @Rafkus w swoim ostatnim pliku. Właśnie przetestowałem to i widzę, że próbujący wejść do Rejestru zajętego przez innego użytkownika, otrzymuje tak, jak piszecie stosowny komunikat, łącznie z nazwą użytkownika. Jeśli mowa o nazwie, to jest to nazwa użytkownika wewnętrznej sieci firmy. Nie ma to co prawda spójności z naszymi tu użytkownikami, ale w zupełności to wystarcza. Chociaż może to i dobrze, bo może się tak zdarzyć, chociaż nie powinno, że ktoś inny będzie zalogowany do sieci, a ktoś inny zarejestruje w Rejestrze. No ale to oczywiście z punktu widzenia pracodawcy jest niedozwolone.
@Rafkus prześledziłem Twój ostatni plik pod kontem zmiany miejsca logów Rejestru. Zmodyfikowałem makro i coś mi wyszło, no ale oczywiście biorąc pod uwagę mój zasób wiedzy, nie do końca.
Otóż log przeniosłem do nowego Arkusza o nazwie "log", jednak rozsypała mi się ochrona Rejestru. Arkusz z logiem jest chroniony, natomiast sam Rejestr już nie.
W załączeniu przesyłam zmodyfikowany plik
Załączniki
Kopia Rejestr - logowanie2.ods
(19.84 KiB) Pobrany 249 razy
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Przejrzałem twoje zmiany, pozwolę je sobie zamieścić aby omówić błędy. W celu łatwiejszego wyjaśnienia ponumerowałem je, kropkami zastąpiłem elementy tymczasowo niepotrzebne.

Kod: Zaznacz cały

Sub Rejestr 	'przycisk zapisz w dialogboksie		'
 ...
  'Arkusz kalkulacyjny
2.  Doc=ThisComponent
3.  Ark = Doc.Sheets.getByName("Arkusz1") 
...
4.  Ark.unprotect("abc")		'deaktywacja ochrony arkusza, wymagana w OO
...
5.    Doc=ThisComponent  
6.  Ark = Doc.Sheets.getByName("log")     ' definicja arkusza
7.  Ark.getCellByPosition(0, 0).string   =  "Witaj"     'definicja pozycji
9.  Ark.protect("abc")		'aktywacja ochrony arkusza, wymagana w OO
10.  Ark.getCellByPosition(k, i).string = kto	'kto zapisał
11.  Ark.getCellByPosition(k+1, i).string = now		'kiedy zapisano/edytowano
...
End Sub
ad 5. Niepotrzebnie definiujesz tą zmienną BO została zdefiniowana wcześniej - w punkcie 2

Ad. 3 i 6. Pod jedną zmienną "Ark" definiujesz dwa różne arkusze. Tutaj wyjątkowo może tak być bo najpierw były zrobione wszystkie zadania w arkuszu 1, a następnie są robione są wszystkie zadania w arkuszu 2. A co by było gdybyś chciał dodać do siebie jakieś dwie wartości z obydwu arkuszy? Miałbyś problem. W takim przypadku powinieneś ustawić zmienne osobno dla każdego arkusza np "Ark1" i "Ark2"

Ad.4 i 9. Powiązane z poprzednim wyjaśnieniem. Wyłączasz ochronę arkusza 1 a włączasz ochronę w arkuszu 2. A gdzie włączenie ochrony w arkuszu 1 i wyłączenie w 2? Ochrona nie ciągnie się od 1 do 2

Ad. 10 i 11. Próbujesz wstawić dane do komórek które dosłownie przed chwilą zablokowałeś. Ponadto czy zdajesz sobie sprawę co oznaczają literki k oraz i ?? Są to zmienne wyliczone wcześniej:
- i - jest to numer znalezionego pierwszego pustego wiersza w arkuszu 1. Może warto by było znaleźć taki wiersz osobno dla arkusza 2?
- k - wyznaczony numer kolumny do wpisu w Arkuszu 1. Tam po kolei wpisywałeś odpowiednio do kolumn: 0 (czyli A), 1( B), 2 (C), 3 (D) no i 4 (E). Dlatego masz wpisy odpowiednio do kolumny 5 i 6 w arkuszu2. Może warto zatem zamiast k wpisać odpowiednio 0 oraz 1??

Poniżej całe poprawione makro

Kod: Zaznacz cały

Sub Rejestr 	'przycisk zapisz w dialogboksie		'
 Dim Doc As Object 
 Dim Ark as Object
  for i=1 to 5		'test czy wszystkie kontrolki zostały uzupełnione
    If Dlg.getControl("TextBox" & i).text = "" Then
       MsgBox "Uzupełnij dane w formularzu. Poz: " & dlg.getControl("Label" & i).text, 48, "Informacja"
       Exit Sub
    End If
  next i
  'Arkusz kalkulacyjny
  Doc=ThisComponent
  Ark = Doc.Sheets.getByName("Arkusz1") 
  if Dlg.getControl("CheckBox1").state=0 then
    i=1+getLastUsedRow(Ark) 	'wpisy do nowego wiersza
  else i=getLastUsedRow(Ark)	'modyfikacja ostatniego wiersza
  end if
   
  Ark.unprotect("abc")		'deaktywacja ochrony arkusza, wymagana w OO
  for k=0 to 4		'wstawienie danych do arkusza
   'Nie znam jakie wartości są wprowadzane do arkusza tekst? liczba?
   'jeżeli zmienne tekstowe to mają być wprowadzane przy pomocy tego polecenia:
      Ark.getCellByPosition(k, i).string = Dlg.getControl("TextBox" & k+1).text
   'liczby wprowadzamy przy pomoct poniższego polecenia:   
      'Ark.getCellByPosition(k, i).Value = Dlg.getControl("TextBox" & k+1).text
   next k  
  Ark.protect("abc")		'aktywacja ochrony arkusza, wymagana w OO     

  Ark = Doc.Sheets.getByName("log")     ' definicja arkusza2  
  Ark.unprotect("xyz")		'deaktywacja ochrony arkusza, tak sobie zmieniłem hasło
  i=1+getLastUsedRow(Ark) 	'zmienna i szuka pierwszego  wolnego wiersza
  Ark.getCellByPosition(3, 0).string   =  "Witaj"     'definicja pozycji D1 - w zasadzie to niepotrzebne ;-)
  Ark.getCellByPosition(0, i).string = ktos		'kto zapisał do jakiejś ostatniej komórki A
  Ark.getCellByPosition(1, i).string = now		'kiedy zapisano/edytowano; do jakejś ostatniej komórka B 
  Ark.protect("xyz")		'aktywacja ochrony arkusza, tak sobie zmieniłem hasło bo czy musi być takie same? :D  
  Dlg.endExecute()    'zamknięcie okna dialogowego
End Sub
PS. ad 7. to oczywiście jest zbędne :mrgreen: ad 1 i 8. byłem głodny więc zjadłem :lol:
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Dokonałem z wszelką starannością podmiany tej części makra, co prawda zakłada ochronę na obydwu arkuszach, jednak wyświetla błąd

Błąd uruchomieniowy języka BASIC.
'1'

Type: com.sun.star.lang.IllegalArgumentException
Message:

p.s. Trochę rozjaśnił mi Twój mały wykład. Doceniam nie tylko, że to robisz, ale przede wszystkim jak próbujesz przekazać swoją wiedzę.
Niestety są w tym też i złe strony, bo uświadomiłeś mi ile muszę się nauczyć ... :crazy:
Na marginesie, jakbyś podrzucił jakąś lekturę w tym zakresie.......(oczywiście dla mocno opornych :D )
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Swoją wiedzę zdobywam właśnie tu na tym forum, gdzieś kiedyś tutaj znalazłem link:
https://wiki.openoffice.org/wiki/Docume ... ASIC_Guide niestety strona w języku angielskim ale translator google pomaga,
a tu taka podstawowa wiedza o programowaniu w VBA w naszym języku:
ftp://ftp.kis.p.lodz.pl/pub/people/P.Ur ... lBasic.pdf
http://il.pw.edu.pl/~iap/IAPZ/vbkurs/iso2/index.htm

Korzystam też z rozszerzenia MRI pomaga pisać makra, przynajmniej w bazach danych - bez odpowiednich makr w formularzach miałbym sporo klikania, kopiowania i wklejania. A od formularzy to już jest całkiem blisko do okien dialogowych.
Co prawda sporo nerwów mnie on kosztował nim nauczyłem się jak się go używać (co najmniej 3 razy się poddawałem i go odinstalowywałem), on również jest obcojęzyczny.

Co do kodu to już patrzę u mnie działa, ale znalazłem błąd gdzieś indziej. Zapomniałem, że trzeba poprawić również możliwość Edycji ostatniego wiersza...
No i usunięcia...

proszę, oto kolejna wersja
Załączniki
Kopia Rejestr - logowanie3.ods
Dołączyłem plik
(21.59 KiB) Pobrany 251 razy
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Wszystko działa, jak należy. Bardzo Ci dziękuję, za materiały szkoleniowe również. Na pewno skorzystam.
Cóż... pora brać się za tworzenie właściwego Rejestru. Trochę mnie przeraża ilość (ok 20 kolumn), które trzeba "opatrzeć" stosownym formularzem. Nie wspomnę, że tych Rejestrów jest kilka. No ale noce długie, więc..... :)
Na marginesie: zajmujesz się tylko OO/LO, czy też pisaniem makr w Excelu?

Może to pytanie bardziej do kolegi @Jermor (ze względu na "rzucenie" pomysłu),jak też oczywiście do Ciebie @Rafkus, czy znajdziecie trochę czasu na to, o czym pisał w swoim ostatnim poście właśnie @Jermor, a mianowicie modyfikacji przechowywania danych logowania w oddzielnej bibliotece i tam ich ochrony. Takie rozwiązanie w moim mniemaniu byłoby znacznie bezpieczniejszym, tym bardziej, że różni ludzie będą to użytkować.
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Jeśli chodzi o nową bibliotekę:
z menu Narzędzia wybierz Makra ---> Zarządzaj makrami --->OpenOffice Basic
Kliknij przycisk Zarządzaj
W otwartym oknie przejdź na kartę Biblioteki, wybierz w Położeniu gdzie chcesz mieć nową bibliotekę, kliknij przycisk Nowy, jeśli chcesz to wymyśl jakąś nazwę i OK. Tak utworzonej bibliotece możesz nadać jakieś hasło. Przejdź na kartę moduły znajdź tam katalog ze swoją biblioteką i kliknij edytuj i ... możesz tam tworzyć własne makra.

Co do pliku rejestru to sam z chęcią poczytam jak taki zrobić.

Dołączam znowu plik z dwoma bibliotekami (wcześniejszą wersję), dodałem drugi przycisk otwiera on ten sam formularz ale jest on wraz z innymi makrami zapisany w nowej bibliotece "raz". Polecam przeprowadzić test:
Uruchomić formularz, NIE wybierać użytkownika tylko od razu kliknąć Zaloguj a w wyskakującym komunikacie kliknąć Anuluj. Podziwiaj różnice.
Załączniki
Kopia Rejestr - Kopia-3b.ods
(28.99 KiB) Pobrany 299 razy
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Nooooo, miałem to już z dawno powiedzieć: jest to totalna wirtuozeria, która ma tu miejsce. O to chodziło, bardzo dziękuję
Jak będziesz miał inne tego typu smaczki, to bardzo proszę :D
Rozumiem, że pozostawienie "starych" bibliotek i formularza, to tak w na zapas?
Co do logów, to jeśli Arkusz logów będzie ukryty i na dodatek chroniony, to spokojnie można to odpuścić. Nie oznacza, to, że ów torcik nie może mieć wisienki ;)
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

do poprzedniego postu: Najpierw spróbuj uruchomić formularz z biblioteki raz.
PS. Nie używam exela więc go nie znam. Ciekawy projekcik.
_____________________
Pozostawiłem stare biblioteki tylko tak dla testów w jednym plików, oczywiście można je usunąć.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
andro
Posty: 29
Rejestracja: ndz gru 30, 2018 3:34 am

Re: Blokada arkusza po zapisie

Post autor: andro »

Uczyniłem, jak sugerujesz w poprzednim poście (zaloguj, anuluj itd). Otrzymałem poniższy komunikat

Błąd uruchomieniowy języka BASIC.
Proces przerwany przez użytkownika.

Wybierając stary formularz i postępując analogicznie, otrzymałem ten sam komunikat z tym, że jednocześnie otworzyła biblioteka z makrami.
Nie wiem, może będąc przed kawą, coś knocę.
libreoffice 6.1.4.2 Win 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Blokada arkusza po zapisie

Post autor: Rafkus »

Jest dobrze, właśnie o to chodziło. Tworząc własną bibliotekę z zabezpieczoną hasłem NIE OTWIERA okno basic, a co za tym idzie nikt nie znający hasła do biblioteki nie podejrzy innych ważnych danych (haseł logowania i ochrony arkuszy) - Dzięki @Jermor, właśnie dowiedziałem się czegoś nowego :D

Jeśli chodzi o komunikat:
Rafkus pisze:W makrze haslo_ok zalecam zamienić linijkę:

Kod: Zaznacz cały

print "wybierz użytkownika"
na:
MsgBox "wybierz użytkownika",0
Polecenie print wyświetla okno komunikatu, ale posiada również przycisk anuluj, którego naciśniecie powoduje przerwanie wykonywanie makra i przejście do okna BASIC, w zamienniku tego efektu nie ma.
Print jakoś łatwiej mi się pisze :lol:
Ps. W pliku "Kopia Rejestr - Kopia-3b.ods" kolumny logowania Kto i Kiedy są ukryte.Bez odblokowanego arkusza nikt ich nie zobaczy. Może takie rozwiązanie wystarczy?
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
ODPOWIEDZ