Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проверка указанного значения поля / 22 сообщений из 22, страница 1 из 1
24.09.2007, 18:28
    #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
24.09.2007, 21:50
    #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
25.09.2007, 00:25
    #34822935
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка указанного значения поля
softwarer Например, заменить ее кодогенерацией.
Где можно почитать что это такое в контесте хранимых процедур?
...
Рейтинг: 0 / 0
25.09.2007, 00:30
    #34822941
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка указанного значения поля
В контексте чего угодно. Пишите программу, которая в некоторый момент времени "заранее" (типичные варианты - при настройке системы; при изменении таблицы настроек) пересоздает хранимые процедуры в соответствии с этими настройками.
...
Рейтинг: 0 / 0
25.09.2007, 11:20
    #34823634
Shtock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверка указанного значения поля
да,без динамического скл тяжело.у нас в качестве условия для проверки необходимости перехода используются функции, написанные в определенном формате. На вход кушают набор параметров (мы их вытягиваем по вертикали и помещаем в специальную временную таблицу - это помогает, если однозначно можно провести идентификацию по нескольким полям), однозначно идентифицирующих сущность для проверки. Возвращаю 0 или 1 соответственно.Соответственно в таблице находится имя функции.СУБД - Oracle.
...
Рейтинг: 0 / 0
25.09.2007, 12:37
    #34824000
проверка указанного значения поля
Shtockда,без динамического скл тяжело.у нас в качестве условия для проверки необходимости перехода используются функции, написанные в определенном формате. На вход кушают набор параметров (мы их вытягиваем по вертикали и помещаем в специальную временную таблицу - это помогает, если однозначно можно провести идентификацию по нескольким полям), однозначно идентифицирующих сущность для проверки. Возвращаю 0 или 1 соответственно.Соответственно в таблице находится имя функции.СУБД - Oracle.
Чего-то совсем запутался я в Вашей постановке...
То Вы говорите, что динамического SQL нет, то говорите, что СУБД - Оракл...
В Оракле PL/SQL есть замечательная команда Execute Immediate, которая позволяет вам выполнить динамически созданную строку запроса.

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

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

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

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

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

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

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


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

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

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


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