Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизПомогите и мне с запросом... Найти похожие ветки
← →
VID (2004-01-21 21:24) [0]Хочу сделать такой select, который из таблицы T1 выбирал бы значения всех записей для поля Field1, а также рядом с каждым значением ставил бы номер записи.
Select Field1, {как и что ?} from t1
----------------------------------------------
и вот какой нужен результат:
----------------------------------------------
Field1 F_1
a 1
br 2
cww 3
r5 4
w3 5
← →
Johnmen (2004-01-21 22:06) [1]А смысл ?
← →
Kalinka (2004-01-21 22:10) [2]Можно попробовать так (прошу прощения за какие-либо ошибки - пишу вслепую):
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
Может получится :)
А еще можно попробовать через курсор, но это дольше.
← →
VID (2004-01-21 23:20) [3]To Johnmen: Хочу что бы FIBDataSet, при открытии, в качестве одного из полей, показывал номер записи. Если знаешь, как это сделать, более красивым методом - скажи, буду только рад )
To Kalinka: ты куда то не в ту степь...
← →
Deniz (2004-01-22 06:22) [4]Опять порядковый № записи :(
create procedure ...
returns (RowNum integer, ...)
as begin
RowNum = 0;
for select ... from ... where ... into ... do begin
RowNum = RowNum + 1;
suspend;
end;
end
← →
Desdechado (2004-01-22 10:59) [5]Если речь идет просто о визуальной красивочти выборки - типа, юзеру перед глазами нумеровать строки, то это нормально. Только потом этот номер не использовать нигде!
А создать его можно как Deniz ©, а можно и просто так:
1. SELECT 1 AS rownum, прочие поля ...
2. на клиенте в AfterOpen пробегать по датасету и в первое поле счетчиком присваивать номера
← →
Johnmen (2004-01-22 11:07) [6]>VID ©
Всё равно, не понимаю смысла показа...:)
К вышесказанному можно добавить еще способ.
Добавляем вычисляемое поле myrecno в НД. Вычисление
DataSet.FieldByName("myrecno").AsInteger:=DataSet.RecNo;
← →
VID (2004-01-22 17:20) [7]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 использованы не будут.
посему, не вижу резона использовать хп для выборки данных из таблиц, при меняющихся условиях сортировки полей.
← →
VAleksey (2004-01-22 17:24) [8]Для такой задачи любой метод "тормознутый".
← →
div (2004-01-22 18:21) [9]если правильно понял, то нужна просто нумерация строк...
я бы в 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;
← →
Sandman25 (2004-01-22 18:27) [10][9] div (22.01.04 18:21)
Если поле не первое, а скажем N-ое, то все равно можно обращаться по индексу.
const N = 5;
...
Fields[N].AsInteger := ...
← →
div (2004-01-22 19:02) [11]2 Sandman25
ну ясное дело )))) я же принцип показываю а не индексацию полей объясняю )))
← →
Sandman25 (2004-01-23 16:17) [12]div
Меня смутила фраза "ну или если это поле первое тогда еще проще (и шустрее)". Выглядело так, словно есть разница между первым полем и остальными :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c