Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос на объединение строк [D6]


msguns ©   (2005-07-15 11:20:00) 

ADO+ACCESS
Есть 2 таблицы, связанные отношением Master-Detail. В детале есть надцать записей с текстовым полем. Надо одним запросом без создания временного файла получить для каждой записи мастера одну запись, в которой в одном поле сложены все тексты детала.

Пример:

Мастер
 ID    NUM
 24   4567

Детал
 DID  ID     TEXT
  1   24    'Мама '
  2   24    'мыла '
  3   24    'раму '

Результат
 ID    NUM     TEXTSUMMARY
 24   4567  'Мама мыла раму'

Я понял, что в джете такое невозможно
Хочу чтоб попинали ногами ;))


msguns   (2005-07-15 13:16:00) [1]

>DiamondShark ©   (15.07.05 13:12) [9]

Благодарю за код. Если не получится решить чисто "по-клиентски", то буду пробовать


DiamondShark   (2005-07-15 13:12:00) [2]

dfm


object Form1: TForm1
 object ADOConnection1: TADOConnection
   Connected = True
   ConnectionString =
     'Provider=MSDataShape;Persist Security Info=False;Mode=Share Deny' +
     ' None;Data Source=C:\Documents and Settings\Администратор\Мои до' +
     'кументы\db1.mdb;Data Provider=Microsoft.Jet.OLEDB.4.0'
 end
 object Master: TADODataSet
   Active = True
   Connection = ADOConnection1
   CursorType = ctStatic
   OnCalcFields = MasterCalcFields
   CommandText =
     'SHAPE {select * from Master} Master'#13#10'APPEND ({select ID,Text from Deta' +
     'il} Detail RELATE ID TO ID)'
   object MasterID: TIntegerField
     DisplayWidth = 12
     FieldName = 'ID'
   end
   object MasterNUM: TWideStringField
     DisplayWidth = 16
     FieldName = 'NUM'
     Size = 50
   end
   object MasterDetail: TDataSetField
     DisplayWidth = 12
     FieldName = 'Detail'
     ReadOnly = True
     IncludeObjectField = False
   end
   object MasterText: TStringField
     DisplayWidth = 306
     FieldKind = fkCalculated
     FieldName = 'Text'
     Size = 255
     Calculated = True
   end
 end
end


pas

procedure TForm1.MasterCalcFields(DataSet: TDataSet);
var
 Text: String;
 ds: TDataset;
begin
 Text := '';
 ds := MasterDetail.NestedDataSet;
 ds.First;
 while not ds.Eof do begin
   Text := Text + ds.FieldByName('Text').AsString;
   ds.Next;
 end;
 MasterText.Value := Text;
end;


Гламурненько так...


msguns   (2005-07-15 12:37:00) [3]

>DiamondShark ©   (15.07.05 12:30) [6]
>Без побочных -- никак.
Два датасета будут по-любому.

Во-первых, это понятно что два.
Во-вторых, не по-любому. Напрмер через макрос, хоть и геморно до безобразности.

Да уж, паршиво когда нет хранимок ;((


DiamondShark   (2005-07-15 12:34:00) [4]

О, придумал, как без побочных запросов.
В качестве провайдера используем MSDataShape, пишем запрос, возвращающий иерархический рекордсет.
В OnCalcFields вычисляем поле по вложенному рекордсету.

Гы ;)
Формально -- запрос один, без побочных ;)


DiamondShark   (2005-07-15 12:30:00) [5]


> Как ? В смысле без побочных запросов

Без побочных -- никак.
Два датасета будут по-любому.


msguns   (2005-07-15 12:23:00) [6]

>ЮЮ ©   (15.07.05 11:48) [3]
>А предложения длинные бывают? а то сделать Left Joina для 1х слов со вторыми, далее с третьими и т.д.

Кол-во деталей заранее не известно. Но реально десятки. Длина текста в поле детала до кб.

>DiamondShark ©   (15.07.05 12:10) [4]
>Например, вычисляемое поле.

Как ? В смысле без побочных запросов


DiamondShark   (2005-07-15 12:10:00) [7]

Только на клиенте.
Например, вычисляемое поле.


ЮЮ   (2005-07-15 11:48:00) [8]

А предложения длинные бывают? а то сделать Left Joina для 1х слов со вторыми, далее с третьими и т.д.


sniknik   (2005-07-15 11:35:00) [9]

переводи access(оболочку) на mssql и делай нем.


Johnmen   (2005-07-15 11:22:00) [10]

Никак не получится. Т.е. совсем никак :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо