Регистрация  |  Вход

Калькуляция данных по таблице

Всем привет,

вот такая задача, и не скажу чтоб сильно уж необычная.

одна из наших задач - это помогать клиентам перевести электронную текстовую и некоторую Excel документацию в более удобные CRUD приложения. Думаю, все понятно, и вы тоже с этим работаете.

например, люди подают заявки на что-то, там присутствует текстовая часть в виде вопрос-ответов, но есть и таблицы с калькуляцией, иногда простой, иногда сложной. сложную калькуляцию можно разбить на каскад более простых таблиц с более простой калькуляцией, но тем не менее калькуляцию нужно как-то организовать

причем калькулируемые данные - это не поля в пределах одного или нескольких объектов (привет, формулы), каждая ячейка таблицы - это отдельная запись специального объекта, и все эти записи путем сложного конфигурирования рендерятся в виде таблицы. Один раз тебе нужно одна таблица - конфигурируешь ее одним способом, затем другая- конфигурируешь ее другим способом. (не спрашивайте, как потом эти данные переносить на более "плоский" целевой объект для дальнейшего использования в том числе средствами стандартных репортов, это совсем другая история). Формульные поля в таблице задаются Excel-подобными формульными настройками, как А2+А3+А4

ну, так вот, все это работает на клиенте. Таблице рендерится в браузере, затем в работу пускается специальная JS либа (оказывается, есть и такие), которая выполняет калькуляцию по таблице в реал-тайме. Вычисленные на клиенте значения в калькулируемых полях пре-спокойно сохраняются в БД вместе с сохранением других полей. Удобно, модно, современно.

А как бы вы выполнили такую задачу? На стороне сервера (более надежно, но не вполне реал-тайм) или бы не парились и доверились JS?

Всем привет,

вот такая задача, и не скажу чтоб сильно уж необычная.

одна из наших задач - это помогать клиентам перевести электронную текстовую и некоторую Excel документацию в более удобные CRUD приложения. Думаю, все понятно, и вы тоже с этим работаете.

например, люди подают заявки на что-то, там присутствует текстовая часть в виде вопрос-ответов, но есть и таблицы с калькуляцией, иногда простой, иногда сложной. сложную калькуляцию можно разбить на каскад более простых таблиц с более простой калькуляцией, но тем не менее калькуляцию нужно как-то организовать

причем калькулируемые данные - это не поля в пределах одного или нескольких объектов (привет, формулы), каждая ячейка таблицы - это отдельная запись специального объекта, и все эти записи путем сложного конфигурирования рендерятся в виде таблицы. Один раз тебе нужно одна таблица - конфигурируешь ее одним способом, затем другая- конфигурируешь ее другим способом. (не спрашивайте, как потом эти данные переносить на более "плоский" целевой объект для дальнейшего использования в том числе средствами стандартных репортов, это совсем другая история). Формульные поля в  таблице задаются Excel-подобными формульными настройками, как А2+А3+А4 

ну, так вот,  все это работает на клиенте. Таблице рендерится в браузере, затем в работу пускается специальная JS либа (оказывается, есть и такие), которая выполняет калькуляцию по таблице в реал-тайме. Вычисленные на клиенте значения в калькулируемых полях пре-спокойно сохраняются в БД вместе с сохранением других полей. Удобно, модно, современно.

А как бы вы выполнили такую задачу? На стороне сервера (более надежно, но не вполне реал-тайм) или бы не парились и доверились JS?




Однозначно JS. После него работать с вышеописанными сильно кастомизируемыми задачами через апекс вызывает боль - то что в JS хендлится парой-тройкой строк, в апексе вполне может потребовать простыню кода. Еще не забыть про лимиты, которые через JS проще обойти.
Хотя, конечно, окончательное решение можно дать только узнав полные условия задачи.

Однозначно JS. После него работать с вышеописанными сильно кастомизируемыми задачами через апекс вызывает боль - то что в JS хендлится парой-тройкой строк, в апексе вполне может потребовать простыню кода. Еще не забыть про лимиты, которые через JS проще обойти.
Хотя, конечно, окончательное решение можно дать только узнав полные условия задачи.

Что-то совсем расплывчатый вопрос. Поэтому сложно дать конкретный ответ.

Скажу так. Калькуляция на стороне клиента в JS тоже должна учитывать некоторые правила.
- никакой калькуляции если результат будет сохраняться в базу! ЭТО ОГРОМНАЯ ДЫРА в безопасности. 100 раз надо убедиться что никто из пользователей не захочет (потому что сможет в любом случае) изменить результаты калькуляции в запросе от фронта на бэкенд.
- не надо вытягивать половину базы данных на фронт чтобы просчитать пару чисел и показать пользователю. Хотите получить тонну камней в свой огород от разгневанных пользователей у которых старый пенек с хромом ушел в затуп на полчаса. Для всяких сложных калькуляций существуют высокооптимизированные базы данных которые крутятся на высовопроизводительных серверах. Не стоит думать что браузер на слабеньком компе или даже на мобилке будет мощнее.

Если действительно хочется организовать сложные расчеты с сохранением данных в базу НО SF почему-то это не позволяет делать - вынесите эту логику во внешний сервис с простым REST API. Получили от пользователя данные в SF, отправили запрос на внешний сервис, он там произвел кучу расчетов хоть на квантовом процессоре с использованием ИИ и вернул результат через пару секунд. Вы успешно распихали все по полям в нужных объектах. Профит.

JS на фронтенде используется исключительно чтобы:
- оживить интерфейс,
- организовать предварительную валидацию (!именно предварительную потому что основная в бэкенда ОБЯЗАТЕЛЬНА),
- организовать скрытое (без перезагрузки) взаимодействие с бэкендом.
ВСЕ!!!

Если следовать этим правилам то
- фронтенд будет быстрым, красивым и интерактивным
- бэкенд будет безопасным и стабильным.

Что-то совсем расплывчатый вопрос. Поэтому сложно дать конкретный ответ.

Скажу так. Калькуляция на стороне клиента в JS тоже должна учитывать некоторые правила.
- никакой калькуляции если результат будет сохраняться в базу! ЭТО ОГРОМНАЯ ДЫРА в безопасности. 100 раз надо убедиться что никто из пользователей не захочет (потому что сможет в любом случае) изменить результаты калькуляции в запросе от фронта на бэкенд. 
- не надо вытягивать половину базы данных на фронт чтобы просчитать пару чисел и показать пользователю. Хотите получить тонну камней в свой огород от разгневанных пользователей у которых старый пенек с хромом ушел в затуп на полчаса. Для всяких сложных калькуляций существуют высокооптимизированные базы данных которые крутятся на высовопроизводительных серверах. Не стоит думать что браузер на слабеньком компе или даже на мобилке будет мощнее. 

Если действительно хочется организовать сложные расчеты с сохранением данных в базу НО SF почему-то это не позволяет делать - вынесите эту логику во внешний сервис с простым REST API. Получили от пользователя данные в SF, отправили запрос на внешний сервис, он там произвел кучу расчетов хоть на квантовом процессоре с использованием ИИ и вернул результат через пару секунд. Вы успешно распихали все по полям в нужных объектах. Профит.

JS на фронтенде используется исключительно чтобы: 
- оживить интерфейс, 
- организовать предварительную валидацию (!именно предварительную потому что основная в бэкенда ОБЯЗАТЕЛЬНА), 
- организовать скрытое (без перезагрузки) взаимодействие с бэкендом.
ВСЕ!!!

Если следовать этим правилам то
- фронтенд будет быстрым, красивым и интерактивным
- бэкенд будет безопасным и стабильным.

Dmitry Shnyrev
- никакой калькуляции если результат будет сохраняться в базу! ЭТО ОГРОМНАЯ ДЫРА в безопасности. 100 раз надо убедиться что никто из пользователей не захочет (потому что сможет в любом случае) изменить результаты калькуляции в запросе от фронта на бэкенд.

А что делать если клиент хочет чтобы значение пересчитывались на странице при изменении значения в инпуте?
Сохранять на сервер, а потом показывать обновленные данные с базы - медленно...

[quote="Dmitry Shnyrev"]
- никакой калькуляции если результат будет сохраняться в базу! ЭТО ОГРОМНАЯ ДЫРА в безопасности. 100 раз надо убедиться что никто из пользователей не захочет (потому что сможет в любом случае) изменить результаты калькуляции в запросе от фронта на бэкенд. 
[/quote]

А что делать если клиент хочет чтобы значение пересчитывались на странице при изменении значения в инпуте?
Сохранять на сервер, а потом показывать обновленные данные с базы - медленно...

camamber
А что делать если клиент хочет чтобы значение пересчитывались на странице при изменении значения в инпуте?

Предупредить клиента о возможной проблеме в безопасности, тем самым снимая с себя ответственность
Слово клиента закон! Хочет, платит - значит делать.
Я к тому говорю чтобы вы сами не проектировали подобные дырявые системы.

Я сам уже не раз встречал проекты где очень много всего считается на фронте. Но на это можно закрыть глаза потому что эти страницы исключительно для внутреннего использования персоналом компаний и клиент отлично понимает что запросы можно модифицировать на лету.

Просто вот небольшая тестовая задачка для размышления.

Пользователю (какому-то клиенту компании) предлагается на красивой интерактивной странице собрать скажем тур для путешествия. В зависимости от кучи выбранных параметров на многошаговом визарде итоговая цена должна пересчитываться. На последнем шаге пользователь видит цену и сабмитит результат. Та итоговая цена которую он увидел в результате своих манипуляций должна сохраниться в базу. Как бы вы это сделали?

[quote="camamber"]А что делать если клиент хочет чтобы значение пересчитывались на странице при изменении значения в инпуте? [/quote]
Предупредить клиента о возможной проблеме в безопасности, тем самым снимая с себя ответственность :D
Слово клиента закон! Хочет, платит - значит делать. :D
Я к тому говорю чтобы вы сами не проектировали подобные дырявые системы. 

Я сам уже не раз встречал проекты где очень много всего считается на фронте. Но на это можно закрыть глаза потому что эти страницы исключительно для внутреннего использования персоналом компаний и клиент отлично понимает что запросы можно модифицировать на лету. 

Просто вот небольшая тестовая задачка для размышления.

Пользователю (какому-то клиенту компании) предлагается на красивой интерактивной странице собрать скажем тур для путешествия. В зависимости от кучи выбранных параметров на многошаговом визарде итоговая цена должна пересчитываться. На последнем шаге пользователь видит цену и сабмитит результат. Та итоговая цена которую он увидел в результате своих манипуляций должна сохраниться в базу. Как бы вы это сделали?

на форуме ни один вопрос не может считаться полностью отвеченным, пока на него не ответит Дмитрий

Dmitry Shnyrev
Просто вот небольшая тестовая задачка для размышления.

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

но тем не менее, с проверкой на стороне сервера нужно тоже что-то решать.

кто-то встречал апекс или JAVA класс, который выполняет Excel-подобную калькуляцию по массиву?

на форуме ни один вопрос не может считаться полностью отвеченным, пока на него не ответит Дмитрий :)

[quote="Dmitry Shnyrev"]Просто вот небольшая тестовая задачка для размышления.[/quote]

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

но тем не менее, с проверкой на стороне сервера нужно тоже что-то решать.

кто-то встречал апекс или JAVA класс, который выполняет Excel-подобную калькуляцию по массиву?