Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подпрограммы в ХП / 23 сообщений из 23, страница 1 из 1
14.03.2017, 10:52
    #39418648
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
в хранимой процедуре есть часть кода, которая повторяется несколько раз,
каким образом можно убрать дублирование?
...
Рейтинг: 0 / 0
14.03.2017, 10:56
    #39418653
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
Вынести в другую ХП/функцию не предлагать?
...
Рейтинг: 0 / 0
14.03.2017, 10:59
    #39418656
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
_гость__,

в 2.5 вынести в другую ХП.
В 3.0 ещё можно подпрограмму в секции деклараций сделать. Или если оформить как PSQL пакет в приватную ХП/функцию.
...
Рейтинг: 0 / 0
14.03.2017, 11:00
    #39418658
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
выносить простой код в UDF не очень хотелось бы (сложнее поддерживать)
(там простые действия, только что длинный IF)
...
Рейтинг: 0 / 0
14.03.2017, 11:03
    #39418661
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
Симонов Денис,

спасибо, буду пробовать
...
Рейтинг: 0 / 0
14.03.2017, 11:08
    #39418668
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
_гость__выносить простой код в UDF не очень хотелось бы (сложнее поддерживать)
(там простые действия, только что длинный IF)
И откуда мысль такая появилась "выносить .... в UDF "
...
Рейтинг: 0 / 0
14.03.2017, 11:32
    #39418695
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
Чё я один такой балбес, почему-то о цикле подумал...
...
Рейтинг: 0 / 0
14.03.2017, 13:13
    #39418831
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
да нормально всё было, считалась статистика работы оборудования за день
теперь появилось доп условие, разделить на смены (при том что оборудование работает non-stop)

сделал условия, задания до пересменки (код), пересменка (код) и после пересменки(код)...
вот и утроился изначально нетривиальный алгоритм

Код: plsql
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.
            IF (position('21' in :composition_cb) > 0) THEN
              cb21 = cb21 + job_m2;
            ELSE
              IF (position('22' in :composition_cb) > 0) THEN
                cb22 = cb22 + job_m2;
              ELSE
                IF (position('23' in :composition_cb) > 0) THEN
                  cb23 = cb23 + job_m2;
                ELSE
                  IF (position('24' in :composition_cb) > 0) THEN
                    cb24 = cb24 + job_m2;
                  ELSE
                    IF (position('25' in :composition_cb) > 0) THEN
                      cb25 = cb25 + job_m2;
                    ELSE
                      IF (position('31' in :composition_cb) > 0) THEN
                        cb31 = cb31 + job_m2;
                      ELSE
                        IF (position('32' in :composition_cb) > 0) THEN
                          cb32 = cb32 + job_m2;
                        ELSE
                          IF (position('33' in :composition_cb) > 0) THEN
                            cb33 = cb33 + job_m2;
                          ELSE
                            IF (position('34' in :composition_cb) > 0) THEN
                              cb34 = cb34 + job_m2;
                            ELSE
                              IF (position('35' in :composition_cb) > 0) THEN
                                cb35 = cb35 + job_m2;

            job_m = job_m + job_m2 * composition_layer1_dencity / 1000;
            job_m = job_m + job_m2 * composition_layer3_dencity / 1000;
            IF (composition_layers > 3) THEN
             job_m = job_m + job_m2 * composition_layer5_dencity / 1000;

            IF (:composition_corr = 'B') THEN BEGIN
              corr_b = corr_b + job_m2;
              job_m = job_m + job_m2 * composition_layer2_dencity * kb / 1000;
            END
            ELSE
              IF (:composition_corr = 'E') THEN BEGIN
                corr_e = corr_e + job_m2;
                job_m = job_m + job_m2 * composition_layer2_dencity * ke / 1000;
              END
              ELSE
                IF (:composition_corr = 'BE') THEN BEGIN
                  corr_be = corr_be + job_m2;
                  job_m = job_m + job_m2 * composition_layer2_dencity * kb / 1000;
                  job_m = job_m + job_m2 * composition_layer4_dencity * ke / 1000;
                END
...
Рейтинг: 0 / 0
14.03.2017, 13:21
    #39418840
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
мрак.
почему не CASE ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.03.2017, 13:38
    #39418862
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
Мимопроходящий,

попробовал
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
            CASE
             WHEN (position('21' in :composition_cb) > 0) THEN
              cb21 = cb21 + job_m2
            ...

Token unknown
CASE

(сервер Firebird 2.5.5)
...
Рейтинг: 0 / 0
14.03.2017, 13:48
    #39418877
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
_гость__,

Полный текст нужен. Case без Select не работает вроде. Или не вроде.
...
Рейтинг: 0 / 0
14.03.2017, 13:49
    #39418881
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
_гость__,

потому что в Firebird CASE это выражение возвращающее значение, а не управляющий оператор.
З.Ы. Не вижу как можно применить CASE для упрощения в этом случае.
...
Рейтинг: 0 / 0
14.03.2017, 13:52
    #39418885
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
KreatorXXI,

работает, но не как управляющая конструкция.

Код: sql
1.
2.
3.
4.
5.
A = CASE 
  WHEM B=1 THEN 1 
  WHEM B=2 THEN 2 
  ELSE 0 
END;



вполне себе будет работать в PSQL
...
Рейтинг: 0 / 0
14.03.2017, 13:53
    #39418891
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
Симонов Денис, опечатался

* WHEN
...
Рейтинг: 0 / 0
14.03.2017, 14:00
    #39418903
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
Мимопроходящий воду CASE-ом замутил)
...
Рейтинг: 0 / 0
14.03.2017, 14:02
    #39418905
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
CASE в твоём случае нужен в SELECT-е
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.03.2017, 14:07
    #39418910
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
стоит ли выносить IF-ы в отдельные ХП или не заморачиваться?
...
Рейтинг: 0 / 0
14.03.2017, 14:19
    #39418929
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
А что, искомый код в :composition_cb может встречаться в любом месте?
Также не очень вижу повторяющийся код. Но если он есть, то да, лучше вынести в отдельную ХП, а в чем проблемы с этим?
...
Рейтинг: 0 / 0
15.03.2017, 03:48
    #39419408
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
_гость__сделал условия, задания до пересменки (код), пересменка (код) и после пересменки(код)...
вот и утроился изначально нетривиальный алгоритм

Я такого рода портьянки форматирую по другому, и они становятся достаточно прозрачно понимаемыми:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IF (position('21' in :composition_cb) > 0) THEN cb21 = cb21 + job_m2; ELSE
IF (position('22' in :composition_cb) > 0) THEN cb22 = cb22 + job_m2; ELSE
IF (position('23' in :composition_cb) > 0) THEN cb23 = cb23 + job_m2; ELSE
IF (position('24' in :composition_cb) > 0) THEN cb24 = cb24 + job_m2; ELSE
IF (position('25' in :composition_cb) > 0) THEN cb25 = cb25 + job_m2; ELSE
IF (position('31' in :composition_cb) > 0) THEN cb31 = cb31 + job_m2; ELSE
IF (position('32' in :composition_cb) > 0) THEN cb32 = cb32 + job_m2; ELSE
IF (position('33' in :composition_cb) > 0) THEN cb33 = cb33 + job_m2; ELSE
IF (position('34' in :composition_cb) > 0) THEN cb34 = cb34 + job_m2; ELSE
IF (position('35' in :composition_cb) > 0) THEN cb35 = cb35 + job_m2; 
...



И в таком виде их легко проверять и редактировать, изменяя один символ.
...
Рейтинг: 0 / 0
15.03.2017, 09:49
    #39419497
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
А не созрели для введения в язык оператора ELSIF? Ещё было бы удобнее читать.
...
Рейтинг: 0 / 0
15.03.2017, 09:53
    #39419503
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
А чем в данном случае ELSIF
помог бы, в сравнении с else if ?
На 1 символ короче текст станет?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2017, 09:54
    #39419506
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
KreatorXXI,

и чем он будет отличаться от ELSE IF, кроме лишнего пробела?
...
Рейтинг: 0 / 0
16.03.2017, 14:54
    #39420855
_гость__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подпрограммы в ХП
можно и так, число строк уменьшится.

ХП в данном случае, вообще не покатит, с такой кучей выходных параметров (код может и больше станет).

был опыт программирования на ABAP, так там ещё немного извратившись можно было к самим cb цеплять 21-35 (21-35 в массив, а дальше в зависимости от вхождения генерировать выходной параметр).
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подпрограммы в ХП / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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