:: Visual Foxpro, Foxpro for DOS
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Игорь пунктуален до безобразия вот должно быть числовое с префиксом n и все тут
Не-не, срач не разводим ... главное ТС счас не запутать мелочами
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Главное - должен быть порядок. Если уж используется такой вариант нотации, то надо его придерживаться. Это ж не для каких-то "непонятных великих целей" придумано - это упрощение жизни разработчика. Видишь lCheck - работаешь с ним как с логическим полем - никакие lCheck=1 тут неприменимы. Видишь nSome - работаешь как с числом, скажем не пишешь nSome + " строка" или LEN(nSome)=2
В строго типизированном языке в момент компиляции будет ошибка (и даже до того - IDE умеет "подсказки" выдавать где ты ошибся в типах практически сразу после ввода буковок кода в окно редактора), а в фоксе - пока до исполнения этой части кода дело не дойдёт (а это может быть и через год после написания - если не тестировать тщательно все возможные "ветки" кода), ты и знать не будешь что у тебя там ошибка.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Igor Korolyov
В принципе, конечно, можно и через OR насобирать условий. Но есть и другие способы:
- если выбранных значений не очень много, то можно использовать условие вида
поле IN (1, 2, 6, 8)
- собирая "список кодов" в строку через запятую, и используя макро. Не самое красивое, но вполне рабочее решение.
- если выбранных значений может быть больше десятка, то использовать выбор отмеченных в курсор (типа как мой класс делает) и в запросе прописать
поле IN (SELECT id FROM csrSelected)
Если для выбора использовать мувер (он ведь тоже по сути выбирает произвольное множество элементов из списка - от нуля до всех) и он работает на курсоре с полем Check, то безо всяких лишних телодвижений в запрос прописывается

поле IN (SELECT id FROM csrMover WHERE lCheck)

P.S. обычно префикс l имеют логические поля, там не будет никаких 0/1, там будет .T. и .F. и потому условие будет выглядеть вот так вот "просто" если там всё же число, то условие в подзапросе будет nCheck=1 - т.к. и поле уж тогда надо назвать с префиксом n
Одновременно выбранных значений не будет больше пяти точно, поэтому первый вариант с использованием макро годится вполне.
Только не пойму как собрать этот "список кодов", как происходит присвоение выбранного значения к конкретной переменной? если делать это через thisform.list3.value то переменной присваивается только одно последнее значение из трех например выбранных. В указанном примере 1,2,6,8 - это строки курсора с содержанием значения n-ой строки или как?
аналогичный вопрос возникает при построении условия через OR.



Исправлено 1 раз(а). Последнее : ptaxa888, 18.03.18 00:01
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Присвоение значения переменной производит, кхм, оператор присвоения = (символ равно), или команда store.
Никакие свойства .Value ничего никуда не присваивают. Они лишь дают доступ (и по чтению и по записи) к "содержимому элемента управления".
Свойство ControlSource в некотором роде присвоение производит - но в данном случае оно абсолютно не при чём.
В данном примере 1,2,3 - это значения для поиска в поле. Каждое из них сравнивается с содержимым поля, и если вышло совпадение, то эта запись попадает в результат отбора.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 18.03.18 00:17
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Igor Korolyov
- если выбранных значений не очень много, то можно использовать условие вида
поле IN (1, 2, 6, 8)
- собирая "список кодов" в строку через запятую, и используя макро. Не самое красивое, но вполне рабочее решение.
Про выбранные значения изначально подумал про подсвеченные, а не количество значений поля. в таком случае через марко не удобно т.к. значений в поле вываливается от 2 до 20. В таком случае выбранные записи мне нужно копировать в новый курсор с изменением поля lcheck с 0 на 1 так? а потом их вытаскивать в IN. или я все не так понимаю?



Исправлено 4 раз(а). Последнее : ptaxa888, 18.03.18 00:46
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я лично вообще ничего не понимаю, ну кроме того что ты плаваешь по всем вопросам, начиная от элементарных.
Книжку бы тебе какую почитать, раз уж приходится программировать то на фоксе...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Порекомендуйте книгу по программированию, для чайников так сказать. Почитал книжки именно по VFP, но там программирования практически нет, по большей мере работа с СУБД .
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
Вот набросал вам пример со стандартным мультиселектом листбокса ... не утверждаю что 100% грамотно - но работает )))
А также думаю специализированный класс будет поудобнее
Ratings: 0 negative/1 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
AndyNigmatec
Вот набросал вам пример со стандартным мультиселектом листбокса ... не утверждаю что 100% грамотно - но работает )))
А также думаю специализированный класс будет поудобнее
Спасибо всем за помощь, все получилось. Условие отбора формируется. Стоило открыть книжку и сразу стало понятно о чем речь (про IN)
SELECT sprav1
SCAN
m.i=m.i+1
REPLACE sprav1.lcheck WITH thisform.list3.Selected(m.i)
ENDSCAN
*.......
CASE tipC2=('S')
SELECT cChoice2
SCAN FOR lcheck=1
cWhere=[ WHERE ]+ALLTRIM(cChoice2.tblfld)+[ IN ]+[(SELECT sprav1.text FROM sprav1 WHERE lcheck=.T.)]
ENDSCAN
*.....
Ratings: 0 negative/0 positive


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

On-line: 20 PaulWist Joys  (Гостей: 18)

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