Меню

Ошибка арифметического переполнения при преобразовании expression к типу данных nvarchar

Error: Arithmetic overflow error converting expression to data type nvarchar.

UPDATE [dbo].ForecastAccuracyKeyAccounts
SET ThreeMonthPercent = ((Actual - ThreeMonthForecast) / Actual) * 100, SixMonthPercent = ((Actual - SixMonthForecast) / Actual) * 100, 
NineMonthPercent = ((Actual - NineMonthForecast) / Actual) * 100
WHERE Actual != 0

Since, I am dividing by Actual, I want to ensure that Actual is not equal to zero. But when I add the statement in the WHERE CLAUSE I cannot get rid of the error.

asked Feb 10, 2014 at 19:59

ahsatan's user avatar

ahsatanahsatan

611 gold badge1 silver badge7 bronze badges

7

Maybe try ISNULL

UPDATE [dbo].ForecastAccuracyKeyAccounts

    SET ThreeMonthPercent = ((Actual - ISNULL(ThreeMonthForecast,0)) / Actual) * 100,

    SixMonthPercent = ((Actual - ISNULL(SixMonthForecast,0)) / Actual) * 100, 

    NineMonthPercent = ((Actual - ISNULL(NineMonthForecast,0)) / Actual) * 100

    WHERE Actual != 0

Hector Sanchez's user avatar

answered Feb 10, 2014 at 20:41

Rick S's user avatar

Rick SRick S

6,3765 gold badges25 silver badges42 bronze badges

6

Error: Arithmetic overflow error converting expression to data type nvarchar.

UPDATE [dbo].ForecastAccuracyKeyAccounts
SET ThreeMonthPercent = ((Actual - ThreeMonthForecast) / Actual) * 100, SixMonthPercent = ((Actual - SixMonthForecast) / Actual) * 100, 
NineMonthPercent = ((Actual - NineMonthForecast) / Actual) * 100
WHERE Actual != 0

Since, I am dividing by Actual, I want to ensure that Actual is not equal to zero. But when I add the statement in the WHERE CLAUSE I cannot get rid of the error.

asked Feb 10, 2014 at 19:59

ahsatan's user avatar

ahsatanahsatan

611 gold badge1 silver badge7 bronze badges

7

Maybe try ISNULL

UPDATE [dbo].ForecastAccuracyKeyAccounts

    SET ThreeMonthPercent = ((Actual - ISNULL(ThreeMonthForecast,0)) / Actual) * 100,

    SixMonthPercent = ((Actual - ISNULL(SixMonthForecast,0)) / Actual) * 100, 

    NineMonthPercent = ((Actual - ISNULL(NineMonthForecast,0)) / Actual) * 100

    WHERE Actual != 0

Hector Sanchez's user avatar

answered Feb 10, 2014 at 20:41

Rick S's user avatar

Rick SRick S

6,3765 gold badges25 silver badges42 bronze badges

6

SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Enterprise SQL Server 2014 Developer SQL Server 2014 Standard SQL Server 2014 Web Еще…Меньше

Проблемы

Предположим, что вы используете репликацию транзакций Microsoft SQL Server 2012 или SQL Server 2014. Вы пытаетесь добавить подписку с @sync_type, указанную как «поддержка репликации», «Инициализация с помощью резервной копии» или «инициализировать из LSN» для публикации, а идентификатор публикации больше 99. В этом случае появляется следующее сообщение об ошибке:

Сообщение 8115, уровень 16, состояние 2, sp_MSsetupnosyncsubscriptionwithlsn процедуры, строка 237Arithmetic ошибка переполнения при преобразовании выражения в тип данных nvarchar.

Решение

Совокупные сведения об обновлениях

Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.

  • Накопительное обновление 1 для SQL Server 2014 с пакетом обновления 1 (SP1)

  • Накопительное обновление 5 для SQL Server 2012 с пакетом обновления 2 (SP2)

  • Накопительное обновление 6 для SQL Server 2014

  • Накопительное обновление 14 для SQL Server 2012 с пакетом обновления 1 (SP1)

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе «Применяется к».

Нужна дополнительная помощь?

Aumi

20 / 35 / 14

Регистрация: 08.10.2015

Сообщений: 406

1

Ошибка арифметического переполнения

05.02.2018, 12:38. Показов 9839. Ответов 3

Метки нет (Все метки)


Здравствуйте,

Есть таблица1 (idtovar, price,amount,itog)

T-SQL
1
2
3
    [Price] [smallmoney] NULL,
    [Amount] [int] NULL,
itog float null

В таблице заполнены все столбцы, кроме itog.

Есть процедура, которая заполняет этот столбец

T-SQL
1
2
3
4
ALTER procedure [dbo].[UpdateSumDelta]
as
 
UPDATE tab1 SET itog = Amount*Price;

если я в таблицу добавлю одну строчку и выполню процедуру, то ошибки нет.
Но когда мне надо обновить 60 т строк, то:

Код

Сообщение 8115, уровень 16, состояние 2, процедура UpdateSumDelta, строка 43
Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney.
Выполнение данной инструкции было прервано.

Откуда взялось expression? Как бороться с ошибкой?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

05.02.2018, 12:38

3

1107 / 753 / 181

Регистрация: 27.11.2009

Сообщений: 2,241

05.02.2018, 12:49

2

Цитата
Сообщение от Aumi
Посмотреть сообщение

Откуда взялось expression?

Amount*Price

Цитата
Сообщение от Aumi
Посмотреть сообщение

В таблице заполнены все столбцы, кроме itog.
Есть процедура, которая заполняет этот столбец

А зачем что-то хранить, если можно просто сделать вычисляемое поле itog AS Amount*Price??
И процедура тогда не нужна.
Почему там SMALLMONEY, а не MONEY?
Использование типа FLOAT в финансовых расчётах крайне нежелательно.
Лучше MONEY или DEC(длина, точность) подходящего размера.
Хотя, если итог станет вычисляемым, его тип будет определяться выражением Amount*Price.



0



20 / 35 / 14

Регистрация: 08.10.2015

Сообщений: 406

05.02.2018, 12:51

 [ТС]

3

iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.

Цитата
Сообщение от iap
Посмотреть сообщение

Лучше MONEY или DEC(длина, точность) подходящего размера

это вместо float использовать?



0



1107 / 753 / 181

Регистрация: 27.11.2009

Сообщений: 2,241

05.02.2018, 13:00

4

Лучший ответ Сообщение было отмечено Aumi как решение

Решение

Приоритет типов данных (Transact-SQL)

Добавлено через 2 минуты

Цитата
Сообщение от Aumi
Посмотреть сообщение

iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.

это вместо float использовать?

Я ж говорю, лучше не далать itog постоянным полем, а сделать вычисляемым.
Тип будет определяться из выражения (Expression) согласно приоритету типов (почитайте про это, ссылку я дал).

Добавлено через 3 минуты

Цитата
Сообщение от Aumi
Посмотреть сообщение

iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.

Результат умножения будет приведён к типу сомножителя с бОльшим приритетом типа.
Если оставить SMALLMONEY и INT, то это будет SMALLMONEY, но он не вмещает в себя результат умножения.
Можно попытаться явно преобразовать тип в какой-нибудь побольше, поместив умножение в функцию CAST().



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

05.02.2018, 13:00

4

Я создаю систему службы поддержки, но, похоже, столкнулся с небольшой проблемой: когда пользователь нажимает кнопку, чтобы «предварительно зарегистрировать» номер билета службы поддержки, мой скрипт срабатывает на сервере SQL Express, создавая новую строку -> получает идентификатор строки -> использует идентификатор строки для создания окончательной ссылки на билет (в формате RAD000001, например, для строки 1), этот процесс, кажется, работает для меня нормально, пока я не доберусь до номера 9… когда пользователь нажимает » Кнопка «создать новый билет» (создание билета номер 10) я получаю следующую ошибку:

Arithmetic overflow error converting expression to data type nvarchar.

Он создает строку, но, похоже, не работает при обновлении (строка создается, возвращается идентификатор, а затем ссылка создается из идентификатора)

Моя таблица SQL выглядит так:

CREATE TABLE [dbo].[tickets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ticket_ref] [varchar](15) NULL,
    [details_id] [int] NULL,
    [state] [int] NULL,
    [create_date_Time] [datetime] NOT NULL,
    [details_subject] [varchar](255) NULL,
    [details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

и это код С#:

private string Reform_TicketId(string original_ticket_id)
{
    switch (original_ticket_id.Length)
    {
        case 1:
            return "RAD00000" + original_ticket_id.ToString();
        case 2:
            return "RAD0000" + original_ticket_id.ToString();
        case 3:
            return "RAD000" + original_ticket_id.ToString();
        case 4:
            return "RAD00" + original_ticket_id.ToString();
        case 5:
            return "RAD0" + original_ticket_id.ToString();
        case 6:
            return "RAD" + original_ticket_id.ToString();
        default:
            return "ERROR!";
    }
}

protected void DsCreateTicketEntry_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
    string original_id = e.Command.Parameters["@ticket_id"].Value.ToString();
    string reformed_id = Reform_TicketId(original_id.ToString()).ToString();

    if (original_id != "0")
    {
        //It has returned a value that is a DB ID field and seems correct! lets proceed!
        DsCreateTicketEntry.UpdateParameters["ticket_db_id"].DefaultValue = original_id;
        //DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = reformed_id;
        DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = "RAD000002";
        DsCreateTicketEntry.Update();
        LblTicketOutput.Text = reformed_id;
    }
    else
    {
        //@TODO: Write to the label stating we had problems generating a Ticket ID!
    }
}

protected void btnCreateTicket_Click(object sender, EventArgs e)
{
    DsCreateTicketEntry.Insert();
    btnCreateTicket.Enabled = false;
}

со следующими запросами в моем SQLDataSource:

InsertCommand="INSERT INTO tickets(state, create_date_Time) VALUES (1,GETDATE()) SET @ticket_id=SCOPE_IDENTITY();"    
UpdateCommand="UPDATE tickets SET ticket_ref = @new_ticket_id WHERE (id = @ticket_db_id)"

Надеюсь, кто-то сможет пролить свет на то, где я ошибаюсь!? Я смотрел на этот код весь день, и он немного вышел за рамки моей лиги обучения…

Я получаю данные из представления, и один из столбцов, которые я использую, — nvarchar(50), но всегда только N'True' или N'False', в зависимости от работы связанного столбца даты в этом родительском представлении.

Следующий код извлекает идентификатор записи и столбец, который я ищу, YTD:

SELECT Enquiry_Number, YTD 
FROM dbo.vw_SalesPO_YTD

Выход:

ENQ-001 True
ENQ-002 False
ENQ-003 True

Однако по какой-то причине я не могу фильтровать свои результаты с помощью этого столбца YTD. Если я попытаюсь сделать это:

SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD
WHERE YTD = N'True'

Затем происходит сбой со следующей ошибкой:

Ошибка арифметического переполнения при преобразовании выражения в тип данных datetime.

Этого я не понимаю, потому что в этом запросе нет выражений datetime. Да, True или False были определены путем сравнения дат и времени в родительском представлении, но я не понимаю, как это могло попасть в этот подзапрос. Попытка сделать то же самое в родительском представлении дает ту же ошибку — я демонстрирую это таким образом для простоты.

Однако выполнение аналогичной операции в части запроса SELECT работает без проблем:

SELECT 
    Enquiry_Number,
    YTD,
    CASE 
       WHEN YTD = N'True' THEN 1 ELSE 0 
    END As C
FROM
    dbo.vw_SalesPO_YTD 

Выход:

ENQ-001 True 1
ENQ-002 False 0
ENQ-003 True 1

Однако эти 1 и 0 наследуют один и тот же недостаток, поэтому я не могу использовать их в предложении WHERE без этой ошибки datetime.

Я много искал и не знаю, как определить основную проблему. Я читал кое-что о сопоставлениях и приоритетах типов, но не могу понять, почему происходит такое поведение.

Когда я проверил YTD в INFORMATION_SCHEMA.COLUMNS, это подтверждает, что этот столбец ничем не отличается от других столбцов в моей таблице: YTD равен nvarchar(50), используя {{X4} } сопоставление.

Связанный вопрос: Выражение преобразования ошибки арифметического переполнения SQL Server к типу данных datetime


Источник проблемы

Эта проблема все еще не решена, но если вы хотите воспроизвести ее, этот код из родительского представления должен генерировать эту проблему:

CASE WHEN 
Award_Date <= DATEFROMPARTS(FinancialYear - 1, 11, 1) + GETDATE() - DATEADD(year, DATEDIFF(month, '20161101', GETDATE()) / 12, '20161101')
THEN N'True'
ELSE N'False'
END

Да, это выглядит слишком сложно. Мы сравниваем Award_Date с связанным FinancialYear, который длится с 1 ноября по 31 октября. Каждая запись уже знает, в каком FinancialYear она находится. Конечная цель состоит в том, чтобы сравнить позицию СЕГОДНЯ (30.11.2016) с СЕГОДНЯМИ в прошлом году (2015-11-30) и СЕГОДНЯ годом ранее (2014-11- 30) и др.

Таким образом, код берет сегодняшнюю дату и объединяет ее с FinancialYear для связанной записи и показывает, произошла ли запись между началом финансового года и сегодня того же года. . И он делает это успешно, но тогда я ничего не могу сделать с N'True' или N'False', которые он производит.

5 ответов

Лучший ответ

Это успешный обходной путь , а не решение как таковое или объяснение основной проблемы.

Очевидно, что существует проблема с данными, поступающими из представления, которая не позволяет обрабатывать результаты столбца YTD в предложении WHERE, и тем не менее, они могут быть обработаны к тому времени, когда запрос достигнет его SELECT фаза.

Я создал новый table, который явно определяет столбец YTD как nvarchar(50), а затем вставил все записи из моего представления в эту таблицу, что устранило проблему. Затем записи можно отсортировать и отфильтровать по YTD, как и положено.


0

Steve Taylor
30 Ноя 2016 в 14:02

SELECT *
FROM (SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD) AS A
WHERE cast(A.YTD as varchar) = 'True'


1

Krish
30 Ноя 2016 в 12:45

В качестве примера я использовал следующее:

DECLARE @Data TABLE
(
    Enquiry_Number nvarchar(10),
    YTD nvarchar(50)
)

INSERT INTO @Data(Enquiry_Number, YTD)
SELECT N'ENQ-001', N'True' UNION
SELECT N'ENQ-002', N'False' UNION
SELECT N'ENQ-003', N'True' 


SELECT Enquiry_Number, [YTD] FROM (
    SELECT Enquiry_Number, CONVERT(nvarchar(10),YTD) AS [YTD] FROM @Data
) AS A
WHERE A.YTD = N'True'

Результат:

ENQ-001 True
ENQ-003 True

В поле YTD должны быть результаты, которые заставят его вернуть как тип datetime.

Попробуйте такой запрос:

SELECT * FROM dbo.vw_SalesPO_YTD WHERE ISDATE(YTD)= 1

Обновленный вопрос: попробуйте:

ISNULL(CASE WHEN  Award_Date <= DATEFROMPARTS(FinancialYear - 1, 11, 1) + GETDATE() - DATEADD(year, DATEDIFF(month, '20161101', GETDATE()) / 12, '20161101') THEN N'True' ELSE N'False' END, 'false')


1

Danie Schoeman
30 Ноя 2016 в 13:38

Попробуйте это: — Не добавляйте n перед строкой

SELECT *
FROM (SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD) AS A
WHERE A.YTD = 'True'


1

frhd
30 Ноя 2016 в 14:21

Я не знаю, что это за тип источника с начала года.

Попробуйте использовать следующее:

SELECT Enquiry_Number, [YTD] FROM (
    SELECT Enquiry_Number, CONVERT(nvarchar(10),YTD) AS [YTD] FROM dbo.vw_SalesPO_YTD
) AS A
WHERE A.YTD = N'True'

10 — это просто отстойное значение. Он будет вырезать любую часть поля длиной более 10. Это зависит от вашего фактического размера поля.


1

Danie Schoeman
30 Ноя 2016 в 12:35

   фпк1сл

31.01.16 — 21:52

Добрый день!

Конфигурация УТ 11.1.10.145, платформа 8.3.6.2237, SQL Server 2008.

При проведении документа «Расчет себестоимости товаров» за апрель, выскакивает ошибка

Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

по причине:

{Документ.РасчетСебестоимостиТоваров.МодульОбъекта(2181)}: Ошибка при вызове метода контекста (ВыполнитьПакет)

        Выборка = Запрос.ВыполнитьПакет()[1].Выбрать();

по причине:

Ошибка выполнения запроса

по причине:

Ошибка при выполнении операции над данными:

Microsoft SQL Server Native Client 10.0: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.

HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1

Все  другие документы проводятся нормально. Подскажите пожалуйста, все чем может быть проблема, куда смотреть?

   фпк1сл

1 — 31.01.16 — 21:53

Я понимаю, что где-то в результате запроса получается большое число, вот только как найти, откуда это число возникает?

   cw014

2 — 01.02.16 — 07:37

Пройтись отладчиком + ТИИ

   фпк1сл

3 — 01.02.16 — 11:57

Отладчик мне ничего не покажет, программа завершается в момент Выборка = Запрос.ВыполнитьПакет()[1].Выбрать(); , значит я не узнаю, что её выбивает. В файловом варианте база тоже не запускается, размер слишком большой.

   Timon1405

4 — 01.02.16 — 12:04

обновитесь, говорят, на 11.1.10.150 проблема уходит.

   Михаил Козлов

5 — 01.02.16 — 12:14

(3) Можно попробовать в консоли удалять из пакета по 1. Или выполнять по 1.

   Карупян

6 — 01.02.16 — 12:16

профайлером (или тж) засечь запрос и посмотреть

   фпк1сл

7 — 01.02.16 — 15:21

Обновляться буду в крайнем случае, попробую в технологическом журнале посмотреть на криминал. Профайлером не имею представления как пользоваться.

   фпк1сл

8 — 02.02.16 — 16:16

Обновление не дало результатов. В ТЖ и профайлер смотрел — ничего не понял. Подскажите, может по какому нибудь регистру посмотреть какие нибудь значения подозрительные?

   mikecool

9 — 02.02.16 — 16:19

(8) первый запрос из пакета генерит не перевариваемое число — посмотри, какие там числовые поля и попытайся понять, откуда мб такое большое

   Timon1405

10 — 02.02.16 — 17:16

(8) поищите большой ресурс «ПостояннаяРазница» в регистре ВыручкаИСебестоимостьПродаж в консоли запросов

   Tateossian

11 — 02.02.16 — 18:37

(0) Скорее всего, это происходит где-то при делении, попробуй все такие места явно обработать через ВЫРАЗИТЬ( КАК ЧИСЛО(xx,yy))

   Cyberhawk

12 — 02.02.16 — 18:53

ИР тебе в помощь — там и разбивка запроса на подзапросы, и отбор ТЖ по конкретному запросу

   фпк1сл

13 — 03.02.16 — 09:26

(11) В том то дело, все место обработаны через Выразить, запрос полностью типовой.

// 0 Расчет коэффициентов (количество перехода из состояния в состояние) уравнения.

        |ВЫБРАТЬ

        |    УзлыКорректировки.НомерУзла                                     КАК НомерУзла,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость)                  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициент,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьБезНДС)            КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентБезНДС,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ПостояннаяРазница)          КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентПостояннаяРазница,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ВременнаяРазница)           КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентВременнаяРазница,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходы)        КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходы,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходыБезНДС)  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходыБезНДС,

        |

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК Стоимость,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьБезНДС,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК ПостояннаяРазница,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК ВременнаяРазница,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходы,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходыБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходыБезНДС

        |

        |ПОМЕСТИТЬ ВременнаяТаблицаРешений

        |ИЗ

        |    ВтУзлыКорректировки КАК УзлыКорректировки

        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания

        |        ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник

        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений

        |        ПО ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла

        |ГДЕ

        |    УзлыКорректировки.Количество <> 0

        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) > -999999999.999999999

        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) < 999999999.999999999

        |

        |СГРУППИРОВАТЬ ПО

        |    УзлыКорректировки.НомерУзла,

        |    УзлыКорректировки.Количество

        |

        |ИНДЕКСИРОВАТЬ ПО

        |    НомерУзла

        |;

        |/////////////////////////////////////////////////////////////////////////////

        // 1 Расчет ошибки расчета.

        |ВЫБРАТЬ

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК Отклонение,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеБезНДС,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеПостояннаяРазница,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеВременнаяРазница,

        |

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА

        |

        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеДопрасходы,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА

        |

        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеДопрасходыБезНДС

        |ИЗ

        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений

        |

        |        ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ТаблицаРешений

        |        ПО ВременнаяТаблицаРешений.НомерУзла = ТаблицаРешений.НомерУзла

        |;

        |//////////////////////////////////////////////////////////////

        // 2 Удаление таблиц.

        |УНИЧТОЖИТЬ ВтТаблицаРешений

        |;

        // 3 Суммирование коэффициентов.

        |//////////////////////////////////////////////////////////////

        |ВЫБРАТЬ

        |    ВременнаяТаблицаРешений.НомерУзла  КАК НомерУзла,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициент

        |            + ВременнаяТаблицаРешений.Стоимость

        |        КАК ЧИСЛО(23,10))              КАК Стоимость,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |            + ВременнаяТаблицаРешений.СтоимостьБезНДС

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьБезНДС,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |            + ВременнаяТаблицаРешений.ПостояннаяРазница

        |        КАК ЧИСЛО(23,10))              КАК ПостояннаяРазница,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |            + ВременнаяТаблицаРешений.ВременнаяРазница

        |        КАК ЧИСЛО(23,10))              КАК ВременнаяРазница,

        |

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходы

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходы,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходыБезНДС

        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходыБезНДС

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходыБезНДС

        |

        |ПОМЕСТИТЬ ВтТаблицаРешений

        |

        |ИЗ

        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений

        |

        |ИНДЕКСИРОВАТЬ ПО

        |    НомерУзла

        |;

        |//////////////////////////////////////////////////////////////

        // 4 Удаление таблицы.

        |    УНИЧТОЖИТЬ ВременнаяТаблицаРешений

        |»;

   фпк1сл

14 — 03.02.16 — 12:58

Запрос выполняется с использованием Менеджера временных таблиц

   фпк1сл

15 — 03.02.16 — 13:02

Еще глупый вопрос, в запросе выполняется первый пакет. Как мне его найти?

   фпк1сл

16 — 05.02.16 — 09:26

я вычислил, что всему виной вот эта строчка в запросе

|    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

Здесь и происходит переполнение.

   Ёпрст

17 — 05.02.16 — 09:35

(16) выкини выразить оттуда

   Ёпрст

18 — 05.02.16 — 09:35

и спи спокойно дальше

   фпк1сл

19 — 05.02.16 — 09:42

(17) Не помогло, все та же ошибка преобразования numeric.

Что интересно, только за апрель документ выжучивается, следующий месяц проводится без проблем.

   Ёпрст

20 — 05.02.16 — 09:43

ну поставь  КАК ЧИСЛО(15,0)

   фпк1сл

21 — 05.02.16 — 09:53

(20) Все так же упрямо выскакивает эта ошибка.

   НЕА123

22 — 05.02.16 — 10:00

СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0)) Как СуммаПР,

Сумма(ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК СуммаСписания,…

может дикие числа.

   НЕА123

23 — 05.02.16 — 10:03

вообще, ИМХО, ВЫРАЗИТЬ в Сумма засунуть.

   Tateossian

24 — 05.02.16 — 10:09

(16) Выведи в отладке содержимое ВтТаблицаРешений в ТЗ и посмотри, что там за числа.

   фпк1сл

25 — 05.02.16 — 10:53

(23) выразил, снова ошибка. (24)  Глазами пробежался по 12к строк, на первый взгляд никакого криминала. Попробую покромсать запрос и выполнять по частям.

   фпк1сл

26 — 05.02.16 — 13:11

Получается, что «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» имеют значение Null.

И если подставить, то получается, что выражение

ВЫРАЗИТЬ(СУММА(0 * 0) КАК ЧИСЛО(23,10)) — вызывает арифметическое переполнение.

   фпк1сл

27 — 05.02.16 — 13:50

Был неправ, зайдя дальше обнаружил, что умножение «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» на какой то итерации дает переполнение, буду двигаться дальше.

   фпк1сл

28 — 09.02.16 — 15:52

При проведении документа «Расчет себестоимости» формируются записи регистра накопления «Себестоимость товаров». Так вот за 2014 год все формировалось нормально, а с 2015 в колонке «Стоимость (ПР)» — постоянная разница, только по 2-3 номенклатурам начали появляться и расти огромные числа. Подскажите, из-за чего растет постоянная разница строго по 2 позициям номенклатуры?

  

фпк1сл

29 — 10.02.16 — 10:10

Пример. Одна организация, два склада.

Документ перемещения формирует две записи в регистре накопления — Количество(10) по двум складам.

Документ Расчет себестоимости товаров формирует одну запись — Стоимость(ПР) : 134 046 229,30.   Откуда такая цифра? Причем некоторые записи идут корректно, в чем разница, так и не понял.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка антипробуксовочной системы шкода рапид
  • Ошибка арифметического переполнения при преобразовании expression к типу данных int sql server