powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проверка указанного значения поля
22 сообщений из 22, страница 1 из 1
проверка указанного значения поля
    #34822495
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Следующая задача:
Документ должен находится в одном из состояний («согласование», «бронирование» и т.д.)
Переходы между состояниями не линейные, т.е. строгой последовательности перехода межу состояниями нет. Следующее состояние зависит от значений самого документа.
(Например, если сумма больше 10 тыс.)
Необходимо при несоответствие условий запрещать переход. Возможно автоматически переходить в следующее состояние. Динамический SQL отсутствует. Какие возможны решения?

Что получилось у меня:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
--Примерная (упрощенная)схема БД:
--документ:
CREATE TABLE doc (
       id_doc       INTEGER NOT NULL ,                         --ключ
       id_state             INTEGER NOT NULL,                 --ссылка на состояние
       sum                  decimal( 8 , 2 ),                                    --общая сумма документа
       F1                 char( 3 ),                                                --поля 1
       F2                 INTEGER                                            -- поле 2 
)
--позиции
CREATE TABLE doc_det (
       Id_doc_det INTEGER NOT NULL,                          --ключ
       id_doc       INTEGER NOT NULL,                          --ссылка на шапку документа
       nama_det       CHAR( 20 ),			      --наименование позиции	
       id_state             INTEGER NOT NULL,                 --ссылка на состояние
       sum                  decimal( 8 , 2 )                                    --сумма позиции
       F1                 char( 3 ),                                                --поля 1
       F2                 INTEGER                                            -- поле 2 
)
-- таблица с состояниями
CREATE TABLE state (
       id_state             INTEGER NOT NULL,
       code                 char( 3 ) NOT NULL
)
--Например, 3 состояния
insert into state (id_state, code)
 values (  1 ,’A’);
insert into state (id_state, code)
 values (  2 ,’B’);
insert into state (id_state, code)
 values (  3 ,’C’);

--и таблица с возможные переходами состояний:
CREATE TABLE possible_change (
       id_possible_change   INTEGER NOT NULL, --ключ
       id_state             integer NOT NULL,        --текущие состояние  
       id_new_state         integer NOT NULL,    --возможное состояние
       auto  Boolean      NOT NULL                   --признак «автоматического»    перехода
);
--Например, такие переходы:
insert into possible_change(id_possible_change, id_state, id_new_state)
 values ( 1 ,  1 ,  2 );
insert into possible_change(id_possible_change, id_state, id_new_state)
 values ( 1 ,  1 ,  3 )
--теперь сами условия перехода
CREATE TABLE switch_cond (
       id_switch_cond       integer NOT NULL,  --ключ
       id_possible_change   INTEGER, --ссылка на переход
       name_table          char( 20 ),                --имя таблицы (реально регистрация сложнее)
       name_field          char( 20 ),                --имя поля
       operation         char( 5 ),		      --операция, например «>»,«<»,«=»
       value                char( 250 ) NOT NULL, --значение
);

--Из-за отсутствия динамического SQL’я вижу пока только одно решение в «лоб»
--Создаю таблицу для хранения «попаданий» условий примерно такую:

CREATE TABLE change_state
       id_doc       INTEGER NOT NULL ,                         --ссылка на документ
       id_switch_cond   INTEGER NOT NULL                --ссылка на переход
)
Таблицу заполняю в процедурах вставки и обновления,примерно следующим образом:
Процедура «знает» с какой таблицей работает. Делаю разбор по полям, если нахожу поле, указанное в условиях проверки - сверяю его с указанным значением. (операции обрабатываются простым IF’ом). Если есть - добавляю/обновляю, нет –удаляю.
В конце процедуры проверяю количество «паданий».
Понимаю, что коряво, как сделать по-другому (или улучшить) не знаю.
Может, кто что предложит?
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34822785
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Динамический SQL отсутствует. Какие возможны решения?
Кто мешает использовать статический? Чем вызвано острое желание проверять именно в динамике?

Gold_ name_table char(20), --имя таблицы (реально регистрация сложнее)
name_field char(20), --имя поля
operation char(5), --операция, например «>»,«<»,«=»
value char(250) NOT NULL, --значение
Угу. (Грустно) Навскидку:

1. Кто скажет, это условие на "хотя бы одна позиция документа" или на "все позиции документа"?
2. Как в пять символов впишется is not null?
3. Какой результат программа выдаст для 250.0 = 250,0?
....
128. Как записать сюда "есть хотя бы одна позиция, по которой есть резерв"?
....

Gold_Понимаю, что коряво, как сделать по-другому (или улучшить) не знаю.
Может, кто что предложит?
Делать "динамические вещи без динамики" некоряво невозможно. Лучший выход - таки избавиться от динамики. Например, заменить ее кодогенерацией.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34822935
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer Например, заменить ее кодогенерацией.
Где можно почитать что это такое в контесте хранимых процедур?
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34822941
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В контексте чего угодно. Пишите программу, которая в некоторый момент времени "заранее" (типичные варианты - при настройке системы; при изменении таблицы настроек) пересоздает хранимые процедуры в соответствии с этими настройками.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34823634
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да,без динамического скл тяжело.у нас в качестве условия для проверки необходимости перехода используются функции, написанные в определенном формате. На вход кушают набор параметров (мы их вытягиваем по вертикали и помещаем в специальную временную таблицу - это помогает, если однозначно можно провести идентификацию по нескольким полям), однозначно идентифицирующих сущность для проверки. Возвращаю 0 или 1 соответственно.Соответственно в таблице находится имя функции.СУБД - Oracle.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34824000
Shtockда,без динамического скл тяжело.у нас в качестве условия для проверки необходимости перехода используются функции, написанные в определенном формате. На вход кушают набор параметров (мы их вытягиваем по вертикали и помещаем в специальную временную таблицу - это помогает, если однозначно можно провести идентификацию по нескольким полям), однозначно идентифицирующих сущность для проверки. Возвращаю 0 или 1 соответственно.Соответственно в таблице находится имя функции.СУБД - Oracle.
Чего-то совсем запутался я в Вашей постановке...
То Вы говорите, что динамического SQL нет, то говорите, что СУБД - Оракл...
В Оракле PL/SQL есть замечательная команда Execute Immediate, которая позволяет вам выполнить динамически созданную строку запроса.

У меня студент техникума за 2 месяца (летняя практика) на FoxPro написал две функции реализующие:
- простейший разбор SQL-выражения на составные части и сохранение их в БД (SQL запрос "парсился" на: наименования полей, использованные таблицы (правда, вложенные запросы не подвергались разбору), условия в Where и др.).
- сборка SQL-выражения из сохраненных в БД условий.
У Вас аналогичная работа должна получиться намного быстрее...
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34824993
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Чего-то совсем запутался я в Вашей постановке...
То Вы говорите, что динамического SQL нет, то говорите, что СУБД - Оракл..."

Я вообще ничего не говорю. Автор топика не я,а я просто опытом своим делюсь.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34825162
bill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, что изменение состояние - это изменение поля id_state? Тогда почему бы не повесить триггер на update этой таблицы. Триггер вызывает хранимую процедуру, а в нее логику можно любую запрограммировать.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34826244
Shtock"Чего-то совсем запутался я в Вашей постановке...
То Вы говорите, что динамического SQL нет, то говорите, что СУБД - Оракл..."

Я вообще ничего не говорю. Автор топика не я,а я просто опытом своим делюсь.
Прошу прощения, "слона-то (т.е. то, что топики писали разные люди) я и не заметил..."
Извините, если сможете... :(
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34826676
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийУ меня студент техникума за 2 месяца (летняя практика) на FoxPro написал две функции реализующие:
- простейший разбор SQL-выражения на составные части и сохранение их в БД
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34829129
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerВ контексте чего угодно. Пишите программу, которая в некоторый момент времени "заранее" (типичные варианты - при настройке системы; при изменении таблицы настроек) пересоздает хранимые процедуры в соответствии с этими настройками.

я так понимаю что в приложении будет динамический скл )

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

В какое следующее состояние перводит это и надо мне выяснить

Программист-Любитель


Любопытно. Как использовать в указанном случае еще не понял. Но где такое мне поюобное понадобится знаю. Спасибо.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34829170
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_я так понимаю что в приложении будет динамический скл )
"В приложении" (в клиенте) такого понятия нет. Можно сказать, что там любой sql - динамический. Важно может быть отсутствие динамического sql при собственно операции перехода между состояниями - и это вполне достигается.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34830066
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerВажно может быть отсутствие динамического sql при собственно операции перехода между состояниями - и это вполне достигается.
Не понял. Можно другими словами?
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34830188
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_ Программист-ЛюбительЛюбопытно. Как использовать в указанном случае еще не понял. Но где такое мне поюобное понадобится знаю. Спасибо.
На диаграмме, которая отвечает за хранение синтаксических деревьев выражений WHERE, проверочные отчеты и их запуск у меня вышло 16 таблиц. Не считая описания источников данных, полей, форм для вывода и др., связанного с этой задачей, но выделенное в отдельные схемы.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34831584
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Программист-Любитель: схемкой на shtock@mail.ru поделитесь?
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34831625
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как ее послать ? Сфотографировать из EM не получиться - большая, на 1 экран не влезает.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34831983
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распечатал А3 и переслал то, что получил по почте от принтера после пересканирования. Если опять распечатать А3 будет читабельно.

(Перечитал сам - бред какой-то)
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34832000
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист-ЛюбительРаспечатал А3 и переслал то, что получил по почте от принтера после пересканирования. Если опять распечатать А3 будет читабельно.
Есть такая штука как PDFCreator ;)
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34832096
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ссылку. Поставил. Вывел в ПДФ и отправил.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34832185
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавно.Как я смотрю еще и с контролем доступа.
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34832241
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программист-ЛюбительСпасибо за ссылку. Поставил. Вывел в ПДФ и отправил.

Можно и мне прислать gold@atrus.ru
...
Рейтинг: 0 / 0
проверка указанного значения поля
    #34832467
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас тороплюсь, завтра могу приклеить в данную ветку снимки форм, реализующих работу с условияим и проверками.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проверка указанного значения поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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