Функция [cp..] и строковые перемнные в "Финансах без проблем"



Posted by Анатолий Анимица on December 01, 1999 at 12:24:21:

In Reply to: Сервер 3.11 posted by Валерий Токарев on December 01, 1999 at 03:42:13:

Валерий Токарев сообщает об ошибке в его настройке:
в записии факта, который потом обрабатывается оператором
: total приходник L сумма ?S от кого ?D НДС ?ND
номер субсчета (значение D) определяется выражением:
: D=[cp D,1,[length D]/[found]]
и при этом
: сервер выдает сообщение об ошибке: Е-27 29:21 Это выражение должно выдавать строку, а не число.
Что нужно, чтобы выражение D=... обошлось без ошибки?
1. Переменная D должна быть строкой (символьная перемнная). Это такая, у которая состоит хотя бы из одного символа ("пусто"-это не строка!).
То есть, если в каком-нибудь факте значение D - "неправильное", эта ошибка останется не замеченной до тех пор, пока или не окажется "счет .. не существует", или что-нибудь подобное данному сообщению.

Далее. Выражение, вычисляющее D, не вполне тривиально - или автор и программист, а не только бухгалтер, или это писал кто-то другой.
Рассмотрим его подробнее.
Написано: D=[cp D..], т.е. оператор пытается откусить первые несколько байт строки D (допустим, там строка на самом деле).
Далее, Написано D=[cp D,[length D]/[found]]
Что это? Если [found]=1 - значит надо "откусить" ВСЕ символы D от первого до последнего. Если [found]=0, значит, надо длину делить на 0!!! А если и длина строки D=0, надо 0/0. Ну ладно. Ноль на ноль - это все, что угодно. Но ошибка - первая из трех возможных - гарантирована, если не все с этим выражением в порядке, включая входные значения переменных.
А если [found]=1000, то придется кусать первых 0 байтов от переменной D, потому что 9/1000=0.


Рецепт.
1. Никогда не пишите того, что может оказаться ошибкой при хотя бы одном возможном значении входных данных.
Это одно из следствий первого закона Мэрфи.
2. Если Вам это зачем-то нужно, все-таки проверьте соответствие входных данных предстоящей обработке. Скажем, хотя бы длины и [found] проверьте насчет нулей.
3. И, может быть, самое важное. При генерации фактов фозможно транзиентное наследование значения переменной.
То есть, если Вы напишете: a=b, а b перед этим не определена - Вы получите сообщение "переменная b не имеет значения". С фактами не совсем так. Если Вы напишете fact QUQU,a,b.. - а перемнная b не определена в этом файле-коэффициенте - не ВСЕГДА Вы получите сообщение о несуществовании переменной b. Это надо контролировать глазками и ручками.

В предыдущих версиях сервера этой проблемы не возникало.

Не факт. Просто раньше везло? Или запуск ТОЧНО этой же базы на другом сервере НЕ приводит к этой ошибке?


Если мне удалось докопаться до истины по одной строке - спасибо за внимание.
А если нет - пришлите мне, Валерий, чуть больше данных - и я их посмотрю, а потм мы к этой теме вернемся на wwwboard - с Вашего позволения.
Ваш
ААА




Пpишедшие ответы: