Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > две формы( передача значений)


Автор: alexIrish 12.2.2008, 19:26
Привет.
Нужна подсказка/совет:
во временной таблице TEMP1 три поля: Operator, TotalTime, DownTime
Поля Operator, TotalTime заполняются напрямую в одной форме formTEMP1 связанной с етой таблицей.
Заполнили:
Operator    TotalTime   DownTime
Bob                8
Chris              8
Нажали кнопку, открылась вторая форма formTEMP2
из  второй форме formTEMP2 , заполняются поля таблицы DownTime.( R_Date, Operator, DownTime,
DownTimeDescription)

Пример строк таблицы DownTime: заполнили
12/02/08    Bob     .25        IT issue
12/02/08    Bob     .5          No picks
12/02/08    Chris   .2          No picks
теперь нужно что бы по нажатию кнопки из формы formTEMP2 передалось:
Sum(DownTime) group by Operator ( но не из таблицы, а имменно из формы. Т.е строки которые только что были внесены)
в форму formTEMP1 / таблицу TEMP1 соответственно DownTime.Operator    = TEMP1 .Operator    
Таблицы TEMP1 и DownTime не связаны.
Я пробовал через formTEMP2 . Recordset  но чего то не вышло.

Спасибо.

Автор: bopoha 12.2.2008, 19:33
Почему не из таблицы, а с формы? Данные в таблицу и попадают...

У форм можно получить Recordset методом:
Код

set rst = me.RecordsetClone

Автор: alexIrish 13.2.2008, 00:37
Цитата

Почему не из таблицы, а с формы? Данные в таблицу и попадают...

Потому что в форме 1-20 строк и все которые надо а таблица все время растет. И со временем запрос будет тормозить.
Sама таблица DownTime нузна для подробного отчета. но вот процеs заполнения ее данными является частью другого отчета.

Цитата

У форм можно получить Recordset методом:
Код

set rst = me.RecordsetClone


A kak потом етот рекордсет присабачить к запросу? Sам то рекордсет я получил...  smile 
нужно потом SQL запрос на update выполнить, типа:
Код

Update TEMP1,rst Set TEMP1.DownTime = (Select SUM(rst.DownTime),Operator From rst Group by Operator)
Where TEMP1.Operator=rst.Operator

Я понимаю, что рекордsет ето не запрос и не таблица, и что такой запрос работать ни когда не будет.
Идея такова, что берем результат суммы DownTime, по операторам и апдейтим таблицу TEMP1.
Я ж грешным делом временную таблицу через TableDef хотел сделать и ее в запрос сунуть, потом решил что по времени выполнения
выигрыша не будет. Что запрос ко всей таблице DownTime s nuzhnymi parametrami, что создание новой, пусть и маленькой таблицы, запрос на апдатейт с 
innner Join DownTime i етой новой, и удаление новой таблицы.

Ваш совет?

Автор: Akina 13.2.2008, 09:49
Цитата(alexIrish @  13.2.2008,  01:37 Найти цитируемый пост)
со временем запрос будет тормозить

Какой объем таблицы ожидается? сотни тысяч записей? миллионы? потому как тысячи (даже 10-20 тысяч) не должны тормозить на выборках без вторичного использования вычисляемых полей.

Цитата(alexIrish @  12.2.2008,  20:26 Найти цитируемый пост)
не из таблицы, а имменно из формы. Т.е строки которые только что были внесены

Коллекция Forms включает в себя все открытые в текущий момент формы. Получите ссылку на нужную. У нее соответственно есть коллекция Controls, которая включает в себя все имеющиеся на форме контролы, в т.ч. скрытые и неактивные. Найдите нужный и получите его содержимое (Text, Value, etc.)/

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

Автор: bopoha 13.2.2008, 12:27
alexIrish, вы очень сильно мудрите, высасывая утверждения из пальца. Вам стоит очень сильно подумать над алгоритмом работы. Т.к. через месяц подобную кашу очень тяжело разгребсти. Чем проще, тем лучше.

Немного теории:
В не зависимости от того сколько в таблице данных, на форму они выбираются запросом. Если таблица связаная - находится в другой mdb - а эта mdb находится на другой машине , то таблица полностью загружается. Даже если выбирать одну запись.
Recordset - набор данных.
текст SQL - текстовая инструкция движку базы данных. Если на выборку, то в результате получаем Recordset.
Recordset нельзя вставить в SQL.

Этот запрос, если вместо rst указать имя таблицы, работать не будет.
Код

Update TEMP1,rst Set TEMP1.DownTime = (Select SUM(rst.DownTime),Operator From rst Group by Operator)
Where TEMP1.Operator=rst.Operator

Т.к. вложенный запрос должен возвращать одну запись! А может вернуть несколько. Значит групировку убрать, а фильтр добавить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)