AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Результаты опроса: Какой из методов следует использовать?
if (record) - Хорошо бы ответить в теме, почему 19 73.08%
if (record.RecId) - Хорошо бы ответить в теме, почему 5 19.23%
Свой вариант - Отписался в теме 2 7.69%
Голосовавшие: 26. Вы ещё не голосовали в этом опросе

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.11.2008, 11:35   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
? if (record) vs if (record.RecId)
Ссылки по теме (в них много jobs по теме):
А RecId может быть отрицательным?
if (record) в случае join с использованием group by
Проверка на RecId

X++:
static void Job1(Args _args)
{
    InventTable invTbl = InventTable::find("OL-1000");
    ;
    if (invTbl)
    {
    }
    
    if (invTbl.RecId)
    {
    }
}
Вот еще job, из-за которого я собственно и начал дискуссию:

Добавьте этот метод на таблицу Address.
X++:
static server void doIt(Address _a)
{
    if (_a)
    {
        info("passed if(buffer) check in method");
    }
    
    if (_a.RecId)
    {
        info("passed if(buffer.recId) check");
    }
}
Перекройте метод create на источнике данных Address формы Address:

X++:
public void create(boolean _append = false)
{
    super(_append);

    if (address)
     info("passed if (address) in datasource");
    if(address.RecId)
     info("passed if (address.recId) in datasource");

     Address::doIt(address);
     
}
Какой из вариантов, по вашему мнению, должен использоваться?
Старый 27.11.2008, 11:43   #2  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
X++:
if (table.RecId != 0)
Не помню какую страшилку про if(record) прочел на форуме, но после нее приучил себя писать так, хотя возможно это и лишнее...
Старый 27.11.2008, 11:48   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Мне показалось, что в прошлом уже пришли к решению. Проверка по RecId не сработает на сгруппированном источнике данных, и если в запросе указать список полей, в который не входит RecId. Посему она менее универсальна.

Опять же, как трактовать сформированный но невставленный буфер.

Хотя одно время я испытывал сложности с временными таблицами. Там мне приходилось делать проверку именно на RecId. На буфер что-то не срабатывало. Но я в последнее время с таким не сталкивался, а старые случаи по памяти описать не могу. Может что и путаю. Если наткнусь — отпишу сюда.
__________________
С уважением,
glibs®
Старый 27.11.2008, 11:49   #4  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Я почти всегда использую if (record). Проблем вроде не встречал. Почему именно так - не знаю. Особо никогда не анализировал.

Последний раз редактировалось oip; 27.11.2008 в 12:09. Причина: немного не так сначала написал
Старый 27.11.2008, 12:04   #5  
anykey is offline
anykey
Участник
 
35 / 26 (1) +++
Регистрация: 04.12.2006
не совсем понял, почему нельзя использовать проверку по RecID при указании списка полей для выборки.
Если я верно понял, не должна срабатывать проверка таког вида:
X++:
if((select firstonly AccountNum from custTable).RecId)
        info ("Found");
?
А вообще стараюсь использовать только проверку по RecId (опять таки не помню почему, что-то читал по этому поводу), исключая случаи проверки невставленных записей и сгруппированных рез-тов.

Последний раз редактировалось anykey; 27.11.2008 в 12:07.
Старый 27.11.2008, 13:25   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Всегда использую if (record), держа в голове ситуацию с группировками, джоинами и списками полей, естественно.
__________________
Zhirenkov Vitaly
Старый 27.11.2008, 13:35   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Ответил if (record) - хотя часто выборка курсора делается в одном методе, а проверка - в другом. В этом случае - строка return record вызывает ошибку - т.к. к boolean такая конструкция не приводится. Приходится писать return record.RecId != 0.
Проверку if (record.RecId !=0) опасно делать, когда имеешь дело с группировками.
Проверку if (record.RecId) опасно было делать до того как подправили багу по преобразованию int в boolean.
А дальше осталась сила привычки - if (record) работает железно - так почему бы им не пользоваться и не помнить про лишние грабли?
__________________
Возможно сделать все. Вопрос времени
Старый 27.11.2008, 13:54   #8  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
С самого начала писал if (record), бо столкнулся с тем, что (record.RecId !=0) && f (record.RecId) не всегда отрабатывают
__________________
Axapta book for developer
Старый 27.11.2008, 14:30   #9  
anykey is offline
anykey
Участник
 
35 / 26 (1) +++
Регистрация: 04.12.2006
Если не ошибаюсь, то после этого поста стал стараться использовать проверку по RecId.
Хотя, ничего нового, к написанному выше это не добавляет
Старый 27.11.2008, 14:45   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 anykey
Прошу прощение, но пример в этом посте
X++:
    select count(purchId) purchTable where
        purchTable.purchId == "Do not exist";
    if (purchTable)
    {
        info("The record exists!");
}
некорректен.
По этому запросу из базы данных будет возвращен курсор, со значением в агрегатной функции равным нулю. И аксапта абсолютно правильно говорит об этом - значение найдено. А то, что оно равно 0 - так про это и спрашивали, собственно.
Вот если бы агрегатная функция была max() или min(), а условие срабатывало, то это бы был явный косяк Аксапты.

Что касается меня, то использую, в основном, if (record)
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 27.11.2008 в 14:50.
Старый 27.11.2008, 16:30   #11  
zemlyn is offline
zemlyn
Участник
Аватар для zemlyn
 
146 / 44 (2) +++
Регистрация: 28.01.2004
а по-моему надо использовать по-прямому назначению

if(address.RecId) - если выбираем всю запись

if(address.(какое-то поле)) - если используем группировку (да-да, и поменьше копипастить, коллеги )

if(address) -- если пользуем как некоторую табличную переменную

х++ крайне расхолаживает из-за дырявости и многофункциональности использования таблич.переменных (говорю на примере ax3.0)
Старый 27.11.2008, 17:01   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Хотелось бы значит, чтобы все, кто ответил if (record), еще попробовали второй пример из моего первого поста - в том, довольно простом случае получается, что if (record) не срабатывает.
Вопрос: должен ли? Почему?
Старый 27.11.2008, 17:20   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Хотелось бы значит, чтобы все, кто ответил if (record), еще попробовали второй пример из моего первого поста - в том, довольно простом случае получается, что if (record) не срабатывает.
Вопрос: должен ли? Почему?
Пробовал, но вообще-то у меня они оба не срабатывают, и if (record) , и if (recID) (на 3.0). А должно было быть по-другому?

Мне кажется что не должен и поведение разумное.
__________________
Zhirenkov Vitaly
Старый 27.11.2008, 17:24   #14  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
На АХ 2009 (вроде как и раньше - я проверю) срабатывает первый - if (record)
Старый 27.11.2008, 17:34   #15  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
На АХ 2009 (вроде как и раньше - я проверю) срабатывает первый - if (record)
Я ж так понял речь про пример с "Address"?
__________________
Zhirenkov Vitaly
Старый 27.11.2008, 17:41   #16  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
На АХ 2009 (вроде как и раньше - я проверю) срабатывает первый - if (record)
Ха. Сорри, недотестировал.
Правильнее будет сказать так: может сработать, может нет.
Не срабатывает когда в гриде нет записи ещё (например, когда открываете альтерантивный адрес по клиенту) и вы создаёте первую новую. (или уже есть, но незаполненная )
Если же открываете, а там уже есть запись, то действительно if (record) срабатывает.
При этом визуально табличные переменные одинаково выглядят.

Забавно.
Видимо дело тут в этой самой привязке табличной переменной к курсору.
Иначе объяснить не могу.

Лично моё мнение - баг, срабатывать не должно.
__________________
Zhirenkov Vitaly
Старый 27.11.2008, 18:27   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Такое впечатление, что при инициализации новой записи внутри метода super() не все внутренние переменные сбрасываются. Если перед вызовом super() сделать address = null;, то if (record) перестанет срабатывать.

Еще такой момент. Если открыть форму без записей, а потом создавать в ней новые не закрывая, то if (record) не срабатывает. Если же в форме при открытии есть записи, то, даже после удаления их, при добавлении новой if (record) начинает срабатывать
__________________
Axapta v.3.0 sp5 kr2
Старый 27.11.2008, 18:39   #18  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от AndyD Посмотреть сообщение
Еще такой момент. Если открыть форму без записей, а потом создавать в ней новые не закрывая, то if (record) не срабатывает. Если же в форме при открытии есть записи, то, даже после удаления их, при добавлении новой if (record) начинает срабатывать
Да, есть такое, я же об этом уже писал в предыдущем сообщении.
__________________
Zhirenkov Vitaly
Старый 27.11.2008, 18:53   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Я это видел.
Я хотел акцентировать внимание, что даже после удаления всех записей эффект не пропадает.
Т.е., либо флаги прописываются где-то внутри формы, либо запись ассоциируется с формой и после удаления всех данных привязка остается.
__________________
Axapta v.3.0 sp5 kr2
Теги
best practice, faq, recid

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
if (record) в случае join с использованием group by kashperuk DAX: Программирование 9 07.12.2007 15:11
jerry-dynamics: How can you make sure that the end user can not delete a record in one table if there are related records in another table? Blog bot DAX Blogs 0 16.06.2007 11:20
Fred Shen: Always use recId to know if a select statement returns a record Blog bot DAX Blogs 0 28.10.2006 16:40
InventJournalTrans DreamCreator DAX: Программирование 7 14.12.2004 14:48
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:42.