![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос на объединение строк [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]Никак не получится. Т.е. совсем никак :)