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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.04.2005, 13:33   #1  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
Изменение выравнивания 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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
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  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
все равно не понимаю
пятница сказывается, видимо
на живых данных все же нагляднее было бы
покажите, где (как) символы в ваучере теряются
Старый 11.04.2005, 05:25   #5  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Версию и collation БД озвучьте, пожалуйста

PHP код:
select @@version
select databasepropertyex
('axdb''collation'
Старый 12.04.2005, 06:58   #7  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
>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  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
Выдержка из документации

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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано 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]
Теперь понял, спасибо. Занятно. А Вам действительно необходимо иметь Num с StringSize=40 (если я правильно посчитал)?
Старый 12.04.2005, 10:24   #10  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
Цитата:
Изначально опубликовано Vadik


Теперь понял, спасибо. Занятно. А Вам действительно необходимо иметь Num с StringSize=40 (если я правильно посчитал)?
Действительно у меня стоит длина 40 на слое cus, хотя на слое sys - 20. Самое неприятное в том, что я не имею лицензионных прав кроме как на слой usr (не закуплено x++ source code).
Кто это поставил - для меня вопрос ( или внедренцы или пришло с SP). Сейчас буду выяснять. Модификация этого EDT от 16.03.2004.
Старый 12.04.2005, 11:29   #11  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
При изменении длины EDT сталкиваемся с той же ситуацией (идет приведение типов cast(<filed> as varchar), т.е. поле обрезается до 30 символов).
Я не представляю, как штатными средствами Axapta выполнить изменение длины строкового поля (более 30) с правым выравниванием к более короткой без потери символов с 31.. и изменить выравнивание на левое.
Старый 22.04.2005, 09:33   #12  
DenisS is offline
DenisS
Участник
 
65 / 24 (1) +++
Регистрация: 01.09.2003
Столкнулись с той же проблемой. Решение было такое:

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  
jaran is offline
jaran
Участник
 
20 / 15 (1) ++
Регистрация: 24.12.2004
На тесте прогнал следующий алгоритм.
1. Создал копию приложения и БД
2. Включил мониторинг запросов SQL в файл в Axapta
3. Изменил выравнивание на левое у NUM
4. Синхронизировал.
5. Повторил п.1
6. Из файл мониторинг "взял" все update и конструкцию as varchar заменил на as varchar(40) (У меня сейчас стоит 40 символов)
7. Прогнал полученный SQL скрипт на БД (просто написал на Delphi выполнение данного скрипта)
8. Изменил выравнивание на левое у NUM (можно и длину) и синхронизировал.
Вроде все нормально.
Но на реальной БД повторить что-то побаиваюсь. (Объем БД 33Гб)

Есть у кого какие советы, предостережения.
Теги
баг, синхронизация баз

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание наследника EDT через Х++ vesna DAX: Программирование 12 02.05.2012 08:13
Выравнивание Num влево последствия... 36AC DAX: Программирование 31 09.06.2007 16:13
проблема выравнивания SHiSHok DAX: Программирование 2 11.04.2006 14:19
Ошибка в синхронизации выравнивания EDT axz DAX: Программирование 7 02.02.2006 16:36
Список полей таблиц на базе конкретного EDT Владимир Максимов DAX: Программирование 10 06.10.2004 14:45

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

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

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