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

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

Сортировка выборки по вычисляемому полю [D7, XP]


Alex8 ©   (2007-11-16 09:09:00) 

Добрый день ! Помогите, пожалуйста !
Мне нужно отсортировать выборку по вычисляемому полю (Nm),
но что-то не получается.
Последовательность моих действий следующая:

1.Записываю в с-во SQL (комп. Query1)  "SELECT cName FROM Tiz"
2. В реактор полей (комп. Query1) заношу поле cName
3. В  том же реакторе полей формирую вычисляемое поле Nm
4. Текст запроса - SELECT cName FROM Tiz ORDER BY Nm
5. Исключение- "Field in order by must be in result set".
   (При моем ужасном английском перевел как
    "Поле раздела ORDER BY д.б. указано разделе SELECT")
6. Изменил запрос на  SELECT Nm, cName FROM Tiz ORDER BY Nm
7. Исключение- "Invalid field Name.   Nm   ".
                       Хотя это поле указано в реакторе полей.
Где я портачу? Спасибо.


Anatoly Podgoretsky   (2007-11-16 16:39:00) [1]


>   А когда я создавал вычисляемое поле ('Nm') в редакторе
> полей (пункт 3 последовательности моих действий),
> разве я не включил его в датасет?

Ты включил его в датасет, после выполнения запроса, а надо до.


Sergey13   (2007-11-16 13:13:00) [2]

> [16] Alex8   (16.11.07 12:08)
> Но один вопрос  все-таки остался:
> В cName as Nm  м.б. можно указать любое поле из
> редактора полей и лишь бы присутствовало as Nm ?

Nm - калк поле в датасете и Nm - псевдоним поля в тексте запроса относятся друг к другу как Юрий Долгоругий и Юрий Гагарин. Имена полей датасета берутся из запроса, но ОБРАТНОЙ СВЯЗИ НЕТ. Запрос не видит твоего датасета, он просто дает данные для его формирования.


ЮЮ   (2007-11-16 12:29:00) [3]

> Но один вопрос  все-таки остался:
> В cName as Nm  м.б. можно указать любое поле из
> редактора полей и лишь бы присутствовало as Nm ?


Поля в запросе указываются только те, что есть в таблице.

А то что в твоем DataSete есть ftCalculated поле с именем, совпадющим с именеи поля, возвращающим запросом, никак не повлияет на сортировку.


> Так я ж говорю, что стараюсь убрать в вопросе все
> лишнее.

Настолько убрал, что помочь тебе невозможно :)


Alex8   (2007-11-16 12:08:00) [4]

> > 1.Записываю в с-во SQL (комп. Query1)  "SELECT cName FROM
> Tiz"
> > Делаю выборку из двух таблиц, где получаю 2 столбца

Что не согласуется ?  Так я ж говорю, что стараюсь убрать в вопросе все
лишнее.

Ведь цель достигнута,
 ответ (до которого я сам не мог додуматься) получен
(SELECT cName as Nm, cName FROM Tiz ORDER BY Nm),
за что еше раз большое спасибо.
А если что не так. Извини

Но один вопрос  все-таки остался:
 В cName as Nm  м.б. можно указать любое поле из
 редактора полей и лишь бы присутствовало as Nm ?


ЮЮ   (2007-11-16 11:59:00) [5]

> > Просто не хочу загромождать вопрос деталями, не влияющими
> на ответ.

Так тебе нужно рещить свою проблему, или пофилософствовать на общие темы?


> Нужно объединить результаты в один столбец (Nm), чтобы исключить пустые значения, каких много.

БД какая? Возможно есть решение на уровни SQL, возможности которого у роазных серверов разная.


Desdechado   (2007-11-16 11:56:00) [6]

Или можно прямо так:
ORDER BY Trim(cName)||Trim(cName_1)


Desdechado   (2007-11-16 11:54:00) [7]

А что, сортировать по набору полей уже не модно?
ORDER BY cName, сName_1


Sergey13   (2007-11-16 11:51:00) [8]

> [11] Alex8   (16.11.07 11:44)

Блин, ну я тащусь. Аж материться хочется.

> Просто не хочу загромождать вопрос деталями, не влияющими на ответ.

> 1.Записываю в с-во SQL (комп. Query1)  "SELECT cName FROM Tiz"
> Делаю выборку из двух таблиц, где получаю 2 столбца


Alex8   (2007-11-16 11:44:00) [9]

Нечего скрывать. Просто не хочу загромождать вопрос деталями, не влияющими на ответ.
  Теперь о процедуре.
Делаю выборку из двух таблиц, где получаю 2 столбца
cName  и сName_1.  Нужно объединить результаты в один
столбец (Nm), чтобы исключить пустые значения, каких много.

procedure TfrmAbr.QmtCalcFields(DataSet: TDataSet);
Var r1, r2:string;
begin
r1:= Trim(Qmt.fieldByName('cName').AsString);
r2:= Trim(Qmt.fieldByName('cName_1').AsString);
If r2='' Then Qmt.fieldByName('Nm').AsString := r1
         Else Qmt.fieldByName('Nm').AsString := r2;
end;

Так все-таки
> М.б. можно указать любое поле из
>  редактора полей и лишь бы присутствовало as Nm ?


Sergey13   (2007-11-16 11:06:00) [10]

> [7] Alex8   (16.11.07 10:51)
> Это от безисходности.

Чем дольше ты будешь партизанить и скрывать смысл своих действий, выдавая свои теоретизирования за описание проблемы, тем глубже будет чувство безъисходности.

> [7] Alex8   (16.11.07 10:51)
> М.б. потому, что Nm я вычисляю в процедуре Query1.CalcFields ?
М.б. ты все таки опубликуешь эту загадочную процедуру?


ЮЮ   (2007-11-16 11:06:00) [11]

> Ведь алгоритм вычисления  может быть  связан с  несколькими
> полями или не связан вообще

Извини,  'гражданин'||cName , это не твоё.

Вот теья и спрашивают, что и как ты вычисляешь на клиенте. Если пожобное можно вычислить в запросе силами SQL и ORDER BY <номер поля>, то "вычисляей" в запросе. Иначе общнго решения нет, всё зависит от алгоритма вычисления  

>или не связан вообще


А это ещё что за вычислимое поле, значение которого никоим образом не зависит от записи? RND тут на днях обсуждали, поищи.


ЮЮ   (2007-11-16 10:57:00) [12]

> SELECT 'гражданин'||cName as Nm, cName FROM Tiz ORDER BY
> Nm

1) зачем здесь сортировать по Nm? Разве по cName порядок изменится:
2) ORDER BY 1поддерживается?


Alex8   (2007-11-16 10:51:00) [13]

> Включать расчитываемое поле в таблицу - это неправильно.
Согласен. Это от безисходности.

> SELECT 'гражданин'||cName as Nm, cName FROM Tiz ORDER BY Nm
Вот теперь понятно. Спасибо.

Прошел вариант: SELECT cName as Nm, cName FROM Tiz ORDER BY Nm
Но 2 вопроса остались.
1. SELECT 'гражданин'||- транслятор воспринял как ошибочный оператор.
 М.б. потому, что Nm я вычисляю в процедуре Query1.CalcFields ?
2.  В "SELECT cName as Nm" почему cName ?
   В моем примере просто нет других полей и я вычисляю Nm на основе
   cName-это ясно.  Но если  полей несколько, какое поле указывать?
  Ведь алгоритм вычисления  может быть  связан с  несколькими
 полями или не связан вообще. М.б. можно указать любое поле из
 редактора полей и лишь бы присутствовало as Nm ?


Sergey13   (2007-11-16 10:16:00) [14]

> [5] Alex8   (16.11.07 10:05)

Что хоть считается то в этом поле? Включать расчитываемое поле в таблицу - это неправильно.


Alex8   (2007-11-16 10:05:00) [15]

> Включи поле в датасет

  А когда я создавал вычисляемое поле ('Nm') в редакторе
полей (пункт 3 последовательности моих действий),
разве я не включил его в датасет?
 М.б. это поле надо включить в физическую таблицу  БД ?


Sergey13   (2007-11-16 09:56:00) [16]

> [2] Alex8   (16.11.07 09:47)
> SELECT Nm, cName FROM Tiz ORDER BY Nm

Nm - это поле которое ты создал в ДАТАСЕТЕ, т.е. практически в своем воображении. Но требуешь его от вполне реальной таблицы Tiz.
Если тебе необходимо сортировать по такому полю ЗАПРОС, то его и надо создавать в ЗАПРОСЕ. Нопример

SELECT 'гражданин'||cName as Nm, cName FROM Tiz ORDER BY Nm


Anatoly Podgoretsky   (2007-11-16 09:53:00) [17]

> Alex8  (16.11.2007 09:47:02)  [2]

Включи поле в датасет.


Alex8   (2007-11-16 09:47:00) [18]

> Добавляешь калк поле в датасет, а требуешь его от таблицы.

А как обратиться к датасет ?  
 Попробовал    Select Query1Nm-не проходит.
                     Select Query1.FieldByName('Nm')-не проходит.

Я в растерянности. Не могу додуматься


Sergey13   (2007-11-16 09:16:00) [19]

> [0] Alex8   (16.11.07 09:09)
> Где я портачу?

Ты путаешь датасет и физическую таблицу в БД. Вторая ничего не знает про первый. Добавляешь калк поле в датасет, а требуешь его от таблицы.


Наверх

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