Potrzebne tabele MS Access
Na poprzednich stronach • Zbiór WMRODZ, • Zbiór TERC, • Zbiór SIMC, • Zbiór ULIC przedstawiłem sposób przetwarzania plików *.XML za pomocą biblioteki Microsoft XML,v6.0. Dla dwóch największych plików zawierających zbiór SIMC oraz zbiór ULIC biblioteka Microsoft XML,v6.0 niezbyt się sprawdziła ze względu na bardzo długi czas przetwarzania i zapisu danych do tabel. Dlatego w celu pobranie danych z tych plików zostały użyte wbudowane funkcje tekstowe VBA.
Według mojego projektu mającego na celu zapis wszystkich danych w „Relacyjnej bazie danych MS Access” dla każdego pliku trzeba utworzyć co najmniej jedną tabelę:
- Plik WMRODZ.xml wymaga jednej tabeli:
- • tblWMRodz,
- Plik SIMC.xml wymaga czterech tabel:
- • tblRodz_Gmi,
- • tblWojewodztwa,
- • tblPowiaty,
- • tblTERC_Gminy,
- Plik TERC.xml wymaga jednej tabeli:
- • tblSIMC_Miejscowosci,
- Plik ULIC.xml wymaga dwóch tabel:
- • tblULIC_Nazwy,
- • tblULIC_Ulice,
Wszystkie tabele powinny zawierać indeks podstawowy (Primry Key) i zostać połączone Relacjami
wymuszającymi integralność danych. Wszystkie pola tabel, za wyjątkiem pola tNazwa_2 w tabeli tblULIC_Nazwy,
są wymagane (muszą zawierać dane).
Najprościej jest dla każdej tabeli napisać procedurę, za pomocą której utworzymy tabelę, dodamy do niej pola, ustawimy wymagane
właściwości pól tabeli. Mając utworzone tabele ustawiamy Relacje pomiędzy polami tabel i po robocie.
Słów kilka o module klasy
Zamiast wielokrotnie pisać taki sam, lub bardzo podobny kod dla 8-miu tabel, łatwiej i prościej będzie utworzyć moduł klasy
(klasę) clsTeryt, zawierającą właściwości i metody za pomocą których w prosty sposób będziemy mogli
wykonać wyżej opisane czynności.
Aby wstawić do naszego projektu moduł klasy należy w oknie edytora VBA wybrać z menu pozycję „Insert”
i następnie kliknąć na podmenu „Class Module”.
lub po kliknięciu prawym przyciskiem myszy w oknie Eksplorator projektu „Project” wybrać z menu podręcznego pozycję „Insert”, a potem pozycję „Class Module”.
Następnie w oknie właściwości nowo wstawionego modułu klasy „Properties Class1” nadajemy właściwości Name wartość clsTeryt. Od tej pory będziemy się mogli odwoływać do naszej klasy za pomocą jej nazwy clsTeryt.
Klasa clsTeryt
Poniżej przedstawiam spis metod jakie oferuje klasa clsTeryt, za pomocą których możemy utworzyć nową tabelę, dodać do niej nowe pola określonego typu i rozmiaru (dla pól tekstowych), utworzyć klucz podstawowy tabeli oraz utworzyć indeksy na wybranych polach. Pomiędzy tabelami możemy utworzyć Relacje wymuszające integralność referencyjną danych tj. „kaskadową aktualizację pól pokrewnych” oraz „kaskadowe usuwanie rekordów pokrewnych”.
Metody klasy clsTeryt
• Metoda
terytCreateTable(sTableName As String) As Boolean
tworzy nowy obiekt TableDef, (nową tabelę o nazwie sTableName). Należy zauważyć, że tabela ta nie jest jeszcze zapisana w bazie, więc nie może być widoczna w oknie bazy danych.
• Metoda
terytCreateField( _
sFieldName As String, _
iType As Long, _
Optional lSize As Integer = 0, _
Optional fRequired As Boolean = True, _
Optional fAllowZeroLength As Boolean = False) As Boolean
tworzy nowy obiekt Field określonego typu i rozmiaru (dla pola tekstowego),
ustawia właściwość Required i AllowZeroLength, następnie dołącza obiekt Field
do kolekcji Fields obiektu TableDef (m_tdf).
Innymi słowy, tworzy nowe pole sFieldName o określonym typie iType i rozmiarze lSize
w tabeli i określa, czy pole to jest Wymagane (fRequired) tzn. użytkownik musi wpisać jakieś dane
oraz czy dozwolony jest ciąg zerowej długości "" (fAllowZeroLength) tzn. użytkownik nie zna danych,
ale wpisuje "" co oznacza, że pole zostało edytowane i nie zawiera wartości Null.
• Metoda
terytAppendTable() As Boolean
dołącza obiekt TableDef (m_tdf) do kolekcji TableDefs obiektu Database (m_dbs). Tabela m_tdf o nazwie sTableName zostaje zapisana w bazie i jest widoczna w oknie bazy danych.
• Metoda
terytCreateIndex( _
sFieldName As String, _
Optional fPrimary As Boolean = False, _
Optional fUnique As Boolean = False) As Boolean
tworzy nowy obiekt Index typu Podstawowy, Unikatowy (bez Duplikatów) lub Indeks (Duplikaty OK). Utworzony obiekt Index dołącza do kolekcji Indexes obiektu TableDef (m_tdf).
• Metoda
terytCreateIndexMulti( _
sFieldName As String, _
Optional sFieldName1 As String = "", _
Optional sFieldName2 As String = "", _
Optional fPrimary As Boolean = False, _
Optional fUnique As Boolean = False) As Boolean
tworzy nowy, wielopolowy (maksymalnie 3 pola) obiekt Index typu Podstawowy, Unikatowy (bez Duplikatów) lub Indeks (Duplikaty OK). Utworzony obiekt Index dołącza do kolekcji Indexes obiektu TableDef (m_tdf).
• Metoda
terytCreateRelation( _
sPrimaryTableName As String, _
sPrimaryFieldName As String, _
sForeignTableName As String, _
sForeignFieldName As String, _
Optional fUpdateCascade As Boolean = False, _
Optional fDeleteCascade As Boolean = False) As Boolean
tworzy obiekt Relation pomiędzy polem sPrimaryFieldName tabeli podstawowej sPrimaryTableName i polem sForeignFieldName tabeli obcej sForeignTableName zapewniając integralność referencyjną. Następnie tworzy obiekt Field kolekcji Fields należącej do nowego obiektu Relation i dołącza obiekt Field do kolekcji Fields obiektu Relation. Ustawia atrybuty, wymuszające integralność referencyjną UpdateCascade („kaskadowo aktualizuj pola pokrewne”) lub (i) RelationDeleteCascade („kaskadowo usuń rekordy pokrewne”) tak by zmiany, lub usuwanie rekordów z powiązanych pól zostały wykonane z zachowaniem reguł. Utworzony obiekt Relation dołączany jest do kolekcji Relations obiektu Database (m_dbs).
• Metoda
terytDeleteAllRelations() As Boolean
usuwa wszystkie relacje w obiekcie Database m_dbs.
• Metoda
terytDeleteTable(sTableName As String) As Boolean
usuwa tabelę sTableName. Przed usunięciem tabeli sTableName sprawdza, czy usuwana tabela jest powiązana relacjami z innymi tabelami. Jeżeli tak, to usuwa wszystkie relacje, którymi powiązana jest tabela sTableName z innymi tabelami w obiekcie Database (m_dbs).
Właściwości klasy clsTeryt
• Właściwość
Property Get prpTableExists(sTableName As String) As Boolean
sprawdza w kolekcji TableDefs obiektu Database (m_dbs), czy tabela sTableName istnieje.
Kod klasy clsTeryt
Option Compare Database Option Explicit Dim m_dbs As DAO.Database Dim m_tdf As DAO.TableDef Dim m_fld As DAO.Field Private Const conClassName As String = "clsTeryt" Private Sub Class_Initialize() ' ustaw odwołanie do bieżącej bazy danych Set m_dbs = CurrentDb End Sub Private Sub Class_Terminate() ' zniszcz zmienne obiektowe Set m_fld = Nothing Set m_tdf = Nothing Set m_dbs = Nothing End Sub ' Metoda terytCreateTable(...) tworzy nowy obiekt TableDef (m_tdf) o nazwie sTableName Public Function terytCreateTable(sTableName As String) As Boolean ' utwórz nowy obiekt TableDef Set m_tdf = m_dbs.CreateTableDef(sTableName) terytCreateTable = True End Function ' Metoda terytCreateField(...) tworzy obiekt Field o nazwie sFieldName i dołącza ' utworzony obiekt Field do kolekcji Fields obiektu TableDef (m_tdf) ' argumenty: ' sFieldName ' nazwa pola, które ma być utworzone ' iType ' argument opcjonalny określający typ danych nowego obiektu Field. ' Dla wartości domyślnej lType = 0, przyjmowane jest domyślne ustawienia rozmiaru ' pola tekstowego. Może przyjmować jedną z predefiniowanych stałych: ' dbBinary, dbBoolean, dbByte, dbCurrency, dbDate, dbDecimal, dbDouble, dbGUID, ' dbInteger, dbLong, dbMemo, dbSingle, dbText, dbTime. ' lSize ' dla pola tekstowego (dbText) określa w bajtach maksymalny rozmiar pola sFieldName. ' Argument ten jest ignorowany dla pól numerycznych i pól o stałej szerokości. ' Dla wartości domyślnej lSize = 0 pola tekstowego, przyjmowana jest wartość domyślna ' rozmiaru pola (maksymalnie 255 bajtów). ' fRequired ' argument opcjonalny określający, czy obiekt Field może zawierać wartości Null. ' Dla wartości domyślnej fRequired = True, pole jest wymagane (nie może zawierać ' wartości Null) ' fAllowZeroLength ' argument opcjonalny określający, czy dopuszczalne jest ustawienie ciągu ' o długości zerowej ("") dla ' właściwości Value obiektu Field o typie danych Text lub Memo. ' Dla wartości domyślnej fAllowZeroLength = False, pole jest wymagane ' (nie może zawierać wartości Null) ' zwraca: ' Przy powodzeniu zwraca True ' autor: Zbigniew Bratko ' data: 30.03.2018 '============================================================================================= Public Function terytCreateField( _ sFieldName As String, _ iType As Long, _ Optional lSize As Integer = 0, _ Optional fRequired As Boolean = True, _ Optional fAllowZeroLength As Boolean = False) As Boolean If iType = dbText And lSize > 0 Then ' pole typu tekstowego o określonym rozmiarze Set m_fld = m_tdf.CreateField(sFieldName, iType, lSize) Else ' pole typu tekstowego o domyślnym rozmiarze Set m_fld = m_tdf.CreateField(sFieldName, iType) End If ' ustaw właściwość Required i AllowZeroLength obiektu Field (m_fld) With m_fld .Required = fRequired .AllowZeroLength = fAllowZeroLength End With 'dołącz utworzony obiekt Field (m_fld) do kolekcji Fields obiektu TableDef (m_tdf) m_tdf.Fields.Append m_fld terytCreateField = True End Function ' Metoda terytAppendTable(...) dołącza utworzony obiekt TableDef (m_tdf) ' do kolekcji TableDefs obiektu Database (m_dbs) Public Function terytAppendTable() As Boolean m_dbs.TableDefs.Append m_tdf terytAppendTable = True End Function ' Metoda terytCreateIndex(...) tworzy nowy obiekt Index typu Podstawowy, ' Unikatowy (bez duplikatów) lub Indeks (duplikaty OK). Utworzony indeks dołącza ' do kolekcji Indexes obiektu TableDef (m_tdf) ' argumenty: ' sFieldName ' nazwa pola, które ma być indeksowane ' fPrimary ' argument opcjonalny określający, czy indeks ma być indeksem (kluczem) podstawowym ' fUnique ' argument opcjonalny określający, czy indeks ma być indeksem unikatowym (bez duplikatów) ' zwraca: ' Przy powodzeniu zwraca True ' autor: Zbigniew Bratko ' data: 30.03.2018 '============================================================================================= Public Function terytCreateIndex( _ sFieldName As String, _ Optional fPrimary As Boolean = False, _ Optional fUnique As Boolean = False) As Boolean Dim idx As DAO.Index Dim sPrefixIndex As String ' ustaw prefiks nazwy indeksu If fPrimary Then sPrefixIndex = "Primary_" ElseIf fUnique Then sPrefixIndex = "Unique_" Else sPrefixIndex = "Index_" End If sPrefixIndex = sPrefixIndex & m_tdf.Name ' utwórz nowy indeks Set idx = m_tdf.CreateIndex(sPrefixIndex & "_" & sFieldName) With idx 'dołącz obiekt Field do kolekcji Fields obiektu Index (idx) .Fields.Append .CreateField(sFieldName) ' jeżeli indeks Podstawowy (klucz podstawowy) If fPrimary Then .Primary = fPrimary ' jeżeli indeks Unikatowy (bez duplikatów) If fUnique Then .Unique = fUnique ' jeżeli oba warunki nie, to utworzony zostanie indeks (Duplikaty OK) End With ' dołącz nowy obiekt Index (idx) do kolekcji Indexes obiektu TableDef (m_tdf) m_tdf.Indexes.Append idx terytCreateIndex = True End Function ' Metoda terytCreateIndexMulti(...) tworzy nowy, wielopolowy obiekt Index typu Podstawowy, ' Unikatowy (bez duplikatów) lub Indeks (duplikaty OK). Utworzony indeks dołącza ' do kolekcji Indexes obiektu TableDef (m_tdf) ' argumenty: ' sFieldName ' argument obowiązkowy, nazwa pierwszego pola, które ma być indeksowane ' sFieldName1, sFieldName2, ' argument opcjonalny, określający nazwę drugiego i trzeciego pola indeksu wielopolowego, ' jeżeli oba opcjonalne argumenty będą puste utworzony zostanie indeks pojedynczy. ' fPrimary ' argument opcjonalny określający, czy indeks ma być indeksem (kluczem) podstawowym ' fUnique ' argument opcjonalny określający, czy indeks ma być indeksem unikatowym (bez duplikatów) ' zwraca: ' Przy powodzeniu zwraca True ' autor: Zbigniew Bratko ' data: 30.03.2018 '============================================================================================= Public Function terytCreateIndexMulti( _ sFieldName As String, _ Optional sFieldName1 As String = "", _ Optional sFieldName2 As String = "", _ Optional fPrimary As Boolean = False, _ Optional fUnique As Boolean = False) As Boolean Dim idx As DAO.Index Dim sIndexName As String Dim sFieldNames() As String Dim i As Long ' ustaw prefiks nazwy indeksu If fPrimary Then sIndexName = "Primary_" ElseIf fUnique Then sIndexName = "Unique_" Else sIndexName = "Index_" End If sIndexName = sIndexName & m_tdf.Name ' zapisz nazwy pól w tablicy ReDim sFieldNames(0) sFieldNames(0) = sFieldName If Len(sFieldName1) > 0 Then ReDim Preserve sFieldNames(0 To 1) sFieldNames(1) = sFieldName1 End If If Len(sFieldName2) > 0 Then ReDim Preserve sFieldNames(0 To 2) sFieldNames(2) = sFieldName2 End If ' utwórz nazwę indeksu For i = LBound(sFieldNames) To UBound(sFieldNames) sIndexName = sIndexName & "_" & sFieldNames(i) Next ' utwórz nowy indeks Set idx = m_tdf.CreateIndex(sIndexName) With idx 'dołącz obiekty Field do kolekcji Fields obiektu Index (idx) For i = LBound(sFieldNames) To UBound(sFieldNames) .Fields.Append .CreateField(sFieldNames(i)) Next ' jeżeli indeks Podstawowy (klucz podstawowy) If fPrimary Then .Primary = fPrimary Else ' jeżeli indeks Unikatowy (bez duplikatów) If fUnique Then .Unique = fUnique ' jeżeli oba warunki nie, to utworzony zostanie indeks (Duplikaty OK) End If End With ' dołącz nowy obiekt Index (idx) do kolekcji Indexes obiektu TableDef (m_tdf) m_tdf.Indexes.Append idx terytCreateIndexMulti = True End Function ' Metoda terytCreateRelation(...) tworzy obiekt Relation pomiędzy polem sPrimaryFieldName ' tabeli podstawowej sPrimaryTableName i polem sForeignFieldName tabeli obcej sForeignTableName ' zapewniając integralność referencyjną. Następnie tworzy obiekt Field ' kolekcji Fields należącej do nowego obiektu Relation i dołącza obiekt Field ' do kolekcji Fields obiektu Relation. ' Ustawia atrybuty, wymuszające integralność referencyjną UpdateCascade ' (kaskadowo aktualizuj pola pokrewne) lub (i) RelationDeleteCascade ' (kaskadowo usuń rekordy pokrewne) tak by zmiany, lub usuwanie rekordów ' z powiązanych pól zostały wykonane z zachowaniem reguł. Utworzony obiekt ' Relation dołączany jest do kolekcji Relations obiektu Database (m_dbs). ' argumenty: ' sPrimaryTableName ' nazwa tabeli podstawowej ' sPrimaryFieldName ' nazwa pola tabeli podstawowej ' sForeignTableName ' nazwa tabeli obcej ' sForeignFieldName ' nazwa pola tabeli obcej ' fUpdateCascade ' argument opcjonalny określający, czy uaktualnianie będzie wykonywane kaskadowo. ' Jeżeli użytkownik zmieni zawartość powiązanych ze sobą pól (pól klucza ' głównego w tabeli nadrzędnej), zmiana ta będzie uwzględniona we wszystkich ' powiązanych tabelach. ' fDeleteCascade ' argument opcjonalny określający, czy usuwanie będzie wykonywane kaskadowo. ' Jeżeli użytkownik usunie rekord nadrzędny, to zostaną usunięte ' wszystkie powiązane rekordy pokrewne . ' zwraca: ' Przy powodzeniu zwraca True ' autor: Zbigniew Bratko ' data: 30.03.2018 '============================================================================================= Public Function terytCreateRelation( _ sPrimaryTableName As String, _ sPrimaryFieldName As String, _ sForeignTableName As String, _ sForeignFieldName As String, _ Optional fUpdateCascade As Boolean = False, _ Optional fDeleteCascade As Boolean = False) As Boolean Dim rel As DAO.Relation Dim fld As DAO.Field Dim sRelationName As String Dim lCascade As Long ' utwórz unikatową nazwę relacji sRelationName = sPrimaryTableName & "_" & sPrimaryFieldName & "_" & _ sForeignTableName & "_" & sForeignFieldName ' utwórz nowy obiekt Relation dla tabeli podstawowej i obcej Set rel = m_dbs.CreateRelation(sRelationName, sPrimaryTableName, sForeignTableName) ' ustaw atrybuty, wymuszające integralność referencyjną rel.Attributes = IIf(fUpdateCascade = True, dbRelationUpdateCascade, 0) Or _ IIf(fDeleteCascade = True, dbRelationDeleteCascade, 0) ' utwórz obiekt Field kolekcji Fields ' należącej do nowego obiektu Relation Set fld = rel.CreateField(sPrimaryFieldName) ' ustaw właściwości ForeignName obiektu Field tabeli obcej, ' który odpowiada polu w tabeli podstawowej fld.ForeignName = sForeignFieldName ' dołącz obiekt Field do kolekcji Fields nowego obiektu Relation rel.Fields.Append fld ' dołącz nowy obiekt Relation do kolekcji Relations obiektu Database (m_dbs) m_dbs.Relations.Append rel terytCreateRelation = True End Function ' usuwa wszystkie relacje w obiekcie Database m_dbs Public Function terytDeleteAllRelations() As Boolean Dim i As Long With m_dbs ' zacznij od końca usuwać obiekty Relation z kolekcji ' Relations obiektu Database (m_dbs_ For i = m_dbs.Relations.Count - 1 To 0 Step -1 .Relations.Delete .Relations(i).Name Next End With End Function ' usuwa tabelę sTableName. Przed usunięciem tabeli sprawdza, czy usuwana tabela jest ' powiązana relacjami z innymi tabelami. Jeżeli tak, to usuwa wszystkie relacje, którymi ' powiązana jest tabela sTableName z innymi tabelami w obiekcie Database (m_dbs). Public Function terytDeleteTable(sTableName As String) As Boolean Dim rel As DAO.Relation If Not prpTableExists(sTableName) Then ' tabela nie istnieje, nie ma co usuwać terytDeleteTable = True Exit Function End If ' sprawdź, czy usuwana tabela jest powiązana relacjami For Each rel In m_dbs.Relations With rel If StrComp(.Table, sTableName, vbTextCompare) = 0 Or _ StrComp(.ForeignTable, sTableName, vbTextCompare) = 0 Then ' usuń istniejącą relację m_dbs.Relations.Delete rel.Name End If End With Next ' usuń tabelę m_dbs.TableDefs.Delete sTableName terytDeleteTable = True End Function ' sprawdza w kolekcji TableDefs obiektu Database (m_dbs), czy tabela istnieje Public Property Get prpTableExists(sTableName As String) As Boolean Dim dbs As DAO.Database ' pułapkuj błąd wykonania dla nie istniejącej tabeli On Error Resume Next ' pobierz nazwę obiektu TableDef z kolekcji TableDefs prpTableExists = CBool(Len(m_dbs.TableDefs(sTableName).Name)) On Error GoTo 0 End Property
Zastosowanie metod klasy clsTeryt
Wykorzystamy większość metod klasy clsTeryt by utworzyć wszystkie potrzebne tabele na przyjęcie danych z Plików pełnych rejestru TERYT. Po utworzeniu tabel za pomocą metody .terytCreateRelation(...) utworzone zostaną wszystkie potrzebne relacje pomiędzy utworzonymi tabelami.
Private Sub btnCreateTable_Click() On Error GoTo Err_Handler Dim cls As clsTeryt Set cls = New clsTeryt With cls .terytDeleteTable "tblWMRodz" .terytCreateTable "tblWMRodz" .terytCreateField "ID_RM", dbText, 2 .terytCreateField "tNazwa_RM", dbText, 100 .terytCreateField "tStan_Na", dbText, 10 .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_RM", True '================================================== .terytDeleteTable "tblRodz_Gmi" .terytCreateTable "tblRodz_Gmi" .terytCreateField "ID_RG", dbText, 1 .terytCreateField "tNazwa_RG", dbText, 100 ' dodatkowe, skrótowe pole opisowe .terytCreateField "tSkrot_RG", dbText, 21 .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_RG", True '================================================== .terytDeleteTable "tblWojewodztwa" .terytCreateTable "tblWojewodztwa" .terytCreateField "ID_Woj", dbText, 2 .terytCreateField "tWojewodztwo", dbText, 100 .terytCreateField "tNazwa_Dod", dbText, 50 .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_Woj", True '================================================== .terytDeleteTable "tblPowiaty" .terytCreateTable "tblPowiaty" .terytCreateField "ID_Pow", dbText, 4 .terytCreateField "Id_Woj", dbText, 2 .terytCreateField "tPowiat", dbText, 100 .terytCreateField "tNazwa_Dod", dbText, 50 .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_Pow", True ' utwórz Indeks (duplikaty OK) .terytCreateIndex "Id_Woj" '================================================== .terytDeleteTable "tblTERC_Gminy" .terytCreateTable "tblTERC_Gminy" .terytCreateField "ID_Gmi", dbText, 7 .terytCreateField "Id_Pow", dbText, 4 .terytCreateField "Id_RG", dbText, 1 .terytCreateField "tNazwa", dbText, 100 .terytCreateField "tNazwa_Dod", dbText, 50 .terytCreateField "tStan_Na", dbText, 10 .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_Gmi", True ' utwórz Indeksy (duplikaty OK) .terytCreateIndex "Id_Pow" .terytCreateIndex "Id_RG" '================================================== .terytDeleteTable "tblSIMC_Miejscowosci" .terytCreateTable "tblSIMC_Miejscowosci" .terytCreateField "ID_Sym", dbText, 7 .terytCreateField "Id_Gmi", dbText, 7 .terytCreateField "Id_RM", dbText, 2 .terytCreateField "tMZ", dbText, 1 .terytCreateField "tNazwa", dbText, 100 .terytCreateField "tSymPod", dbText, 7 .terytCreateField "tStan_Na", dbText, 10 .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_Sym", True ' utwórz Indeksy (duplikaty OK) .terytCreateIndex "Id_Gmi" .terytCreateIndex "Id_RM" .terytCreateIndex "tNazwa" '================================================== .terytDeleteTable "tblULIC_Nazwy" .terytCreateTable "tblULIC_Nazwy" .terytCreateField "ID_SymUl", dbText, 5 .terytCreateField "tCecha", dbText, 5 .terytCreateField "tNazwa_1", dbText, 100 .terytCreateField "tNazwa_2", dbText, 100, False .terytAppendTable ' utwórz Indeks Primary .terytCreateIndex "ID_SymUl", True ' utwórz Indeksy (duplikaty OK) .terytCreateIndex "tCecha" .terytCreateIndex "tNazwa_1" '================================================== .terytDeleteTable "tblULIC_Ulice" .terytCreateTable "tblULIC_Ulice" .terytCreateField "Id_Sym", dbText, 7 .terytCreateField "Id_SymUl", dbText, 5 .terytCreateField "tStan_Na", dbText, 10 .terytAppendTable ' utwórz Indeksy (duplikaty OK) .terytCreateIndex "Id_Sym" .terytCreateIndex "Id_SymUl" ' utwórz dwupolowy Indeks Primary .terytCreateIndexMulti "Id_Sym", "Id_SymUl", "", True ' utwórz Relacje pomiędzy tabelami .terytCreateRelation "tblWojewodztwa", "ID_Woj", "tblPowiaty", "Id_Woj", True, True .terytCreateRelation "tblPowiaty", "ID_Pow", "tblTERC_Gminy", "Id_Pow", True, True .terytCreateRelation "tblTERC_Gminy", "ID_GMI", "tblSIMC_Miejscowosci", "Id_GMI", True, True .terytCreateRelation "tblWMRodz", "ID_RM", "tblSIMC_Miejscowosci", "Id_Rm", True, True .terytCreateRelation "tblRodz_Gmi", "ID_RG", "tblTERC_Gminy", "Id_RG", True, True .terytCreateRelation "tblSIMC_Miejscowosci", "ID_Sym", "tblULIC_Ulice", "Id_Sym", True, True .terytCreateRelation "tblULIC_Nazwy", "ID_SymUl", "tblULIC_Ulice", "Id_SymUl", True, True End With ' otwórz okno Relacje DoCmd.RunCommand acCmdRelationships ' odśwież okno bazy Application.RefreshDatabaseWindow Exit_Here: ' zniszcz zmienne obiektowe Set cls = Nothing Exit Sub Err_Handler: MsgBox "Błąd nr " & Err.Number & vbNewLine & _ Err.Description Resume Exit_Here End Sub
Widok okna „Relacje” po utworzeniu wszystkich tabel.
Widok okna „Relacje” po utworzeniu wszystkich potrzebnych Relacji.
Poniżej znajduje się link do przykładowej bazy, w której przy wykorzystaniu metody klasy clsTeryt, utworzone zostaną wszystkie potrzebne tabele i relacje pomiędzy tabelami. Do tak przygotowanych tabel będzie możliwe pobranie wszystkich danych ze zbioru "TERC z Plików pełnych rejestru TERYT.
Ale o tym na następnej stronie Zapis danych z plików pełnych rejestru TERYT.