powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / HELP ! Срочно !! Суммирование по тесктовым полям
22 сообщений из 22, страница 1 из 1
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208397
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно выполнить запрос в рез которого будет текстовое выражение, получившееся путем сложения текстовых полей в выборке

т.е.
Таблица:

Поле1
-------
Строка1
Строка2
Строка3
Строка4

после выборки имеем одну запись с полем
Строка1Строка2Строка3Строка4

Возможно ли такое и как это сделать!
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208410
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За этот месяц отправляю сюда за идеей,наверное, уже 4-го вопрошающего
Остальные сейчас запостят предложения по GetStrings и у меня опять будет дежавю
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208415
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь забыл добавить
С базой работаю на DELPHI через ADO и не с SQL Server а с Аксесовской базой... Соответственно речь о процедурах и функциях идти не может...
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208420
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Соответственно речь о процедурах и функциях идти не может...

Что в DELPHI уже и не язык программирования?
Главаное - идея. А как ты ее реализуешь ... дело пятое
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208454
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно это реализовать в одном запросе без программирования на других яз.

Суть: есть 3 таблицы


Клиенты
ID Клиент
-------- --------
1 Клиент1
2 Клиент2
3 Клиент3


Распоряжения
ID Nраспор
---- ---------
222 Номер1
223 Номер2
224 Номер3
225 Номер2

Связь
ID_Клиента ID_Распоряжения
----------- ------------------
1 222
2 223
3 224
2 225

Суть - каждому клиенту может быть сопоставлено неколько распоряжений

А теперь надо сделать выборку клиентов с их распоряжениями!!!
И тут плодить по каждому клиенту несколько записей - нельзя
В результате выборки должно быть:

Клиент1 | Номер1
Клиент2 | Номер2 Номер4
Клиент3 | Номер3

Как это сделать?


Если бы SUM умела складывать текстовые поля то запрос бы выглядел так:

SELECT
Клиенты.Клиент,
( SELECT SUM(NРаспор) FROM Распоряжения WHERE ID in
(SELECT ID_Распоряжения FROM Связь WHERE ID_Клиента=Клиенты.ID)
) as Номера_Документов
FROM
Клиенты
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208466
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Нужно это реализовать в одном запросе без программирования на других яз.

Это что, задачка на сообразительность? Именно 1 запросом и без программирования??? Тогда, извини...
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208474
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это не задачка это проблема....
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208476
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если в том одном языке есть соотствующая функция (аналог Sum для стрингов), тогда хорошо. Если нет, тогда плохо.
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208484
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это что всё что вы можете посоветовать???
Где все спецы?
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208486
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Постановка задачи: исполнить одной строкой то, что на данном языке одной строкой не делается. Кто скажет, что эта задача разрешима, пусть бросит в меня камень.
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208487
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Может, в форуме по Дельфи подскажут, каким синтаксисом это достигается.
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208491
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да дельфи тут совсем не причем!!!
На аксесе как - не прибегая к процедурам макросам, юзерским функциям?
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208501
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу только посоветовать сделать методом грубой силы
1.Открываешь рекордсет
2 В цикле перебираешь все записи и конкатенируешь нужные поля.
Я думаю Дельфи это позволяет сделать.
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208502
Oleg Romantsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIG
Спасибо, но это не подходит..
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208504
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В Аксессе (если его рассматривать только как сервер) такой возможности нет .
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32208510
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но это не подходит..
Тоди ой
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32209194
nauvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть достаточно муторное, но универсальное решение этой задачи
Суть его в следующем:
создается таблица результата TRez с ключевым полем ID_Клиент и полями
IR,IR1,IR2 … IR20 для ID_Распоряжения по каждому клиенту

Формируется набор запросов на добавление в эту таблицу сначала самых «длинных» наборов распоряжений, затем более коротких. Так как ID_Клиент ключевое поле, после «длинного» набора, короткий не запишется

Для работы запроса в таблицу СВЯЗЬ нужно добавить поле счетчика ID

Теперь вид самого запроса :
для 4 распоряжений одному клиенту

INSERT INTO TRez ( ID_Клиента, IR, IR1, IR2, IR3 )
SELECT С3.ID_Клиента, С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения, С3.ID_Распоряжения
FROM ((Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента) LEFT JOIN Связь AS С3 ON С2.ID_Клиента = С3.ID_Клиента
WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID]) AND ((С3.id)>[С2].[ID]));

Ключевой здесь является строка WHERE, убирающая перестановки ID_Распоряжения и выводящая их в порядке возрастания счетчика ID в таблице связь

для 3 распоряжений одному клиенту
INSERT INTO TRez (ID_Клиента, IR, IR1, IR2 )
SELECT С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения
FROM (Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента
WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID]));

для 2 распоряжений одному клиенту
INSERT INTO TRez (ID_Клиента, IR, IR1 )
SELECT С.ID_Распоряжения, С1.ID_Распоряжения
FROM Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента
WHERE (((С1.id)>[С].[ID]));

для 1 распоряжениz одному клиенту

INSERT INTO TRez ( ID_Клиента, IR )
SELECT С.ID_Клиента, С.ID_Распоряжения
FROM Связь AS С;

Дальше все просто. Мастеришь 20 идентичных запросов на добавление. Имена им даешь такие, чтобы было удобно генерить это имя в программе с циклом, например Q_4, Q_3, … Q_1. В самом крутом запросе связаны 20 таблиц Связь, в самом простом = одна таблица. Удаляешь все из таблицы TRez . Программно запускаешь запросы Q_20 ...Q_1 в порядке убывания крутизны, и получаешь в таблице TRez что хотел.

На VB это выглядит так
For i=20 to 1 step –1
Currentdb.execute “Q_” & i
Next i

результат в TRez для твоего примера будет следующим
ID_Клиента IR IR1 IR2 IR3
1 222
2 223 225
3 224

Затем к каждому полю IR,IR1…в таблице Trez цепляешь LEFT JOIN таблицы Распоряжения, а к полю ID_Клиент таблицу Клиенты и делаешь конкатенацию полей Nраспор, чтобы получилось искомое
Клиент2 | Номер2 Номер4 Номер6 Номер8

Муторность в том, что если заранее число полей IR,IR1… не известно, приходится страховаться и мастерить много идентичных запросов на добавление, Правда, работают они быстро
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32209198
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://hiprog.com/access/article.asp?id=334
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32209201
nauvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть достаточно муторное, но универсальное решение этой задачи
Суть его в следующем:
создается таблица результата TRez с ключевым полем ID_Клиент и полями
IR,IR1,IR2 … IR20 для ID_Распоряжения по каждому клиенту

Формируется набор запросов на добавление в эту таблицу сначала самых «длинных» наборов распоряжений, затем более коротких. Так как ID_Клиент ключевое поле, после «длинного» набора, короткий не запишется

Для работы запроса в таблицу СВЯЗЬ нужно добавить поле счетчика ID

Теперь вид самого запроса :
для 4 распоряжений одному клиенту

INSERT INTO TRez ( ID_Клиента, IR, IR1, IR2, IR3 )
SELECT С3.ID_Клиента, С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения, С3.ID_Распоряжения
FROM ((Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента) LEFT JOIN Связь AS С3 ON С2.ID_Клиента = С3.ID_Клиента
WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID]) AND ((С3.id)>[С2].[ID]));

Ключевой здесь является строка WHERE, убирающая перестановки ID_Распоряжения
И выводящая их в порядке возрастания счетчика ID в таблице связь

для 3 распоряжений одному клиенту
INSERT INTO TRez (ID_Клиента, IR, IR1, IR2 )
SELECT С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения
FROM (Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента
WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID]));

для 2 распоряжений одному клиенту
INSERT INTO TRez (ID_Клиента, IR, IR1 )
SELECT С.ID_Распоряжения, С1.ID_Распоряжения
FROM Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента
WHERE (((С1.id)>[С].[ID]));

для 1 распоряжения одному клиенту

INSERT INTO TRez ( ID_Клиента, IR )
SELECT С.ID_Клиента, С.ID_Распоряжения
FROM Связь AS С;

Дальше все просто. Мастеришь 20 идентичных запросов на добавление. Имена им даешь такие, чтобы было удобно генерить это имя в программе с циклом, например Q_4, Q_3, … Q_1. В самом крутом запросе связаны 20 таблиц Связь, в самом простом = одна таблица. Удаляешь все из таблицы TRez . Программно запускаешь эти запросы в порядке убывания крутизны, и получаешь в таблице TRez что хотел.

На VB это выглядит так
For I=20 to 1 step –1
Currentdb.execute “Q_” & i
Next I

Результат будет таким
ID_Клиента: IR: IR1 IR2 IR3
1 : 222
2 : 223 :225
3 : 224


Затем к каждому полю IR,IR1…в таблице Trez цепляешь LEFT JOIN таблицы Распоряжения, а к полю ID_Клиент таблицу Клиенты и делаешь конкатенацию строк, чтобы получилось
Клиент2 | Номер2 Номер4 Номер6 Номер8

Муторность в том, что если заранее число полей IR,IR1… не известно, приходится страховаться и мастерить много идентичных запросов на добавление, Правда, работают они быстро
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
HELP ! Срочно !! Суммирование по тесктовым полям
    #32648702
Dark Night
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 All:
Время другое, проблема та же. ;)
Есть таблица ID1, ID2, ID3, Data, причем ID1 и ID2 однозначно определяют ID3, а ID3 -> Data. Вопрос: как наименее "безболезненно" сделать конкатенацию всех строковых полей Data для пар (ID1, ID2)? Пересмотрены куча "рецептов" на форуме, где-то говориться про SQL2000, где-то еще про что-то, но у меня чистый -- Access2000. Можно использовать VBA, формулы, скрипты -- все. Как? Просто уже голова кругом.
Сразу скажу: это -> http://hiprog.com/access/article.asp?id=334 почему-то не работает, хотя вроде для Access написано.
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32648845
GuestN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже не знаю, почему у тебя не работают примеры Юрия Шермана, но если быстродействие очень не критично, то для DAO можно попробовать такой простой варитант:

Функция:
Public Function DConcat(exp As String, source As String, Optional usl As String) As Variant
On Error GoTo DConcat_err
Dim MyDB As Database, MyTable As Recordset, tsql As String
Set MyDB = CurrentDb()
DConcat = ""
tsql = "SELECT [" & source & "].[" & exp & "] FROM " & source & ""
If usl <> "" Then
tsql = tsql & " WHERE (" & usl & ")"
End If
tsql = tsql & ";"
Set MyTable = MyDB.OpenRecordset(tsql)
If MyTable.RecordCount > 0 Then

MyTable.MoveFirst
Do Until MyTable.EOF
DConcat = DConcat & IIf(DConcat <> "", ",", "") & MyTable(exp)
MyTable.MoveNext
Loop
End If
Exit Function
DConcat_err:
DConcat = ""
End Function

Запрос:
SELECT T.ID1, T.ID2,
Dconcat("Date","T","([ID1] =" & [id1] & ") and (id2=" & [id2] & ")") AS v1
FROM T
GROUP BY T.ID1, T.ID2;
...
Рейтинг: 0 / 0
HELP ! Срочно !! Суммирование по тесктовым полям
    #32649078
Dark Night
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 GuestN:
То есть, в принципе возможно написание своей функции с целью использованя ее в SQL-скриптах? У меня именно на этом шаге (ввод выражения в запросе) не работали примеры, ссылка на которые дана выше.
-----------------------
Попробую еще... :|
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / HELP ! Срочно !! Суммирование по тесктовым полям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]