Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Сортировка выборки по вычисляемому полю   Найти похожие ветки 

 
Alex8   (2007-11-16 09:09) [0]

Добрый день ! Помогите, пожалуйста !
Мне нужно отсортировать выборку по вычисляемому полю (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   ".
                       Хотя это поле указано в реакторе полей.
Где я портачу? Спасибо.


 
Sergey13 ©   (2007-11-16 09:16) [1]

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

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


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

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

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

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


 
Anatoly Podgoretsky ©   (2007-11-16 09:53) [3]

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

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


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

> [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


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

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

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


 
Sergey13 ©   (2007-11-16 10:16) [6]

> [5] Alex8   (16.11.07 10:05)

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


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

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

> 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 ?


 
ЮЮ ©   (2007-11-16 10:57) [8]

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

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


 
ЮЮ ©   (2007-11-16 11:06) [9]

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

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

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

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


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


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

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

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

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


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

Нечего скрывать. Просто не хочу загромождать вопрос деталями, не влияющими на ответ.
  Теперь о процедуре.
Делаю выборку из двух таблиц, где получаю 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:51) [12]

> [11] Alex8   (16.11.07 11:44)

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

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

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


 
Desdechado ©   (2007-11-16 11:54) [13]

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


 
Desdechado ©   (2007-11-16 11:56) [14]

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


 
ЮЮ ©   (2007-11-16 11:59) [15]

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

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


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

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


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

> > 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 12:29) [17]

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


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

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


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

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


 
Sergey13 ©   (2007-11-16 13:13) [18]

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

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


 
Anatoly Podgoretsky ©   (2007-11-16 16:39) [19]


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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.064 c
15-1194734939
Johnmen
2007-11-11 01:48
2007.12.09
А где Digitman?


2-1194869688
Kick
2007-11-12 15:14
2007.12.09
Проблема с TStringList


2-1195204511
Pro100
2007-11-16 12:15
2007.12.09
Дробная часть


8-1170349122
Vitaliy U.S.
2007-02-01 19:58
2007.12.09
Цифровой фотоаппарат


2-1194852866
Ditrix
2007-11-12 10:34
2007.12.09
обработка исключений в консольном приложении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский