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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2012, 11:58   #1  
eon is offline
eon
Участник
 
3 / 10 (1) +
Регистрация: 13.07.2011
! Неправильный 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  
rDenis2 is offline
rDenis2
Участник
 
62 / 36 (2) +++
Регистрация: 13.05.2010
Я бы написал так:



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  
eon is offline
eon
Участник
 
3 / 10 (1) +
Регистрация: 13.07.2011
Цитата:
Сообщение от rDenis2 Посмотреть сообщение
Я бы написал так:



X++:
void insertInToTestPerfomanceTable(...,
                                   TimeInMS duration,
                                   ...,
                                   TransDate periodFrom,
                                   TransDate periodTo)
{



ttsbegin;

testPerfomanceTable.clear()


  if (duration <= 999)
    {
        testPerfomanceTable.Duration2 = strfmt("%1: mc", duration );
    }

....

ttscommit;

Сделал. Даты ставятся верно. duration2 теперь стало 50/50, то записывается верная строка, то записывается пустое значение.

Спасибо. Что еще можно сделать?
Старый 06.08.2012, 12:32   #4  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
->
Цитата:
Сообщение от eon Посмотреть сообщение
Сделал. Даты ставятся верно. duration2 теперь стало 50/50, то записывается верная строка, то записывается пустое значение.

Спасибо. Что еще можно сделать?
вместо
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  
eon is offline
eon
Участник
 
3 / 10 (1) +
Регистрация: 13.07.2011
rDenis2

Спасибо за UPD

Сейчас вроде всё заполняется как надо.
Спасибо за помощь
Старый 06.08.2012, 12:55   #6  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Для таких ветвлений кмк лучше switch использовать. он как-то понагляднее
__________________
С уважением,
Вячеслав
Старый 10.08.2012, 12:59   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от pitersky Посмотреть сообщение
Для таких ветвлений кмк лучше switch использовать. он как-то понагляднее
Вот уж чего здесь точно не нужно! Вообще-то, здесь вообще нет ветвления. Просто последовательное создание разрядности.


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  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вот уж чего здесь точно не нужно! Вообще-то, здесь вообще нет ветвления. Просто последовательное создание разрядности.
если нет ветвления, то switch по определению не нужен. а нужен он там, где ветвление есть и его не обойти. как будто десяток вложенных else if выглядит лучше...
__________________
С уважением,
Вячеслав
Старый 10.08.2012, 13:57   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от pitersky Посмотреть сообщение
если нет ветвления, то switch по определению не нужен. а нужен он там, где ветвление есть и его не обойти. как будто десяток вложенных else if выглядит лучше...
Проблема в том, что если здесь использовать swith, то это будет switch (true). Надеюсь, Вы не предлагаете 59999 case писать А конструкция switch (true) однозначно указывает на ошибку проектирования. Такая конструкция - это то же самое, что и десяток вложенных else if, но "вид сбоку" И то и другое выглядит "не естесственно". Как следствие, возникает желание проверить логику на предмет отказа от ветвления. Проверил. Не нужна она в данном случае.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 10.08.2012, 15:17   #10  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Владимир, я полностью согласен с тем, что switch(true) - явная нелепость. Видимо, надо было в исходном посте написать просто "используйте для ветвлений switch", тогда бы и вопросов не было
__________________
С уважением,
Вячеслав
Старый 10.08.2012, 15:38   #11  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Про switch(true) уже обсуждали:
if (a == true)
к какому-то общему знаменателю не пришли - кому-то нравится, кому-то нет.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Arijit Basu: Dynamics AX 2009 Bulk Data insert using SSIS Blog bot DAX Blogs 0 09.03.2010 10:05
method insert() when insert table from outside susenyudha DAX in English 1 29.08.2008 18:51
axaptapedia: Howto insert a menu reference into the MainMenu Blog bot DAX Blogs 0 03.08.2007 23:20
Про Insert, DoInsert и IAxaptaRecord::Insert murad DAX: Программирование 5 23.05.2006 12:26
Не работает Insert_Recordset Yprit DAX: Программирование 21 06.10.2004 12:02

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

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

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