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.
Każdy rekord w tabeli A ma dokładnie jeden odpowiadający rekord w tabeli B i odwrotnie.
Przykład:
Zastosowanie: gdy dodatkowe dane są opcjonalne i rzadko używane.
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:
Zastosowanie: gdy wiele rekordów może być powiązanych z jednym nadrzędnym rekordem (np. mieszkańcy w miejscowości).
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 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:
Tabela pośrednia: uczniowie_przedmioty (uczen_id, przedmiot_id)
Zastosowanie: np. uczniowie zapisani na wiele przedmiotów.
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.
1. Otwórz raport w trybie edycji:
2. Utwórz nową grupę:
3. Wybierz pole do grupowania:
Trzymaj razem jest zaznaczona dla tej nowej grupy.4. Przenieś sekcję szczegółów do nowej grupy:
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.
- Otwórz swój raport w trybie edycji.
1. Wybierz zakładkę „Raport”:
2. Kliknij „Wstaw grupę”:
3. Wybierz pole do grupowania:
1. Przenieś sekcję szczegółów:
1. Zapisz zmiany:
2. Wygeneruj raport:
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.
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