|
07.03.2007, 16:27 | #1 |
Участник
|
Мне еще нравится подобная практика использования комментариев:
X++: info('@NEO258'); //DocuView
__________________
_databaseTransDelete ... bl@$ ! |
|
07.03.2007, 16:27 | #2 |
Banned
|
|
|
07.03.2007, 16:33 | #3 |
Участник
|
Если речь o vendors, inventory .. то это стандартные labels, в en-gb они соответственно suppliers, stock ..
__________________
_databaseTransDelete ... bl@$ ! |
|
|
За это сообщение автора поблагодарили: EVGL (-1). |
06.03.2007, 17:53 | #4 |
Banned
|
Я постарался улучшить код, избавив его от указанных недостатков.
X++: static container now() { #define.KernelDLL('KERNEL32') #define.SizeOfStructure(8*4) Binary systemtime = new Binary(#SizeOfStructure); DLL _DLL = new DLL(#KernelDLL); DLLFunction _GetSystemTime = new DLLFunction(_DLL, 'GetLocalTime'); int wYear; int wMonth; int wDayOfWeek; int wDay; int wHour; int wMinute; int wSecond; int wMilliseconds; date resDate; TimeOfDay resTime; _GetSystemTime.arg(ExtTypes::Pointer); _GetSystemTime.call(systemtime); wYear = systemtime.word(0); wMonth = systemtime.word(2); wDay = systemtime.word(6); resDate = mkdate(wDay, wMonth, wYear); wHour = systemtime.word(8); wMinute = systemtime.word(10); wSecond = systemtime.word(12); resTime = wSecond + (wMinute + wHour*60)*60; info(strFmt("%1 %2", resDate, time2str(resTime, -1, -1))); return [resDate, resTime]; } P.S. Исправил: надо было успользовать функцию GetLocalTime вместо GetSystemTime. Как нетрудно видеть, код в итоге стал не менее компактным, зато более доступным и понятным. Последний раз редактировалось EVGL; 06.03.2007 в 18:03. |
|
07.03.2007, 14:11 | #5 |
Участник
|
Может когда время = полночь минус 1 минута, запускать sleep на 2 минуты?
А уже на второй минуте след. дня начинать то, чего там планировалось Последний раз редактировалось kashperuk; 07.03.2007 в 14:32. Причина: упс. очепятка |
|
07.03.2007, 14:44 | #6 |
Member
|
Да... программистский подход был у автора.
Я бы запомнил дату до и после запроса времени, если бы они отличались, то вывел бы полночь для второй даты, а если нет, то время и вторую дату. Вообще по БестПрактису код лучше писать наглядно (ну типа он без комментариев д.б. понятен). С очень высокой вероятностью если автору показать этот кусок кода через год после его написания и без предварительной подготовки (т.е. внезапно), он далеко не сразу сообразит, чего он им хотел добиться.
__________________
С уважением, glibs® |
|
07.03.2007, 15:05 | #7 |
Иван Захаров
|
Цитата:
// Получение текущей даты и времени с проверкой // на случай, что между вызовами today() и timenow() наступит новый день Их я опустил намеренно - чтобы всеобщий разум пошевелил извилинами. Вон EVGL "выдал" совершенно понятный код. |
|
07.03.2007, 15:52 | #8 |
Member
|
Цитата:
Сообщение от ziva
...
А на этот случай перед методом имеются комментарии: ... Вообще по БестПрактису код лучше писать наглядно (ну типа он без комментариев д.б. понятен). ..." Для тех, кто перед праздником утратил бдительность, обращаю внимание, что я не против комментариев, а наоборот — за их использование. Но одно второму не мешает, и друг друга не исключает.
__________________
С уважением, glibs® |
|
07.03.2007, 15:09 | #9 |
Участник
|
лично мне исходный вариант нравится больше всего. По-моему всё понятно.
|
|
07.03.2007, 16:13 | #10 |
Участник
|
любой вариант постребует комментариев на тему "зачем". Хотя мне и так было, в-общем, понятно. Достаточно просто задать себе вопрос при каких условиях условие в вайле будет тру.
|
|
19.04.2007, 16:47 | #11 |
Banned
|
Как сделать 4 ошибки в слове "еще"?
Из Reports\JmgAbsenceColumn\fetch в 3.0:
X++: while select sum(seconds) from jmgStampTrans group by JobIDAbs where jmgStampTrans.emplId == _jmgEmployee.emplId && jmgStampTrans.startDate >= jmgReport_AbsenceColumn.parmDateFrom() && jmgStampTrans.startDate <= jmgReport_AbsenceColumn.parmDateTo() && jmgStampTrans.stampType == JmgStampTypeEnum::Absence { wrkIndex = str2Int(jmgStampTrans.jobIdAbs); if (! wrkIndex) wrkIndex = str2Int(jmgStampTrans.jobId); if ((wrkIndex) && (arrayIndex[wrkIndex])) sumSeconds[arrayIndex[wrkIndex]] += jmgStampTrans.seconds; } |
|
28.04.2007, 13:36 | #12 |
Участник
|
Цитата:
Сообщение от EVGL
Из Reports\JmgAbsenceColumn\fetch в 3.0:
X++: while select sum(seconds) from jmgStampTrans group by JobIDAbs where jmgStampTrans.emplId == _jmgEmployee.emplId && jmgStampTrans.startDate >= jmgReport_AbsenceColumn.parmDateFrom() && jmgStampTrans.startDate <= jmgReport_AbsenceColumn.parmDateTo() && jmgStampTrans.stampType == JmgStampTypeEnum::Absence { wrkIndex = str2Int(jmgStampTrans.jobIdAbs); if (! wrkIndex) wrkIndex = str2Int(jmgStampTrans.jobId); if ((wrkIndex) && (arrayIndex[wrkIndex])) sumSeconds[arrayIndex[wrkIndex]] += jmgStampTrans.seconds; } Первая ошибка - простая. Не выбирается JobId А в чем вторая ошибка-то? Я же так понимаю ошибка должна быть именно в этой строке? И это ведь не вызов str2Int без проверки, что это таки число? И не длина строки? И не номерная серия? Просвети Последний раз редактировалось kashperuk; 28.04.2007 в 13:43. |
|
28.04.2007, 13:09 | #13 |
Участник
|
X++: void loadParam(container _param = conNull()) { int i; if (conLen(_param) > 0) { param = conNull(); for (i = 1; i <= conlen(_param); i++) { param = conIns(param, i, conPeek(_param, i)); } } } |
|
|
За это сообщение автора поблагодарили: kashperuk (1). |
28.04.2007, 13:14 | #14 |
Участник
|
Прикольная тема.
И особо мне нравится, как мне приходят уведомления о новых сообщениях в ней на почту. Название темы там отображается не так "The Daily Axapta WTF" а так |
|
28.04.2007, 21:01 | #15 |
Banned
|
Вторая ошибка: JobId типа ProdJobId - это строка с обычной номерной серией, у которой вполне может быть буквенный префикс или суффикс, а они преобразуют его в индекс массива.
А в примере Белугина программист, похоже, был уверен, что контейнеры передаются по ссылке. Тяжелый случай. |
|
29.04.2007, 00:25 | #16 |
Участник
|
Цитата:
PS В четверке, кстати, у меня тоже так. Только что проверил. Последний раз редактировалось kashperuk; 29.04.2007 в 02:20. |
|
29.04.2007, 18:50 | #17 |
Banned
|
JobId генерируется в трех местах: в производстве, проектах или в самом управлении цехом. Если JobId пришел из производства, то там стоит своя номерная серия.
|
|
17.05.2007, 17:05 | #18 |
Banned
|
Comment On Classics Week: Chocolate Covered SQL
Много занимаясь решениями для упаковочной отрасли, не мог пройти мимо этого:
Прочитайте внимательно состав продукта. (c) http://worsethanfailure.com/Articles...ered-SQL-.aspx |
|
|
За это сообщение автора поблагодарили: e@gle (1), a33ik (1). |
05.06.2007, 10:22 | #19 |
Участник
|
Вчера наткнулся в методе Classes\InventAdjustPost\updateTotal на очень удививший меня код.
X++: protected void updateTotal() { InventSettlement inventSettlement; InventTrans inventTrans; ProjLedger projLedger; while select forcePlaceHolders forceSelectOrder sum(costAmountadjustment) from inventSettlement index hint DateVoucherIdx group by itemId,balanceSheetPosting,balanceSheetAccount,operationsPosting,operationsAccount,dimension where inventSettlement.transDate == transDate && inventSettlement.voucher == voucher && inventSettlement.costAmountAdjustment != 0 && inventSettlement.InventTransCurrency_RU == inventTransCurrency && inventSettlement.posted == NoYes::No join inventTrans index hint recId group projId,projAdjustRefId,inventTransId where inventTrans.RecId == inventSettlement.TransRecId { if (correspondenceEnable) { this.updateMap_RU(inventSettlement,inventTrans); } else { projLedger = this.newProjLedger_RU(inventTrans.ProjId, inventTrans.InventTransId, inventTrans.ProjAdjustRefId); this.updateTrans(inventSettlement, ledgerVoucher,projLedger); } } this.updateTrans_RU(); } Это вообще нормально?? |
|
06.06.2007, 10:13 | #20 |
Участник
|
В продолжнение темы, приведу вырезку из DevGuide.
Оказывается, это задокументированная фича, и помимо group работает и для order Цитата:
ORDER_GROUP ::= order OPT_BY
ORDER_GROUP ::= group OPT_BY OPT_BY ::= by OPT_BY ::= |
|
|
За это сообщение автора поблагодарили: mazzy (5), belugin (3). |