![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите и мне с запросом... [D5, IB6.x]
VID © (2004-01-21 21:24:00)
Хочу сделать такой select, который из таблицы T1 выбирал бы значения всех записей для поля Field1, а также рядом с каждым значением ставил бы номер записи.
Select Field1, {как и что ?} from t1
----------------------------------------------
и вот какой нужен результат:
----------------------------------------------
Field1 F_1
a 1
br 2
cww 3
r5 4
w3 5
Sandman25 (2004-01-23 16:17:00) [1]
div
Меня смутила фраза "ну или если это поле первое тогда еще проще (и шустрее)". Выглядело так, словно есть разница между первым полем и остальными :)
div (2004-01-22 19:02:00) [2]
2 Sandman25
ну ясное дело )))) я же принцип показываю а не индексацию полей объясняю )))
Sandman25 (2004-01-22 18:27:00) [3]
[9] div (22.01.04 18:21)
Если поле не первое, а скажем N-ое, то все равно можно обращаться по индексу.
const N = 5;
...
Fields[N].AsInteger := ...
div (2004-01-22 18:21:00) [4]
если правильно понял, то нужна просто нумерация строк...
я бы в Dataset добавил калькулируемое поле (предположим RowNo) и после в обработчике события OnCalcFields следующее:
Dataset.FieldByName("RowNo").AsInteger := Dataset.RecNo;
ну или если это поле первое тогда еще проще (и шустрее):
Dataset.Fields[0].AsInteger := DataSet.RecNo;
Либо можно написать обработчик события OnGetText этого поля (смысл не меняется). Что-то типа:
procedure TForm.DataSetRowNoGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if DisplayText then
Text := IntToStr(DataSet.RecNo)
else
Text := "";
end;
VAleksey (2004-01-22 17:24:00) [5]
Для такой задачи любой метод "тормознутый".
VID (2004-01-22 17:20:00) [6]
Desdechado © (22.01.04 10:59) [5]
Да, ты меня понял, просто хочется для наглядности юзеру показывать номер записи. Но метод твой, рискует быть тормозным, в случае, если будет возвращено слишком дофига записей......
поэтому обратим внимание на Johnmen © (22.01.04 11:07) [6]
Johnmen © (22.01.04 11:07) [6]
Странно, чего ж тут непонятного... впрочем...
to all: я тут подумал, что может и нафиг не нужно такое поле, может проще, FIBDataSet.afterscroll обрабатывать, и писать такой код
IF DataSet = MyDataSet then
begin
MyDataSetsForm.RecStatus.Caption := IntToStr(DataSet.RecNo)+"/"+IntToStr(DataSet.RecordCount);
end;
пару слов для Deniz © (22.01.04 06:22) [4]
Твой метод понятен, но вот требует написания нового хп (что не трудно) и переделки части программы, под использование этой новой хп(что уже не просто, т.к. проект большой). К тому же как я понимаю в таком случае (если получать данные из хп), о использовании индексов таблицы придётся забыть
Поясню: допустим я пишу такой вызов
Select * from NEW_PROCEDURE (...) ORDER BY "A", "B"; (1)
а сама процедура выбирает записи по стандартному принципу (она же не знает как я на самом деле хочу отсортировать выборку):
for Select * from NEW_TABLE INTO :....
do suspend; (2)
таким образом я в результате выполнения SQL (1) получу желаемый набор данных, в нужном порядке сортировки, но вот индексы которые я специально создавал для такого случая на поля "A" и "B" в таблице NEW_TABLE использованы не будут.
посему, не вижу резона использовать хп для выборки данных из таблиц, при меняющихся условиях сортировки полей.
Johnmen (2004-01-22 11:07:00) [7]
>VID ©
Всё равно, не понимаю смысла показа...:)
К вышесказанному можно добавить еще способ.
Добавляем вычисляемое поле myrecno в НД. Вычисление
DataSet.FieldByName("myrecno").AsInteger:=DataSet.RecNo;
Desdechado (2004-01-22 10:59:00) [8]
Если речь идет просто о визуальной красивочти выборки - типа, юзеру перед глазами нумеровать строки, то это нормально. Только потом этот номер не использовать нигде!
А создать его можно как Deniz ©, а можно и просто так:
1. SELECT 1 AS rownum, прочие поля ...
2. на клиенте в AfterOpen пробегать по датасету и в первое поле счетчиком присваивать номера
Deniz (2004-01-22 06:22:00) [9]
Опять порядковый № записи :(
create procedure ...
returns (RowNum integer, ...)
as begin
RowNum = 0;
for select ... from ... where ... into ... do begin
RowNum = RowNum + 1;
suspend;
end;
end
VID (2004-01-21 23:20:00) [10]
To Johnmen: Хочу что бы FIBDataSet, при открытии, в качестве одного из полей, показывал номер записи. Если знаешь, как это сделать, более красивым методом - скажи, буду только рад )
To Kalinka: ты куда то не в ту степь...
Kalinka (2004-01-21 22:10:00) [11]
Можно попробовать так (прошу прощения за какие-либо ошибки - пишу вслепую):
create table #t2(field1 varchar(50), rownum int identity(1,1))
insert into #t2(field1)
select field1
from t1
select * from #t2 order by rownum
Может получится :)
А еще можно попробовать через курсор, но это дольше.
Johnmen (2004-01-21 22:06:00) [12]
А смысл ?