powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Слияние записей
13 сообщений из 13, страница 1 из 1
Слияние записей
    #37602209
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посоветуйте, как лучше сделать конкатенацию
Допустим, есть номер телефона и за ним закреплено несколько сотрудников (сама БД имеет реляционный вид)
Хочу вывести на гриде записи с полями «Номер телефона» и «ФИО» где в поле «ФИО» будут перечислены фамилии сотрудников за которыми закреплена симка через «;»
Источник данных грида - ADO recordset, который формируется на основании запроса
Хотел в этот recordset добавить новое поле «ФИО» методом .Fields.Append и заполнить его в цикле соответствующими данными, но, к сожалению нельзя добавить новое поле в recordset если он уже открыт (или можно?).
Сейчас обдумываю, как вариант добавить пустое поле «ФИО» в справочник номеров сим карт, где динамически будут обновляться данные по фамилиям сотрудников при каждом вызове процедуры обновления грида.
...
Рейтинг: 0 / 0
Слияние записей
    #37602337
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде нашел наименее затратный способ, но он все ровно заключается в обновлении таблицы БД, что как по мне плохо.
Хоть подскажите, а можно как-то повесить функцию на поле рекордсет ну типо как в Access в запросе вешают на поле функцию из модуля
...
Рейтинг: 0 / 0
Слияние записей
    #37602495
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TpaBkaХоть подскажите, а можно как-то повесить функцию на поле рекордсет ну типо как в Access в запросе вешают на поле функцию из модуляКонечно можно. НО!
У тебя база то какая?
...
Рейтинг: 0 / 0
Слияние записей
    #37602499
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
TpaBkaПосоветуйте, как лучше сделать конкатенацию
Допустим, есть номер телефона и за ним закреплено несколько сотрудников (сама БД имеет реляционный вид)
Хочу вывести на гриде записи с полями «Номер телефона» и «ФИО» где в поле «ФИО» будут перечислены фамилии сотрудников за которыми закреплена симка через «;»
Источник данных грида - ADO recordset, который формируется на основании запроса
Хотел в этот recordset добавить новое поле «ФИО» методом .Fields.Append и заполнить его в цикле соответствующими данными, но, к сожалению нельзя добавить новое поле в recordset если он уже открыт (или можно?).
Сейчас обдумываю, как вариант добавить пустое поле «ФИО» в справочник номеров сим карт, где динамически будут обновляться данные по фамилиям сотрудников при каждом вызове процедуры обновления грида.
1
создать свободный рекордсет, заполнить его из "ADO recordset, который формируется на основании запроса", и уже его делать источником грида
2
сделать всё сразу в запросе
...
Рейтинг: 0 / 0
Слияние записей
    #37602503
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlTpaBkaХоть подскажите, а можно как-то повесить функцию на поле рекордсет ну типо как в Access в запросе вешают на поле функцию из модуляКонечно можно. НО!
У тебя база то какая?
Access подключаюсь ч/з ADODB.Connection
...
Рейтинг: 0 / 0
Слияние записей
    #37602505
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TpaBkaWhite Owlпропущено...
Конечно можно. НО!
У тебя база то какая?
Access подключаюсь ч/з ADODB.ConnectionТы можешь сделать то что тебе нужно в виде Access'овской Query? Если можешь - сделай такую Query (в ней можно будет использовать Акцессовские функции). А потом с клиента уже запрашивай данные из этой query.
...
Рейтинг: 0 / 0
Слияние записей
    #37602512
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ё1
создать свободный рекордсет, заполнить его из "ADO recordset, который формируется на основании запроса", и уже его делать источником грида

Думал над этим вариантом, но как по мне он не оптимальный

ё2
сделать всё сразу в запросе


подскажите как, пожалуйста
...
Рейтинг: 0 / 0
Слияние записей
    #37602513
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlTpaBkaпропущено...

Access подключаюсь ч/з ADODB.ConnectionТы можешь сделать то что тебе нужно в виде Access'овской Query? Если можешь - сделай такую Query (в ней можно будет использовать Акцессовские функции). А потом с клиента уже запрашивай данные из этой query.
нельзя, ADO Recordset не воспринимает такие функции как, например NZ или Replace или Round и тем более пользовательские функции, если они присутствуют в запросе, на котором он основан
...
Рейтинг: 0 / 0
Слияние записей
    #37602520
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
TpaBkaё1
создать свободный рекордсет, заполнить его из "ADO recordset, который формируется на основании запроса", и уже его делать источником грида

Думал над этим вариантом, но как по мне он не оптимальный

хм... вариант как вариант ..

почему ?
какие критерии "оптимальности"
TpaBkaё2
сделать всё сразу в запросе


подскажите как, пожалуйста
нужно будет узнать макс.количество "слагаемых" в контакенации (простой запрос с top 1 count group by order by)
и составить запрос динамически, такого плана
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT T.key, min(T.fio & (',' + T_1.fio) & (',' + T_2.fio) & (',' + T_3.fio)) as xz
FROM ((T 
LEFT JOIN T AS T_1 
  ON (T.fio < T_1.fio) AND (T.key = T_1.key)) 
LEFT JOIN T AS T_2 
  ON (T_1.key = T_2.key) AND (T_1.fio < T_2.fio)) 
LEFT JOIN T AS T_3 
  ON (T_2.key = T_3.key) AND (T_2.fio < T_3.fio)
GROUP BY T.key


T
fiokeyaaa1aaa2bbb1ccc1ddd2rrr3

Q
keyxz1aaa,bbb,ccc2aaa,ddd3rrr
...
Рейтинг: 0 / 0
Слияние записей
    #37602544
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёнужно будет узнать макс.количество "слагаемых" в контакенации (простой запрос с top 1 count group by order by)
и составить запрос динамически, такого плана
SELECT T.key, min(T.fio & (',' + T_1.fio) & (',' + T_2.fio) & (',' + T_3.fio)) as xz
FROM ((T
LEFT JOIN T AS T_1
ON (T.fio < T_1.fio) AND (T.key = T_1.key))
LEFT JOIN T AS T_2
ON (T_1.key = T_2.key) AND (T_1.fio < T_2.fio))
LEFT JOIN T AS T_3
ON (T_2.key = T_3.key) AND (T_2.fio < T_3.fio)
GROUP BY T.key

О прикольно, спасибо!

ёпочему ?
какие критерии "оптимальности"

Столько этапов:
1 Создать первый рекорсет на основе запроса где все необходимые поля кроме ФИО (типо группированный)
2 Создать отвязанный рекордсет + новое поле ФИО
3 Создать ещё один рекордсет на основе запроса где есть ФИО и key
4 в цикле заполнить отвязанный рекордсет + в этом цикле будет еще один цикл который будет формировать данные для поля ФИО из второго рекордсета

И учитывая что данная процедура будет вызываться каждый раз после обновления грида, то по мне это как то не очень правильно
...
Рейтинг: 0 / 0
Слияние записей
    #37602763
Grigory_R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
слушайте, стандартный же вопрос, поищите на форумах.
присоединяюсь к рекомендациям от [Ё],
для сложных выборок(в случае когда запрос не помещается на пару экранов) допустимо создавать промежуточные временные таблицы(обычно достаточно 1 или 2-ух)
...
Рейтинг: 0 / 0
Слияние записей
    #37603087
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ё помоги ещё плз
Я написал динамический построитель запроса, в итоге получаю:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT T0.код_сим, Min(T0.ФИО & (';' + T1.ФИО) & (';'+ T2.ФИО) & (';' + T3.ФИО) & (';' + T4.ФИО)) AS Владелец
FROM (((CSim AS T0
LEFT JOIN CSim AS T1 ON (T0.ФИО < T1.ФИО) AND (T0.код_сим = T1.код_сим)) 
LEFT JOIN CSim AS T2 ON (T1.ФИО < T2.ФИО) AND (T1.код_сим = T2.код_сим)) 
LEFT JOIN CSim AS T3 ON (T2.ФИО < T3.ФИО) AND (T2.код_сим = T3.код_сим)) 
LEFT JOIN CSim AS T4 ON (T3.ФИО < T4.ФИО) AND (T3.код_сим = T4.код_сим) 
GROUP BY T0.код_сим


В итоге вот результат:
код_сим Владелец68 Адаменко А.П.;Потапова О.М.;Чейпеш І.В.;Яцева А.С.;74 Накарловіч Р.О.;;;;75 Адаменко А.П.;Суховій М.В.;Яцева А.С.;;80 Зінькова О.В.;;;;81 Старенький Ю.Л.;;;;82 Бородько О.В.;;;;
у меня поле ФИО в запросе CSim такого вида:
Код: sql
1.
ФИО: Trim([фамилия] & IIf([имя]<>"";" " & Left([имя];1) & ".";"") & IIf([отчество]<>"";Left([отчество];1) & ".";""))


Как убрать лишние ; не прибегая к
Код: sql
1.
IIf(T1.ФИО<>'', "(';' + T1.ФИО)", "")...
...
Рейтинг: 0 / 0
Слияние записей
    #37603191
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снимается
нужно было переделать в запросе CSim поле ФИО
с
Код: sql
1.
ФИО: Trim([фамилия] & IIf([имя]<>"";" " & Left([имя];1) & ".";"") & IIf([отчество]<>"";Left([отчество];1) & ".";""))

на
Код: sql
1.
ФИО: [фамилия] & (" "+Left([имя];1)+".")+Left([отчество];1)+"."


Данный метод конкатенации быстрый и удобный
в запросах где предполагается что слияние будет происходить по 100 строк он к сожалению не применим т.к. в итоговом запросе будут участвовать 100 таблиц
а Access не резиновый ((((
Но для моего случая он удобный, так как слияние может быть максимум 5-6 записей что, кстати, тоже мало вероятно

ё еще раз спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Слияние записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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