08.04.2005, 13:33 | #1 |
Участник
|
Изменение выравнивания EDT NUM
При изменении выравнивания расширенного типа данных NUM с правого на левое при синхронизация "вываливаются" ошибки типа
Синхронизация Невозможно выполнить команду языка определения данных в '' (''). Запись уже существует. UPDATE INVENTCLOSING SET VOUCHER={fn IFNULL({fn LTRIM(CAST(VOUCHER AS VARCHAR))},' ')} Ошибка кроется в AS VARCHAR Действительно select VOUCHER, {fn IFNULL({fn LTRIM(CAST(VOUCHER AS VARCHAR))},' ')} from inventclosing выдает для второго выражения 30 символов слева. Как выйти из данной ситуации. Непроходят синхронизацию порядка 35 таблиц ------------------------ Axapta 3.0 SP3 MDAC 2.8 MS SQL 2000 |
|
08.04.2005, 14:00 | #2 |
Модератор
|
Re: Изменение выравнивания EDT NUM
Цитата:
Изначально опубликовано jaran
Ошибка кроется в AS VARCHAR Действительно select VOUCHER, {fn IFNULL({fn LTRIM(CAST(VOUCHER AS VARCHAR))},' ')} from inventclosing выдает для второго выражения 30 символов слева. И еще - покажите, пожалуйста, результаты select count(distinct voucher) from bmssa.InventClosing select count(distinct ltrim(rtrim(voucher))) from bmssa.InventClosing на БД до изменения выравнивания |
|
08.04.2005, 14:11 | #3 |
Участник
|
select count(distinct voucher) from bmssa.InventClosing
select count(distinct ltrim(rtrim(voucher))) from bmssa.InventClosing Выдают одинаковые результаты (159) Посмотрите на результат этого запроса select voucher, cast(voucher as varchar) from InventClosing При изменени выравнивания расширенных типов как раз и используется конструкция cast(<поле> as varchar), которая обрезает значание поля до 30 символов |
|
08.04.2005, 14:34 | #4 |
Модератор
|
все равно не понимаю
пятница сказывается, видимо на живых данных все же нагляднее было бы покажите, где (как) символы в ваучере теряются |
|
11.04.2005, 05:25 | #5 |
Участник
|
select '''' + voucher + '''', '''' + cast(voucher as varchar) + '''' from InventClosing
выдает следующий результат COLUMN1 COLUMN2 ' ЗСк00000004' ' З' ' ЗСк00000001' ' З' ' ЗСк00000002' ' З' ' ЗСк00000015' ' З' ' ЗСк00000016' ' З' ' ЗСк00000019' ' З' ' ДКор00000023' ' ДК' ' ДКор00000024' ' ДК' ' ДКор00000001' ' ДК' ' ЗСк00000003' ' З' |
|
11.04.2005, 09:02 | #6 |
Модератор
|
Версию и collation БД озвучьте, пожалуйста
PHP код:
|
|
12.04.2005, 06:58 | #7 |
Участник
|
>select @@version
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: ) >select databasepropertyex('axdb', 'collation') Cyrillic_General_CI_AS |
|
12.04.2005, 07:20 | #8 |
Участник
|
Выдержка из документации
char and varchar Fixed-length (char) or variable-length (varchar) character data types. char[(n)] Fixed-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000. Storage size is n bytes. The SQL-92 synonym for char is character. varchar[(n)] Variable-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000. Storage size is the actual length in bytes of the data entered, not n bytes. The data entered can be 0 characters in length. The SQL-92 synonyms for varchar are char varying or character varying. Remarks When n is not specified in a data definition or variable declaration statement, the default length is 1. When n is not specified with the CAST function, the default length is 30 Получается что при выполнении синхронизации таблиц Axapta использует конструкции типа UPDATE INVENTCLOSING SET VOUCHER={fn IFNULL({fn LTRIM(CAST(VOUCHER AS VARCHAR))},' ')} что есть не совсем корректно (cast(<поле> as varchar) будет выдавать максимум 30 символов) |
|
12.04.2005, 09:32 | #9 |
Модератор
|
Цитата:
Изначально опубликовано jaran
When n is not specified with the CAST function, the default length is 30 Получается что при выполнении синхронизации таблиц Axapta использует конструкции типа UPDATE INVENTCLOSING SET VOUCHER={fn IFNULL({fn LTRIM(CAST(VOUCHER AS VARCHAR))},' ')} что есть не совсем корректно (cast(<поле> as varchar) будет выдавать максимум 30 символов) [/B] |
|
12.04.2005, 10:24 | #10 |
Участник
|
Цитата:
Изначально опубликовано Vadik
Теперь понял, спасибо. Занятно. А Вам действительно необходимо иметь Num с StringSize=40 (если я правильно посчитал)? Кто это поставил - для меня вопрос ( или внедренцы или пришло с SP). Сейчас буду выяснять. Модификация этого EDT от 16.03.2004. |
|
12.04.2005, 11:29 | #11 |
Участник
|
При изменении длины EDT сталкиваемся с той же ситуацией (идет приведение типов cast(<filed> as varchar), т.е. поле обрезается до 30 символов).
Я не представляю, как штатными средствами Axapta выполнить изменение длины строкового поля (более 30) с правым выравниванием к более короткой без потери символов с 31.. и изменить выравнивание на левое. |
|
22.04.2005, 09:33 | #12 |
Участник
|
Столкнулись с той же проблемой. Решение было такое:
1. Создать в БД средствами Axapta табличку (Fields_varchar_30) с полями TABLE_NAME, FIELD_NAME, в которую записать все имена полей таблиц, у которых изменится выравнивание и длина которых более 30 символов 2. По этой табличке в Query Analyzer прогнать скрипт: DECLARE @TABLE_NAME sysname, @COLUMN_NAME sysname DECLARE Cur CURSOR LOCAL FAST_FORWARD FOR SELECT TABLE_NAME, FIELD_NAME FROM Fields_varchar_30 OPEN Cur FETCH NEXT FROM Cur INTO @TABLE_NAME, @COLUMN_NAME WHILE @@FETCH_STATUS = 0 BEGIN EXEC('UPDATE ' + @TABLE_NAME + ' SET ' + @COLUMN_NAME + ' = ltrim('+@COLUMN_NAME+')') FETCH NEXT FROM Cur INTO @TABLE_NAME, @COLUMN_NAME END CLOSE Cur DEALLOCATE Cur 3. Далее синхронизация средствами Axapta проходит без проблем. 4. Одно НО !!!!: При изменении выравнивания в расширенном типе данных в AOT в поле таблицы выравнивание остается прежним!. Синхронизация, Компиляция и бубен не помогают. Кто сталкивался с этим - это криминально или нет??? |
|
22.04.2005, 09:57 | #13 |
Участник
|
На тесте прогнал следующий алгоритм.
1. Создал копию приложения и БД 2. Включил мониторинг запросов SQL в файл в Axapta 3. Изменил выравнивание на левое у NUM 4. Синхронизировал. 5. Повторил п.1 6. Из файл мониторинг "взял" все update и конструкцию as varchar заменил на as varchar(40) (У меня сейчас стоит 40 символов) 7. Прогнал полученный SQL скрипт на БД (просто написал на Delphi выполнение данного скрипта) 8. Изменил выравнивание на левое у NUM (можно и длину) и синхронизировал. Вроде все нормально. Но на реальной БД повторить что-то побаиваюсь. (Объем БД 33Гб) Есть у кого какие советы, предостережения. |
|