powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подпрограммы в ХП
23 сообщений из 23, страница 1 из 1
Подпрограммы в ХП
    #39418648
_гость__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в хранимой процедуре есть часть кода, которая повторяется несколько раз,
каким образом можно убрать дублирование?
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418653
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынести в другую ХП/функцию не предлагать?
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418656
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_гость__,

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

спасибо, буду пробовать
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418668
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_гость__выносить простой код в UDF не очень хотелось бы (сложнее поддерживать)
(там простые действия, только что длинный IF)
И откуда мысль такая появилась "выносить .... в UDF "
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418695
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чё я один такой балбес, почему-то о цикле подумал...
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #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
Подпрограммы в ХП
    #39418840
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мрак.
почему не CASE ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #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
Подпрограммы в ХП
    #39418877
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_гость__,

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

потому что в Firebird CASE это выражение возвращающее значение, а не управляющий оператор.
З.Ы. Не вижу как можно применить CASE для упрощения в этом случае.
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #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
Подпрограммы в ХП
    #39418891
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, опечатался

* WHEN
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418903
_гость__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий воду CASE-ом замутил)
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418905
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CASE в твоём случае нужен в SELECT-е
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418910
_гость__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стоит ли выносить IF-ы в отдельные ХП или не заморачиваться?
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39418929
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что, искомый код в :composition_cb может встречаться в любом месте?
Также не очень вижу повторяющийся код. Но если он есть, то да, лучше вынести в отдельную ХП, а в чем проблемы с этим?
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #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
Подпрограммы в ХП
    #39419497
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не созрели для введения в язык оператора ELSIF? Ещё было бы удобнее читать.
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39419503
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем в данном случае ELSIF
помог бы, в сравнении с else if ?
На 1 символ короче текст станет?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подпрограммы в ХП
    #39419506
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

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

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

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


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