25.01.2002, 05:43 | #1 |
Administrator
|
А RecId может быть отрицательным?
Это нормально, что у меня запись при добавлении в таблицу получила отрицательное значение RecId? Кто-нибудь с таким сталкивался или я один такой счастливый?!
А я-то всегда считал, что RecId - что-то вроде unsigned long...
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
25.01.2002, 06:53 | #2 |
Участник
|
Теоретически это очень даже возможно. Предствим ситуацию, когда RecId достигнет-таки макс. своего значения. Что тогда? Очевидно, перейдет к минусам.
... Кстати, этот вопрос поднимался как-то в конференции tadorna-axapta на yahoogroups... И еще кстати, RecId - это самый обычный int (если я не ошибаюсь)... Хотя я лично не разу не видел отрицательных recID. |
|
25.01.2002, 08:28 | #3 |
сибиряк
|
Взято с technet.navision.com
Do not test for [Recid > 0] - valid Recid's may be negative as well...
Testing if a database buffer is empty can be done using the Recid column. But a little care should be taken. This article explains how. One way to determine if a select returned a record, is to test the RecId column. Some programmers - including experienced XAL programmers - does this by testing if the column is greater than zero: if (myTable.Recid>0) // then blah, blah,... Still, for large amounts of data, Recid values may exceed the upper limit of a signed 32-bit long. For such high values, the Recid's in Axapta appear as negative number, thus making the above X++ construction error prone. Instead use if (myTable.Recid) // then blah, blah,... or if (myTable.Recid != 0) // then blah, blah,... One exception for this rule is, when the Recid column has been used for an aggregation such as count: select count(Recid) from myTable; if (myTable.Recid > 0) // then blah, blah,... since the number of records is obviously not negative.
__________________
С уважением, Вячеслав. |
|
25.01.2002, 08:44 | #4 |
Участник
|
... Конечно, technet.navision.com не может ошибаться...
Но все же, гораздо лучше (на мой взгляд) для проверки, чего оно нам вернуло, использовать простое if(MyTable)// blah-blah Вот пример, когда это лучше: select sum (Qty), sum (CostAmountPosted) from InventTrans // можно еще пять полей написать where // условия - неважно //Если ХОТЬ чего-то есть, то выполняй (напр, вывод на экран) if(inventTrans) { //А тут это самое blah-blah } Кстати, RecID у этого inventTrans'а, конечно же, нулевой. Удачи! Андрей Беседин. |
|
25.01.2002, 09:16 | #5 |
----------------
|
Из личного опыта
Отрицательный RecId - нормальное явление, при котором БД нормально существует и работает. Другой вопрос, что произойдет, когда RecId опять придет к 0? |
|
12.05.2005, 18:43 | #6 |
Участник
|
Впечатлилась результатами изысканий...
Сделано вот что: вручную изменялись значения nextValue в таблице SYSTEMSEQUENCES на максимальное положительное, максимальное отрицательное целое и на -1. На всякий случай выйти из Аксапты и заново зайти. При максимальном положительном nextValue устанавливался в отрицательный, при максимальном отрицательном- уменьшался, при (-1) - Аксапта издевательства не выдержала. И "выругалась". Но возник вопрос: а что означает поле ID в таблице SYSTEMSEQUENCES?? Дело в том, что для тестируемой компании не одна строка была в этой таблице, а несколько с разными ID (-3,-2,-1). И имена разные (SysEvent, TRANSID, SEQNO). Вопрос-то не критичный. Просто интересно. |
|
12.05.2005, 19:01 | #7 |
Moderator
|
Это просто эсперименты или есть реальная проблема?
Если я думаю про тот проект, то там отрицательные RecId были уже тогда когда ты еще и про аксапту не слышала. И ничего - жило себе спокойно |
|
13.05.2005, 01:07 | #8 |
Administrator
|
Ну кстати, именно из-за этого в свое время разгорелся спор http://www.axforum.info/forums/showt...ighlight=recId , в результате которого господин db привел суперjob, показывающий некорректное приведение типов int->boolean. Фишка состояла в том, что, если RecId равен -512, и (вроде) так далее по степеням двойки, то выражение if (!myTable) будет ложно (запись существует), а выражение if (!myTable.RecId) будет истинно, т.к. -512 - это false (с точки зрения Аксапты)
|
|
14.05.2005, 15:10 | #9 |
Участник
|
ну, по поводу поля ID так это тип элемента, значения которого генерируются ядром.
То есть при ID = -1 по NextVal генерируется RecID, при ID = -2, TransactionId. При -3 - не знаю, что. SysEvent, видимо. |
|
03.05.2006, 13:36 | #10 |
Участник
|
Цитата:
Сообщение от Кирен
Но возник вопрос: а что означает поле ID в таблице SYSTEMSEQUENCES??
Дело в том, что для тестируемой компании не одна строка была в этой таблице, а несколько с разными ID (-3,-2,-1). И имена разные (SysEvent, TRANSID, SEQNO). Вопрос-то не критичный. Просто интересно. TRANSID используется для генерирования уникальных (на уровне компании в Аксапте) ID в TransactionLog (Аудит) |
|
Теги |
recid |
|
Похожие темы | ||||
Тема | Ответов | |||
снова RecId из SQL | 4 | |||
if (record) vs if (record.RecId) | 18 | |||
поля, содержащие RecId | 15 | |||
RecID при экспорте-импорте не восстанавливаются? | 14 | |||
генерирование RecId | 8 |
|