powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / stored function + editable View + VBA
11 сообщений из 11, страница 1 из 1
stored function + editable View + VBA
    #39976237
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Возник один вопрос по использованию stored function в связке с view:
Есть небольшая таблица счетов , где пользователь производит их занесение. (номер счета, дата, сумма_счета, сумма_списания)
И есть (только что написал ) небольшая тестовая функция на mySql которая считает остаток сумма_счета-сумма_списания.
Проблема заключается в том, что при редактировании данных во вьюхе, к примеру сумма счета идет обращение к этой функции ,а она в свою очередь также обращается к исходной таблице, что и вьюха. И получается зацикленное обращение.
И на клиенте получается всегда небольшой конфликт типа "пока вы правили эту запись другой пользователь изменил ее".
Функция простая:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION funGetOstatok(schet_id INT)
RETURNS DOUBLE
BEGIN
DECLARE summa_ostatok double;
set summa_ostatok=(SELECT ostatok FROM q_ostatki_scheta WHERE kodOplati=schet_id);
RETURN IFNULL(summa_ostatok,0) ;
END



Есть на мускуле что то типа SET NOCOUNT , или команды какой, которая разруливает наложение обращений к одному и тому же ресурсу и из функции и самой вьюхи? Потому что хочется создать полноценную редактируемую вьюху с расчетным полем , которое считает остаток?
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976248
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов,

Покажите полный комплект объектов, кто к чему обращается?

А вообще, использование редактируемых вьюх, на мой взгляд, плохая идея. У них масса ограничений, см. https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976260
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Да,согласен, лучше разделять ввод и отчеты , но очень хочется сконструировать что нибудь совместное)

Вот тестовые объекты :
1) Таблица t_sales источник где ведется информация по заведению счетов:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE t_sales (
  sale_id int NOT NULL AUTO_INCREMENT,
  sale_number varchar(255) NOT NULL DEFAULT '',
  sale_date date DEFAULT NULL,
  sale_prihod double DEFAULT 0,
  sale_spisano double DEFAULT 0,
  dogovor_id int DEFAULT NULL,
  PRIMARY KEY (sale_id)
)



2) Отдельная вьюха v_test_ostatok ,которая считает остаток по разнице sale_prihod- sale_spisano нарастающим итогом по дате и ключу, выводит
просто ключ и сам остаток:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  `a`.`sale_id` AS `sale_id`,
  (SUM(IFNULL((`b`.`sale_prihod` - `b`.`sale_spisano`), 0)) + MAX((`a`.`sale_prihod` - `a`.`sale_spisano`))) AS `ostatok`
FROM (`t_sales` `a`
  LEFT JOIN `t_sales` `b`
    ON (((`b`.`sale_id` < `a`.`sale_id`)
    AND (`b`.`sale_date` <= `a`.`sale_date`)
    AND (`b`.`dogovor_id` = `a`.`dogovor_id`))))
GROUP BY `a`.`sale_id`,
         `a`.`sale_date`



3) Функция funGetOstatok , которая выдергивает остаток из вьюхи v_test_ostatok
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION funGetOstatok(schet_id INT)
  RETURNS DOUBLE
BEGIN
DECLARE summa_ostatok double;
set summa_ostatok=(SELECT ostatok FROM v_test_ostatok WHERE sale_id=schet_id);
RETURN IFNULL(summa_ostatok,0) ;
END



4) Ну и наконец результирующая VIEW view_total которая выводится на клиент (выводится , но периодически лочится , как указывал в начале топика. Содержит обращение и к таблице и функцию)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
  `t_sales`.`sale_id` AS `sale_id`,
  `t_sales`.`sale_number` AS `sale_number`,
  `t_sales`.`sale_date` AS `sale_date`,
  `t_sales`.`sale_prihod` AS `sale_prihod`,
  `t_sales`.`sale_spisano` AS `sale_spisano`,
  `t_sales`.`dogovor_id` AS `dogovor_id`,
  `funGetOstatok`(`t_sales`.`sale_id`) AS `ostatok_obshiy`
FROM `t_sales`
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976263
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаю, что можно все сократить до одной вьюхи, и без функции и без промежуточной вью с расчетом остатка, но ээфект такой же, идет наложение обращений к одной и той же таблице. Может свойства какие нибудь есть, типа partitial counting или что нить еще подобное..
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976278
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перерасчёт остатка (и в принципе его хранение) вообще одна большая ошибка. RTFM "Переопределённые данные".
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976282
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Да, если посмотреть перерасчёт остатков, то два лагеря, кто то апдейтит физические одноимённый поля в таблицах, кто то вычисляет в полях запроса и выводит расчётные значения. И в какой то момент становишься перед выбором, либо обновлять 100 тысяч строк, либо вычислять на лету эти поля в 100 тысяч строках. Одинаково хреново в обеих лагерях))
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976312
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
RTFM "Переопределённые данные".


А что в данном контексте мне нужно пересоздавать, функцию или View?
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976414
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
что в данном контексте мне нужно пересоздавать, функцию или View?

Вопрос века - а что тебе из этого РЕАЛЬНО нужно? v_test_ostatok и funGetOstatok для ЭТОЙ задачи не нужны, так что если нет ещё задачи, в которой они необходимы - то от них следует избавиться. Вообще.
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976422
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, да по сути кроме таблицы ничего и не нужно. Я писал выше ,что нужна editable view на стороне клиента.
Так то на MySql я могу все сделать все в одной вью естественно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
  `a`.`sale_id` AS `sale_id`,
  `a`.`sale_number` AS `sale_number`,
  `a`.`sale_date` AS `sala_date`,
  `a`.`sale_prihod` AS `sale_prihod`,
  `a`.`sale_spisano` AS `sale_spisano`,
  IFNULL((`a`.`sale_prihod` - `a`.`sale_spisano`), 0) AS `raznica`,
  (SUM(IFNULL((`b`.`sale_prihod` - `b`.`sale_spisano`), 0)) + MAX((`a`.`sale_prihod` - `a`.`sale_spisano`))) AS `ostatok`
FROM (`t_sales` `a`
  LEFT JOIN `t_sales` `b`
    ON (((`b`.`sale_id` < `a`.`sale_id`)
    AND (`b`.`sale_date` <= `a`.`sale_date`)
    AND (`b`.`dogovor_id` = `a`.`dogovor_id`))))
GROUP BY `a`.`sale_id`,
         `a`.`sale_date`



и вся разница + остатки вычисляется нормально, только она естественно необновляемая на стороне клиента)
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976425
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
RTFM "Переопределённые данные".


Я вот по этому пункту немного не понимаю, вы имеете в виду дропать и пересоздавать объекты на какое то событие?
К примеру при обращении к View сначала дропаем старое представление и создаем новое (на стороне сервера MySql)? Вы это имеете в виду?

Давайте представим, что у меня в MS Access прилинкована View как таблица , в которой хочется перерасчитывать остаток при изменении значений заполняемой строки/строк.
...
Рейтинг: 0 / 0
stored function + editable View + VBA
    #39976663
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я победил на стороне клиента данную проблему.
Теперь можно обновлять необновляемое))
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / stored function + editable View + VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]