Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.011 c
4-39126
Kair
2003-12-12 07:56
2004.02.13
Курсор мышки


1-38955
10100010110110110001
2004-02-03 22:47
2004.02.13
ТЕКСТ


1-38886
yot
2004-02-04 14:02
2004.02.13
Инерпритация


14-39044
DeMoN-777
2004-01-25 16:59
2004.02.13
Авторские права


3-38716
Virus
2004-01-22 10:07
2004.02.13
Ole и база данных paradox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский