powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Этот странный UPDATE
11 сообщений из 11, страница 1 из 1
Этот странный UPDATE
    #33666405
M0r0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начну сразу с кода )

Код: plaintext
1.
2.
3.
4.
UPDATE cur_slave SET bInProt=.T. ;
WHERE ALLTRIM(cur_slave.nom)+"."+ALLTRIM(cur_slave.wid) IN ;
(SELECT ALLTRIM(cur_protocol.nom)+"."+ALLTRIM(cur_protocol.wid) FROM cur_protocol)


Так вот как сделать чтобы строки сравнивались по полному вхождению. А то получается, что если в cur_slave есть запись 100.1, а в cur_protocol ее нет, но есть 100.10, то флаг установится. А записи-то нет. SCAN'ом неохота пользоваться, как-то громоздко ,)
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33666411
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET ANSI OFF
С уважением, Алексей
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33666449
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то наоброт

SET ANSI ON

OFF - это значение по умолчанию. И оно как раз сравнивает по первым символам. Точнее, до истечения символов в самом коротком из сравниваемых строк.

Если не хочется возится с настройками, то надо дополнить все сравниваемые строки до фиксированной длины пробелами при помощи функции PADR():

Код: plaintext
1.
2.
3.
UPDATE cur_slave SET bInProt=.T. ;
WHERE PADR(ALLTRIM(cur_slave.nom)+"."+ALLTRIM(cur_slave.wid), 10 ) IN ;
(SELECT PADR(ALLTRIM(cur_protocol.nom)+"."+ALLTRIM(cur_protocol.wid), 10 ) FROM cur_protocol)

Здесь число 10 я поставил условно. Вместо него поставьте свое значение равное предельно возможной длине полученных выражений.
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33666483
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, виноват, перепутал.
Конечно SET ANSI ON, но при этом учти, что эта установка имеет областью действия текущюю сессию данных, т.е. для Private Data Session надо SET ANSI ON выдавать каждый раз при запуске формы.
С уважением, Алексей
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33667635
Сергей А.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще лучше использовать оператор '==' : String1==String2
И не озадачиваться :)
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33668157
Uггi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей А.М.А еще лучше использовать оператор '==' : String1==String2
И не озадачиваться :)Не лучше. Поскольку выражения с этим оператором не оптимизируются.
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33668337
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей А.М.А еще лучше использовать оператор '==' : String1==String2
И не озадачиваться :)
Подскажите как использовать этот оператор в конструкции

Field1 IN (...)
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33668346
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uггi Сергей А.М.А еще лучше использовать оператор '==' : String1==String2
И не озадачиваться :)Не лучше. Поскольку выражения с этим оператором не оптимизируются.
Для Select-SQL - оптимизируются. По сути, "==" означает локальную настройку SET ANSI ON для сравниваемого выражения.
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33668384
Сергей А.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Подскажите как использовать этот оператор в конструкции

Field1 IN (...)
Думаю, можно написать
Код: plaintext
1.
2.
UPDATE cur_slave SET bInProt=.T. ;
WHERE ALLTRIM(cur_slave.nom)+"."+ALLTRIM(cur_slave.wid) == ;
(SELECT DISTINCT ALLTRIM(cur_protocol.nom)+"."+ALLTRIM(cur_protocol.wid) FROM cur_protocol)

Предусматривая последующее замечание, задаю встречный вопрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE CURSOR w (id C( 10 ), name C( 10 ))
INSERT INTO w VALUES ("","a")
INSERT INTO w VALUES ("","aa")
INSERT INTO w VALUES ("","aaa")
* Здесь все нормально
UPDATE w SET id=ALLTRIM(id)+"1" WHERE ALLTRIM(name) == (select ALLTRIM(name)from w WHERE name="a")
* Здесь ошибка - подзапрос выдает больше одной строки
UPDATE w SET id=ALLTRIM(id)+"2" WHERE ALLTRIM(name) = (select ALLTRIM(name)from w WHERE name="a")
Почему так?
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33668461
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей А.М.Думаю, можно написать...
Написать может и можно, а смысл?

Сергей А.М.Почему так?
Потому что ТАК не работает! Ибо вопрос упирается в смысл ...
...
Рейтинг: 0 / 0
Этот странный UPDATE
    #33668520
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей А.М.Предусматривая последующее замечание, задаю встречный вопрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE CURSOR w (id C( 10 ), name C( 10 ))
INSERT INTO w VALUES ("","a")
INSERT INTO w VALUES ("","aa")
INSERT INTO w VALUES ("","aaa")
* Здесь все нормально
UPDATE w SET id=ALLTRIM(id)+"1" WHERE ALLTRIM(name) == (select ALLTRIM(name) from w WHERE name="a")
* Здесь ошибка - подзапрос выдает больше одной строки
UPDATE w SET id=ALLTRIM(id)+"2" WHERE ALLTRIM(name) = (select ALLTRIM(name) from w WHERE name="a")
Почему так?
На самом деле, то , что второй запрос выдает ошибку вполне нормально, поскольку результатом подзапроса будет выборка из 3 записей

Код: plaintext
select ALLTRIM(name)from w WHERE name="a"

А вот то, что использование тождественного равенства позволяет выполнить запрос вызывает недоумение. Почему, собственно? Ведь по прежнему подзапрос возвращает те же 3 записи.

Сильно похоже на то, что тождественное равенство работает как INNER JOIN.

Слегка изменяю пример

Код: plaintext
1.
2.
3.
4.
5.
CREATE CURSOR w (id C( 10 ), name C( 10 ))
INSERT INTO w VALUES ("","a")
INSERT INTO w VALUES ("","a")

UPDATE w SET id=ALLTRIM(id)+"1" WHERE ALLTRIM(name) == (select ALLTRIM(name) from w WHERE name="a")

Т.е. 2 совершенно одинаковые записи. В результате _TALLY=4 (т.е. обновились 4 записи) и в таблице имеем в поле id значения "11". Каждая запись обновилась 2 раза (!)

Правда, такое поведение было в VFP6, а в VFP9 обновляются только 2 записи.

Я продублировал этот вопрос в FoxClub. Может там скажут что полезное по этому поводу

http://forum.foxclub.ru/read.php?29,196896
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Этот странный UPDATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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