Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос AccessXP
 
 автор: gant   (17.01.2013 в 12:41)   личное сообщение
 
 

С SQL я не в ладах. Англичане говорят, старую собаку трудно учить новым трюкам.
Есть обычная файл . сервер программа. Работает стабильно 8 лет и в Access 2003, 2007 и 2010. Время от времени экономисты просят сделать некоторые не предусмотренные ранее вещи.
Я столкнулся с такой задачей . привожу упрощенный пример.
TabA
-------
VertragNr Result
25 0?
26 0?
27 0?

TabB
--------
LiefNr Oplata
25 3?
26 2 ?
25 3?
25 5?
26 10?
27 10?
27 15?

Результат должен оказаться в TabA

TabA
-------
VertragNr Result
25 11?
26 12?
27 25?

Мое решение примитивное: сделано два запроса, которые выполняю один за другим.
В Запр1 сжимаю TabB (Group) и формирую промежуточную Таб3
В Запр2 помещаю результат из Таб3 в TabA (UPDATE).

Здесь много недостатков - надо при входе в процедуру удалять Таб3, если она еще существует. Кроме того, эта Таблица3 формируется в программе PROG.MDE (Front-END).
Значит, PROG.MDE будет разбухать и надо будет заботиться об её систематическом сжатии
возможно 1 раз в день при старте PC (Autoexec).
А можно ли как-то с помощью Function сформировать массив в памяти и потом загнать его в
TabA.

Благодарю заранее за участие.

  Ответить  
 
 автор: snipe   (17.01.2013 в 13:14)   личное сообщение
 
 

как-то у вас все слишком мудро сделано
Почему нельзя написать запрос на основе таблы Tab B
в котором первый сторбец группировать, а второй - суммировать

или если табла А так важна
то в запрос запихать обе таблицы и сделать объединение записей что бы все записи из таблы А, а остальные если совпадают и опять группировка и суммирование


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

  Ответить  
 
 автор: gant   (17.01.2013 в 21:17)   личное сообщение
 
 

- - - Почему нельзя написать запрос на основе таблы Tab B
в котором первый сторбец группировать, а второй - суммировать

Запрос1 работает именно так, как Вы и предлагаете.
Таб,А важна, в реальности в ней куча столбцов. Просто пример я упростил, чтобы получить здесь принципиальное решение.

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

Буду счастлив увидеть это решение. Простой пример Вы видите. Если можете, помогите.
Сжимать MDE File - об этом я уже думал. На одном PC у бухгалтеров, если не будет выхода, я так и сделаю. Однако в Internet я видел, огромными буквами написано, сжатие такая же небезопасная операция, как и другое ПО, как и ненадежно железо.
Конечно, всевозможные копированя предусмотрены, но мои пользователи будут меня разыскивать. А SOFT установлен в нескльких городах, не наездишься ...

  Ответить  
 
 автор: Анатолий (Киев)   (17.01.2013 в 19:31)   личное сообщение
 
 

Если важно именно записать в таблицу TabA, то можно в запросе на обновление использовать функцию DSum(). Типа:
UPDATE TabA SET Result = DSum('[Oplata]', '[TabB', '[LiefNr]=' & [TabA]![VertragNr])

  Ответить  
 
 автор: gant   (17.01.2013 в 21:24)   личное сообщение
 
 

Попробую. А вот как бы рализовать такое:
Из запроса1 сбросить результаты в оперативную память, а затем из памяти занести данные
в ТабА. Попытаться написать Function и использовать их в запросах. Я читал, в запросах можно испоьзовать Функции.

  Ответить  
 
 автор: gant   (18.01.2013 в 13:40)   личное сообщение
 
 

Анатолий, пока запрос не сработал. Да Вы и сами можете убедиться. Пример с двумя простыми таблицами Вы видите. Но использование DSUM я еще поробую позже.

  Ответить  
 
 автор: snipe   (18.01.2013 в 17:23)   личное сообщение
 
 

а мы
а нам

прикрепи к сообщению

  Ответить  
 
 автор: gant   (23.01.2013 в 01:04)   личное сообщение
 
 

Я попробую обойтись без UPDATE, для этого надо будет кое-что перелопатить. Но все равно непонятно, как решить эту задачу. В TAB_A у меня договора, даты, полная сумма договора, предоплата и еще много вспомогательной Инф. В TAB_B хранятся ном.договора, даты, оплаты и др. вспомогательная инф. Таблицы совершенно разные по структуре. Мне надо показать должников. Это главная задача. ну и есть и попутные. Я считал, что это типичная коммерческая проблема. Вот SNIPE предлагает запрос на основе TAB_B, но в его постановке мне тоже многое непонятно. Может быть без UPDATE у Вас есть решение?

  Ответить  
 
 автор: snipe   (23.01.2013 в 05:37)   личное сообщение
 
 

)))) то что таблицы разные по структуре это не важно главное в обеих есть столбец - номер договора
за это можно ухватиться

то что я вам пришлю текст sql - проблемы не решит тут важно понимание
icq в профиле - пишите

  Ответить  
 
 автор: gant   (23.01.2013 в 22:46)   личное сообщение
 
 

Snipe, спасибо. Я попробую через подзапрос это решить. Когда будет время, потренируюсь.
Вообще мне трудно было предусмотреть заранее, что такие вопросы всплывут, а постановщики объясняют быстро и вообще далеко не заглядывают. Пришлось им рассказать одну притчу. Она не совсем культурная, но нам ее рассказал профессор. А поскольку профессор, то и я позволю себе.
Шел как-то постановщик задач (они еще называт себя архитекторами) по берегу реки и увидел запечатанную бутылку. Ну и взял и открыл ее. А оттуда васкочил огромный джин и говорит: "Брат, 10000 лет я сидел в этой проклятой бутылке, а ты меня спас. Проси, что хочешь. Все для тебя сделаю."
Постановщик подумал и сказал: "Хочу, чтобы мой детородный орган аж до земли был".
И джин укоротил ему ноги.
Ребята смеялись как-то кисловато, а вот один программист среди них очень.
Ну это я так написал, для разрядки.

  Ответить  
 
 автор: snipe   (24.01.2013 в 05:47)   личное сообщение
 
 

Ну смотрите

имеем таблицуВ
которая содержит в себе информацию по поступлению платежей по договорам
пишем запрос к этой табле который группирует номера договоров и считает сумму поступлений
получаем примерно вот так

SELECT ТаблицаВ.Номер_Договора, Sum(ТаблицаВ.Платеж) AS Поступление
FROM ТаблицаВ
GROUP ТаблицаВ.Номер_Договора


Имеем ТаблицуА в которой находится список договоров


SELECT ТаблицаА.*
FROM ТаблицаА


а теперь смотрите что я с ними сделаю


SELECT ТаблицаА.Номер_Договора,ТаблицаА.Сумма_Договора, a1.Поступление
FROM ТаблицаА LEFT JOIN (SELECT ТаблицаВ.Номер_Договора, Sum(ТаблицаВ.Платеж) AS Поступление FROM ТаблицаВ GROUP ТаблицаВ.Номер_Договора)  AS a1 
ON ТаблицаА.Номер_Договора = a1.Номер_Договора


в итоге должен получиться запрос в котором 3 столбца Номер договора, Сумма договора, Общая сумма Поступлений

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

(SELECT ТаблицаВ.Номер_Договора, Sum(ТаблицаВ.Платеж) AS Поступление
FROM ТаблицаВ
GROUP ТаблицаВ.Номер_Договора) AS a1

если убрать текст запроса то останется () as a1
т.е. в запросе верхнего уровня этот запрос будет проходить по именем a1

LEFT JOIN - это тип соединения таблиц - в данном случае все данные из таблицыА и только те записи из таблицы а1 которые совпадают

ON ТаблицаА.Номер_Договора = a1.Номер_Договора - это поля объединения (совпадения) в таблицах - таблицаА и а1

  Ответить  
 
 автор: gant   (26.01.2013 в 15:29)   личное сообщение
 
 

Snipe, с подзапросом отлично работает. Вы меня опередили, только BY отсутствовал.
Достал отличное пособие для начинающих химиков с примерами. В моей поделке не менее 170 запросов, но как-то выкручивался до сих пор с помощью графического построителя запросов. Есть запросы и с UNIT. Теперь кусок программы придется переделывать.
Понимаю, что за молодыми людьми со свежими знаниями уже не угнаться.
А ведь в молодые годы чинил железо и мог писать прграммы в машинных кодах
(ЗВМ Злектронно-вычислительная машина (!) Минск.22 аж 120 кв.м (!!).
Я бы бросил все зти занятия, но осталась одна любопытная вещь: ACCESS считается настольной системой и должен плохо работать с таблицами в более 100000 записей.
А у меня уже есть таблицы по 70000 записей и пока жалоб на медленную работу не слышал. Так что ждем-с. Но удаление данных за прошлые годы со сжатием Datenbank предусмотрел.
SNIPE, СПАСИБО! Исчезаю с горизонта.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList