====== LibreOffice Base ====== ===== Relacje ===== Ogólnie w bazach relacyjnych występują cztery podstawowe typy relacji między tabelami. Znajomość sposobu działania tych relacji da możliwość użytkowania LO Base. Znając konstrukcje tych czterech typów relacji (1:1, 1:M, M:1, M:N), możesz stworzyć praktycznie każdą strukturę bazy danych! Bazy relacyjne działają na tych fundamentalnych zasadach, a bardziej skomplikowane modele to po prostu kombinacje tych relacji. ==== Relacja 1:1 (jeden do jednego) ==== Każdy rekord w tabeli A ma dokładnie jeden odpowiadający rekord w tabeli B i odwrotnie. **Przykład:** * uzytkownicy (id, imie, nazwisko) * profile (id, uzytkownik_id, adres, telefon) **Zastosowanie:** gdy dodatkowe dane są opcjonalne i rzadko używane. ==== Relacja 1:M (jeden do wielu) ==== Jeden rekord w tabeli A może być powiązany z wieloma rekordami w tabeli B, ale każdy rekord w B odnosi się tylko do jednego rekordu w A. **Przykład:** * miejscowosci (id, nazwa) * mieszkancy (id, imie, nazwisko, miejscowosc_id) **Zastosowanie:** gdy wiele rekordów może być powiązanych z jednym nadrzędnym rekordem (np. mieszkańcy w miejscowości). ==== Relacja M:1 (wiele do jednego) ==== To właściwie to samo co 1:M, tylko patrzymy z drugiej strony. Każdy rekord w tabeli B należy do jednego rekordu w tabeli A. **Przykład:** * Jeden miejscowosc_id w mieszkancy może mieć wielu mieszkańców. * To po prostu perspektywa tabeli mieszkancy w relacji 1:M. ==== Relacja M:N (wiele do wielu) ==== Jeden rekord w tabeli A może być powiązany z wieloma rekordami w tabeli B, a jeden rekord w tabeli B może być powiązany z wieloma rekordami w tabeli A. **Przykład:** * uczniowie (id, imie, nazwisko) * przedmioty (id, nazwa) **Tabela pośrednia:** uczniowie_przedmioty (uczen_id, przedmiot_id) **Zastosowanie:** np. uczniowie zapisani na wiele przedmiotów. ===== Tworzenie raportu ===== ==== Opcja "Trzymaj razem" ==== Opcja ''Trzymaj razem / Keep Together'' nie działa zgodnie z oczekiwaniami dla sekcji ''szczegóły'' i że utworzenie nowej grupy w oparciu o rekord rozwiązuje problem. W takim przypadku możemy przejść przez kroki tworzenia nowej grupy w raporcie LibreOffice Base, która zagwarantuje, że sekcje szczegółów zostaną razem. === Kroki do utworzenia nowej grupy w raporcie === 1. **Otwórz raport w trybie edycji**: - Wybierz raport w sekcji "Raporty" i kliknij "Edytuj". 2. **Utwórz nową grupę**: - Wybierz zakładkę "Raport". - Kliknij na "Wstaw grupę". 3. **Wybierz pole do grupowania**: - Wybierz pole, które chcesz użyć do grupowania (np. ID rekordu, jeśli jest unikalny dla każdego rekordu). - Upewnij się, że opcja ''Trzymaj razem'' jest zaznaczona dla tej nowej grupy. 4. **Przenieś sekcję szczegółów do nowej grupy**: - Upewnij się, że sekcja szczegółów jest częścią nowo utworzonej grupy. - Sprawdź, czy wszystkie dane, które mają być utrzymywane razem, znajdują się w tej sekcji. === Przykład === Załóżmy, że masz raport, który wyświetla szczegóły transakcji. Chcesz, aby wszystkie szczegóły dotyczące pojedynczej transakcji były trzymane razem na jednej stronie. === Krok 1: Otwórz raport w trybie edycji === - Otwórz swój raport w trybie edycji. === Krok 2: Utwórz nową grupę === 1. **Wybierz zakładkę "Raport"**: - Przejdź do zakładki "Raport". 2. **Kliknij "Wstaw grupę"**: - Kliknij na przycisk "Wstaw grupę". 3. **Wybierz pole do grupowania**: - Wybierz pole, które identyfikuje unikalnie każdy rekord (np. ID rekordu). - Upewnij się, że zaznaczona jest opcja "Trzymaj razem" dla tej grupy. === Krok 3: Przenieś sekcję szczegółów do nowej grupy === 1. **Przenieś sekcję szczegółów**: - Upewnij się, że wszystkie elementy, które mają być utrzymywane razem, znajdują się w sekcji szczegółów nowej grupy. === Krok 4: Sprawdź i wygeneruj raport === 1. **Zapisz zmiany**: - Zapisz zmiany w raporcie. 2. **Wygeneruj raport**: - Sprawdź, czy sekcje szczegółów są trzymane razem na jednej stronie zgodnie z oczekiwaniami. === Podsumowanie === Tworzenie nowej grupy w oparciu o unikalne pole (np. ID rekordu) i korzystanie z opcji "Trzymaj razem" w tej grupie to skuteczny sposób na zapewnienie, że dane w sekcji szczegółów są trzymane razem na jednej stronie. Dzięki temu rozwiązaniu możesz skutecznie zarządzać układem raportu, unikając niepożądanych podziałów danych na różne strony. ===== Formularze ===== ==== Makro otwierania i zamykania formularza ==== Przydatne jeżeli chcemy pod przyciskiem utworzyć akcje zamknięcie aktualnie otwartego formularza a jednocześnie otworzenie nowego. Po dodanie skryptu pod ''właściwościami formantu'' przycisku w polu ''dodatkowe informacje'' wpisujemy ''TBLAUTOR;TBLKSIAZKA''. W tym przypadku zostanie zamknięty formularz ''TBLKSIAZKA'' a następnie otwarty formularz ''TBLAUTOR''. W zakładce ''Wydarzenia'' i polu ''Wykonaj akcję'' wybieramy nasze makro ''Standard.Module1.OpenAndCloseForm_FromTag (document, Basic)''. Działanie to jest przydane przy wypełnianiu danych tabel z relacją wiele do wielu. Jeżeli chcemy pozostawić otwarty formularz ''TBLKSIAZKA'' w polu ''dodatkowe informacje'' wystarczy wpisać ''TBLAUTOR;'' i pominąć nazwę zamykanego formularza. Poniższe makro działa uniwersalnie na wszystkie formularze. Sub OpenAndCloseForm_FromTag(oEvent As Object) Dim oButton As Object Dim sTagContent As String Dim sTargetFormName As String Dim sFormToCloseName As String Dim oFormToOpen As Object Dim oFormToClose As Object ' Pobierz zawartość pola Etykieta danych (Tag) oButton = oEvent.Source.Model sTagContent = Trim(oButton.Tag) If sTagContent = "" Then MsgBox "Nie podano nazw formularzy w polu 'Etykieta danych'." Exit Sub End If ' Podziel dane z pola Tag wg średnika Dim aParts() As String aParts = Split(sTagContent, ";") If UBound(aParts) < 0 Then MsgBox "Brak poprawnych nazw formularzy w polu 'Etykieta danych'." Exit Sub End If sTargetFormName = Trim(aParts(0)) ' formularz do otwarcia If UBound(aParts) >= 1 Then sFormToCloseName = Trim(aParts(1)) ' formularz do zamknięcia Else sFormToCloseName = "" ' brak drugiego formularza End If ' Otwórz docelowy formularz On Error GoTo OpenError oFormToOpen = ThisDatabaseDocument.FormDocuments.getByName(sTargetFormName) oFormToOpen.open On Error GoTo 0 ' Zamknij formularz, jeśli podano jego nazwę If sFormToCloseName <> "" Then On Error GoTo CloseError oFormToClose = ThisDatabaseDocument.FormDocuments.getByName(sFormToCloseName) oFormToClose.close(True) On Error GoTo 0 End If Exit Sub OpenError: MsgBox "Nie udało się otworzyć formularza: " & sTargetFormName Resume Next CloseError: MsgBox "Nie udało się zamknąć formularza: " & sFormToCloseName Resume Next End Sub