Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
Есть такой код:
*** отбираем совместимые муфты ***
SELECT chert_txt FROM muft_sovm where dvig_tipor like "%"+dt+"%" INTO CURSOR fff
*** формирование выражения фильтра ***
SELECT fff
GO TOP 
ff="mufty.chert_txt=" + "'" + alltrim(fff.chert_txt) + "'"
x=RECCOUNT()
FOR i=2 TO x
GO i
ff=ff + " OR " + "mufty.chert_txt=" + "'" + alltrim(fff.chert_txt) + "'"
NEXT 
*tt="MUFTY.CHERT_TXT='М140.09' OR  MUFTY.CHERT_TXT='М140.10' OR MUFTY.CHERT_TXT='М140.12' OR MUFTY.CHERT_TXT='М140.13' OR MUFTY.CHERT_TXT='М190.24' OR MUFTY.CHERT_TXT='М140.61'"
SELECT * ;
FROM mufty ;
WHERE &ff ;
INTO CURSOR mmm
browse

если я присваиваю выражение (где закомментировано) то все проходит нормально. В чем же дело?
16 фев 05, 14:00    [1324805]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
я догадываюсь, что можно сделать требуемое без таких извратов и средствами SQL... но не догадываюсь как
16 фев 05, 14:04    [1324827]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
Дмитрий Маликов
Member

Откуда: Новосибирск
Сообщений: 179
SELECT * ;
FROM mufty ;
WHERE mufty.chert_txt in (select alltrim(fff.chert_txt) from fff) ;
INTO CURSOR mmm
16 фев 05, 14:37    [1324945]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
Не-а, ничего не выбирает (пустой курсор получается).
если сделать так:
SELECT * ;
FROM mufty ;
WHERE mufty.chert_txt in ('М40.09', 'М40.12') ;
INTO CURSOR mmm

то все хорошо.
16 фев 05, 14:42    [1324968]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
и вот так тоже работает
ff="'М40.09', 'М140.12'"
SELECT * ;
FROM mufty ;
WHERE mufty.chert_txt in (&ff) ;
INTO CURSOR mmm
16 фев 05, 14:47    [1324990]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
А в чем проблема-то? Ты проверил, какое значение принимает переменная m.ff непосредственно перед макроподстановкой? Может в ней вообще ничего нет (в курсоре fff нет записей).

И еще, брось ты замашки от VB. Для сканирования записей таблицы есть команда SCAN...ENDSCAN и не надо выдумывать себе приключений через GO.

SELECT chert_txt ;
FROM muft_sovm ;
WHERE dvig_tipor like "%"+dt+"%" ;
INTO CURSOR fff NOFILTER

*** формирование выражения фильтра ***
LOCAL lcFiltr
lcFiltr = ''
SELECT fff
SCAN
	lcFiltr = m.lcFiltr + " OR mufty.chert_txt=["+fff.chert_txt+"]"
ENDSCAN

* Отсекаем лишний OR
lcFiltr = SubStr(m.lcFiltr,5)

* Для отладки, смотрим что за условие получилось
MessageBox(m.lcFiltr)

* Собственно запрос
SELECT * ;
FROM mufty ;
WHERE &lcFiltr ;
INTO CURSOR mmm

BROWSE

Если же делать одним запросом, то будет так:

SELECT mufty.* ;
FROM mufty ;
INNER JOIN muft_sovm ON mufty.chert_txt = muft_sovm.chert_txt
WHERE muft_sovm.dvig_tipor like "%"+dt+"%" ;
INTO CURSOR mmm
16 фев 05, 14:49    [1325000]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
ВладимирМ
А в чем проблема-то?

Проблема в том, что не работает!
Ни первый, ни второй ваш вариант.
messagebox выдает строку на пол-экрана и ... курсор пустой.
16 фев 05, 14:56    [1325032]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Дай команду REINDEX на таблицу mufty.

Если не поможет, то выложи эти таблички с парой строк (целиком не надо).

Да, на всякий случай.

-) Длина одной строки в макроподстановке (содержимое переменной lcFilter) не должна превышать 8,192 символов
16 фев 05, 15:05    [1325076]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
Если я делаю так:
ff="'М40.09'" + "," +"'М140.12'"
SELECT * ;
FROM mufty ;
WHERE mufty.chert_txt in (&ff) ;
INTO CURSOR mmm
все работает

а когда то же присваивание аа делаю в цикле, то не работает.
16 фев 05, 15:06    [1325080]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
(вырезано цензурой)

create cursor test1 (test1 C(10))
insert into test1 (test1) values ('один')
insert into test1 (test1) values ('два')
insert into test1 (test1) values ('три')
create cursor test2 (test1 C(10))
insert into test2 (test1) values ('один')
insert into test2 (test1) values ('два')

LOCAL lcFilter
lcFilter = ''
select test2
SCAN
	lcFilter = m.lcFilter + " OR test1.test1=["+test2.test1+"]"
ENDSCAN

lcFilter = SubStr(m.lcFilter,5)

select * from test1 where &lcFilter

Ищи ошибку у себя.
16 фев 05, 15:26    [1325182]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi w3d!

Альтернативно к тому что Владимир предложил:

CREATE CURSOR muft_sovm (chert_txt C(10), dvig_tipor C(10))
INSERT INTO muft_sovm (chert_txt, dvig_tipor) ;
    VALUES ("10.01", "asdf")
INSERT INTO muft_sovm (chert_txt, dvig_tipor) ;
    VALUES ("10.02", "sdfg")
INSERT INTO muft_sovm (chert_txt, dvig_tipor) ;
    VALUES ("10.03", "dfg")
CREATE CURSOR mufty (chert_txt C(10), other C(10))
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.01", "1111")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.02", "2222")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.03", "333")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.04", "444")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.05", "555")
dt = "sd"
SELECT * ;
    FROM mufty ;
    WHERE chert_txt IN ;
        (SELECT chert_txt ;
            FROM muft_sovm ;
            WHERE dvig_tipor LIKE "%"+dt+"%") ;
    INTO CURSOR mmm
BROWSE

Ещё скажи что и это не работает, или "не так" работает :)

Posted via ActualForum NNTP Server 1.1

17 фев 05, 02:06    [1326650]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
Igor Korolyov

Hi w3d!

Альтернативно к тому что Владимир предложил:

CREATE CURSOR muft_sovm (chert_txt C(10), dvig_tipor C(10))
INSERT INTO muft_sovm (chert_txt, dvig_tipor) ;
    VALUES ("10.01", "asdf")
INSERT INTO muft_sovm (chert_txt, dvig_tipor) ;
    VALUES ("10.02", "sdfg")
INSERT INTO muft_sovm (chert_txt, dvig_tipor) ;
    VALUES ("10.03", "dfg")
CREATE CURSOR mufty (chert_txt C(10), other C(10))
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.01", "1111")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.02", "2222")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.03", "333")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.04", "444")
INSERT INTO mufty (chert_txt, other) ;
    VALUES ("10.05", "555")
dt = "sd"
SELECT * ;
    FROM mufty ;
    WHERE chert_txt IN ;
        (SELECT chert_txt ;
            FROM muft_sovm ;
            WHERE dvig_tipor LIKE "%"+dt+"%") ;
    INTO CURSOR mmm
BROWSE

Ещё скажи что и это не работает, или "не так" работает :)


ЭТОТ код работает. Если я выкидываю создание курсоров и натравливаю его на свою базу - не работает. Прилагаю базу и форму.

К сообщению приложен файл (Form.rar - 10Kb) cкачать
17 фев 05, 05:54    [1326702]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
Этот запрос работает:
dt="160S2"
SELECT chert_txt ;
   FROM muft_sovm ;
   WHERE dvig_tipor LIKE "%"+dt+"%"

Этот запрос тоже работает:
SELECT * ;
    FROM mufty ;
    WHERE chert_txt IN ;
        ("М140.09", "М140.10", "М140.12", "М140.13") ;
    INTO CURSOR mmm

А этот - не работает:
SELECT * ;
    FROM mufty ;
    WHERE chert_txt IN ;
        (SELECT chert_txt ;
            FROM muft_sovm ;
            WHERE dvig_tipor LIKE "%"+dt+%") ;
    INTO CURSOR mmm
17 фев 05, 06:15    [1326711]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
В последнем запросе кавычки забыл напечатать, должно быть:
SELECT * ;
    FROM mufty ;
    WHERE chert_txt IN ;
        (SELECT chert_txt ;
            FROM muft_sovm ;
            WHERE dvig_tipor LIKE "%"+dt+"%") ;
    INTO CURSOR mmm
17 фев 05, 06:18    [1326714]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с WHERE  [new]
w3d
Member

Откуда: Сургут
Сообщений: 681
Уже разобрался с помощью добрых людей :)).
В таблицах были перемешаны русские и английские буквы.

Отдельное спасибо за пример, как надо делать SQL-запросы
17 фев 05, 09:26    [1326920]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить