Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 30 31 32 33 34 35 36 37 38 [39]
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 761
DarkMaster
alekcvp,
А тут дело не в переменной, а в совпадении имен. Ровно такой же результат будет и в FB


Будет, но если вы попытаетесь в update запрос засунуть переменную без ':' (и нет поля с таким именем), то он будет ругаться, во всяком случае у меня в SP ругался. Поэтому просто всегда пишутся переменные с двоеточием.
8 май 18, 10:16    [21394905]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3400
Засада еще и в том, что никто никакими предупреждениями не сыпит о совпадении имен. А тот же PL/SQL developer в режиме отладки показывает, что там переменная используется, а не колонка.
8 май 18, 10:53    [21395021]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 52303
Блог
JaDi
Засада еще и в том, что никто никакими предупреждениями не сыпит о совпадении имен. А тот же PL/SQL developer в режиме отладки показывает, что там переменная используется, а не колонка.

Честно говоря, это хорошая мина при плохой игре. Тут авторы синтаксиса языка, конечно, лажанулись.
8 май 18, 10:55    [21395034]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 544
softwarer,
 UPDATE TABLE SET
   POLE1 = POLE1 +1,
   POLE2 = CASE WHEN POLE2 < POLE1 THEN POLE1 ELSE POLE4,
   POLE3 = CASE WHEN NVL(IN_PARAM1,0) <= 0 THEN POLE3 ELSE IN_PARAM1 END,
   POLE4 = SYSDATE,
   POLE5 = P_POLE5
 WHERE POLE6 > POLE7

И, чего тут не правильного? Вполне реально, логично, понятно и правильно. Работаем с собственными полями.
А вопросы... Видимо, это просто от недоперепонимания :)
8 май 18, 11:15    [21395144]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 544
Название топика очень верное
8 май 18, 11:16    [21395155]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 52303
Блог
stells2
И, чего тут не правильного?

Не правильного тут неявное внедрение переменных в запрос, что приводит к проблеме и вынуждает пользоваться костылями типа префикса p_.
8 май 18, 11:22    [21395199]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 544
softwarer,
Выше я показал, когда обновление таблицы идет фактически её же полями.
Это частая практика
UPDATE TABLE SET POLE1 = CASE WHEN POLE1 <= 0 THEN 1 ELSE POLE1 END; -- ЕСЛИ НАДО, ОБНОВЛЯЕМ, ИНАЧЕ НЕ ТРОГАЕМ.

Честно говоря, даже причин обсуждения не вижу.
Покажите в какой СУБД такая конструкция вызовет ошибку? (ну, CASE можно заменить на просто POLE+1)
8 май 18, 11:29    [21395252]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
stells2
Member

Откуда: Оклахома Пригород Колымы
Сообщений: 544
А с другой стороны, программист же должен понимать что он делает.
А если код большой, писал он давно или другой человек читает - как он должен определить, что POLE1 это переменная а не атрибут таблицы если названия одинаковые, по каким признакам определить?
8 май 18, 11:33    [21395277]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 52303
Блог
stells2
Выше я показал, когда обновление таблицы идет фактически её же полями.

Это нормально и не вызывает у меня никаких возражений. Ошибку дизайна я назвал в другом месте.
8 май 18, 12:16    [21395490]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
bk0010
Member

Откуда:
Сообщений: 4349
DarkMaster
alekcvp,
А тут дело не в переменной, а в совпадении имен. Ровно такой же результат будет и в FB
У меня такое было с одним отечественным контроллером. Там к своей программе прилинковывалась ОС (похожая на цельнотянутый VxWorks) и шилась в ПЗУ. Никак не могли отладится. Оказалось, что если имя переменной в программе и в ОС совпадает, то это становится одной переменной - счастливой отладки.
8 май 18, 23:46    [21397194]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 58467
bk0010> Оказалось, что если имя переменной в программе и в
bk0010> ОС совпадает, то это становится одной переменной

А как это обнаружили?

Posted via ActualForum NNTP Server 1.5

8 май 18, 23:48    [21397196]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
miksoft
Member

Откуда:
Сообщений: 36652
bk0010,

А что такое "имя переменной в ОС" ?
Это переменные окружения или что-то другое?
9 май 18, 00:33    [21397261]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
bk0010
Member

Откуда:
Сообщений: 4349
Гаджимурадов Рустам
А как это обнаружили?
То, что в переменных значения изменяются без команды - отладочной печатью на каждый чих. А как догадались лечить это простым переименованием не знаю: я там был на подхвате, притаранил очередной кусок кода, а меня порадовали разгадкой. Связались с разработчиками контроллера - они об этом знали, типа "это не баг, это фича".
miksoft
А что такое "имя переменной в ОС" ?
Это переменные окружения или что-то другое?
Да если бы. Самые обычные (типа int i; или float b[200]), насколько сейчас вспоминается даже не глобальные.
9 май 18, 01:13    [21397295]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 58467
bk0010> Связались с разработчиками контроллера - они об этом знали, типа "это не баг, это фича".

Так это было задокументировано?

Posted via ActualForum NNTP Server 1.5

9 май 18, 01:34    [21397298]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
bk0010
Member

Откуда:
Сообщений: 4349
Нет. Но, видимо, считалось само собой разумеющимся, о чем все знают.
9 май 18, 01:53    [21397302]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 58467
bk0010> Нет.

Тогда бага, да. Весьма забавная, ибо быстро обнаруживаемая, ИМХО.
И как в итоге стали обходить? Ставить везде длиннющие префиксы
уникальные в каждом модуле ?

> Но, видимо, считалось само собой разумеющимся, о чем все знают.


Posted via ActualForum NNTP Server 1.5

9 май 18, 02:03    [21397304]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
bk0010
Member

Откуда:
Сообщений: 4349
Гаджимурадов Рустам
bk0010> Нет.

Тогда бага, да. Весьма забавная, ибо быстро обнаруживаемая, ИМХО.
И как в итоге стали обходить? Ставить везде длиннющие префиксы
уникальные в каждом модуле ?

> Но, видимо, считалось само собой разумеющимся, о чем все знают.


Совсем не быстро: задача расчетная, ничего не ломается, врет не всегда и по-разному. Думали - шизеем. Обходить стали префиксом (одним, не длинным - со своими переменными путаницы не было), но не долго - проект закрыли.
Вспомнил аналогичный случай, более свежий. Делаем проект на C++ и Qt. Проект состоит из исполняемого модуля и штук 15 dll, которые он вызывает. Пока каждый пилит свою dll-ку все нормально. Как все начинает компилить ведущий - начинается хрень: ресурсы путаются (в dll-ках на кнопках не те картинки), компилятор предупреждает о хрени со слотами, короче все компилируется и запускается, но все криво. Чесали репу - в чем дело? Потом дошло: Moc-компилятор (препроцессор, реализующий магию Qt) спятил, встретив при одной компиляции в разных dll классы с одним именем (winMain). Изменили имена классов - все наладилось.
9 май 18, 16:16    [21398029]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3400
bk0010,

Кстати, вспомнился случай со шкурками DevExpress, да и просто формой делфи -- одно приложение жутко глючило, не сворачивалось, разворачивалось как-то не так, акцесс виолейшены случайные и компоненты разъезжались. А всё оказалось в том, что имя экзешника было "services.exe" -- винда его как-то по своему обрабатывала, и всё ломало внутри.
9 май 18, 16:47    [21398053]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 6376
JaDi
bk0010,

Кстати, вспомнился случай со шкурками DevExpress, да и просто формой делфи -- одно приложение жутко глючило, не сворачивалось, разворачивалось как-то не так, акцесс виолейшены случайные и компоненты разъезжались. А всё оказалось в том, что имя экзешника было "services.exe" -- винда его как-то по своему обрабатывала, и всё ломало внутри.
Бэст прэктиз - именовать екзешники windows.exe
10 май 18, 00:21    [21398785]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 30 31 32 33 34 35 36 37 38 [39]
Все форумы / Delphi Ответить