21.01.2002, 15:56 | #1 |
Участник
|
условие WHERE SomeField == NULL
Axapta не поддерживает NULL значений. Каждое поле в таблице всегда содержит конкретное значение.
Хотя, для каждого типа данных существует значение, которое рассматривается как NULL: <table border=1><tr><td><b>Тип</b></td><td><b>NULL значение</b></td></tr><tr><td>String</td><td>Пустая строка</td></tr><tr><td>Integer</td><td>0</td></tr><tr><td>Real</td><td>0.0</td></tr><tr><td>Date</td><td>1 января 1901</td></tr><tr><td>Time</td><td>00:00:00</td></tr><tr><td>Emun</td><td>первое начение</td></tr></table> Забивать в коде некоторые значения не всегда удобно (например, для дат), поэтому облегчить себе жизнь можно так: <pre> SomeTable tbl; date nullDate; // далее в коде оставляем эту переменную неинициализированной ... select from tbl where SomeField == nullDate; </pre> |
|
21.01.2002, 20:31 | #2 |
Участник
|
Вообще говоря, есть класс Global.
Этот класс содержит сборник разновсяческих полезных методов-функций. Среди всех этих функций есть и DateNull (а также strMax, strMin и т.п.). О классе Global можно прочитать в AOT в разделе "Application Developer Documentation\Classes\Global". А также в хелпе, если сделать поиск по слоку Global. Согласен с Alexey в том, что в select'е лучше использовать простую переменную-константу, а не метод класса. Похоже, что в этом случае Аксапта делает запрос оптимальнее. |
|
22.01.2002, 14:31 | #3 |
Участник
|
Небольшое уточнение
Небольшое уточнение по поводу NULL-значений конкретных типов:
1. Date - хоть в документации и написано, что для date NULL = 01.01.1901, реально на сервере храниться 01.01.1900 (MSSQLServer 2000). Более того, datenull() возвращает именно это значение. 2. Enum - не первое значение, а 0 (в Enum не обязательно содержится элемент со значением 0, а реально в базе это тот же int). И к вопросу о "where Fiedl = null": Почему бы не использовать конструкцию типа : SomeTable tbl; ... select from tbl where (! SomeField); PS: И, наверное, использование неинициализированных переменных в коде не есть хорошо)) |
|
22.01.2002, 16:05 | #4 |
Участник
|
C NULL -значения для Date и Enum согласен, в первом сообщении я просто процитировал Руководство разработчика Axapta (Null values for different data types)
А что касается неинициализированных значений, то здесь я имел в виду - не присваиваем переменной никаких значений. Axapta при создании переменной всегда инициализирует её значением по умолчанию. |
|
22.01.2002, 16:23 | #5 |
Участник
|
По неинициализированным переменным:
Я имел ввиду именно это - мне кажется, что НЕ присваивать переменной никаких значений, полагая, что Axapta сама проинициализирует её значением по умолчанию, не стоит. Как говориться, если хочешь, чтобы что-то было сделано, надо сделать это самому. Тем более, что это поможет избежать трудноуловимых багов, коих в промышленной разработке и так хватает. |
|
22.01.2002, 22:56 | #6 |
Administrator
|
Цитата:
Изначально опубликовано xroad
Я имел ввиду именно это - мне кажется, что НЕ присваивать переменной никаких значений, полагая, что Axapta сама проинициализирует её значением по умолчанию, не стоит. Цитата:
When a variable is declared, memory is also allocated and the variable is initialized to the default value.
То, о чем пишет Алексей - использование регламентированного поведения интерпретатора, и ничего страшного в этом нет.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
23.01.2002, 16:30 | #7 |
Участник
|
Я думал, что моя мысль очевидна, но оказывается, это не совсем так. Я правильно понял, что можно полагаться на AXAPTA в вопросе присвоения defaul-значений, про которые ничего не ясно (в том же help'e написаны конкретные значения, но они отличаются от того, что есть на практике!) и которые могут поменятся уже в следующем SP?
Это вопрос культуры программирования, он не имеет отношения конкретно к AXAPTA, а распространяется на программирование в целом. Даже в VB я встречал ситуации, когда декларированное поведение по умолчание не отрабатывало. Даже в SQL сразу после определения переменных следует их инициализация руками именно тем значением, которое указано в справке, как default (NULL) (достаточно посмотреть исходные коды системных сохранённых процедур в базе master), несмотря на то, что в справке по MS SQL Server написано "After declaration, all variables are initialized as NULL." |
|
23.01.2002, 16:42 | #8 |
сибиряк
|
Что касается SQL, то полностью поддерживаю. Долго ломал голову при написании stored procedure, полагаясь на значение по умолчанию, почему ничего не работает.
__________________
С уважением, Вячеслав. |
|
|
|