Автор | Сообщение | ||||
---|---|---|---|---|---|
Юрий Никитин Почетный форумщик Зарегистрирован: 17.09.2004 |
Добавлено: 01.02.2005 17:56 Заголовок сообщения: Чудеса с кассовым методом (iScala 2.2, PL) Друзья, Встречался ли кто-нибудь с такой странной проблемой: iScala 2.2 HF 2187, Книга Закупок. Кассовый метод включен в параметрах модуля. Один и тот же поставщик. При вводе инвойсов НДС пишется на контрольный счет всегда. А вот при полной оплате НДС иногда списывается на «боевой» счет, а иногда нет… Пробовал воспроизвести. Несколько раз вводил в тестовой компании одинаковые инвойсы и платежи; различие было только в номерах. Действительно, из 5 пар инвойс-платеж в одной не сработал перенос НДС. Изучил все related таблицы. Записи идентичны (за исключением номеров)… Трассировка запросов к базе, выполняемых Скалой, ничего интересного не дает; видать, все дело в программной логике. Есть ощущение, что проявление ошибки как-то связано с номером инвойса. Кстати, по отзывам пользователей, в Книге Продаж то же самое творится. Вот такая вот ботва. Может, кто-нибудь уже с этим боролся? |
||||
aav Администратор Зарегистрирован: 14.09.2004 |
Добавлено: 01.02.2005 18:25 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
|
||||
Юрий Никитин Почетный форумщик Зарегистрирован: 17.09.2004 |
Добавлено: 02.02.2005 09:54 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
|
||||
aav Администратор Зарегистрирован: 14.09.2004 |
Добавлено: 02.02.2005 10:27 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
|
||||
vome Народный форумщик Зарегистрирован: 17.09.2004 |
Добавлено: 02.02.2005 10:45 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
|
||||
Удалён Гость |
Добавлено: 02.02.2005 11:56 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
В скале 5.1 русские буквы зачемятельно прокатывають |
||||
Юрий Никитин Почетный форумщик Зарегистрирован: 17.09.2004 |
Добавлено: 02.02.2005 13:25 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
В тех счетах, где нет проблем, русские буквы тоже присутствуют. И «П» в том числе. Леш, а чем эта буква так примечательна? |
||||
Юрий Никитин Почетный форумщик Зарегистрирован: 17.09.2004 |
Добавлено: 02.02.2005 13:26 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
Спасибо, попробуем. Хотя все инвойсы и авансы рублевые, вроде бы округление здесь ни при чем… |
||||
aav Администратор Зарегистрирован: 14.09.2004 |
Добавлено: 02.02.2005 14:27 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)
|
||||
Юрий Никитин Почетный форумщик Зарегистрирован: 17.09.2004 |
Добавлено: 09.02.2005 16:31 Заголовок сообщения: Чудесное исцеление… Похоже, проблема решена. Интересная проблема. Три дня угрохал. Путь решения: 1. Трассировал запросы к базе, которые Скала отправляет в процессе закрытия инвойса 2. Обнаружил интересный запрос такого вида: SELECT PL17001, PL17002, PL17003, PL17004,PL17008,PL17009,PL17010,PL17017,PL17018 where Смысл понятен. Ищем, была ли запись типа X (то есть регистрация НДС по кассовому методу при вводе инвойса) и, если была, то «перекидываем» НДС при оплате, а если нет, то не «перекидываем». Так вот, обратите внимание на пробелы, которые скала зачем-то добивает после номера инвойса и кода поставщика. В определенных случаях такой запрос РАБОТАЕТ НЕПРАВИЛЬНО. То есть не выдает ничего, хотя такая запись (без пробелов, конечно) в таблице есть. Согласно спецификации ANSI-92 SQL и Microsoft T-SQL, пробелы в конце литерала в операторах WHERE со знаком равенства не должны влиять на результат запроса. Однако влияют… Просходит это тогда, когда в таблице есть еще одна запись, например, с PL17001=’15А’ (А—русское, aav был прав про русские буквы!). Все, при этом SQL сервер впадает в ступор и не находит запись с PL17001=’15’ по критерию PL17001=’15 ‘ (с пробелом). Причем это происходит только при поиске по нескольким полям составного ключа. КАК ЛЕЧИТЬ Радикальным хирургическим методом. Сменой Collation для базы данных… У нас было Cyrillic_General_BIN. Я поменял collation для PL17cc00 на Cyrillic_General_CS_AI, и запрос заработал. Так что теперь предвкушаю замену Collation для трех баз по 3-5 гигабайт… Спасибо всем за советы. Если нужна любая дополнительная информация, обращайтесь! YNi |
||||
E-terminator Почетный форумщик Зарегистрирован: 03.01.2005 |
Добавлено: 10.02.2005 09:42 Заголовок сообщения: Collations и iScala — это не просто история, это целый роман. Как я догадываюсь, с продолжением Ровно год — полтора года назад еще на 2.1 я обнаружил проблему с появлением на экране списка Учетных Измерений (по F4). Проблема заключалась в том, что если ввести в поле для поиска «?<БУКВА>», то список выводится не полный, т.е. часть записей не попадали в выборку. Аналогичный запрос в QA приводил, естественно, к правильному результату. Трассировка показывала, что Скала не посылала аналогичный T-SQL запрос. Она забирает в свой внутренний курсор «пачку» данных и далее внутри сама, по своим понятиям фильтрует и сортирует данные. Во как. Это понятно. Ноги растут из DOSа и Btrieve. Я потратил кучу усилий, чтобы мне в R&D ответили на простой вопрос: «А какой же набор Collation Settungs должен быть?» Прямого ответа не дождался. В инструкции по iScala сказано, что она должна поддерживать ЛЮБОЙ набор. В инструкции по 5.1 было — Cyrillic_General_BIN. Конвертер 5.1->iScala2.x не изменяет его. Следовательно, можно предположить, что вариант Cyrillic_General_BIN должен работать нормально. Дальше интересней. В феврале прошлого года я целый МЕСЯЦ занимался уже 2.2. на предприятии, на котором я сейчас работаю, а тогда работал на этом проекте внедрения. Занимался тем, чем и ты сейчас. Пытался сам методом проб и ошибок определить подходящий набор Collation Settings. Последовательно заменял различные наборы. Для автоматизации этого безобразия даже написал некий Collation-Converter (дикая помесь VBScript и T-SQL!!!). Нетрудно составить набор возможных комбинаций, которые бы поддерживали кириллицу. Фишка оказалась в том, что (держись за стул!!! ) в разных модулях Скала, при выполнении разных запросов правильно работают РАЗНЫЕ наборы Collations! Во как! Т.е., разные программеры по-разному сортируют и фильтруют текстовые поля, по разным алгоритмам. Еще раз напомню, что это не T-SQL запросы, а внутренний механизм фильтрации и сортировки. Результатом этого тестирования в процессе внедрения (передовой метод!) iScala 2.2 стала некая DLL от нашего R&D, которая якобы снимала эти вопросы. Потом она (в марте 2004г.) была включена в один из HotFixes. После этого я c аналогичными проблемами не встречался. Так может ты начинаешь новую главу этого увлекательного романа? Могу добавить только то, что желательно, чтобы Collation Settings был един для: 1. SQL Server — default Collation settings 2. Базы данных с бизнес-информацией (iScala) 3. Системной БД (iScala) |
||||
Jugulator Главный форумщик Зарегистрирован: 08.10.2004 |
Добавлено: 03.11.2005 16:56 Заголовок сообщения: >Так вот, обратите внимание на пробелы, которые скала зачем-то добивает после номера инвойса и кода поставщика. В определенных случаях такой запрос РАБОТАЕТ НЕПРАВИЛЬНО. То есть не выдает ничего, хотя такая запись (без пробелов, конечно) в таблице есть. Согласно спецификации ANSI-92 SQL и Microsoft T-SQL, пробелы в конце литерала в операторах WHERE со знаком равенства не должны влиять на результат запроса. Однако влияют… < Подтверждаю: влияют. iScala 2.2 SR1 на MS SQL Server 2000 SP4. Нежданно-негаданно без всяких видимых причин перестают работать отчеты по покупателю (сальдовые ведомости КП). Исследование показывает, что запрос |
||||
Удалён Гость |
Добавлено: 14.12.2005 15:30 Заголовок сообщения: Не эксперементируйте с Collation в 2.2 Проходили мы это. После конвертации с 5.1 на 2.2 не пошла сальдовая ведомость. Книга закупок вся из русских символов (PL03001 PL21001 и т.д.). День разбирались. Ни кто однозначно не говорил: «Да нужно менять Collation». Все только рекомендуют. Говорю: «В Росси нужно менять Collation обязательно, или не используйте русские символы вообще «. |
||||
Jugulator Главный форумщик Зарегистрирован: 08.10.2004 |
Добавлено: 15.12.2005 20:18 Заголовок сообщения: >> Коллеги, пока могу только рекомендовать от CLUSTERED по возможности отказываться. Теперь я не буду так категоричен. Далее я приведу не отгадки на известные загадки, а просто некоторую информацию к размышлению. Что стало в моем случае проблемой? Примерно такая вещь, смотрите: select SL01001, convert(varbinary, SL01001) from SL010100 where left(SL01001,4) = N’0272′ order by SL01001 COLLATE Cyrillic_General_BIN /* 0272В 0x3000320037003200120420002000200020002000 русская «вэ» 0272 0x3000320037003200200020002000200020002000 0272V 0x3000320037003200560020002000200020002000 */ Есть в таблице сразу три кода, которые начинаются на число 0272, а в конце в одном случае ничего не стоит, в другом случае стоит русская буква, в другом буква латинская. Что происходит в такой ситуации в iScala 2.2 SR1? Во-первых, в списке покупателей по F4 сортировка происходит в указанном порядке, т.е. код без букв оказывается посередине между кодом с русской буквой и кодом с латинской буквой. Во-вторых, в сальдовой ведомости код 0272 пропускается, поскольку запрос, где код дополняется пробелами справа до длины поля, не находит нужную запись. Я предположил, что составной кластерный индекс SL03001 + SL03002 в данном случае не позволяет найти значение между двумя более длинными кодами, поэтому решил просто изменить по всей базе код 0272В на такой же с английской «би» в конце, имеющей похожий вид. Для замены был выполнен UPDATE по 50 таблицам. Контрольный SELECT, однако, дал те же результаты, что и до обновления. Кондратий уже распахнул свои объятия, когда я догадался вслед изменениям послать команду dbcc dbreindex (‘SL030100’). Теперь заработало как надо, т.е. и порядок какой надо в списке (более короткая строка впереди) и в ведомости покупатель объявился. Теперь я полагаю, что убрав сначала кластерный индекс с таблицы, тем самым просто неявно вызвал пересоздание индекса, и сразу после окончания работы запрос стал показывать нужный результат, а я бросился всем рассказывать как хорошо жить без CLUSTERED. Потом, видимо, при вставке новых записей в таблицу SL03, все вернулось в исходное положение. Так что CLUSTERED тут не при чем. Почти. Далее нашел все похожие ситуации в SL03: select a.SL01001, b.SL01001, c.SL01001 from SL010100 a inner join SL010100 b on LEFT(b.SL01001, LEN(a.SL01001)) = a.SL01001 and ASCII(SUBSTRING(b.SL01001, LEN(a.SL01001) + 1, 1)) between 192 and 223 —between ‘А’ and ‘Я’ inner join SL010100 c on LEFT(c.SL01001, LEN(a.SL01001)) = a.SL01001 and ASCII(SUBSTRING(c.SL01001, LEN(a.SL01001) + 1, 1)) between 65 and 90 — between ‘A’ and ‘Z’ Другие коды оказались старыми и закрытыми, поэтому изменять их не имело смысла. Данное приключение, однако, заставило задуматься о двоичном представлении символов в системе, хотя о таких вещах уже давно не приходилось вспоминать, витая в облаках наборов данных в качестве практически бизнес-интеллигента и не опускаясь на грешную землю. В связи с этим я и привел в первом запросе преобразование строки в varbinary, где видно, что порядок-то сортировки для BIN немного другой. Привожу несколько ссылок для общего развития: Юникод http://ru.wikipedia.org/wiki/Unicode Кириллица в Юникоде (файл PDF)http://www.unicode.org/charts/PDF/U0400.pdf Кириллица в Юникоде http://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2_%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4%D0%B5 Теперь небольшой фрагмент, чтобы посмотреть порядок символов при двоичной сортировке: select top 256 IDENTITY(int,0,1) as CharCode, convert(nchar(1), space(1)) as CharChar, convert(binary(2), space(1)) as CharBin into #chars from sysobjects a, sysobjects b ALTER TABLE #chars ALTER COLUMN CharChar nchar(2) COLLATE Cyrillic_General_BIN NOT NULL update #chars set CharChar = CHAR(CharCode) + SPACE(1) /* NOT NCHAR(CharCode) */ ALTER TABLE #chars ADD CONSTRAINT prkey PRIMARY KEY CLUSTERED (CharChar, CharBin) update #chars set CharBin = convert(binary(2), CharChar) dbcc dbreindex (‘#chars’) select * from #chars order by CharCode select *, convert(nchar(2), CharBin) from #chars order by CharBin drop table #chars |