powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос DELETE
6 сообщений из 6, страница 1 из 1
Запрос DELETE
    #38643936
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер. Почему при удалении просит выбрать таблицу?

авторDELETE * FROM drivers WHERE (drivers.pasp=thisform.pageframe1.page3.text1.Value) OR (drivers.fio=thisform.pageframe1.page3.combo1.Value)
...
Рейтинг: 0 / 0
Запрос DELETE
    #38643940
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В другой таблице почему-то запись не удаляется.
Запрос:
авторDELETE FROM way WHERE way.idm=VAL(thisform.pageframe1.page2.combo1.Value)
...
Рейтинг: 0 / 0
Запрос DELETE
    #38643943
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, нет все работает (2 пост)
...
Рейтинг: 0 / 0
Запрос DELETE
    #38643949
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу разобраться с 1 постом.
Если удаляю так, без звездочки, он почему-то удаляет все записи.
авторDELETE FROM drivers WHERE (drivers.pasp=thisform.pageframe1.page3.text1.Value) OR (drivers.fio=thisform.pageframe1.page3.combo1.Value)
...
Рейтинг: 0 / 0
Запрос DELETE
    #38644162
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вопрос сравнения символьных строк. В частности, сравнения с пустой строкой.

Дело в том, что по умолчанию, любое сравнение символьных строк выполняется до окончания символов в самой короткой из сравниваемых строк. Ну, а раз пустая строка имеет нулевую длину, то, по факту, имеем, что пустая строка равна любому значению.

В частности, у Вас имеется

Код: sql
1.
2.
3.
4.
thisform.pageframe1.page3.text1.Value = ""
thisform.pageframe1.page3.combo1.Value = "1"

DELETE FROM drivers WHERE (drivers.pasp="") OR (drivers.fio="1")



Вот первое условие (drivers.pasp="") и выполняется всегда. Поскольку объединение условий через OR, то это означает истинность условий для вообще всех записей

Решений проблемы несколько

Вариант 1 - формировать условие в зависимости от введенных данных через макроподстановку

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Local lcFilter
lcFilter = ""

if empty(thisform.pageframe1.page3.text1.Value) = .f.
    lcFilter = iif(empty(lcFilter),""," OR ") + "drivers.pasp=[" + thisform.pageframe1.page3.text1.Value + "]"
endif

if empty(thisform.pageframe1.page3.combo1.Value) = .f.
    lcFilter = iif(empty(lcFilter),""," OR ") + "drivers.fio=[" + thisform.pageframe1.page3.combo1.Value + "]"
endif

if empty(lcFilter) = .f.
    DELETE FROM drivers WHERE &lcFilter
else
    MessageBox("Укажите критерии удаления")
endif



Вариант 2 - дополнять символьные строки концевыми пробелами до некоторой фиксированной длины

Код: sql
1.
2.
3.
4.
5.
Local lcPasp, lcFIO
lcPasp = PADR(LTRIM(thisform.pageframe1.page3.text1.Value),10)
lcFIO = PADR(LTRIM(thisform.pageframe1.page3.combo1.Value),10)

DELETE FROM drivers WHERE (drivers.pasp=m.lcPasp) OR (drivers.fio=m.lcFIO)



Разумеется, число 10 - условно. Здесь надо подставить число, равное размерности полей drivers.pasp и drivers.fio соответственно

Вариант 3 - использовать глобальную настройку SET ANSI

Глобальная настройка SET ANSI определяет способ сравнения символьных строк в рамках команд Select-SQL. Глобально. Для всех команд Select-SQL в рамках текущего сеанса данных

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Local lcANSI
lcANSI = SET("ANSI")
if lcANSI = "OFF"
   SET ANSI ON
endif

Local lcPasp, lcFIO
lcPasp = LTRIM(thisform.pageframe1.page3.text1.Value)
lcFIO = LTRIM(thisform.pageframe1.page3.combo1.Value)

DELETE FROM drivers WHERE (drivers.pasp=m.lcPasp) OR (drivers.fio=m.lcFIO)

if lcANSI <> SET("ANSI")
   SET ANSI OFF
endif



Решение крайне рискованное, поскольку Вы меняете глобальную настройку для решения локальных задач. А это требует особой аккуратности в использовании. Крайне не рекомендуется применять такое решение новичкам

Вариант 4 - использовать выражение тождественного равенства (два символа равно подряд)

Код: sql
1.
2.
3.
4.
5.
Local lcPasp, lcFIO
lcPasp = AllTrim(thisform.pageframe1.page3.text1.Value)
lcFIO = AllTrim(thisform.pageframe1.page3.combo1.Value)

DELETE FROM drivers WHERE (drivers.pasp == m.lcPasp) OR (drivers.fio == m.lcFIO)



Сравнение на тождественное равенство работает как "локальная" настройка SET ANSI ON, действующая в рамках одного конкретного сравнения. В этом случае символьные строки сначала дополняются концевыми пробелами до одинаковой длины и только потом сравниваются.

Здесь "тонкость" заключается в том, что прежде, чем выполнить сравнение, необходимо отсечь возможные ведущие пробелы. Поскольку Вы вводите значение через объекты формы, то наличие ведущих пробелов вещь достаточно обычная. Впрочем, отсечение ведущих пробелов необходимо выполнять в любом из вариантов сравнения.


=============================================================

PS: Почему Delete * вызывает диалог выбора таблицы? "Если ничего не помогает, попробуйте прочитать инструкцию" В данном случае справку по команде Delete-SQL

Код: sql
1.
DELETE [Target] FROM [FORCE] Table_List (...)



После ключевого слова DELETE либо сразу следует ключевое слово FROM, либо имя таблицы, из которой и выполняется удаление. А если вместо имени таблицы указать звездочку, то это и есть необходимость указания списка таблиц, чтобы пользователь выбрал, из чего же он удалять собирается.

Чтобы избежать появления списка для выбора, Вы должны явным образом указать из какой таблицы будет происходить удаление

DELETE FROM drivers

или так

DELETE drivers FROM drivers
...
Рейтинг: 0 / 0
Запрос DELETE
    #38644259
sfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ, Большое спасибо! На счет DELETE * реально тупил!
Ещё раз СПАСИБО!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос DELETE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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