Чудеса с кассовым методом (iScala 2.2, PL)

Автор Сообщение
Юрий Никитин
Почетный форумщик

Зарегистрирован: 17.09.2004
Сообщения: 26
Откуда: Санкт-Петербург

Добавлено: 01.02.2005 17:56 Заголовок сообщения: Чудеса с кассовым методом (iScala 2.2, PL)
Друзья,

Встречался ли кто-нибудь с такой странной проблемой:

iScala 2.2 HF 2187, Книга Закупок. Кассовый метод включен в параметрах модуля. Один и тот же поставщик.

При вводе инвойсов НДС пишется на контрольный счет всегда. А вот при полной оплате НДС иногда списывается на «боевой» счет, а иногда нет…

Пробовал воспроизвести. Несколько раз вводил в тестовой компании одинаковые инвойсы и платежи; различие было только в номерах. Действительно, из 5 пар инвойс-платеж в одной не сработал перенос НДС. Изучил все related таблицы. Записи идентичны (за исключением номеров)… Трассировка запросов к базе, выполняемых Скалой, ничего интересного не дает; видать, все дело в программной логике. Есть ощущение, что проявление ошибки как-то связано с номером инвойса.

Кстати, по отзывам пользователей, в Книге Продаж то же самое творится.

Вот такая вот ботва. Может, кто-нибудь уже с этим боролся?

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 01.02.2005 18:25 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

Юрий Никитин писал(а):
из 5 пар инвойс-платеж в одной не сработал перенос НДС. Изучил все related таблицы. Записи идентичны (за исключением номеров)…


Есть ли в ошибочной паре инвойс-платеж в номере русские буквы?

Юрий Никитин
Почетный форумщик

Зарегистрирован: 17.09.2004
Сообщения: 26
Откуда: Санкт-Петербург

Добавлено: 02.02.2005 09:54 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

aav писал(а):
Есть ли в ошибочной паре инвойс-платеж в номере русские буквы?


Опа! А вот об этом я не думал… Есть. В номере аванса.

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 02.02.2005 10:27 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

Юрий Никитин писал(а):
Опа! А вот об этом я не думал… Есть. В номере аванса.


Что-то такое на тему русских букв мне говорила недавно Марина Мареева с хотлайна.
А в остальных есть (в тех, где нет проблем)? И что за буква, не «П» случайно?

vome
Народный форумщик

Зарегистрирован: 17.09.2004
Сообщения: 210
Откуда: Санкт-Петербург -> Москва

Добавлено: 02.02.2005 10:45 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

Юрий Никитин писал(а):
из 5 пар инвойс-платеж в одной не сработал перенос НДС. Изучил все related таблицы. Записи идентичны (за исключением номеров)…


Может дикая идея, но что если поставить параметр считать оплаченным, если разница между счет фактурой и платежом 0 р. 0099 коп. Глазик

Удалён
Гость

Добавлено: 02.02.2005 11:56 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

aav писал(а):
Что-то такое на тему русских букв мне говорила недавно Марина Мареева с хотлайна.
А в остальных есть (в тех, где нет проблем)? И что за буква, не «П» случайно?

В скале 5.1 русские буквы зачемятельно прокатывають Обидно, чес слово, обидно!

Юрий Никитин
Почетный форумщик

Зарегистрирован: 17.09.2004
Сообщения: 26
Откуда: Санкт-Петербург

Добавлено: 02.02.2005 13:25 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

aav писал(а):
А в остальных есть (в тех, где нет проблем)? И что за буква, не «П» случайно?

В тех счетах, где нет проблем, русские буквы тоже присутствуют. И «П» в том числе. Леш, а чем эта буква так примечательна?

Юрий Никитин
Почетный форумщик

Зарегистрирован: 17.09.2004
Сообщения: 26
Откуда: Санкт-Петербург

Добавлено: 02.02.2005 13:26 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

vome писал(а):
Может дикая идея, но что если поставить параметр считать оплаченным, если разница между счет фактурой и платежом 0 р. 0099 коп. Глазик

Спасибо, попробуем. Хотя все инвойсы и авансы рублевые, вроде бы округление здесь ни при чем…

aav
Администратор
Администратор

Зарегистрирован: 14.09.2004
Сообщения: 1081
Откуда: Санкт-Петербург

Добавлено: 02.02.2005 14:27 Заголовок сообщения: Re: Чудеса с кассовым методом (iScala 2.2, PL)

Юрий Никитин писал(а):
В тех счетах, где нет проблем, русские буквы тоже присутствуют. И «П» в том числе. Леш, а чем эта буква так примечательна?


А пес его знает, просто я помню проблемы с «П», когда в ЛАН файле тоже была «П», означающая предоплату, мы тогда ее еще заменяли на Ъ, вот только не могу вспомнить, где это было в коде покупателя или в номере счета-фактуры.

Leshic писал(а):
В скале 5.1 русские буквы зачемятельно прокатывають Обидно, чес слово, обидно!


Да, вроде хотлайном это говорилось только про 2.2

Юрий Никитин
Почетный форумщик

Зарегистрирован: 17.09.2004
Сообщения: 26
Откуда: Санкт-Петербург

Добавлено: 09.02.2005 16:31 Заголовок сообщения: Чудесное исцеление…
Похоже, проблема решена. Интересная проблема. Три дня угрохал.

Путь решения:

1. Трассировал запросы к базе, которые Скала отправляет в процессе закрытия инвойса

2. Обнаружил интересный запрос такого вида:

SELECT PL17001, PL17002, PL17003, PL17004,PL17008,PL17009,PL17010,PL17017,PL17018
FROM PL17сс00

where
PL17001 = N’15 ‘ —!!! ВНИМАНИЕ!
AND
PL17002 = N’20485 ‘ —!!! ВНИМАНИЕ!
AND PL17003 = N’X’
ORDER BY PL17001,PL17002,PL17003,PL17004

Смысл понятен. Ищем, была ли запись типа 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
Сообщения: 46
Откуда: град Св. Петра

Добавлено: 10.02.2005 09:42 Заголовок сообщения:
Collations и iScala — это не просто история, это целый роман. Как я догадываюсь, с продолжением Smile Ровно год — полтора года назад еще на 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 аналогичными проблемами не встречался. Так может ты начинаешь новую главу этого увлекательного романа? Smile Могу добавить только то, что желательно, чтобы Collation Settings был един для:
1. SQL Server — default Collation settings
2. Базы данных с бизнес-информацией (iScala)
3. Системной БД (iScala)
Jugulator
Главный форумщик

Зарегистрирован: 08.10.2004
Сообщения: 428

Добавлено: 03.11.2005 16:56 Заголовок сообщения:
>Так вот, обратите внимание на пробелы, которые скала зачем-то добивает после номера инвойса и кода поставщика. В определенных случаях такой запрос РАБОТАЕТ НЕПРАВИЛЬНО. То есть не выдает ничего, хотя такая запись (без пробелов, конечно) в таблице есть. Согласно спецификации ANSI-92 SQL и Microsoft T-SQL, пробелы в конце литерала в операторах WHERE со знаком равенства не должны влиять на результат запроса. Однако влияют… <

Подтверждаю: влияют. iScala 2.2 SR1 на MS SQL Server 2000 SP4. Нежданно-негаданно без всяких видимых причин перестают работать отчеты по покупателю (сальдовые ведомости КП). Исследование показывает, что запрос
SELECT * FROM SL030100 WHERE SL03001 = ‘0337’
выдает строки покупателя, а запрос
SELECT * FROM SL030100 WHERE SL03001 = ‘0337 ‘
не выдает строк вообще.
Умудренный опытом работы с большими таблицами в CRM-системе коллега посоветовал убрать кластерность с первичного ключа таблицы SL03 (он наелся уже кластерности при применении BETWEEN и вставке записей в таблицы с миллионами строк). Знаете, помогло на раз, и Collation трогать не пришлось. Конечно, в своем запросе можно и явно Collation указать, тогда запрос заработает, но iScala как-то к этому факту равнодушна и формирует запросы как считает нужным.
Коллеги, пока могу только рекомендовать от CLUSTERED по возможности отказываться.

Удалён
Гость

Добавлено: 14.12.2005 15:30 Заголовок сообщения: Не эксперементируйте с Collation в 2.2
Проходили мы это. После конвертации с 5.1 на 2.2 не пошла сальдовая ведомость. Книга закупок вся из русских символов (PL03001 PL21001 и т.д.). День разбирались. Ни кто однозначно не говорил: «Да нужно менять Collation». Все только рекомендуют.
Говорю: «В Росси нужно менять Collation обязательно, или не используйте русские символы вообще Exclamation Exclamation Exclamation «.
Jugulator
Главный форумщик

Зарегистрирован: 08.10.2004
Сообщения: 428

Добавлено: 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
GO
ALTER TABLE #chars ALTER COLUMN CharBin binary(2) NOT NULL
GO

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
GO
Посмотрели? Тогда на примере ряда непохожих по начертанию русских и латинских букв еще один запросик:
select Char1 COLLATE Cyrillic_General_BIN, convert(varbinary, Char1)
from (
select convert(nchar(10), N’щ’) as Char1 union
select convert(nchar(10), N’ъ’) as Char1 union
select convert(nchar(10), N’Щ’) as Char1 union
select convert(nchar(10), N’Ъ’) as Char1 union
select convert(nchar(10), N’i’) as Char1 union
select convert(nchar(10), N’j’) as Char1 union
select convert(nchar(10), N’I’) as Char1 union
select convert(nchar(10), N’J’) as Char1 union
select convert(nchar(10), N’iщ’) as Char1 union
select convert(nchar(10), N’iъ’) as Char1 union
select convert(nchar(10), N’iЩ’) as Char1 union
select convert(nchar(10), N’iЪ’) as Char1 union
select convert(nchar(10), N’iI’) as Char1 union
select convert(nchar(10), N’iJ’) as Char1 union
select convert(nchar(10), N’ii’) as Char1 union
select convert(nchar(10), N’ij’) as Char1
) chars
order by Char1 COLLATE Cyrillic_General_BIN
Вообще, как я обнаружил, тема неожиданных результатов запросов время от времени обсуждается, например, на сайте sql.ru:
http://www.sql.ru/forum/actualthread.aspx?tid=146049&hl=cyrillic_general_bin
http://www.sql.ru/forum/actualthread.aspx?tid=190274&hl=cyrillic_general_bin
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=102413&hl=cyrillic_general_bin