|
|
|
| С 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.
Благодарю заранее за участие. | |
|
| |
|
|
|
| как-то у вас все слишком мудро сделано
Почему нельзя написать запрос на основе таблы Tab B
в котором первый сторбец группировать, а второй - суммировать
или если табла А так важна
то в запрос запихать обе таблицы и сделать объединение записей что бы все записи из таблы А, а остальные если совпадают и опять группировка и суммирование
промежуточная табла в данном случае лишняя
более того я бы установил галочку - сжимать при закрытии и потом не заботился о систематическом сжатии бд | |
|
| |
|
|
|
| - - - Почему нельзя написать запрос на основе таблы Tab B
в котором первый сторбец группировать, а второй - суммировать
Запрос1 работает именно так, как Вы и предлагаете.
Таб,А важна, в реальности в ней куча столбцов. Просто пример я упростил, чтобы получить здесь принципиальное решение.
- - - или если табла А так важна
то в запрос запихать обе таблицы и сделать объединение записей что бы все записи из таблы А, а остальные если совпадают и опять группировка и суммирование
промежуточная табла в данном случае лишняя. . .
Буду счастлив увидеть это решение. Простой пример Вы видите. Если можете, помогите.
Сжимать MDE File - об этом я уже думал. На одном PC у бухгалтеров, если не будет выхода, я так и сделаю. Однако в Internet я видел, огромными буквами написано, сжатие такая же небезопасная операция, как и другое ПО, как и ненадежно железо.
Конечно, всевозможные копированя предусмотрены, но мои пользователи будут меня разыскивать. А SOFT установлен в нескльких городах, не наездишься ... | |
|
| |
|
|
|
| Если важно именно записать в таблицу TabA, то можно в запросе на обновление использовать функцию DSum(). Типа:
UPDATE TabA SET Result = DSum('[Oplata]', '[TabB', '[LiefNr]=' & [TabA]![VertragNr]) | |
|
| |
|
|
|
| Попробую. А вот как бы рализовать такое:
Из запроса1 сбросить результаты в оперативную память, а затем из памяти занести данные
в ТабА. Попытаться написать Function и использовать их в запросах. Я читал, в запросах можно испоьзовать Функции. | |
|
| |
|
|
|
| Анатолий, пока запрос не сработал. Да Вы и сами можете убедиться. Пример с двумя простыми таблицами Вы видите. Но использование DSUM я еще поробую позже. | |
|
| |
|
|
|
| а мы
а нам
прикрепи к сообщению | |
|
| |
|
|
|
| Я попробую обойтись без UPDATE, для этого надо будет кое-что перелопатить. Но все равно непонятно, как решить эту задачу. В TAB_A у меня договора, даты, полная сумма договора, предоплата и еще много вспомогательной Инф. В TAB_B хранятся ном.договора, даты, оплаты и др. вспомогательная инф. Таблицы совершенно разные по структуре. Мне надо показать должников. Это главная задача. ну и есть и попутные. Я считал, что это типичная коммерческая проблема. Вот SNIPE предлагает запрос на основе TAB_B, но в его постановке мне тоже многое непонятно. Может быть без UPDATE у Вас есть решение? | |
|
| |
|
|
|
| )))) то что таблицы разные по структуре это не важно главное в обеих есть столбец - номер договора
за это можно ухватиться
то что я вам пришлю текст sql - проблемы не решит тут важно понимание
icq в профиле - пишите | |
|
| |
|
|
|
| Snipe, спасибо. Я попробую через подзапрос это решить. Когда будет время, потренируюсь.
Вообще мне трудно было предусмотреть заранее, что такие вопросы всплывут, а постановщики объясняют быстро и вообще далеко не заглядывают. Пришлось им рассказать одну притчу. Она не совсем культурная, но нам ее рассказал профессор. А поскольку профессор, то и я позволю себе.
Шел как-то постановщик задач (они еще называт себя архитекторами) по берегу реки и увидел запечатанную бутылку. Ну и взял и открыл ее. А оттуда васкочил огромный джин и говорит: "Брат, 10000 лет я сидел в этой проклятой бутылке, а ты меня спас. Проси, что хочешь. Все для тебя сделаю."
Постановщик подумал и сказал: "Хочу, чтобы мой детородный орган аж до земли был".
И джин укоротил ему ноги.
Ребята смеялись как-то кисловато, а вот один программист среди них очень.
Ну это я так написал, для разрядки. | |
|
| |
|
|
|
| Ну смотрите
имеем таблицуВ
которая содержит в себе информацию по поступлению платежей по договорам
пишем запрос к этой табле который группирует номера договоров и считает сумму поступлений
получаем примерно вот так
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 | |
|
| |
|
|
|
| Snipe, с подзапросом отлично работает. Вы меня опередили, только BY отсутствовал.
Достал отличное пособие для начинающих химиков с примерами. В моей поделке не менее 170 запросов, но как-то выкручивался до сих пор с помощью графического построителя запросов. Есть запросы и с UNIT. Теперь кусок программы придется переделывать.
Понимаю, что за молодыми людьми со свежими знаниями уже не угнаться.
А ведь в молодые годы чинил железо и мог писать прграммы в машинных кодах
(ЗВМ Злектронно-вычислительная машина (!) Минск.22 аж 120 кв.м (!!).
Я бы бросил все зти занятия, но осталась одна любопытная вещь: ACCESS считается настольной системой и должен плохо работать с таблицами в более 100000 записей.
А у меня уже есть таблицы по 70000 записей и пока жалоб на медленную работу не слышал. Так что ждем-с. Но удаление данных за прошлые годы со сжатием Datenbank предусмотрел.
SNIPE, СПАСИБО! Исчезаю с горизонта. | |
|
| |