Модераторы: Akina
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Подскажите, как вывести в одном поле содержимое вс, Access непонятно как работает 
:(
    Опции темы
patq
  Дата 27.1.2005, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Работаю в Access 97.
Возникшую проблему объясню на условном примере.
Есть таблица, содержащее пять полей, в которых хранятся данные о приборах. Одно поле числовое – указывает номер подразделения где стоит прибор. Другие текстовые – содержит данные о приборах.
Требуется вывести перечень наличия приборов в подразделении. Например: вольтметр В1, В7, генератор Г5, Г8, …и т.д.
Для вывода требуемых данных в отдельной форме указывается диапазон подразделений, выводимые поля (одновременно может выводиться любое кол-во полей).

Мои алгоритмы решения поставленной задачи:
Алгоритм 1:
- в запросе 1 по диапазону подразделений выбираю требуемые записи,
- в запросе 2 (см. ниже *1) сортирую отфильтрованные записи по возрастанию номера подразделений и содержимого полей. В него вставил написанную функцию (см. ниже *2), куда заносил содержимое полей текущей строки. В функции заносимые значения обрабатывались, лишние отбрасывались, формировался перечень и выдавался в запрос. При начале нового подразделения перечень обнулялся. С каждой записью внутри подразделения содержимое перечень увеличивался,
- в запросе 3 группирую отсортированные записи по номеру подразделения и использую функцию Last выводил сформированный перечень
Запустил запрос 3: получил не то что хотел. Стал отлаживать и увидел, что запрос посылает в функцию строки не последовательно, как видно при просмотре, а по какому-то непонятному алгоритму.
Подскажите: как заставить запрос последовательно вводить строки в функцию.

Алгоритм 2:
Реализовал все это программно. На маленьком объеме записей (< 100), все работает великолепно. При увеличении кол-ва обрабатываемых записей время работы увеличивается в геометрической прогрессии. При обработке всей таблицы и суток не хватит
Подскажите: как ускорить процесс работы программы.

!!!!!!! может у Вас есть другие варианты решения этой трудности



С уважением ко всем, почтившим меня вниманием.

PS. Хотел как быстрее, а получилось как всегда. Подскажите как можно редактировать тему и расширение темы.
Еще раз с уважением

Это сообщение отредактировал(а) patq - 27.1.2005, 10:05
PM MAIL   Вверх
Akina
Дата 27.1.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(patq @ 27.1.2005, 10:59)
Алгоритм 1:

Трёхнуться можно!!! на х... было получать несортированный рекордсет, чтобы потом его сортирить вручную??? на х... было получать все записи, чтобы отбрасывать ненужные вручную???
Одним запросом можно и нужно сразу отобрать нужное, отсортировать в нужном порядке и отобрать нужное количество.

Цитата(patq @ 27.1.2005, 10:59)
запрос посылает в функцию строки не последовательно, как видно при просмотре, а по какому-то непонятному алгоритму.

а с чего это ты вдруг решил что он обязан выдать тебе строки в том порядке, в каком ты хочешь? программа - она дура, и делает то что ты сказал, а не то что ты хотел...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Guest
Дата 28.1.2005, 09:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да прав народ, поспешность нужна только при ловле блох. Это я про себя: написал сообщение, предварительно не просмотрев, а увидел в форуме и АХнул (обрезано ... и т.д.).

А теперь по существу
Цитата(Akina @ 27.1.2005, 10:21)
Трёхнуться можно!!! на х... было получать несортированный рекордсет, чтобы потом его сортирить вручную??? на х... было получать все записи, чтобы отбрасывать ненужные вручную???
Одним запросом можно и нужно сразу отобрать нужное, отсортировать в нужном порядке и отобрать нужное количество.

Это делается в запросе, к сожалению он не убрает повторяющиеся поля, и не компонует в удобочитаемом виде. А для каждого человека требуются разные поля из таблицы, и если для каждой комбинации писать запросы, да все увязывать, что б выдаваемые портянки были покороче - это ж какой объем работы, а тут небольшой модулек, принимающий записи, проверяющий установленные флаги и отбрасывающий лишнее.
Цитата(Akina @ 27.1.2005, 10:21)
а с чего это ты вдруг решил что он обязан выдать тебе строки в том порядке, в каком ты хочешь? программа - она дура, и делает то что ты сказал, а не то что ты хотел...

Наверное к хорошей жизни привыкаю, да и когда использую этот подход при добавлении записей в таблицу запрос работает как надо.

  Вверх
Akina
Дата 28.1.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Guest @ 28.1.2005, 10:00)
к сожалению он не убрает повторяющиеся поля

добавь distinct

Цитата(Guest @ 28.1.2005, 10:00)
не компонует в удобочитаемом виде

ты о чем? запрос готовит данные, а не их вид.

Цитата(Guest @ 28.1.2005, 10:00)
для каждого человека требуются разные поля из таблицы, и если для каждой комбинации писать запросы, да все увязывать, что б выдаваемые портянки были покороче - это ж какой объем работы, а тут небольшой модулек, принимающий записи, проверяющий установленные флаги и отбрасывающий лишнее

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

Цитата(Guest @ 28.1.2005, 10:00)
когда использую этот подход при добавлении записей в таблицу запрос работает как надо

Это фича, но не алгоритм. Полагаться на нее не следует. В БД не существует порядка физического расположения записей - это надо всегда помнить и никогда на это не надеяться. Для того и существует order by, чтобы на грабли не наступать.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
patq
Дата 31.1.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Цитата(Akina @ 28.1.2005, 10:06)

Цитата(Guest @ 28.1.2005, )
к сожалению он не убрает повторяющиеся поля

добавь distinct

Этим не уберешь одинаковые поля в разных записях
Цитата(Akina @ 28.1.2005, 10:06)
а динамически сформировать SQL-строку и выполнить ее типа не судьба? вообще-то именно так обычно все и делают, не полагаясь на статические запросы...

Так я делал в другой программе, здесь функций поставленная задача решается проще
Цитата(Akina @ 28.1.2005, 10:06)
Это фича, но не алгоритм.... В БД не существует порядка физического расположения записей -....  Для того и существует order by, чтобы на грабли не наступать.

Да так и подготавливались записи перед подачей данных в функцию.

А другие варианты решения есть.

С уважением, patq!

PM MAIL   Вверх
Akina
Дата 31.1.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(patq @ 31.1.2005, 11:16)
Этим не уберешь одинаковые поля в разных записях

Если речь о том что записи разные, но выбранные поля содержат одинаковые значения - то group by

А если честно, то я например до сих пор не понимаю что ты пытаешься сотворить... мутно все как-то...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
patq
Дата 1.2.2005, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Цитата(Akina @ 31.1.2005, 10:32)
А если честно, то я например до сих пор не понимаю что ты пытаешься сотворить... мутно все как-то...

Вопрос: как заставить Access в запросе, содержащем функцию, выдавать в эту функцию содержимое записей в том же порядке, который Access показывает при просмотре этого несчастного запроса на дисплее.
Попытки сортировать записи как в запросе с функцией, так и предварительно, без использования сортирови в запросе с функцией дали одинаковый результат. Записи в функцию поступали произвольно.


PM MAIL   Вверх
Akina
Дата 1.2.2005, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(patq @ 1.2.2005, 08:56)
как заставить Access в запросе, содержащем функцию, выдавать в эту функцию содержимое записей в том же порядке, который Access показывает при просмотре этого несчастного запроса на дисплее.

Почему такое требование? не пофиг в каком порядке их обрабатывать? тогда временная промежуточная таблица (или запрос) адназначна.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
patq
Дата 3.2.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Цитата
  Почему такое требование? не пофиг в каком порядке их обрабатывать? тогда временная промежуточная таблица (или запрос) адназначна.

Назначение функции: вводить содержимое полей, помеченных для вывода в отдельной форме, в итоговую сводную строку. На выходе функции присваивается значение итоговой строки.

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

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

!!!! Претензий к функции нет, она махонькая и работает.
PM MAIL   Вверх
Akina
Дата 3.2.2005, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Тогда ты ОБЯЗАН сперва ПОЛУЧИТЬ ОТСОРТИРОВАННЫЙ РЕЗУЛЬТАТ ЗАПРОСА, и только потом скармливать его функции.
А ты желаешь дергать функцию в процессе выполнения запроса, когда данные еще не отсортированы и (возможно даже) не отобраны.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
patq
  Дата 4.2.2005, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Цитата(Akina @ 3.2.2005, 10:04)
Тогда ты ОБЯЗАН сперва ПОЛУЧИТЬ ОТСОРТИРОВАННЫЙ РЕЗУЛЬТАТ ЗАПРОСА, и только потом скармливать его функции.
А ты желаешь дергать функцию в процессе выполнения запроса, когда данные еще не отсортированы и  (возможно даже) не отобраны.

smile Как это сделать?
Мои попытки в этом направлении (об этом было сказано выше, но можа что я не понимаю, поэтому повторюсь):
- сортировал в запросе, где установлена функция
- сортировал в отдельном запросе. В запросе с функцией вызывал запрос в котором сортировал
smile Результат был один и тот же.
PM MAIL   Вверх
Akina
Дата 4.2.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



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

Или попробуй вложенные запросы - внутренний сортирующий и внешний обрабатывающий... но у меня большие сомнения.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
patq
Дата 7.2.2005, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Цитата(Akina @ 4.2.2005, 09:54)
не, ты должен сделать сортирующий запрос, получить рекордсет и программненько скармливать его своей функции...

Или попробуй вложенные запросы - внутренний сортирующий и внешний обрабатывающий... но у меня большие сомнения.

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

С уважением, patq
PM MAIL   Вверх
Akina
Дата 7.2.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Код

' Skeleton code
rst=dbs.openrecordset("Select * From MyTable Where ... Group By ... ORDER BY ...")
with rst
  .movefirst
  while not .eof
  call NyFunc(!MyField1, !MyField2)
  .movenext


Код

select ... from (select ... order by ...) ...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
patq
Дата 8.2.2005, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Цитата(Akina @ 7.2.2005, 09:57)
Код

' Skeleton code
rst=dbs.openrecordset("Select * From MyTable Where ... Group By ... ORDER BY ...")
with rst
  .movefirst
  while not .eof
  call NyFunc(!MyField1, !MyField2)
  .movenext

smile Это пробовал, но отмел. Для небольшого количества записей (около 500) работает быстро. Для большого количества записей (около 3000) процесс затянулся, после 3 мин. надоело ждать и я прекратил процесс.

Цитата(Akina @ 7.2.2005, 09:57)
Код

select ... from (select ... order by ...) ...

smile Пока обходился SQL запросов. Сам составлял редко, когда сильно прижмет. Разберусь как сделать и попробую.


С уважением!

PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0844 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.