Подстановка текста в формулах расчета лабораторных результатов
В форме "Конструктор бланков" достаточно давно существует возможность автоматического вычисления вторичных лабораторных показателей. Для начала, напомним, как это делается.
Как было?
Например, значение непрямого билирубина вычисляется, исходя из значений билирубина общего и прямого. Достаточно в поле "Формула для расчета" прописать формулу, и она автоматически сработает после нажатия кнопки "Автокомментарий" при наборе реального результата.
При написании формулы, ссылки на показатели, участвующие в вычислениях, прописываются как номер показателя (поле "№"), заключенный в квадратные скобки.
Щелкните по картинке, чтобы увеличить
Использовать в вычислениях можно привычные математические символы ("+", "-", "/", "*"). Для возведения в степень используйте символ "^" (например, "[23]^3" означает показетель с номером "23", возведенный в третью степень). Для вычисления натурального логарифма используется команда "log".
Иногда нужно использовать функцию округления числового значения до определенного количества знаков после запятой. Для этого в поле "Формула для расчета" можно использовать функцию "round()" так, как это указано ниже (просто напишите в поле такой текст).
round([5], 2)
Эта формула расшифровывается так: "Взять значение результата для пятого показателя, округлить его до двух знаков после запятой, и подставить вместо предыдущего результата".
При расчетах можно также использовать и логические условия. Например, анализатор передает в программу концентрацию гемоглобина в г/дл, а мы хотим преобразовать это значение в г/л. Для начала можно просто написать формулу "[5]*10", где [5] - это текущее значение гемоглобина (гемоглобин - это показатель с номером "5" в бланке). То есть, после нажания на кнопку "Автокомментарий", число, находящееся в поле результата для гемоглобина, будет автоматически умножено на десять, и заменит оригинальный результат.
Вроде бы, все правильно... Но что произойдет, если пользователь еще раз нажмет на кнопку "Автокомментарий"? (Не спрашивайте "Зачем?", просто примите к сведению, что каждый третий пользователь так делает). Так что произойдет? Значение гемоглобина опять умножится на десять... Каждое нажатие кнопки будет приводить к срабатыванию формулы.
Для того, чтобы избежать этого, можно ввести в формулу логическое условие. Например, такое: "Если концентрация гемоглобина меньше 20, то нужно умножить это значение на 10, а если больше или равно 20, то оставляем такое же значение, как и было". Логика тут такая, что концентрация гемоглобина в г/дл, которое передает анализатор, вряд ли будет больше 20 г/дл (напрмер, 13.5 г/дл). Значит, в первый раз, это число можно умножать на 10 (получится 135 г/л). Итоговый результат будет явно больше 20, поэтому при всех последующих нажатиях на кнопку "Автокомментарий" умножения на 10 происходить не будет.
Как правильно написать такую формулу в поле "Формула для расчета"? Прямо в поле пишете такой текст:
iif([5] < 20, [5]*10, [5])
Сначала используется функция, оценивающая поставленное условие. Это функция "iif()" (да, именно так, с двумя "ii").
Первый аргумент функции (выделено красным) - это собственно условие. В данном примере мы сравниваем, меньше ли показатель с номером "5" числа "20"?
Далее через запятую указывается второй аргумент функции (выделено синим): что нужно делать, если уловие выполняется (и значение гемоглобина меньше двадцати). Нужно результат для пятого показателя умножить на десять.
Наконец, после второй запятой указывают третий аргумент функции (выделено зеленым): что нужно сделать, если условие не выполняется (то есть, если концентрация гемоглобина больше или равна двадцати). Нужно просто оставить результат, как он есть, никак его не изменяя.
Условия можно "вкладывать" друг в друга. Например, в нашей формуле можно было бы написать так:
iif([5]<20, [5]*10, iif([5]<50, [5]*100, [5]) )
То есть, если значение пятого показателя больше или равно "20", то программа переходит к проверке дополнительного условия (выделено синим цветом). Если значение меньше "50", то его умножают на "100", а если больше или равно "50", то оставляют неизменным. (Конечно, это уже не относится к расчету гемоглобина... Просто мы привели этот пример, как наиболее наглядный).
Что добавилось?
До сих пор мы включали в формулу только числа и операции с ними. В текущей версии появилась возможность модифицировать результат, добавляя к нему какой-либо сопроводительный текст.
Например, нам нужно написать формулу, которая оценивает значение пятого показателя, и если он больше "2.5", то нужно добавить к нему в скобках текст "положительный", а иначе - добавить в скобках текст "отрицательный". Обратите внимание, что текст добавляется к значению именно в поле "Результат", а не в колонке "Комментарий". Такая формула будет выглядеть так:
iif([5]>2.5, [5] & ' (положительный)', [5] & ' (отрицательный)')
Давайте разберем эту формулу по косточкам.
Итак, первый аргумент - это условие. Программа проверит, является ли значение для пятого показателя больше, чем "2,5". Заметим, что в формуле для дробных числел для разделения целой и дробной частей используется точка, а не запятая. Потому что запятая - это служебный символ, который используется для разделения аргументов между собой.
Второй аргумент (выделено красным) - это что будет делать программа с результатом, если условие было выполнено. Программа возмет результат, и добавит к нему текст " (положительный)". Для "склеивания" двух фрагментов текста (результата и слова "положительный") используется символ "&". Также обратите внимание, что текст, который мы добавляем к результату, должен быть заключен в одинарные кавычки. Все, что находится между одинарными кавычками, программа рассматривает, как цельный кусок текста. Это означает, что внутри такого куска можно писать какие угодно символы, включая запятые, точки, "+", "/" и т.д. Все это программа не будет обрабатывать, а подставит просто как фрагмент текста.
Третий аргумент (выделено синим) - это что будет делать программа, если результат меньше или равен "2,5". К результату будет добавлен текст " (отрицательный)". Правила написания - такие же, как описано для второго аргумента.
Не забывайте, что можно использовать множественные вложенные условия, арифметические преобразования и округление результата.
Что произойдет, если мы используем эту формулу, и после набора результата нажмем кнопку "Автокомментарий"? Если оригинальный результат был, например, "1.78", то вместо него в поле результата появится "1.78 (отрицательный)". Если бы результат был "3.45", то формула преобразовала бы его в "3.45 (положительный)".
А что произойдет, если пользователь после этого еще раз нажмет кнопку "Автокомментарий"? Ничего не случится. Так как результат "1.78 (отрицательный)" больше не является числом (ведь там есть и буквы), то сравнить фрагмент текста с числом "2.5" уже будет невозможно. Поэтому программа просто проигнорирует формулу и перейдет к обработке других показателей.
Напоследок приведем для примера формулу для обработки результата исследования сыворотки крови на наличие специфических антител IgG к определенному аллергену.
Требуется добавлять к полученному результату значение т.н. "класса", в зависимости от концентрации антител:
Результат < 0,35 KU/l
"Класс 0: специфические антитела отсутствуют"
Результат 0,35-0,69 KU/l
"Класс 1: очень низкий титр, часто без клинических проявлений аллергии"
Результат 0,70-3,49 KU/l
"Класс 2: низкий титр антител, часты клинические симптомы"
Результат 3,5-17,4 KU/l
"Класс 3: явно выраженный титр антител, клинические симптомы обычно присутствуют"
Результат 17,5-52,4 KU/l
"Класс 4: высокий титр антител, почти всегда с аллергической реакцией"
Результат 52,5-99,9 KU/l
"Класс 5: очень высокий титр антител"
Результат более 100,0 KU/l
"Класс 6: чрезвычайно высокий титр антител"
Тут как раз уместно испльзовать вложенные логические условия. Вот как выглядит такая формула для показателя с номером "10":
[10] & ' (' & iif([10]<0.35,'Клас 0 - специфічні антитіла відсутні', iif([10]<0.7, 'Клас 1 - дуже низький титр, часто без клінічних симптомів алергії', iif([10]<3.5, 'Клас 2 - низький титр антитіл, часті клінічні симптоми, якщо результат близький до граничного діапазону', iif([10]<17.5, 'Клас 3 - явно виражений титр антитіл, клінічні симптоми зазвичай присутні', iif([10]<52.5, 'Клас 4 - високий титр антитіл, майже завжди з алергічною реакцією', iif([10]<100, 'Клас 5 - дуже високий титр', 'Клас 6 - надзвичайно високий титр')))))) & ')
Пробуйте, и у вас получится!