|  23.03.2010, 11:01 | #1 | 
| ---------------- | оригинальный orig 
			
			Есть табличка xTable с один полем Qty Есть серверный метод для вычисления изменения в поле Qty X++: server static Qty diff(xTable _xTable) { return _xTable.Qty - _xTable.orig().Qty; } X++: static void Job_Orig(Args _args) { xTable xTable; int i; Qty diff; ; for(i = 1; i <= 5; i++) { xTable.clear(); xTable.Qty = i; diff = xTable::diff(xTable); info(strFmt("%1 %2", diff, xTable.Qty - xTable.orig().Qty)); xTable.insert(); } } 0,00 1,00 1,00 2,00 1,00 3,00 1,00 4,00 1,00 5,00 ну ладно, с первой строкой еще можно смириться, но остальные... почему orig возвращает предыдущую запись? версии 4.0.2501.116 5.0.1500.1313 | 
|  | |
| За это сообщение автора поблагодарили: S.Kuskov (3), _scorp_ (2). | |
|  23.03.2010, 11:36 | #2 | 
| Участник | 
			
			а если Job на сервере запустить, то что будет?
		 | 
|  | 
|  23.03.2010, 11:41 | #3 | 
| ---------------- | 
			
			нормально все будет  1-2-3-4-5 проблема (orig) возникает при передаче курсора между клиентом и сервером если сделать метод клиентским, а джоб серверным, то получим 0-2-3-4-5 Последний раз редактировалось Wamr; 23.03.2010 в 11:46. | 
|  | 
|  23.03.2010, 12:32 | #4 | 
| Возьми свет!!! | 
			
			Это все к чему?
		 
				__________________ Axapta 3.0 sp 5 Oracle  Я могу взорвать вам мозг!!! | 
|  | |
| За это сообщение автора поблагодарили: Alexx7 (0). | |
|  23.03.2010, 13:22 | #5 | 
| Участник | 
			
			Создаётся ощущение, что передача курсора на сервер не всегда происходит. Т.е. у сервера существует своя серверная версия курсора, которая, как оказывается, не всегда (или точнее не целиком) синхронизируется с клиенской. А именно не синхронизируется orig-часть курсора! т.е. xTable.clear() - полностью стирает только клиенстскую версию, а на сервере курсор остаётся со старым orig. Для эксперимента можно попробовать вручную стереть серверный orig X++: server static void serverClear(xTable _xTable) { _xTable.clear(); } X++: ...
    for(i = 1; i <= 5; i++)
    {
        xTable.clear();
        xTable::serverClear(xTable); // <<-----------
        xTable.Qty = i;
        diff = xTable::diff(xTable);
        info(strFmt("%1 %2", diff, xTable.Qty - xTable.orig().Qty));
        xTable.insert();
    }0,00 1,00 2,00 2,00 3,00 3,00 4,00 4,00 5,00 5,00 P.S.: Проверил, в обратную сторону курсоры синхронизируются корректно. Т.е. clear(), вызванный на сервере стирает и клиенский orig() тоже. Последний раз редактировалось S.Kuskov; 23.03.2010 в 13:48. | 
|  | |
| За это сообщение автора поблагодарили: Logger (4). | |
|  23.03.2010, 14:07 | #6 | 
| Участник | 
			
			Ещё мысли по поводу первой строки: По видимому в начале серверная копия курсора создаётся при помощи метода common.data(), который также довольно бесцеремонно обращается с оrig-частью курсора. X++:     xTable xTable, xTable2;
    ;
    
    xTable.clear();
    xTable.Qty = 1;
    info(strFmt("%1 %2", xTable.orig().Qty, xTable.Qty));
    xTable2.data(xTable);
    info(strFmt("%1 %2", xTable2.orig().Qty, xTable2.Qty));0,00 1,00 1,00 1,00 Т.е. смысл этого метода - не скопировать, а создать новый курсор, в котором история orig'инальных полей теряется, и они становятся равны текущим. | 
|  | 
|  17.02.2015, 17:26 | #7 | 
| Участник | 
			
			Всем привет! Есть код: X++: Table Table1 = Table::find( field, forUpdate); If( Table1.orig().data() != Table1 ) { ... } | 
|  | 
|  17.02.2015, 17:29 | #8 | 
| Участник | 
			
			Может, потому что оператор != не предназначен для сравнения табличных буферов?..
		 | 
|  | |
| За это сообщение автора поблагодарили: Товарищ ♂uatr (1). | |
| Теги | 
| orig, баг | 
|  | 
|  Похожие темы | ||||
| Тема | Ответов | |||
| Утечка памяти при вызове orig() | 3 | |||
| Глюк orig() в 3-tier или я чего-то не понимаю? | 2 | |||
| 
 |