06.08.2012, 11:58 | #1 |
Участник
|
Неправильный insert()
Добрый день. Только начинаю программировать в Ax. Столкнулся с проблемой.
Есть метод, вызывается с параметрами. X++: void insertInToTestPerfomanceTable(..., TimeInMS duration, ..., date periodFrom, date periodTo) { ... ; ... testPerfomanceTable.Duration = duration; if (duration <= 999) { testPerfomanceTable.Duration2 = Int2Str(duration) + " мс"; } else if ((duration > 999) && (duration < 59999)) { testPerfomanceTable.Duration2 = Int2Str(duration div 1000) + " с " + Int2Str(duration mod 1000) + " мс"; } ... testPerfomanceTable.PeriodFrom = periodFrom; testPerfomanceTable.PeriodTo = periodTo; ttsbegin; testPerfomanceTable.insert(); ttscommit; } Проблемы две. 1. testPerfomanceTable.PeriodFrom = periodFrom; testPerfomanceTable.PeriodTo = periodTo; В поля кладутся верные даты. Но в БД иногда записывается нулевая дата 1900-01-01. В общем как повезет. 50/50. Через отладчик проверяю, всегда кладется нужная дата, а зписывается не всегда она. Тип полей Date. 2. testPerfomanceTable.Duration2 = ... В поле кладется верная строка. Но в БД ничего не записывается. Через отладчик проверяю, всё норм. Тип поля String. Size 1024. Хотя это слишком много. Простите, если что не так объяснил. Помогите, пожалуйста. AX2009 SQL2008R2 |
|
06.08.2012, 12:18 | #2 |
Участник
|
Я бы написал так:
X++: void insertInToTestPerfomanceTable(..., TimeInMS duration, ..., TransDate periodFrom, TransDate periodTo) { ttsbegin; testPerfomanceTable.clear() if (duration <= 999) { testPerfomanceTable.Duration2 = strfmt("%1: mc", duration ); } .... ttscommit; UPD: еще одна штука, если эти поля: Duration2, PeriodFrom, PeriodTo были добавлены толко что, то иногда когда добавляешь в них инфромацию она сразу не отображаеться в форме например, надо синхронизировать/востановить таблицу/форму где были добавлены эти поля в крайнем случае, перезапустить приложение ахапты/АОС. Последний раз редактировалось rDenis2; 06.08.2012 в 12:30. Причина: add |
|
|
За это сообщение автора поблагодарили: eon (1). |
06.08.2012, 12:28 | #3 |
Участник
|
Цитата:
Сделал. Даты ставятся верно. duration2 теперь стало 50/50, то записывается верная строка, то записывается пустое значение. Спасибо. Что еще можно сделать? |
|
06.08.2012, 12:32 | #4 |
Участник
|
Цитата:
X++: if (duration <= 999) { testPerfomanceTable.Duration2 = Int2Str(duration) + " мс"; } else if ((duration > 999) && (duration < 59999)) { testPerfomanceTable.Duration2 = Int2Str(duration div 1000) + " с " + Int2Str(duration mod 1000) + " мс"; } X++: if (duration <= 999) { testPerfomanceTable.Duration2 = Int2Str(duration) + " мс"; } else if ((duration > 999) && (duration < 59999)) { testPerfomanceTable.Duration2 = Int2Str(duration div 1000) + " с " + Int2Str(duration mod 1000) + " мс"; } else { testPerfomanceTable.Duration2 = ......... .......... }
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
06.08.2012, 12:32 | #5 |
Участник
|
rDenis2
Спасибо за UPD Сейчас вроде всё заполняется как надо. Спасибо за помощь |
|
06.08.2012, 12:55 | #6 |
северный Будда
|
Для таких ветвлений кмк лучше switch использовать. он как-то понагляднее
__________________
С уважением, Вячеслав |
|
10.08.2012, 12:59 | #7 |
Участник
|
Цитата:
X++: str 1024 strDuration; ; // Сначала формируем секунды // Ограничение на меньше 59999 - смысла не имеет, поскольку в противном случае // нужна еще ветка по формированию часов и минут, если значение больше 59999 if (duration > 999) { strDuration = Int2Str(duration div 1000) + " с "; } // Теперь формируем миллисекунды strDuration += Int2Str(duration mod 1000) + " мс"; testPerfomanceTable.Duration2 = strDuration;
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
10.08.2012, 13:13 | #8 |
северный Будда
|
если нет ветвления, то switch по определению не нужен. а нужен он там, где ветвление есть и его не обойти. как будто десяток вложенных else if выглядит лучше...
__________________
С уважением, Вячеслав |
|
10.08.2012, 13:57 | #9 |
Участник
|
Проблема в том, что если здесь использовать swith, то это будет switch (true). Надеюсь, Вы не предлагаете 59999 case писать А конструкция switch (true) однозначно указывает на ошибку проектирования. Такая конструкция - это то же самое, что и десяток вложенных else if, но "вид сбоку" И то и другое выглядит "не естесственно". Как следствие, возникает желание проверить логику на предмет отказа от ветвления. Проверил. Не нужна она в данном случае.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
10.08.2012, 15:17 | #10 |
северный Будда
|
Владимир, я полностью согласен с тем, что switch(true) - явная нелепость. Видимо, надо было в исходном посте написать просто "используйте для ветвлений switch", тогда бы и вопросов не было
__________________
С уважением, Вячеслав |
|
10.08.2012, 15:38 | #11 |
Участник
|
Про switch(true) уже обсуждали:
if (a == true) к какому-то общему знаменателю не пришли - кому-то нравится, кому-то нет. |
|