Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как найти последнюю запись удовлетворяющюю условию / 24 сообщений из 24, страница 1 из 1
15.03.2005, 11:34
    #32960364
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
условие paycаteg=thisform.pageframe1.page3.txtPaycateg.value-1
и надо найти наибольшее значение ab_code

я вот так решил:

Код: plaintext
1.
2.
   SELECT ab_code FROM ab_codes WHERE ;
              paycаteg=thisform.pageframe1.page3.txtPaycateg.value- 1 ;
             INTO CURSOR curAb_Codes ORDER BY ab_code DESC

ну и первая запись в курсоре - то что я ищу

а может еще как-то это умнеее делается?
(еще делал вообще Oder by ab_code, который был DESC и тогда loca for paycateg=нужное_значение, ну и первая найденная запись - то что я ищу)

блин, наверное можно использовать max()...

да, я вот не хотел бы чтобы поиск шел по базе, от которой постороены рилейшны и важна текущая позиция в ней, ее можно, конечно, запомнить по RECNO() и потом к ней вернуться... но с выборкой в курсор этого делать не придеться.

Наверное как-то можно выборку одной записи в курсор сделать, посредством МАХ(), ну это ладно, это случай поиска максимального значения

а как с поиском где не максимальное значение искать надо, а просто поледнюю запись, удовлетворяющюю условию
...
Рейтинг: 0 / 0
15.03.2005, 11:42
    #32960380
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
SELECT ab_codes
calculate max(ab_code) for paycаteg=thisform.pageframe1.page3.txtPaycateg.value-1 to MyVariable
...
Рейтинг: 0 / 0
15.03.2005, 11:45
    #32960389
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
select max(ab_code) FROM ab_codes WHERE ;
paycаteg=thisform.pageframe1.page3.txtPaycateg.value-1;
INTO CURSOR curAb_Codes group BY ab_code
...
Рейтинг: 0 / 0
15.03.2005, 11:49
    #32960402
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
есть недостаток у первого способа :
MyVariable=0 при отсутвии записей удовлетворяющих условию поиска
...
Рейтинг: 0 / 0
15.03.2005, 11:50
    #32960404
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
или пробелу для строки короче эмпти
...
Рейтинг: 0 / 0
16.03.2005, 00:36
    #32962054
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Hi CTAC-KO!

Что значит "последнюю" - физически последнюю в таблице? IMHO это дурной стиль - вот если ты заведёшь какое-то ПОЛЕ (DateTime, или просто счётчик) и на основании его будешь определять что есть "последнее" а что "первое" - тогда совсем другое дело :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
16.03.2005, 10:28
    #32962432
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Igor Korolyov
Hi CTAC-KO!

Что значит "последнюю" - физически последнюю в таблице? IMHO это дурной стиль - вот если ты заведёшь какое-то ПОЛЕ (DateTime, или просто счётчик) и на основании его будешь определять что есть "последнее" а что "первое" - тогда совсем другое дело :)

последнюю не физически, а удовлетворяющюю условию
...
Рейтинг: 0 / 0
16.03.2005, 10:34
    #32962460
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
:-)
...
Рейтинг: 0 / 0
16.03.2005, 11:49
    #32962778
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Если поиск не по индексу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
local lnRecno
lnRecno =  0 
LOCATE FOR <Условие>
DO WHILE FOUND()
    lnRecno = RECNO()
  ENDIF
  CONTINUE
ENDDO
IF lnRecno >  0 
  ? "Последняя удовлетворяющая условию запись имеет номер " + str(lnRecno)
ELSE
  ? "Записей, удовлетворяющих условию, не найдено"
ENDIF
Если поиск по индексу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SET ORDER TO <индекс> DESC
  SEEK <Условие>
  * или LOCATE FOR <Условие>
IF FOUND()
  ? "Последняя удовлетворяющая условию запись имеет номер " + str(Recno())
ELSE
  ? "Записей, удовлетворяющих условию, не найдено"
ENDIF
...
Рейтинг: 0 / 0
16.03.2005, 13:01
    #32963112
kms_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
А я у себя в проге использую практически тоже, что написал leaf в своем втором методе:

Код: plaintext
1.
Select *,recno() as nRec FROM MyTable WHERE <условие> ;
    group BY <поле по которому задается условие> INTO CURSOR MyCursor

Select выдает как раз последнюю запись удовлетворяющую условию, а если нужно идентифицировать ее в таблице, то для этого в селекте используется RecNo():

Код: plaintext
1.
2.
3.
4.
Select *,recno() as nRec FROM MyTable WHERE <условие> ;
  group BY <поле по которому задается условие> INTO CURSOR MyCursor
Select myTable
go MyCursor.nRec

Работает, должен сказать, замечательно!
...
Рейтинг: 0 / 0
16.03.2005, 13:21
    #32963207
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Хм... А RECNO() в SELECT это не есть плохо?
...
Рейтинг: 0 / 0
16.03.2005, 13:34
    #32963261
kms_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
А почему это может быть плохо? Поделитесь мнением, может я пересмотрю некоторые свои подходы к организации Select'ов
...
Рейтинг: 0 / 0
16.03.2005, 13:41
    #32963293
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Непредсказуемость положения указателя при выполнении SELECT'a...
...
Рейтинг: 0 / 0
16.03.2005, 13:55
    #32963343
kms_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Указанный выше Селект с использованием RecNo() всегда указывает у отобранной строки именно тот номер строки, который ей соответсвует - в этом отношении ничего непредсказуемого, а для данной конкретной задачи именно это и нужно.
Если я не прав - поправьте.
...
Рейтинг: 0 / 0
16.03.2005, 14:27
    #32963478
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Спорить не буду... Но и гарантий правильности отработки такого SELECT'a не вижу...
...
Рейтинг: 0 / 0
16.03.2005, 15:16
    #32963658
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Простой тест, где RecNo является ни тем, что Вы о нем думаете ;)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE CURSOR test (ID i, cID c ( 5 ))

FOR i =  1  TO  3 
	INSERT INTO test (ID, cID) VALUES (i, TRANSFORM(i))
ENDFOR

SELECT t2.*, RECNO() RN FROM test t1 ; 
inner JOIN test t2 ON t1.id = t2.id +  1 
...
Рейтинг: 0 / 0
16.03.2005, 15:59
    #32963837
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
2redrik
Вы правы рекно есть зло если в запросе участвует более одной таблицы ,
но в примере приведенном выше таблица одна и -> нет никакого криминала
...
Рейтинг: 0 / 0
16.03.2005, 16:03
    #32963855
kms_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Уважаемый, PaulWist, помнится я писал:
авторУказанный выше Селект с использованием RecNo() всегда указывает у отобранной строки именно тот номер строки, который ей соответсвует - в этом отношении ничего непредсказуемого, а для данной конкретной задачи именно это и нужно.
Ключевым моментом данной фразы являются слова: для данной конкретной задачи .
И, естественно, я не говорю о том, что абсолютно везде и всегда можно в селекте использовать RecNo(), естественно, все зависит от задачи.
...
Рейтинг: 0 / 0
16.03.2005, 16:16
    #32963915
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
kms_

Извините, если невольно обидел, но вот Ваш пост

kms_ А я у себя в проге использую практически тоже, что написал leaf в своем втором методе:

Код: plaintext
1.
Select *,recno() as nRec FROM MyTable WHERE <условие> ;
    group BY <поле по которому задается условие> INTO CURSOR MyCursor


Select выдает как раз последнюю запись удовлетворяющую условию, а если нужно идентифицировать ее в таблице, то для этого в селекте используется RecNo():

Теперь тест на Ваш пример

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE CURSOR test (ID i, cID c ( 5 ))

FOR i =  1  TO  5 
	INSERT INTO test (ID, cID) VALUES (i, TRANSFORM(i))
ENDFOR


SELECT ID,  RECNO() RN FROM test t1 GROUP BY  1 

как видим RN не соответствует фактическому RECNO.

Или я не очень понял о чем речь, тогда приведите тестовый пример.
...
Рейтинг: 0 / 0
16.03.2005, 16:41
    #32963999
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
хотя насчет группировки возможно я и поспешил с постом
сам с группировкой не эксперементировал использовать эту функцию разбиваю на несколько запросов побаиваюсь почему-то
...
Рейтинг: 0 / 0
16.03.2005, 17:32
    #32964190
kms_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
PaulWist, приношу свои искренние извинения за то, что морочил вам и не только вам голову
После того как убедился в вашей правоте (лепту внес ваш последний пример), откопал свою прогу, где использовал аналогичный запрос, и, к моему удивлению, оказалось, что у меня в таблице есть отдельное поле nRecNo, которое я и юзаю, то есть запрос выглядит так:

Код: plaintext
1.
Select .....,nRecNo FROM MyTable WHERE <условие> ;
    group BY <поле по которому задается условие> INTO CURSOR MyCursor

Еще раз сорри.
В следующий раз постараюсь быть менее категоричным в своих высказываниях.
...
Рейтинг: 0 / 0
17.03.2005, 09:29
    #32964944
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
kms_

Да, ладно, все мы делаем ошибки или неправильные выводы, для этого и нужна конференция.
...
Рейтинг: 0 / 0
17.03.2005, 09:40
    #32964967
kms_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
Спасибо за понимание.
...
Рейтинг: 0 / 0
18.03.2005, 14:07
    #32968249
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти последнюю запись удовлетворяющюю условию
kms_А я у себя в проге использую практически тоже, что написал leaf в своем втором методе:

Код: plaintext
1.
Select *,recno() as nRec FROM MyTable WHERE <условие> ;
    group BY <поле по которому задается условие> INTO CURSOR MyCursor

Select выдает как раз последнюю запись удовлетворяющую условию, а если нужно идентифицировать ее в таблице, то для этого в селекте используется RecNo():

Код: plaintext
1.
2.
3.
4.
Select *,recno() as nRec FROM MyTable WHERE <условие> ;
  group BY <поле по которому задается условие> INTO CURSOR MyCursor
Select myTable
go MyCursor.nRec

Работает, должен сказать, замечательно!
надо давать в селекте order by <поле по которому задается условие> DESC и первая запись наша, или последняя, если не DESC, group by - убрать, нафига он здесь вообще? Если нужно выполнить условие еще по одному полю, например, когда в одной базе лежат накладные всех складов и надо выяснить № последней (по условию) тогда просто order by поле_ид_склада, поле_№_накладной вот и все.
все глюки из-за group by, не указывайте его и все будет пучком! В приведенном примере, где не совпадает рекно как раз проблема в попытке найти записи для группировки, что приводит к позиционированию указателя постоянно в конец, что и видно в результате.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как найти последнюю запись удовлетворяющюю условию / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]