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

Результаты опроса: Как лучше оформлять несколько условий в select where?
Я предпочитаю указывать операторы до условия 27 60.00%
Я предпочитаю указывать операторы после условия 15 33.33%
Нет предпочтений: иногда делаю так, иногда иначе 3 6.67%
Не знаю/Мне все равно 0 0%
Голосовавшие: 45. Вы ещё не голосовали в этом опросе

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.06.2011, 12:11   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Как лучше оформлять несколько условий в select where?
***** опрос пересоздан Как лучше оформлять несколько условий в select where? Повторная попытка *****


В коде часто встречаются select c несколькими условиями.
Вариант 1. (после условия)
X++:
    select firstonly paymentTrans
        where paymentTrans.AccountNum            == factureJour.CustVendInvoiceAccount &&
              paymentTrans.Voucher               == factureJour.Voucher                &&
              paymentTrans.CurrencyCode          == factureJour.CurrencyCode           &&
              paymentTrans.PrepaymentFactureId_W == factureJour.FactureId              &&
              paymentTrans.Prepayment            == NoYes::Yes;
Вариант 2. (до условия)
X++:
    select firstonly paymentTrans
        where paymentTrans.AccountNum            == factureJour.CustVendInvoiceAccount
           && paymentTrans.Voucher               == factureJour.Voucher
           && paymentTrans.CurrencyCode          == factureJour.CurrencyCode
           && paymentTrans.PrepaymentFactureId_W == factureJour.FactureId
           && paymentTrans.Prepayment            == NoYes::Yes;
Как вы предпочитаете ставить операторы между условиями?
Перед условием или после условия?
Почему?

А в более сложны случаях? Например,
X++:
    while select bankClientPayment_RU
    where bankClientPayment_RU.RContractAccount
    notexists join RContractTable
    where (
              ( RContractTable.RContractPartnerType == RContractPartnerType::Cust
             && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust )
           || ( RContractTable.RContractPartnerType == RContractPartnerType::Vend
             && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend )
          )
       && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount
       && RContractTable.RContractCode == bankClientPayment_RU.RContractCode
Добавлено: понятно, что при правке существующих select'ов скорее всего будете оставлять так как есть. Вопрос как вы предпочитаете, когда сами создаете select'ы
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 24.06.2011 в 16:52. Причина: добавил пояснение. добавил явное указание на "до условия", "после условия"
Старый 23.06.2011, 12:26   #2  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Предпочитаю вариант 2:
X++:
    select firstonly paymentTrans
        where paymentTrans.AccountNum            == factureJour.CustVendInvoiceAccount
           && paymentTrans.Voucher               == factureJour.Voucher
           && paymentTrans.CurrencyCode          == factureJour.CurrencyCode
           && paymentTrans.PrepaymentFactureId_W == factureJour.FactureId
           && paymentTrans.Prepayment            == NoYes::Yes;
Использую данное оформление в силу таких факторов:
1) Более высокая читабельность кода;
2) Знаки && в начале каждого нового условия говорят о том, что данное условие является продолжением одного большого условия. Если же они стоят в конце, как в 1-м варианте, то снижается наглядность соединения условий. Данную привычку выработал, после прочтения книги Стива Макконелла "Секреты совершенного кода".

Третий пример я бы, скорее всего, оформил так:
X++:
while select bankClientPayment_RU
    where bankClientPayment_RU.RContractAccount
        notexists join RContractTable
            where ((RContractTable.RContractPartnerType == RContractPartnerType::Cust
                        && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust)
                    ||(RContractTable.RContractPartnerType == RContractPartnerType::Vend
                        && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend))
                  && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount
                  && RContractTable.RContractCode == bankClientPayment_RU.RContractCode
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 23.06.2011 в 12:30.
Старый 23.06.2011, 12:34   #3  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Одно время ставил оператора в конце строки. Потом от этого отказался. Причина - добавление в select нового условия (или коммент старого) делать удобнее, если мы в той же строке указываем и оператор добавления. Иначе говоря, оператор после условия логически относится не к той строке, в которой он стоит, а к следующей.
Хотя эстетически первый вариант смотрится красивее
__________________
С уважением,
Вячеслав
Старый 23.06.2011, 12:37   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от pitersky Посмотреть сообщение
Хотя эстетически первый вариант смотрится красивее
а почему?
__________________
полезное на axForum, github, vk, coub.
Старый 23.06.2011, 12:37   #5  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Второй вариант, так как так нагляднее. В таком случае соблюдается правило Оператор <Условие>. Например,
Where <Условие>
And <Условие>
And <Условие>
....
и видна некоторая законченная структура. А еще чем-то напоминает LINQ. В более сложных случаях еще стараюсь скобки оставлять на отдельной строке - помогает при отладке, когда приходится комментровать условия

Последний раз редактировалось Lucky13; 23.06.2011 в 12:52.
Старый 23.06.2011, 12:42   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ответил: "после условия", но обосновать причину не могу. Привычка эта вырабаталась уже давно, теперь пишу на задумываясь. В сложных случаях могу позвольть себе вынести оператор вообще на отдельную строку. Например так:
X++:
    while select bankClientPayment_RU
    where
        bankClientPayment_RU.RContractAccount != ""
    notexists join RContractTable
    where
        RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount && 
        RContractTable.RContractCode == bankClientPayment_RU.RContractCode &&
        (
            (
                RContractTable.RContractPartnerType == RContractPartnerType::Cust &&
                BankClientPayment_RU.PartnerType == ModuleCustVend::Cust
            )
            || 
            ( 
                RContractTable.RContractPartnerType == RContractPartnerType::Vend &&
                BankClientPayment_RU.PartnerType == ModuleCustVend::Vend 
            )
        )
Upd: Попытался сейчас записать условия по другому (оператором вперёд). Понял как минимум одну из причину, почему я так не делаю. А также почему я привык оставлять ключевое слово where на отдельной строке. Все дело в табуляции. Я стараюсь по возможности как можно реже пользоваться пробелами для создания отступов. А при таком способе записи (оператором вперёд) для выравнивания условий приходится делать отступы не кратные четырём пробелам, либо не естественным образом выравнивать первую строку, подгоняя её под остальные.

Последний раз редактировалось S.Kuskov; 23.06.2011 в 13:01.
За это сообщение автора поблагодарили: mazzy (2).
Старый 23.06.2011, 12:51   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ответил: "после условия", но обосновать причину не могу.
Насколько я вижу, вы не выравниваете операторы справа. так?
как относитесь к выравниванию? тратите ли время на выравнивание?
(см. вариант 1 в исходном сообщении)
__________________
полезное на axForum, github, vk, coub.
Старый 23.06.2011, 13:04   #8  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Использую второй вариант. Причины совпадают с изложенными первыми 3мя ответившими.
__________________
Андрей.
Старый 23.06.2011, 13:23   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mazzy Посмотреть сообщение
Насколько я вижу, вы не выравниваете операторы справа. так?
как относитесь к выравниванию? тратите ли время на выравнивание?
(см. вариант 1 в исходном сообщении)
Если в подряд идёт более двух однотипных условий, то стараюсь выравнивать
Старый 23.06.2011, 13:50   #10  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Привычный - первый вариант. Более удобный дла добавления новых условий - наверное второй. Использую - обычно первый. По причине того, что именно он чаще используется в стандартном приложении.

Сложный запрос написал бы как-то так:
X++:
    while select bankClientPayment_RU
        where bankClientPayment_RU.RContractAccount
        notexists join RContractTable
        where ((RContractTable.RContractPartnerType == RContractPartnerType::Cust &&
                BankClientPayment_RU.PartnerType    == ModuleCustVend::Cust)
               ||
               (RContractTable.RContractPartnerType == RContractPartnerType::Vend &&
                BankClientPayment_RU.PartnerType    == ModuleCustVend::Vend))
               && 
               RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount
               && 
               RContractTable.RContractCode    == bankClientPayment_RU.RContractCode
Скобочки на отдельные строки выносить не люблю, получается слишком громоздко.

Цитата:
Сообщение от mazzy Посмотреть сообщение
тратите ли время на выравнивание?
Да!
Старый 23.06.2011, 14:27   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Тоже выношу оператор условия в начало строки.

where (...)
AND (...)
AND (...)

Причины те же:

1. Наглядность (для меня)
2. Удобство добавления/удаления условий

Трачу время на выравнивание для повышения наглядности кода.

Для сложного условия постараюсь визуально выделить "не очевидные" операторы сравнения

X++:
    while select bankClientPayment_RU
        where bankClientPayment_RU.RContractAccount
        notexists join RContractTable
        where (
                (   RContractTable.RContractPartnerType == RContractPartnerType::Cust
                    && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust)
                ||
                (   RContractTable.RContractPartnerType == RContractPartnerType::Vend
                    && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend)
              )
           && RContractTable.RContractAccount   == bankClientPayment_RU.RContractAccount
           && RContractTable.RContractCode      == bankClientPayment_RU.RContractCode

То же самое делаю с математическими знаками в длинных выражениях

X++:
value = value1
            + value2
            - value3;
По тем же причинам.

Также, зачастую выношу запятые в списке параметров в начало

X++:
this.MyMethod(param1
                            ,param2
                            ,param3
                            );

container = [
                         value1
                        ,value2
                        ,value3
                        ];
Причина в том, что в случае добавления/удаления параметров, скорее всего, это надо будет сделать в конце списка параметров, а не в начале. В этом случае запятая в начале просто удобнее.

PS: Или я не понял формулировку голосования, или она противоречит нумерации примеров, приведенных в первом посте. Я так понимаю, что формулировка "оператор ДО условия" соответствует примеру №2 первого поста. Или это не так надо понимать?
Старый 23.06.2011, 14:31   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Может изменить формулировку пунктов голосования примерно так:

- Оператор сравнения в начале строки
- Оператор сравнения в конце строки

Термин "До/После условия", в данном случае, можно понимать очень по разному
За это сообщение автора поблагодарили: Gustav (2).
Старый 23.06.2011, 14:35   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
проголосовало уже 14 человек.
предлагаю не менять.

если хочется, то лучше создать новую тему с новым опросом.
здесь дать ссылку на новую. в новой дать ссылку сюда.
__________________
полезное на axForum, github, vk, coub.
Старый 23.06.2011, 14:54   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
на прошлом месте работы, я писал операторы до условия:
X++:
while select inventTable
    where inventTable.ItemId      == '1'
        && inventTable.ItemName == '2'
и мне казалось что так удобнее, например потому, что если вдруг надо закомментировать одно условие, то просто комментируется одна строка, а если оператор был бы в конце условия, то надо было бы комментировать ещё и его.
X++:
while select inventTable
    where inventTable.ItemId      == '1'
        //&& inventTable.ItemName == '2' // удобно

while select inventTable
    where inventTable.ItemId      == '1'  //&& // неудобно
              //inventTable.ItemName == '2'
когда пришел на другое место работы, ведущий разработчик настоял на том, что бы я писал оператор в конце строки условия. я долго с ним спорил, и пытался понять глубокий смысл написания условия именно таким способом. но в итоге получил ответ, что так требует BP и что так красивее (кстати понятие красоты у всех разное ). в итоге сейчас я пишу оператор в конце строки с условием, и уже привык

P.S. если говорить кратко, то сейчас пользуюсь первым вариантом (по привычке), но считаю более удобным второй (почему написал выше).
Вот такой вот, парадокс
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: mazzy (2), Pustik (2).
Старый 23.06.2011, 16:16   #15  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от lev Посмотреть сообщение
в итоге получил ответ, что так требует BP и что так красивее (кстати понятие красоты у всех разное ).
Насчёт ВР я тоже слышал - мол МС в сертификационных тестах разработчиков по 2009 в обязательном порядке требует условие справа. Хз правда или нет...

Насчёт красоты - всё-таки эстетичнее, когда границы текста ровные и справа, и слева. Не зря же текстовые редакторы умеют выравнивать текст
__________________
С уважением,
Вячеслав
Старый 23.06.2011, 16:19   #16  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
Насчёт красоты - всё-таки эстетичнее, когда границы текста ровные и справа, и слева. Не зря же текстовые редакторы умеют выравнивать текст
Ага, люблю когда все выровнено и слева и справа и посередине
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 23.06.2011, 18:41   #17  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Вы удивитесь, но я предпочитаю ставить && слева, а || справа. (Если кто-то хочет пофлудить, то это отличная тема для флуда ). Аргументы:
- && слева - не требует дополнительного выравнивания
- && слева - удобнее вставлять, убирать и комментировать условия
- && слева, а || справа - улучшает восприятие, и уменьшает вероятность ошибки при последующем возможном изменении условия (!). Знаков && как правило много, а знак || как правило один, поэтому проблем с выравниванием с ним не возникает..

Если пишу сам с нуля - ставлю слева. Если модифицирую код, где стоят справа - то не меняю (ну разве что если условие сильно запутанное или я его сильно меняю).

А еще я предпочитаю переносить "точку с запятой" отдельно на последнюю строку. Хотя иногда не делаю от лени. Аргументы для переноса:
- удобнее вставлять дополнительную строку в условие
- удобнее убирать (удалять или комментировать) последнюю строку в условии
- дополнительная строка между этим и следующим оператором, содержашая только одну точку с запятой, улучшает визуальное восприятие кода
Старый 23.06.2011, 19:28   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Zabr Посмотреть сообщение
Вы удивитесь, но я предпочитаю ставить && слева, а || справа.
а можно попросить отформатировать третий пример из первого в этой ветке сообщения.
любопытно было бы посмотреть
__________________
полезное на axForum, github, vk, coub.
Старый 23.06.2011, 21:05   #19  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
1+2
Солидарен с Zabr
&& слева, || справа, ( ) меня пугают
цель - быстро понять какие условия в запросе и какое нам мешает
сначала читаются условия в одну строку начинающиеся с &&
потом с простыми перечислениями (например статусов)
потом разбор сложных-многоскобочных (в них уже последовательность скобочек знаков и отступов определяется текущим ощущением прекрасного)

X++:
    while select bankClientPayment_RU
        where bankClientPayment_RU.RContractAccount
    notexists join RContractTable
        where ( ( RContractTable.RContractPartnerType == RContractPartnerType::Cust
                  && BankClientPayment_RU.PartnerType == ModuleCustVend::Cust ) ||
                ( RContractTable.RContractPartnerType == RContractPartnerType::Vend
                  && BankClientPayment_RU.PartnerType == ModuleCustVend::Vend )  )
           && RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount
           && RContractTable.RContractCode == bankClientPayment_RU.RContractCode
За это сообщение автора поблагодарили: Zabr (2).
Старый 23.06.2011, 22:56   #20  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
а можно попросить отформатировать третий пример из первого в этой ветке сообщения. любопытно было бы посмотреть
Wamr меня опередил. В точности так. С той поправкой, что "текущее ощущение прекрасного" как правило заставляет выровнять знаки равенства:
X++:
&& RContractTable.RContractAccount == bankClientPayment_RU.RContractAccount
&& RContractTable.RContractCode    == bankClientPayment_RU.RContractCode
Возможно, кому такое выравнивание кажется плохой привычкой. Ну так и бэст практис тоже не боги писали. Да и других плохих привычек в выравнивании не гнушаюсь, грешен:
X++:
if (X.value()) 
     Y = PurchStatus::Invoiced;
else Y = PurchStatus::Received;

Последний раз редактировалось Zabr; 23.06.2011 в 22:58.
Теги
select, как правильно, оформление кода, условия

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
select в X++ и список значений в условии where Prophetic DAX: Программирование 20 17.08.2010 18:43
QueryBuildRange в select.. where propeller DAX: Программирование 11 30.09.2008 13:35
Разница NotInTTS и Found Logger DAX: База знаний и проекты 6 18.09.2008 12:35
Вопрос про Demand Planner slava09 DAX: Функционал 4 25.09.2006 11:43
select * where ... Perc DAX: Программирование 10 06.07.2005 12:31
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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