Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2008, 13:00   #1
ЛюбительПИ
Пользователь
 
Регистрация: 26.07.2008
Сообщений: 17
По умолчанию Раньше это называлось "макроподстановка"

Заканчиваю проект на MVB, требуется суммировать содержимое нескольких одинаковых таблиц. Имена полей могут быть самыми разными, то есть требуется выполнять (в циклах) команду типа:
rst1![field1]=rst1![field1]+rst2![field2]
Имена полей у меня храняться в массиве, но компилятор MVB (Microsoft Access 2003) не пропускает (не понимает) мои попытки "впихнуть" эту конструкцию в функцию Eval. Какие у Вас есть предложения?
ЛюбительПИ вне форума Ответить с цитированием
Старый 26.07.2008, 14:27   #2
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Вопрос Ничего не понял

Выкладывайте код. Желательно в тэге [CODE][/CODE], он вставляется кнопкой #
дмидми вне форума Ответить с цитированием
Старый 26.07.2008, 14:58   #3
ЛюбительПИ
Пользователь
 
Регистрация: 26.07.2008
Сообщений: 17
По умолчанию Просят уточнений

В прикидочном варианте программы всё хорошо считается, когда имена полей таблиц явно указаны, привожу проблемую команду:
Код:
rst1![field1]=rst1![field1]+rst2![field2]
- считает правильно
Но в окончательном варианте программы (из-за погони за универсальностью) заранее не известны конкретные имена полей (здесь это "field1" и "field2"): имена конкретных полей храняться в массиве
Код:
Dim MassFieldsTab(99) as string
В указанной выше команде каким-то образом надо вместо имени поля "field1" сообщить компилятору имя из "MassFieldsTab(i)". В других языках раньше (да и теперь) - эта ситуация называлась "макроподстановка". В случае MVB функция Eval мне пока не поддалась...
ЛюбительПИ вне форума Ответить с цитированием
Старый 26.07.2008, 15:07   #4
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Вопрос Странно

Массив имён вроде бы должен быть двумерным - для каждой таблицы свои имена, насколько я понял. Ну да дело хозяйское.
Код:
  rst1.fields(MassFieldsTab(0)) = rst1.fields(MassFieldsTab(0)) _
    + rst2.fields(MassFieldsTab(1))
Так где код? У дежурного телепата сегодня выходной, и угадать, при чём тут Eval, некому.

Последний раз редактировалось дмидми; 26.07.2008 в 15:09.
дмидми вне форума Ответить с цитированием
Старый 26.07.2008, 15:26   #5
ЛюбительПИ
Пользователь
 
Регистрация: 26.07.2008
Сообщений: 17
По умолчанию

Привожу Ваш вариант введенный в мою реальную программу:
Код:
 
  ' ------------------------
  ' Ядро - подсуммирование:
  Set rst1 = dbs.OpenRecordset("Tab_Summ")    ' -существующая таблица
  Set rst2 = dbs.OpenRecordset("Т_Рабочая")   ' -существующая таблица
  rst1.MoveFirst
  rst2.MoveFirst
  
  For Jrab = 1 To KolZap0
      rst1.Edit           ' редактировать текущую строку
      For Lrab = 2 To KolFi0
         rst1.Fields(MassNameFields(Lrab)) = rst1.Fields(MassNameFields(Lrab)) _
                                           + rst2.Fields(MassNameFields(Lrab))
      Next ' "Lrab"
      rst1.Update         ' формирование строки таблицы
      rst1.MoveNext
      rst2.MoveNext
  Next ' "Jrab"
 
  rst2.Close          ' "Т_Рабочая"
  rst1.Close          ' "Tab_Summ"
  ' Ядро - подсуммирование!
  ' ------------------------
При выполнении на Вашей строке получаем:
Error 3265 "Элемент не обнаружен в данном семействе".
Может быть у меня не подключена какая-либо компонента/библиотека?
ЛюбительПИ вне форума Ответить с цитированием
Старый 26.07.2008, 15:42   #6
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Счастье Придвиньте Ваш монитор ко мне поближе!

Где описания переменных?
Чему к моменту возникновения ошибки равны Lrab, KolFi0, MassNameFields(Lrab) ? Совпадает ли последнее с именами нужных полей в обеих таблицах (в первом Вашем варианте имена были разными)?

Лучше всего - создать ма-а-аленькую БД, в которой будут эти две таблички (не полностью, только нужные поля и, скажем, три записи) и модуль, выполняющий то, что мы обсуждаем. В расширенном режиме внизу - фрейм Дополнительные опции, в нем - ссылка Управление вложениями.

Глядишь, пока такая БД создаётся, проблема решится сама

Последний раз редактировалось дмидми; 26.07.2008 в 15:46.
дмидми вне форума Ответить с цитированием
Старый 26.07.2008, 16:10   #7
ЛюбительПИ
Пользователь
 
Регистрация: 26.07.2008
Сообщений: 17
Смех Благодарность

Спасибо! Ваш вариант "обхода" конкретных имен сработал (через "rst.Fields(mass(i))"). Уточняя объявления массивов (глобальных и локальных) я нашел неточность, которая не позволила сразу заработать Вашему фрагменту. Моя проблема решена! Может быть "проблема отсутствия макроподстановки" надумана и всегда можно найти подобный обходной маневр? Удачи!
ЛюбительПИ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49
На чем пишутся стратегии типа "Казаков" и "Эпохи империи" Tayfun Свободное общение 3 26.06.2007 20:27