:: Visual Foxpro, Foxpro for DOS
Re: Отобрать уникальные пары
Pliskin

Сообщений: 2959
Откуда: Новосибирск
Дата регистрации: 19.11.2003
Igor Korolyov
Я не очень доверяю трюкам с квадратными скобками, потому как правило делаю свои UDF типа greatest(), least() чтобы разрешить конфликт имён между агрегатной и "обычной" функцией min/max.

Вполне сгодится и обычный IIF
* дли min()
IIF( id1>id2, id2, id1 )
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Равиль
Предлагаю усложнить задачу - найти уникальные тройки (правда практического интереса пока нет в этом - но кто знает - вдруг пригодится) :
...
*!* Вопрос : Как выбрать из этой таблицы только уникальные тройки ?

А если воспользоваться теоремой Ферма? \m/
Тогда кстати получается вдобавок и универсальное решение для N полей:

Use In Select("test")
Create Cursor test (id1 i, id2 i, id3 i)
Insert Into test (id1, id2, id3) Values (1, 2, 3)
Insert Into test (id1, id2, id3) Values (2, 3, 4)
Insert Into test (id1, id2, id3) Values (2, 1, 3) && Эта тройка лишняя - она повторяет первую
Insert Into test (id1, id2, id3) Values (3, 1, 4)
INDEX ON id1^3+id2^3+id3^3 TAG un UNIQUE
Browse Last
[sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 2 раз(а). Последнее : Crispy, 14.09.17 11:23
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Crispy
А если воспользоваться теоремой Ферма? \m/

При чем здесь теорема Ферма?

Цитата:
Use In Select("test")
Create Cursor test (id1 i, id2 i, id3 i)
Insert Into test (id1, id2, id3) Values (1, 2, 10)
Insert Into test (id1, id2, id3) Values (4, 6, 9)
INDEX ON id1^3+id2^3+id3^3 TAG un UNIQUE
Browse Last
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
leonid
При чем здесь теорема Ферма?

Ну как при чем?! :al: При том! \m/
Ну пусть будет степень выше:
INDEX ON id1^5+id2^5+id3^5 TAG un UNIQUE
Тут главное суть. [sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Crispy
Тут главное суть. [sm128]

Вот как раз сути то здесь и не видно.

Use In Select("test")
Create Cursor test (id1 i, id2 i, id3 i)
Insert Into test (id1, id2, id3) Values (26, 85, 118)
Insert Into test (id1, id2, id3) Values (53, 90, 116)
INDEX ON id1^5+id2^5+id3^5 TAG un UNIQUE
Browse Last

Будем дальше гадать, или начнем думать?
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
USE IN SELECT("test")
CREATE CURSOR test (id1 i, id2 i, id3 i)
INSERT INTO test (id1, id2, id3) VALUES (1, 2, 3)
INSERT INTO test (id1, id2, id3) VALUES (2, 3, 4)
INSERT INTO test (id1, id2, id3) VALUES (2, 1, 3) && Эта тройка лишняя - она повторяет первую
INSERT INTO test (id1, id2, id3) VALUES (3, 1, 4)
* Осталось найти общую формулу для N полей.
LOCAL laIDs(1)
SELECT * FROM test INTO CURSOR wTest WHERE .F. READW
SELECT test
SCAN
SCATTER TO laIDs
ASORT(laIDs)
SELECT wTest
APPEND FROM ARRAY laIDs
ENDSCAN
SELECT DISTINCT * FROM wTest INTO CURSOR wTest
BROW



Исправлено 8 раз(а). Последнее : Ydin, 14.09.17 20:04
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Pliskin
Вполне сгодится и обычный IIF
* дли min()
IIF( id1>id2, id2, id1 )

Не всегда...
id1 = 1
id2 = null
? IIF(m.id1>m.id2, m.id2, m.id1), MIN(m.id1, m.id2)
Не говоря уж о том что min/max принимают до 26-ти параметров за раз...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Игорь, твое высказывание, про "не доверяю" - это эмоции. А Плискин тебе подпел как авторитету.
И разойдись с ним на тему "что посеешь то и пожнешь". Сам виноват и это callback.
Можно не доверять женщине. А здесь на что тень кидать своим недоверием? На то, что мне так спокойней от своей ошибки? Да, но и не более



Исправлено 1 раз(а). Последнее : Ydin, 15.09.17 17:44
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
id1 = 1
id2 = null
? IIF(m.id1>m.id2, m.id2, m.id1), MIN(m.id1, m.id2)

Для проверки на NULL есть функции NVL(), ISNULL(), но не операторы сравнения.
Ratings: 2 negative/0 positive
Re: Отобрать уникальные пары
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ydin
Игорь, твое высказывание, про "не доверяю" - это эмоции... А здесь на что тень кидать своим недоверием?
Ну так даже сам leonid и привёл примеры когда квадратные скобки в запросе "не взлетают". Это недокументированная особенность, и как таковая и не должна вызывать доверия Нашёл вариант который работает (протестировал решение) - ну хорошо, но не факт что чуть другой вариант уже не сломается...
Жаль что MS не сделали сами для использования в SQL-е функции-синонимы для MIN/MAX... Это решило бы вопрос без лишних телодвижений.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005




Исправлено 2 раз(а). Последнее : Ydin, 15.09.17 22:04
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Ydin
Интересное у вас правило, жаль без наглядного примера.
Но при всем желании не понял, почему созданная ошибка с оператором m.id1>m.id2 при id2 = NULL лучше, к примеру, вместо предварительной обработки NVL(id2,0) или IIF(ISNULL(id2),0,id2)?
Да и вообще, в контексте задачи от ТС, зачем здесь взялся вброс NULL-значений?
Ratings: 1 negative/0 positive
Re: Отобрать уникальные пары
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
lulgu
Ydin Интересное у вас правило, жаль без наглядного примера.
Но при всем желании не понял, почему созданная ошибка с оператором m.id1>m.id2 при id2 = NULL лучше, к примеру, вместо предварительной обработки NVL(id2,0) или IIF(ISNULL(id2),0,id2)?
Да и вообще, в контексте задачи от ТС, зачем здесь взялся вброс NULL-значений?

Цитата:
без наглядного примера
Да я сам понял, что наглядного примера не покажу. И убрал свое сообщение.
Цитата:
зачем здесь взялся вброс NULL-значений?
Да, хотел ИК сказать, что с Null не всегда надо пытаться выходить из положения по дефолту, бывает полезно провоцировать ошибку.
Так делаю, но по ситуации.
Трудно объяснить...
Цитата:
созданная ошибка с оператором m.id1>m.id2 при id2 = NULL лучше
Нет. Не об этом.
Попытаюсь...
Наша программа работает на предприятии, где большая структура самого предприятия.
Но для всех предприятий этой структуры общая база данных - одна. И наши ошибки в программе пишутся в эту БД.
Стратегия написания программы от этого зависит.



Исправлено 1 раз(а). Последнее : Ydin, 15.09.17 22:28
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
null это специальное "значение". Его "выбрасывать" никак нельзя. Его нужно обрабатывать так или иначе - внутри функции, или вовне - вопрос второй. Но просто "сказать" что я с null не работаю - это неправильно. Такой код является неустойчивым и потому ошибочным. Да, один из вариантов "работы" может быть в генерации ошибки - т.е. увидел что какой-то параметр функции null и тут же сгенерировал ошибку 11.

В контексте изначального вопроса - нет гарантии что в поле рабочей таблицы не встретится null - а значит решение должно учитывать такую возможность. max/min худо-бедно это могут делать (другое, дело что в контексте "поиска уникальных пар" предложенными вариантами эта их особенность будет только мешать). Арифметика - "сломается", IIF - тоже "сломается" (но чуть по другому). Речь шла всё же не про это, а про то что вариант с iif не эквивалентен функциям max/min - даже если не заморачиваться на 3 и более параметра.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Смотрите, я пишу ф-ю и ею пользуются другие программисты в нашей фирме.
Скажем, это ф-я
FUNCTION SomeFunc
LPARA tuParm1
m.tuParm1 = nvl(m.tuParm1 ,0)
...

И я сам пишу где-то вызов этой ф-ии. И у меня все хорошо, на здоровье!

А потом я говорю, что есть такая ф-я и Вы все можете ей пользоваться!
И мои ребята пишут...
И где-то проблема. И мне об этом говорят!
Потом уже я догоняю, что мне лучше было бы без вот этого - m.tuParm1 = nvl(m.tuParm1 ,0) !
Я то пишу и знаю, что этот параметр д.б. числовым и если не задан (EVL() или NVL()), то можно взять как 0.
Но мой программист ошибся, он перепутал параметр, и он Null.
И все пляшет - ошибки нет. А где-то далеко потом - не тот результат.
Но этот программист все списывается на меня - моя ф-я работает не правильно.
Я не въезжаю, долго ищу, задачи не знаю.
У них юзер обзывает нас пидарами, т.к. его заказчик его обзывает этим гадким словом...
А так, если подумать, то вероятность такой ситуации такая маленькая...
Чего об этом думать, когда пишешь код - как-то радостно когда получаешь нужный результат...
Я попался на этом может 2-3 раза. Но осадок остался как от встречи с скунксовыми (https://otvet.mail.ru/question/5448287 )



Исправлено 3 раз(а). Последнее : Ydin, 15.09.17 23:25
Ratings: 0 negative/0 positive
Re: Отобрать уникальные пары
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
null это специальное "значение". Его "выбрасывать" никак нельзя. Его нужно обрабатывать так или иначе - внутри функции, или вовне - вопрос второй. Но просто "сказать" что я с null не работаю - это неправильно. Такой код является неустойчивым и потому ошибочным. Да, один из вариантов "работы" может быть в генерации ошибки - т.е. увидел что какой-то параметр функции null и тут же сгенерировал ошибку 11.
В контексте изначального вопроса - нет гарантии что в поле рабочей таблицы не встретится null - а значит решение должно учитывать такую возможность. max/min худо-бедно это могут делать (другое, дело что в контексте "поиска уникальных пар" предложенными вариантами эта их особенность будет только мешать). Арифметика - "сломается", IIF - тоже "сломается" (но чуть по другому). Речь шла всё же не про это, а про то что вариант с iif не эквивалентен функциям max/min - даже если не заморачиваться на 3 и более параметра.

О чем и речь.
Вы написали код с элементарной ошибкой (замечу, вы не в первый раз делаете эту ошибку), без обработки ошибки, но в ошибке обвинили оппонента.
Да еще вдобавок раскрасили мой пост.

ТС в своем CREATE CURSOR ... много еще чего взял по умолчанию, и не только явные NULL - в контекст вы их зачем-то внесли, не подправив начальные условия и не предложив свое решение.
Так что можете попробовать "сломать IIF чуть по-другому" без вброса новых понятий.
Ratings: 1 negative/0 positive
Re: Отобрать уникальные пары
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Ydin
Напрасно убрали, мне и ваш код и пост понравились.

Что касается "трудно объяснить ..." - конечно, этот простой вопрос плавно перерастает в другую и очень объемную тему - глобальную обработку ошибок.
Понятно, что это глобальная стратегия и в двух словах ее не изложишь, да и зачем.
Замечу, что и в этом вопросе когда-то ИК со мной отнюдь не блистал, заодно и мой интерес пропал.

Что касается вашего примера, то здесь у вас ключевая фраза: - "мой программист ошибся, он перепутал параметр".
Такое может происходить с любой функцией, с любыми параметрами - и что теперь, от всего шарахаться.
Да и с вами описанной ситуацией обычная история, осадков хватает, терпишь.
Это организационный вопрос - вдумчивая работа с персоналом, комментарии, защита от дурака, отслеживание ошибок ... - да вы с этим хорошо знакомы.
Ratings: 1 negative/0 positive
Re: Отобрать уникальные пары
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
lulgu
..., защита от дурака, ...

О, да! Это хорошая вещь. Вот бы еще на этом форуме такую внедрить.
Ratings: 0 negative/1 positive
Re: Отобрать уникальные пары
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
leonid
lulgu
..., защита от дурака, ...

О, да! Это хорошая вещь. Вот бы еще на этом форуме такую внедрить.

Строго говоря - "защита от дурака" это свидетельство вашей беспомощности, когда вы боитесь даже незнакомого вам дурака.
Если все же применительно к коду - если вы написали код "на дурака", значит он интересен только дуракам.



Исправлено 1 раз(а). Последнее : lulgu, 16.09.17 00:45
Ratings: 1 negative/0 positive
Re: Отобрать уникальные пары
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ydin
Смотрите, я пишу ф-ю и ею пользуются другие программисты в нашей фирме.
...
Но мой программист ошибся, он перепутал параметр, и он Null.
Александр, я ж не спорю - это как раз пример "плохой" работы с null.
Если функция не должна работать с null (не закодирована она так, или в принципе null не допустим в качестве параметра) то будет совершенно логично и правильно первым шагом проверить параметр и выкинуть error 11 - НЕ пытаться "всё поправить своими силами" (хотя это в парадигме фокса - полную чушь можно написать в коде, а он таки будет пытаться это хоть как-то исполнить Вместо того чтобы сразу написать "ну ты и идиот, братюня"). Т.к. большинство встроенных функций фокса с null работают, и работают "логично и правильно" - если смотреть на это "со стороны". Но для КОНКРЕТНОГО применения в данном конкретном месте это самое "логичное и правильное поведение" оказывает совершенно неподходящим
Именно поэтому нужно:
1) знать и никогда не забывать что помимо циферок/буковок/дат есть ещё хитрый зверь null.
2) при написании особо ответственного, или отчуждаемого кода (когда твою функцию может вызвать кто угодно, и засунуть в параметры что угодно) предусмотреть проверку параметров - как на типы/диапазоны значений, так и на null - и если "по логике" нельзя никак сделать исправление переданного значения, или прописать "значение по умолчанию", то выкинуть ошибку.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 Равиль  (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика