Переход от MDB к ADP

1. Подготовка таблиц и запросов к экспорту


  • Наличие первичного ключа
    Просмотрите внимательно все имеющиеся таблицы и в случае отсутствия в них первичного ключа обязательно создайте его. Если импорт / экспорт прошел криво - и первичный ключ не был перенесен - создайте его вручную.
    Таблицы без первичного ключа на MSSQL - необновляемые, т.е. вы не сможете ни поместить туда данные, ни их редактировать в режиме таблицы из Аксесса + множество других проблем (проблемы с синхронизацией данных)
  • Штамп Времени
    После переноса таблиц добавьте во все таблицы поле с типом timestamp
    Наличие этого поля и первичного ключа принципиально меняет методику обновления данных объектами ADO (которые используются в.т.ч и аксессом) что решает некоторые проблемы и существенно сокращает сетевой траффик команд обновления данных.(однако в некоторых случаях наличие этого поля в источнике данных формы может привести к сложностям типа "Конфликт версии данных" - данные изменены другим пользователем)
  • Пустые значения в полях недопускающих NULL
    Проверьте что во всех таблицах где стоит это ограничение данные не содержат пуcтых полей (в аксессе такое бывает) при экспорте будет ошибка - в зависимости от выбранного инструмента экспорта либо строка таблицы не будет перенесена, либо не будет экспортировано ограничение, либо программа не закончит перенос. Это наиболее часто встречающаяся проблема
  • Размерность связанных полей
    проверьте размер связанных полей - если связь по текстовому в одной таблице размер 50 а в другой 100 то связь в MDB работает , но при экспорте будет ошибка. По возможности следует избегать связей по текстовым полям так как это в любом случае приводит к потере быстродействия, как правило, всегда можно добавить в каждую из связанных таблиц числовое поле и сделать связь именно по нему
  • Диапазон дат
    Проверьте значения в полях таблиц имеющих тип дата. Дата не должна быть раньше чем 1 января 1900 года.
  • Битовые / логические поля
    Проверьте что если поле типа bit и допускает нулл в таблице должно присутствовать поле таймштамп. Иначе при использовании связки сервера + MDB c линкованными таблицами будут проблемы с обновлением данных.

    Имена таблиц и запросов

  • нельзя, чтоб название таблицы или запроса начиналось решеткой (#) (таблицы начинающиеся c # на сервере являются временными, некоторые средства переноса видимо об этом не догадываются)
  • нежелательно чтоб название таблицы начиналось цифрами
  • не рекомендую использовать русские названия таблиц и запросов (возможны проблемы при реализации конкретных клиентских программ)
  • не допускается использование кавычек в названиях

    Примечание: сведения об ошибках при импорте данных собраны из различных источников, при использовании мастеров импорта и экспорта SQL-Сервера и MSACCESS с установленными различными сервис-паками.

    В любом случае обязательно используйте последние версии программного обеспечения c установленными сервис-паками.

    2.Что именно придется переделывать

  • Итоговые поля на формах
    Если Вы привыкли использовать функцию =SUM() для отображения итогов:
    этот подход неприемлем в проектах ADP - заменой ему может послужить программное вычисление итоговых значений Решение1 Решение2

    Примечание: Итоги в формах могут и работать MSAccess XP и MSAccess 2003 (с установленными последними версиями драйверов доступа к данным )- в простейших конструкциях - без возможности прменения фильтра формы

  • Обновление данных на форме методом Refresh
    В проектах обновление формы методом Refresh проявляет себя так же как и Requery.
  • В запросах проектов ADP нельзя указывать условие так как это делалось в MDB:

    RecordSource:

    "Select * from Mytable where ID = Forms!Главная!ID"  
     

    Это не будет работать потому что запросы в ADP выполняются на стороне сервера. сервер представления не имеет о Forms!Главная!...

    Есть несколько вариантов решений:

  • программно вычислять и задавать строку запроса:
      Me.Подчиненная.Form.RecordSource = "Select * from Mytable where ID = " & me.ID 
     
  • Использовать в качестве источника данных хранимую процедуру с параметрами подробнее
  • Использовать знак вопроса в качестве параметра к источнику данных и указывать значение в свойстве входные параметры
    Свойство RecordSource: "Select * from Mytable where ID = ? and uid = ?"
    свойство InputParameters: " ? = ID, ? = UID "
  • Задать источник данных следующим образом:
    RecordSource: Select * from Mytable where DateFrom > @Forms![ФОРМА]![ДАТАС] and DateFrom <= @Forms![ФОРМА]![ДАТАПО]

    DAO
    Лучше отказаться от DAO. Замена для него ADO + ADOX.
    рекордсет переделывают так:

     ' dao должно быть прописано в references - ссылках (свойства редактора VB)  
      Dim rst Аs DAO.Recordset Set rst = currentdb.openrecordset "tablename"  
      rst.edit  
      rst!field1="string"  
      rst.update  
      rst.close  
      set rst = Noting  
      
     
     'adodb должно быть прописано в references - ссылках (свойства редактора VB)  
    Dim rst Аs New ADODB.Recordset   
    rst.open "tablename", CurrentProject.Connection, adOpenKeyset, adLockOptimistic   
     ' для начала используйте такую конструкцию она обеспечивает 
    наибольшее число операций над рекордсетом ' rst.edit - не требуется rst!field1="string" rst.update rst.close set rst = Noting

    Отчеты


    Клиентский фильтр отчета

    Следует обратить внимание, что клиентский фильтр отчета влияет на число отображаемых записей, но не влияет на значения Итоговых полей в примечаниях, разделов полученных с помощью агрегатных функций : =Sum(), =Count() и.т.д.

    Рекомедую вынести фильтр в условие источника данных отчета


  • Страница сайта http://test.interface.ru
    Оригинал находится по адресу http://test.interface.ru/home.asp?artId=8251