|
Слияние записей
|
|||
---|---|---|---|
#18+
Посоветуйте, как лучше сделать конкатенацию Допустим, есть номер телефона и за ним закреплено несколько сотрудников (сама БД имеет реляционный вид) Хочу вывести на гриде записи с полями «Номер телефона» и «ФИО» где в поле «ФИО» будут перечислены фамилии сотрудников за которыми закреплена симка через «;» Источник данных грида - ADO recordset, который формируется на основании запроса Хотел в этот recordset добавить новое поле «ФИО» методом .Fields.Append и заполнить его в цикле соответствующими данными, но, к сожалению нельзя добавить новое поле в recordset если он уже открыт (или можно?). Сейчас обдумываю, как вариант добавить пустое поле «ФИО» в справочник номеров сим карт, где динамически будут обновляться данные по фамилиям сотрудников при каждом вызове процедуры обновления грида. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 17:23 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
Вроде нашел наименее затратный способ, но он все ровно заключается в обновлении таблицы БД, что как по мне плохо. Хоть подскажите, а можно как-то повесить функцию на поле рекордсет ну типо как в Access в запросе вешают на поле функцию из модуля ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 18:56 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
TpaBkaХоть подскажите, а можно как-то повесить функцию на поле рекордсет ну типо как в Access в запросе вешают на поле функцию из модуляКонечно можно. НО! У тебя база то какая? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 21:31 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
TpaBkaПосоветуйте, как лучше сделать конкатенацию Допустим, есть номер телефона и за ним закреплено несколько сотрудников (сама БД имеет реляционный вид) Хочу вывести на гриде записи с полями «Номер телефона» и «ФИО» где в поле «ФИО» будут перечислены фамилии сотрудников за которыми закреплена симка через «;» Источник данных грида - ADO recordset, который формируется на основании запроса Хотел в этот recordset добавить новое поле «ФИО» методом .Fields.Append и заполнить его в цикле соответствующими данными, но, к сожалению нельзя добавить новое поле в recordset если он уже открыт (или можно?). Сейчас обдумываю, как вариант добавить пустое поле «ФИО» в справочник номеров сим карт, где динамически будут обновляться данные по фамилиям сотрудников при каждом вызове процедуры обновления грида. 1 создать свободный рекордсет, заполнить его из "ADO recordset, который формируется на основании запроса", и уже его делать источником грида 2 сделать всё сразу в запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 21:34 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
White OwlTpaBkaХоть подскажите, а можно как-то повесить функцию на поле рекордсет ну типо как в Access в запросе вешают на поле функцию из модуляКонечно можно. НО! У тебя база то какая? Access подключаюсь ч/з ADODB.Connection ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 21:37 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
TpaBkaWhite Owlпропущено... Конечно можно. НО! У тебя база то какая? Access подключаюсь ч/з ADODB.ConnectionТы можешь сделать то что тебе нужно в виде Access'овской Query? Если можешь - сделай такую Query (в ней можно будет использовать Акцессовские функции). А потом с клиента уже запрашивай данные из этой query. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 21:40 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
ё1 создать свободный рекордсет, заполнить его из "ADO recordset, который формируется на основании запроса", и уже его делать источником грида Думал над этим вариантом, но как по мне он не оптимальный ё2 сделать всё сразу в запросе подскажите как, пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 21:48 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
White OwlTpaBkaпропущено... Access подключаюсь ч/з ADODB.ConnectionТы можешь сделать то что тебе нужно в виде Access'овской Query? Если можешь - сделай такую Query (в ней можно будет использовать Акцессовские функции). А потом с клиента уже запрашивай данные из этой query. нельзя, ADO Recordset не воспринимает такие функции как, например NZ или Replace или Round и тем более пользовательские функции, если они присутствуют в запросе, на котором он основан ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 21:54 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
TpaBkaё1 создать свободный рекордсет, заполнить его из "ADO recordset, который формируется на основании запроса", и уже его делать источником грида Думал над этим вариантом, но как по мне он не оптимальный хм... вариант как вариант .. почему ? какие критерии "оптимальности" TpaBkaё2 сделать всё сразу в запросе подскажите как, пожалуйста нужно будет узнать макс.количество "слагаемых" в контакенации (простой запрос с top 1 count group by order by) и составить запрос динамически, такого плана Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
T fiokeyaaa1aaa2bbb1ccc1ddd2rrr3 Q keyxz1aaa,bbb,ccc2aaa,ddd3rrr ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 22:00 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
ёнужно будет узнать макс.количество "слагаемых" в контакенации (простой запрос с 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 в цикле заполнить отвязанный рекордсет + в этом цикле будет еще один цикл который будет формировать данные для поля ФИО из второго рекордсета И учитывая что данная процедура будет вызываться каждый раз после обновления грида, то по мне это как то не очень правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2012, 22:27 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
слушайте, стандартный же вопрос, поищите на форумах. присоединяюсь к рекомендациям от [Ё], для сложных выборок(в случае когда запрос не помещается на пару экранов) допустимо создавать промежуточные временные таблицы(обычно достаточно 1 или 2-ух) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2012, 10:54 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
ё помоги ещё плз Я написал динамический построитель запроса, в итоге получаю: Код: sql 1. 2. 3. 4. 5. 6. 7.
В итоге вот результат: код_сим Владелец68 Адаменко А.П.;Потапова О.М.;Чейпеш І.В.;Яцева А.С.;74 Накарловіч Р.О.;;;;75 Адаменко А.П.;Суховій М.В.;Яцева А.С.;;80 Зінькова О.В.;;;;81 Старенький Ю.Л.;;;;82 Бородько О.В.;;;; у меня поле ФИО в запросе CSim такого вида: Код: sql 1.
Как убрать лишние ; не прибегая к Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2012, 14:58 |
|
Слияние записей
|
|||
---|---|---|---|
#18+
Вопрос снимается нужно было переделать в запросе CSim поле ФИО с Код: sql 1.
на Код: sql 1.
Данный метод конкатенации быстрый и удобный в запросах где предполагается что слияние будет происходить по 100 строк он к сожалению не применим т.к. в итоговом запросе будут участвовать 100 таблиц а Access не резиновый (((( Но для моего случая он удобный, так как слияние может быть максимум 5-6 записей что, кстати, тоже мало вероятно ё еще раз спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2012, 16:01 |
|
|
start [/forum/topic.php?fid=60&fpage=88&tid=2158168]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 140ms |
0 / 0 |