Calc – współdzielenie pliku
Calc – współdzielenie pliku
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
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 305 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
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
Re: Blokada arkusza po zapisie
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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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
Re: Blokada arkusza po zapisie
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
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
Re: Blokada arkusza po zapisie
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)
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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
Wstawiłem moje makro do twojego pliku, możesz sprawdzić efekt.
Plik został zapisany w OO
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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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ę.
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
Re: Blokada arkusza po zapisie
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.
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.
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.
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.
Re: Blokada arkusza po zapisie
Z ciekawości uruchomiłem i dostałem komunikat:
------------------------
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ć)??
wyskakuje on przy linijceBłąd uruchomieniowy języka BASIC.
Nie zdefiniowano procedury lub funkcji.
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
Z rozpędu, bo u mnie działało opuściłem taki kod:
Dim oLibs As Object
Formalnie wystarczyłoby wpisać:
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.
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
Kod: Zaznacz cały
GlobalScope.BasicLibraries.LoadLibrary("Tools")
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.
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.
Re: Blokada arkusza po zapisie
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")
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.
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.
Re: Blokada arkusza po zapisie
@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?
Ż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
Re: Blokada arkusza po zapisie
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.
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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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.
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 280 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.
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.
Re: Blokada arkusza po zapisie
@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ę.
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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.
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.
Re: Blokada arkusza po zapisie
Dziękuję Wam za zainteresowanie i pomoc. Jutro sprawdzę, jak to wszystko działa w rzeczywistym środowisku.
libreoffice 6.1.4.2 Win 10
Re: Blokada arkusza po zapisie
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….?
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
Re: Blokada arkusza po zapisie
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ść.
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:
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ę:
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
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
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
Print jakoś łatwiej mi się pisze
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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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.
@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.
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.
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ł.Jermor pisze:Po wypełnieniu formatki, powinien być otwierany plik arkusza rejestrowego...
@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.
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.
Re: Blokada arkusza po zapisie
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
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 255 razy
libreoffice 6.1.4.2 Win 10
Re: Blokada arkusza po zapisie
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.
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
PS. ad 7. to oczywiście jest zbędne ad 1 i 8. byłem głodny więc zjadłem
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. 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
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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ć ...
Na marginesie, jakbyś podrzucił jakąś lekturę w tym zakresie.......(oczywiście dla mocno opornych )
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ć ...
Na marginesie, jakbyś podrzucił jakąś lekturę w tym zakresie.......(oczywiście dla mocno opornych )
libreoffice 6.1.4.2 Win 10
Re: Blokada arkusza po zapisie
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
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 258 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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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ć.
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
Re: Blokada arkusza po zapisie
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.
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 305 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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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ę
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
Jak będziesz miał inne tego typu smaczki, to bardzo proszę
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
Re: Blokada arkusza po zapisie
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ąć.
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Blokada arkusza po zapisie
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ę.
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
Re: Blokada arkusza po zapisie
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
Jeśli chodzi o komunikat:
Jeśli chodzi o komunikat:
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?Rafkus pisze:W makrze haslo_ok zalecam zamienić linijkę: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.Kod: Zaznacz cały
print "wybierz użytkownika" na: MsgBox "wybierz użytkownika",0
Print jakoś łatwiej mi się pisze
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP