Экспорт правил проверки из файла Microsoft Access MDB - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть файл MDB, который содержит несколько таблиц и форм. Каждое поле имеет правило проверки, например Is Null Or >=0 And <=255.

Эта база данных доступа преобразуется в онлайн-систему с использованием MySQL. Экспортировать все данные легко с помощью MDBTools (https://github.com/brianb/mdbtools).

Однако я не могу найти способ экспортировать правила проверки. Существуют тысячи полей в более чем 100 таблицах, поэтому важно будет экспортировать и импортировать их, а не переписывать каждое из них.

Я не против того, в какой формат они экспортируются, любой текстовый формат, так что я мог бы сделать регулярное выражение, или что-то будет хорошо.

Однако я нигде не смог найти никакой информации об экспорте этих правил проверки.

Возможно, если он не встроен в доступ по умолчанию, тогда можно использовать скрипт VB, чтобы найти информацию и записать ее в текстовый файл? Я не очень знаком с доступом или окнами вообще, так что, если кто-нибудь может подсказать, была бы такая возможность, было бы здорово.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Использование VBA позволяет напрямую получать правила проверки полей.

Я понимаю, что, наверное, уже слишком поздно, чтобы помочь тебе. И, хотя это может показаться неуместным для тех, кто не знаком с Access и VBA, этот подход требует только таблицы, копирования приведенного ниже кода в стандартный модуль и его запуска. Так что кто-то другой может извлечь выгоду.

Я создал свою таблицу, field_validation_rules , для хранения текста свойств правила проверки. Таблица включает в себя 3 текстовых поля: table_name ; 1010 * имя_поля *; и validation_rule .

Public Sub GatherValidationRules()
    Dim db As DAO.Database
    Dim fld As DAO.Field
    Dim rs As DAO.Recordset
    Dim tdf As DAO.TableDef

    Set db = CurrentDb
    Set rs = db.OpenRecordset("field_validation_rules", dbOpenTable, dbAppendOnly)
    For Each tdf In db.TableDefs
        If Not (tdf.Name Like "~*" Or tdf.Name Like "MSys*") Then
            For Each fld In tdf.Fields
                If Len(fld.ValidationRule) > 0 Then
                    rs.AddNew
                    rs!table_name.Value = tdf.Name
                    rs!field_name.Value = fld.Name
                    rs!validation_rule.Value = fld.ValidationRule
                    rs.Update
                End If
            Next
        End If
    Next
    rs.Close
End Sub

Свойство ValidationRule является строковым значением. Если свойство не было присвоено данному полю, ValidationRule - пустая строка. Код пропускает их, сохраняя только правила проверки для полей, которым они назначены.

Если вы хотите собрать собранные правила проверки в текстовом файле, есть несколько вариантов. Я бросил свой в CSV, как это:

DoCmd.TransferText acExportDelim, , "field_validation_rules", "C:\share\Access\field_validation_rules.txt", False
0 голосов
/ 05 сентября 2018

Для любого, кто найдет это, я так и сделал. Это было в Access 2003, оно может отличаться в других версиях.

Сначала я пошел на Tools > Analyze > Documenter, выбрал нужную таблицу и использовал следующие настройки:

enter image description here

Затем мне подарили то, что выглядело как pdf или слово doc (я не думаю, что это так, но это на самом деле не имеет значения).

Затем я сделал File > Export, выбрал «Текстовые файлы .txt» и сохранил его в папке на моем компьютере.

Затем я открыл файл .txt на PHP (везде, где вы можете делать регулярные выражения, должно быть все в порядке).

В моем случае не каждое поле имело правила проверки, и правила проверки не появлялись, если они не были установлены, что означало, что регулярное выражение для извлечения fieldID имело больше результатов, чем для извлечения правил проверки.

Итак, я использовал два регулярных выражения.

/SourceField:\s+(\S+).*?AllowZeroLength/msi Это получает все между SourceField и AllowZeroLength. AllowZeroLength - это первый бит повторяющегося текста после правил проверки.

Затем я использовал это регулярное выражение для получения правил проверки из этой строки.

/ValidationRule:\s+(.*)\\r/ Мне пришлось использовать \r вместо новой строки, вероятно, что-то связанное с переносом из Windows в Ubuntu.

В PHP это выглядело так:

<?php
$file_contents = file_get_contents('validations.txt');
    $response = [];
    preg_match_all('/SourceField:\s+(\S+).*?AllowZeroLength/msi', $file_contents, $matches);
    for($i = 0; $i < count($matches[0]); $i++) {
        $id = $matches[1][$i];
        preg_match('/ValidationRule:\s+(.*)\\r/', $matches[0][$i], $validation_match);
        $response[$id] = $validation_match[1] ?? null;
    }

Почти наверняка есть более чистое регулярное выражение, чем это, но это было невероятно быстро, и я получил именно то, что хотел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...