Форум: "Базы";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизЗапрос на объединение строк Найти похожие ветки
← →
msguns © (2005-07-15 11:20) [0]ADO+ACCESS
Есть 2 таблицы, связанные отношением Master-Detail. В детале есть надцать записей с текстовым полем. Надо одним запросом без создания временного файла получить для каждой записи мастера одну запись, в которой в одном поле сложены все тексты детала.
Пример:
Мастер
ID NUM
24 4567
Детал
DID ID TEXT
1 24 "Мама "
2 24 "мыла "
3 24 "раму "
Результат
ID NUM TEXTSUMMARY
24 4567 "Мама мыла раму"
Я понял, что в джете такое невозможно
Хочу чтоб попинали ногами ;))
← →
Johnmen © (2005-07-15 11:22) [1]Никак не получится. Т.е. совсем никак :)
← →
sniknik © (2005-07-15 11:35) [2]переводи access(оболочку) на mssql и делай нем.
← →
ЮЮ © (2005-07-15 11:48) [3]А предложения длинные бывают? а то сделать Left Joina для 1х слов со вторыми, далее с третьими и т.д.
← →
DiamondShark © (2005-07-15 12:10) [4]Только на клиенте.
Например, вычисляемое поле.
← →
msguns © (2005-07-15 12:23) [5]>ЮЮ © (15.07.05 11:48) [3]
>А предложения длинные бывают? а то сделать Left Joina для 1х слов со вторыми, далее с третьими и т.д.
Кол-во деталей заранее не известно. Но реально десятки. Длина текста в поле детала до кб.
>DiamondShark © (15.07.05 12:10) [4]
>Например, вычисляемое поле.
Как ? В смысле без побочных запросов
← →
DiamondShark © (2005-07-15 12:30) [6]
> Как ? В смысле без побочных запросов
Без побочных -- никак.
Два датасета будут по-любому.
← →
DiamondShark © (2005-07-15 12:34) [7]О, придумал, как без побочных запросов.
В качестве провайдера используем MSDataShape, пишем запрос, возвращающий иерархический рекордсет.
В OnCalcFields вычисляем поле по вложенному рекордсету.
Гы ;)
Формально -- запрос один, без побочных ;)
← →
msguns © (2005-07-15 12:37) [8]>DiamondShark © (15.07.05 12:30) [6]
>Без побочных -- никак.
Два датасета будут по-любому.
Во-первых, это понятно что два.
Во-вторых, не по-любому. Напрмер через макрос, хоть и геморно до безобразности.
Да уж, паршиво когда нет хранимок ;((
← →
DiamondShark © (2005-07-15 13:12) [9]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 13:16) [10]>DiamondShark © (15.07.05 13:12) [9]
Благодарю за код. Если не получится решить чисто "по-клиентски", то буду пробовать
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c