powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка - слишком длинная процедура
58 сообщений из 58, показаны все 3 страниц
Ошибка - слишком длинная процедура
    #39538148
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[DCC Error] fmReportExecutionProfitU.pas(960): E2283 Too many local constants. Use shorter procedures
Там практически один оператор - присвоение текста SQL-запросу. Запрос длинный, с вложенными подзапросами.
Код: pascal
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
procedure TfmReportExecutionProfit.ChangeQueryCoopS;
begin
  ADQueryCoopS.SQL.Text :=
  'SELECT '#13#10 +
  'SUM(sum_fact_prr_1) AS s_sum_fact_prr_1, '#13#10 +
  'SUM(sum_fact_other_1) AS s_sum_fact_other_1, '#13#10 +
  'SUM(sum_fact_teo_1) AS s_sum_fact_teo_1, '#13#10 +
  'SUM(sum_fact_fares_1) AS s_sum_fact_fares_1, '#13#10 +
  'SUM(sum_fact_storage_1) AS s_sum_fact_storage_1, '#13#10 +
  'SUM(sum_fact_prr_1) + '#13#10 +
  'SUM(sum_fact_other_1) + '#13#10 +
  'SUM(sum_fact_teo_1) + '#13#10 +
  'SUM(sum_fact_fares_1) + '#13#10 +
  'SUM(sum_fact_storage_1) AS s_sum_fact_1, '#13#10 +

  'SUM(sum_fact_prr_2) AS s_sum_fact_prr_2, '#13#10 +
  'SUM(sum_fact_other_2) AS s_sum_fact_other_2, '#13#10 +
  'SUM(sum_fact_teo_2) AS s_sum_fact_teo_2, '#13#10 +
  'SUM(sum_fact_fares_2) AS s_sum_fact_fares_2, '#13#10 +
  'SUM(sum_fact_storage_2) AS s_sum_fact_storage_2, '#13#10 +
  'SUM(sum_fact_prr_2) + '#13#10 +
  'SUM(sum_fact_other_2) + '#13#10 +
  'SUM(sum_fact_teo_2) + '#13#10 +
  'SUM(sum_fact_fares_2) + '#13#10 +
  'SUM(sum_fact_storage_2) AS s_sum_fact_2, '#13#10 +

  'SUM(sum_fact_prr_4) AS s_sum_fact_prr_4, '#13#10 +
  'SUM(sum_fact_other_4) AS s_sum_fact_other_4, '#13#10 +
  'SUM(sum_fact_teo_4) AS s_sum_fact_teo_4, '#13#10 +
  'SUM(sum_fact_fares_4) AS s_sum_fact_fares_4, '#13#10 +
  'SUM(sum_fact_storage_4) AS s_sum_fact_storage_4, '#13#10 +
  'SUM(sum_fact_prr_4) + '#13#10 +
  'SUM(sum_fact_other_4) + '#13#10 +
  'SUM(sum_fact_teo_4) + '#13#10 +
  'SUM(sum_fact_fares_4) + '#13#10 +
  'SUM(sum_fact_storage_4) AS s_sum_fact_4, '#13#10 +

  'SUM(sum_fact_prr) AS s_sum_fact_prr, '#13#10 +
  'SUM(sum_fact_other) AS s_sum_fact_other, '#13#10 +
  'SUM(sum_fact_teo) AS s_sum_fact_teo, '#13#10 +
  'SUM(sum_fact_fares) AS s_sum_fact_fares, '#13#10 +
  'SUM(sum_fact_storage) AS s_sum_fact_storage, '#13#10 +
  'SUM(sum_fact_prr) + '#13#10 +
  'SUM(sum_fact_other) + '#13#10 +
  'SUM(sum_fact_teo) + '#13#10 +
  'SUM(sum_fact_fares) + '#13#10 +
  'SUM(sum_fact_storage) AS s_sum_fact '#13#10 +

  'FROM ';

  ADQueryCoopS.SQL.Add(
  '(SELECT '#13#10 +
  // 1 район

// подзапрос
  'ROUND('#13#10 +
  'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
  'FROM invoicing_working_norm iwn '#13#10 +
  'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10 +
  'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
  'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  '+ '#13#10 +
  'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
  'FROM invoicing_additional_service_editing e '#13#10 +
  'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
  'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE e.show_in_report = ''Y'' '#13#10 +
  'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  ', 2) AS sum_fact_prr_1, '#13#10 +

...
//таких подзапросов еще 18
...

  'FROM plan_cargo_processing pcp '#13#10 +
  'INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id '#13#10 +
  'INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id '#13#10 +
  'WHERE pcp.cooperated = ''Y'' '#13#10 +
  'AND pcp.year = :year '#13#10 +
  'AND pcp.month = :month ');

  ADQueryCoopS.ParamByName('year').AsInteger := FindYear;
  ADQueryCoopS.ParamByName('month').AsInteger := FindMonth;

  ADQueryCoopS.ParamByName('date_from').AsDateTime := EncodeDate(FindYear, FindMonth, 1);
  ADQueryCoopS.ParamByName('date_to').AsDateTime := EncodeDateTime(FindYear, FindMonth, DaysInAMonth(FindYear, FindMonth), 23, 59, 59, 0);

  ADQueryCoopS.SQL.Add('GROUP BY cg.id) iq');
  ADQueryCoopS.Open;
end;


Там около 18 длинных подзапросов, по количеству столбцов отчета. И выдает эту ошибку. Без разницы, делаешь все одним текстом
ADQueryCoopS.SQL.Text := '...'
или с помощью нескольких Add
ADQueryCoopS.SQL.Add(...);
Как обойти проблему. Более коротким запрос сделать не получается.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538161
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

Ты вылез за размеры 64К для процедуры. Разбей свой текст запроса на более мелкие куски или грузи из файла. Еще как вариант - перейти на х64 компилятор.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538163
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убери вот эти +#13#10. Ни тебе ни SQL компилятору они не помогают.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538179
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще бы накидать неиспользуемых датасетов на форму и там код хранить -- намного удобнее будет копипастить из-в делфи. А если нужна динамическая генерация, то вместо изменяемого кода поставить заглушку типа @MY_IF@ и туда уже через Replace вставлять куски.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538184
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovУбери вот эти +#13#10. Ни тебе ни SQL компилятору они не помогают.

При отладке запроса, когда сохраняешь его SQL.SaveToFile() и потом отдельно смотришь текст в менеджере запросов - это помогает, а иначе запрос получается в одну строку.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538186
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMastersvnvlad,

Ты вылез за размеры 64К для процедуры. Разбей свой текст запроса на более мелкие куски или грузи из файла. Еще как вариант - перейти на х64 компилятор.
Как понять, разбить на более мелкие куски?
Вот я разбил с помощью SQL.Add, в каждом по 10-20 строк, и в итоге та же самая ошибка.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538198
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladDarkMastersvnvlad,

Ты вылез за размеры 64К для процедуры. Разбей свой текст запроса на более мелкие куски или грузи из файла. Еще как вариант - перейти на х64 компилятор.
Как понять, разбить на более мелкие куски?
Вот я разбил с помощью SQL.Add, в каждом по 10-20 строк, и в итоге та же самая ошибка.
Разбей процедуру на части. Вместо одной процедуры - две или три. Еще лучше - четыре. Но не больше пяти.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538208
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

Вынеси эти константы из процедуры наружу.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538209
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажись, в jedi компонентах был контейнер текстов. Кидаешь на форму или датамодуль, создаешь именованные айтемы, в айтемы во встроенном редакторе пишешь любой текст текст.
Экземпляры объектов - айтемов внедряются в код класса формы, т.е. доступны в компайл-тайме. Вроде бы. А если недоступны, то доступны в рантайме, типа GetByName('''), :-).
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538217
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladПри отладке запроса
а что мешает отлаживать запрос в админском для твоей СУБД инструменте?
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538219
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДКажись, в jedi компонентах был контейнер текстов. Кидаешь на форму или датамодуль, создаешь именованные айтемы, в айтемы во встроенном редакторе пишешь любой текст текст.
Экземпляры объектов - айтемов внедряются в код класса формы, т.е. доступны в компайл-тайме. Вроде бы. А если недоступны, то доступны в рантайме, типа GetByName('''), :-).
Можно тупо на форму положить TMemo с текстом.
А если на датамодуль - то TStringValuesList.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538220
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док> а что мешает отлаживать запрос в админском для твоей СУБД инструменте?

Вероятно, это динамический запрос - когда
составные части (а не параметры) нестатичны.

Приходилось как-то такое отлаживать, ужас.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538258
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тот случай, когда "уж лучше бы ты использовал хранимки"... :)
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538266
Болтаювпт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамВероятно, это динамический запрос - когда
составные части (а не параметры) нестатичны.Никакого вероятно, код приведен, в нем нет if.
И, кстати, никакого ужаса в отладке тоже нет. Делаешь наряду с выполнением запроса вывод его текста и отлаживаешь спокойно.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538293
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladDarkMastersvnvlad,

Ты вылез за размеры 64К для процедуры. Разбей свой текст запроса на более мелкие куски или грузи из файла. Еще как вариант - перейти на х64 компилятор.
Как понять, разбить на более мелкие куски?
Вот я разбил с помощью SQL.Add, в каждом по 10-20 строк, и в итоге та же самая ошибка.
Используй темповые (временные) таблицы, если СУБД позволяет...
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538295
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Никакого вероятно, код приведен, в нем нет if.

Хотя да, if-ов не видно, и если там действительно
"практически один оператор", то лучше вынести в ХП.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538310
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам> Никакого вероятно, код приведен, в нем нет if.

Хотя да, if-ов не видно, и если там действительно
"практически один оператор", то лучше вынести в ХП.

Может и не выдержать. :)
На разных серверах разные ограничения на размер процедуры, "количество контекстов" и т.д.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538336
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

У тебя получается слишком большая константная строка внутри процедуры. Можно:

1) Написать кучку процедур типа:
Код: pascal
1.
2.
3.
4.
   procedure AddTextToSQL_One(SQL:TStrings);
   begin
      SQL.Add(' .... кусок SQL запроса...');
   end;


и звать их как:
Код: pascal
1.
2.
3.
4.
5.
6.
   procedure BuildSQLBody;
   begin
      AddTextToSQL_One(Query.SQL);
      .....
      AddTextToSQL_NNN(Query.SQL);
   end;



2) Сделать

Код: pascal
1.
Query.SQL.LoadFromFile('MySQL_File.sql');



Я за второй метод, если что.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538338
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladПри отладке запроса, когда сохраняешь его SQL.SaveToFile() и потом отдельно смотришь текст
в менеджере запросов - это помогает

Лично я сначала отлаживаю запрос во внешнем инструменте, а только потом копипастю его в
программу, обрамляя строки кавычками. Так проще получается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538340
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ограничения, конечно, есть, но, во-первых, они довольно большие,
во-вторых, эта бодяга с клиента всё равно на сервер уйдёт. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538343
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovsvnvladПри отладке запроса, когда сохраняешь его SQL.SaveToFile() и потом отдельно смотришь текст
в менеджере запросов - это помогает

Лично я сначала отлаживаю запрос во внешнем инструменте, а только потом копипастю его в
программу, обрамляя строки кавычками. Так проще получается.

Обычно получается с первого раза. Затыки бывают один на 20 случаев.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538348
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad> Обычно получается с первого раза.

С первого раза пишешь запросы прямо в Delphi, без DB-tool? Силён.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538352
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно типа этого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
const
  ergg = 'erkg9045jg4i5hji4k5gi45h5r6j6';
  ergg1 = 'erkg9045jg4i5hji4k5gi45h5r6j6';
  ergg2 = 'erkg9045jg4i5hji4k5gi45h5r6j6';
  ergg3 = 'erkg9045jg4i5hji4k5gi45h5r6j6';
  ergg4 = 'erkg9045jg4i5hji4k5gi45h5r6j6';
  erfgege = ergg + ergg1 + ergg2 + ergg3 + ergg4;
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538355
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамsvnvlad> Обычно получается с первого раза.

С первого раза пишешь запросы прямо в Delphi, без DB-tool? Силён.

Большинство не сложные, а те, что сложные, берутся с других похожих, уже работающих.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538356
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что ты каждый вечер городишь.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538383
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Кхм. У него текст не разу не изменялся в процедуре. Следовательно текст можно вынести в константы - поделить их на составляющие запросы, тем самым укоротив текст в несколько раз. И построить ирархию..

Я пишу фигню? Давайте создадим куча маленьких процедур! Но не боле 5


Код: pascal
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

const
  a1 = 'SELECT '#13#10 + 'SUM(sum_fact_prr_1) AS s_sum_fact_prr_1, '#13#10 +
    'SUM(sum_fact_other_1) AS s_sum_fact_other_1, '#13#10 +
    'SUM(sum_fact_teo_1) AS s_sum_fact_teo_1, '#13#10 +
    'SUM(sum_fact_fares_1) AS s_sum_fact_fares_1, '#13#10 +
    'SUM(sum_fact_storage_1) AS s_sum_fact_storage_1, '#13#10 +
    'SUM(sum_fact_prr_1) + '#13#10 + 'SUM(sum_fact_other_1) + '#13#10 +
    'SUM(sum_fact_teo_1) + '#13#10 + 'SUM(sum_fact_fares_1) + '#13#10 +
    'SUM(sum_fact_storage_1) AS s_sum_fact_1, '#13#10 +
    'SUM(sum_fact_prr_2) AS s_sum_fact_prr_2, '#13#10 +
    'SUM(sum_fact_other_2) AS s_sum_fact_other_2, '#13#10 +
    'SUM(sum_fact_teo_2) AS s_sum_fact_teo_2, '#13#10 +
    'SUM(sum_fact_fares_2) AS s_sum_fact_fares_2, '#13#10 +
    'SUM(sum_fact_storage_2) AS s_sum_fact_storage_2, '#13#10 +
    'SUM(sum_fact_prr_2) + '#13#10 + 'SUM(sum_fact_other_2) + '#13#10 +
    'SUM(sum_fact_teo_2) + '#13#10 + 'SUM(sum_fact_fares_2) + '#13#10 +
    'SUM(sum_fact_storage_2) AS s_sum_fact_2, '#13#10 +
    'SUM(sum_fact_prr_4) AS s_sum_fact_prr_4, '#13#10 +
    'SUM(sum_fact_other_4) AS s_sum_fact_other_4, '#13#10 +
    'SUM(sum_fact_teo_4) AS s_sum_fact_teo_4, '#13#10 +
    'SUM(sum_fact_fares_4) AS s_sum_fact_fares_4, '#13#10 +
    'SUM(sum_fact_storage_4) AS s_sum_fact_storage_4, '#13#10 +
    'SUM(sum_fact_prr_4) + '#13#10 + 'SUM(sum_fact_other_4) + '#13#10 +
    'SUM(sum_fact_teo_4) + '#13#10 + 'SUM(sum_fact_fares_4) + '#13#10 +
    'SUM(sum_fact_storage_4) AS s_sum_fact_4, '#13#10 +
    'SUM(sum_fact_prr) AS s_sum_fact_prr, '#13#10 +
    'SUM(sum_fact_other) AS s_sum_fact_other, '#13#10 +
    'SUM(sum_fact_teo) AS s_sum_fact_teo, '#13#10 +
    'SUM(sum_fact_fares) AS s_sum_fact_fares, '#13#10 +
    'SUM(sum_fact_storage) AS s_sum_fact_storage, '#13#10 +
    'SUM(sum_fact_prr) + '#13#10 + 'SUM(sum_fact_other) + '#13#10 +
    'SUM(sum_fact_teo) + '#13#10 + 'SUM(sum_fact_fares) + '#13#10 +
    'SUM(sum_fact_storage) AS s_sum_fact '#13#10 + 'FROM ';

  a2 = '(SELECT '#13#10 + 'ROUND('#13#10 +
    'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
    'FROM invoicing_working_norm iwn '#13#10 +
    'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10
    + 'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
    'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
    'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
    'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
    'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
    'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10
    + 'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
    'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
    'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10
    + 'AND i.cooperated = ''Y'' '#13#10 +
    'AND c1.cargo_status = pcp.cargo_status '#13#10 +
    'AND cn.cargo_group_id = cg.id '#13#10 +
    'AND i.cargo_zone_id = cz.id '#13#10 +
    'AND cz1.cargo_zone_number = ''1'' '#13#10 +
    'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
    'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 + '+ '#13#10
    + 'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
    'FROM invoicing_additional_service_editing e '#13#10 +
    'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
    'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
    'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
    'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
    'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
    'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10
    + 'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
    'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
    'WHERE e.show_in_report = ''Y'' '#13#10 +
    'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10
    + 'AND i.cooperated = ''Y'' '#13#10 +
    'AND c1.cargo_status = pcp.cargo_status '#13#10 +
    'AND cn.cargo_group_id = cg.id '#13#10 +
    'AND i.cargo_zone_id = cz.id '#13#10 +
    'AND cz1.cargo_zone_number = ''1'' '#13#10 +
    'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
    'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
    ', 2) AS sum_fact_prr_1, '#13#10 + 'FROM plan_cargo_processing pcp '#13#10 +
    'INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id '#13#10 +
    'INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id '#13#10 +
    'WHERE pcp.cooperated = ''Y'' '#13#10 + 'AND pcp.year = :year '#13#10 +
    'AND pcp.month = :month ';

begin
  Writeln(a1);
  Writeln('----------');
  Writeln(a2);
  Readln;

end.

...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538405
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataModule + DataSet в нем ? Не, не слышали.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538418
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справедливости ради стоит заметить, что тот же PL/SQL Developer под Оракл подобный код спокойно копипастит из делфи к себе в редактор, автоматом его очищает и приводя к обычному запросу. И в обратном направлении так же из sql в делфи-строчки преобразует. Что-то мне подсказывает, что у автора именно он и стоит.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538420
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может проще все же хранимку использовать? Вообще не люблю sql запросы в программе, а вдруг в запросе что-то добавить или поменять надо, пересобирать клиент. Тогда уж лучше храните свой запрос в БД, загружайте оттуда и пихайте куда хотите.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538422
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiСправедливости ради стоит заметить, что тот же PL/SQL Developer под Оракл подобный код спокойно копипастит из делфи к себе в редактор, автоматом его очищает и приводя к обычному запросу. И в обратном направлении так же из sql в делфи-строчки преобразует. Что-то мне подсказывает, что у автора именно он и стоит.
У меня EMS SQL Manager for MySQL.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538423
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиМожет проще все же хранимку использовать? Вообще не люблю sql запросы в программе, а вдруг в запросе что-то добавить или поменять надо, пересобирать клиент. Тогда уж лучше храните свой запрос в БД, загружайте оттуда и пихайте куда хотите.
Пробовал работать с хранимками, не понравилось по нескольким причинам. Требует все имена полей перечислять (с алиасами, хотя это и хорошая привычка), по-моему нельзя просто звездочку поставить. Приводит хранимку к какому-то своему неудобочитаемому виду. Если требуется отредактировать, это не так просто. Не прижились они у меня.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538424
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикчччД,

Кхм. У него текст не разу не изменялся в процедуре. Следовательно текст можно вынести в константы - поделить их на составляющие запросы, тем самым укоротив текст в несколько раз. И построить ирархию..

Я пишу фигню? Давайте создадим куча маленьких процедур! Но не боле 5


Код: pascal
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

const
  a1 = 'SELECT '#13#10 + 'SUM(sum_fact_prr_1) AS s_sum_fact_prr_1, '#13#10 +
    'SUM(sum_fact_other_1) AS s_sum_fact_other_1, '#13#10 +
    'SUM(sum_fact_teo_1) AS s_sum_fact_teo_1, '#13#10 +
    'SUM(sum_fact_fares_1) AS s_sum_fact_fares_1, '#13#10 +
    'SUM(sum_fact_storage_1) AS s_sum_fact_storage_1, '#13#10 +
    'SUM(sum_fact_prr_1) + '#13#10 + 'SUM(sum_fact_other_1) + '#13#10 +
    'SUM(sum_fact_teo_1) + '#13#10 + 'SUM(sum_fact_fares_1) + '#13#10 +
    'SUM(sum_fact_storage_1) AS s_sum_fact_1, '#13#10 +
    'SUM(sum_fact_prr_2) AS s_sum_fact_prr_2, '#13#10 +
    'SUM(sum_fact_other_2) AS s_sum_fact_other_2, '#13#10 +
    'SUM(sum_fact_teo_2) AS s_sum_fact_teo_2, '#13#10 +
    'SUM(sum_fact_fares_2) AS s_sum_fact_fares_2, '#13#10 +
    'SUM(sum_fact_storage_2) AS s_sum_fact_storage_2, '#13#10 +
    'SUM(sum_fact_prr_2) + '#13#10 + 'SUM(sum_fact_other_2) + '#13#10 +
    'SUM(sum_fact_teo_2) + '#13#10 + 'SUM(sum_fact_fares_2) + '#13#10 +
    'SUM(sum_fact_storage_2) AS s_sum_fact_2, '#13#10 +
    'SUM(sum_fact_prr_4) AS s_sum_fact_prr_4, '#13#10 +
    'SUM(sum_fact_other_4) AS s_sum_fact_other_4, '#13#10 +
    'SUM(sum_fact_teo_4) AS s_sum_fact_teo_4, '#13#10 +
    'SUM(sum_fact_fares_4) AS s_sum_fact_fares_4, '#13#10 +
    'SUM(sum_fact_storage_4) AS s_sum_fact_storage_4, '#13#10 +
    'SUM(sum_fact_prr_4) + '#13#10 + 'SUM(sum_fact_other_4) + '#13#10 +
    'SUM(sum_fact_teo_4) + '#13#10 + 'SUM(sum_fact_fares_4) + '#13#10 +
    'SUM(sum_fact_storage_4) AS s_sum_fact_4, '#13#10 +
    'SUM(sum_fact_prr) AS s_sum_fact_prr, '#13#10 +
    'SUM(sum_fact_other) AS s_sum_fact_other, '#13#10 +
    'SUM(sum_fact_teo) AS s_sum_fact_teo, '#13#10 +
    'SUM(sum_fact_fares) AS s_sum_fact_fares, '#13#10 +
    'SUM(sum_fact_storage) AS s_sum_fact_storage, '#13#10 +
    'SUM(sum_fact_prr) + '#13#10 + 'SUM(sum_fact_other) + '#13#10 +
    'SUM(sum_fact_teo) + '#13#10 + 'SUM(sum_fact_fares) + '#13#10 +
    'SUM(sum_fact_storage) AS s_sum_fact '#13#10 + 'FROM ';

  a2 = '(SELECT '#13#10 + 'ROUND('#13#10 +
    'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
    'FROM invoicing_working_norm iwn '#13#10 +
    'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10
    + 'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
    'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
    'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
    'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
    'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
    'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10
    + 'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
    'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
    'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10
    + 'AND i.cooperated = ''Y'' '#13#10 +
    'AND c1.cargo_status = pcp.cargo_status '#13#10 +
    'AND cn.cargo_group_id = cg.id '#13#10 +
    'AND i.cargo_zone_id = cz.id '#13#10 +
    'AND cz1.cargo_zone_number = ''1'' '#13#10 +
    'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
    'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 + '+ '#13#10
    + 'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
    'FROM invoicing_additional_service_editing e '#13#10 +
    'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
    'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
    'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
    'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
    'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
    'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10
    + 'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
    'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
    'WHERE e.show_in_report = ''Y'' '#13#10 +
    'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10
    + 'AND i.cooperated = ''Y'' '#13#10 +
    'AND c1.cargo_status = pcp.cargo_status '#13#10 +
    'AND cn.cargo_group_id = cg.id '#13#10 +
    'AND i.cargo_zone_id = cz.id '#13#10 +
    'AND cz1.cargo_zone_number = ''1'' '#13#10 +
    'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
    'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
    ', 2) AS sum_fact_prr_1, '#13#10 + 'FROM plan_cargo_processing pcp '#13#10 +
    'INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id '#13#10 +
    'INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id '#13#10 +
    'WHERE pcp.cooperated = ''Y'' '#13#10 + 'AND pcp.year = :year '#13#10 +
    'AND pcp.month = :month ';

begin
  Writeln(a1);
  Writeln('----------');
  Writeln(a2);
  Readln;

end.


В том то и дело, что текст меняется, но каждый раз незначительно, и на практике оказывается проще повторить его весь много раз, чем учитывать мелкие изменения в каждом повторении. Например там в одном случае 'ПЕРЕГРУЗКА', в другом на этом месте 'ТЭО'. В одном запросе джойнится таблица cargo_zone 2 раза, в другом таком же - нет, и т.д.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538461
ЁлыПалы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
svnvlad,
А километровые портянки скл, стало быть прижились?
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538463
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынести SQL-код во внешние файлы и грузить их по необходимости не судьба?
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538464
Фотография Virtual Student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

По моему ситуация идеальная для того, чтобы использовать представления (view). Практически все БД имеют такую возможность.
Создав из этого запроса представление вы избавитесь от необходимости подгружать sql-портянку. Переменные можно передавать параметрами.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538510
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaDiСправедливости ради стоит заметить, что тот же PL/SQL Developer под Оракл подобный код спокойно копипастит из делфи к себе в редактор, автоматом его очищает и приводя к обычному запросу. И в обратном направлении так же из sql в делфи-строчки преобразует. Что-то мне подсказывает, что у автора именно он и стоит.

А, если не секрет, как это делается?
Я себе создал макрос в Notepad++, но это лишний копипаст...
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538523
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

Ого, автор решил обойти ограничения компилятора)))
И дальше неожиданное продолжение - ему надавали советов, как это сделать.
Вот веселуха будет всё это поддерживать)

Видимо, в вакансиях пишут "умение разбираться в чужом коде" как раз для этого случая)


А сторед процедуру тут не предлагали использовать, не ?
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538535
ЁлыПалы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valery_Bsvnvlad,

Ого, автор решил обойти ограничения компилятора)))
И дальше неожиданное продолжение - ему надавали советов, как это сделать.
Вот веселуха будет всё это поддерживать)

Видимо, в вакансиях пишут "умение разбираться в чужом коде" как раз для этого случая)


А сторед процедуру тут не предлагали использовать, не ?

Предлагали, не прижились они у него, говорит :)
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538554
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если присмотреться, то обе части одинаковые
Код: pascal
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.
// подзапрос
  'ROUND('#13#10 +
  'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
  'FROM invoicing_working_norm iwn '#13#10 +
  'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10 +
  'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
  'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  '+ '#13#10 +
  'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
  'FROM invoicing_additional_service_editing e '#13#10 +
  'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
  'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE e.show_in_report = ''Y'' '#13#10 +
  'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  ', 2) AS sum_fact_prr_1, '#13#10 +
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538560
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpub,
пункт в менюA new "Paste from Host Language" function makes it easy to copy SQL statements from a host language like C++, Java, Basic or Pascal. The host language elements are removed and string syntax elements are converted:

https://www.allroundautomations.com/bodyplsqldev100.html
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538565
под ван
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBrЕсли присмотреться, то обе части одинаковые
Код: pascal
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.
// подзапрос
  'ROUND('#13#10 +
  'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
  'FROM invoicing_working_norm iwn '#13#10 +
  'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10 +
  'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
  'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  '+ '#13#10 +
  'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
  'FROM invoicing_additional_service_editing e '#13#10 +
  'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
  'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE e.show_in_report = ''Y'' '#13#10 +
  'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  ', 2) AS sum_fact_prr_1, '#13#10 +



Дима, по ходу, тебе самому пора к окулисту - советую как специалист, видящий разницу между a1 ON a1.id и a ON a.id
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538580
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЁлыПалыне прижились они у него, говорит :)мускл может и не умеет рефкурсоры по динамическим запросам вертать из процедур но уж резалтсеты-то в принципе должен наверное
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538583
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tus,

Спасибо!
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538642
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
под ванДима, по ходу, тебе самому пора к окулисту - советую как специалист, видящий разницу между a1 ON a1.id и a ON a.id
Серьёзно ? А ничего, что в первом алиас А, а во втором А1. Это что-то меняет ?
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538795
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrпод ванДима, по ходу, тебе самому пора к окулисту - советую как специалист, видящий разницу между a1 ON a1.id и a ON a.id
Серьёзно ? А ничего, что в первом алиас А, а во втором А1. Это что-то меняет ?

Это издержки кода. Конечно можно в обоих случаях оставить A.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538796
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Studentsvnvlad,

По моему ситуация идеальная для того, чтобы использовать представления (view). Практически все БД имеют такую возможность.
Создав из этого запроса представление вы избавитесь от необходимости подгружать sql-портянку. Переменные можно передавать параметрами.
А каким образом можно использовать параметры во вьюшках? Я не нашел. Был где-то обходной маневр, но это не рекомендовалось.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538816
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начал разбираться с хранимыми процедурами, пока не очень понимаю, или туплю, если вместо внутреннего скалярного подзапроса вставить хранимку с параметрами, то как осуществлять ее вызов, если туда надо передать значения внешнего запроса?
Там ведь есть участок, где скалярный подзапрос соединяется с внешним:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
....
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +


Вот с этим внешним запросом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  ...
  'FROM plan_cargo_processing pcp '#13#10 +
  'INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id '#13#10 +
  'INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id '#13#10 +
  'WHERE pcp.cooperated = ''Y'' '#13#10 +
  'AND pcp.year = :year '#13#10 +
  'AND pcp.month = :month '



И как CALL MyProc() отобразить в запросе как значение поля, то что было вот этим?
Код: pascal
1.
2.
...
', 2) AS sum_fact_prr_1, 
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538830
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЕсли присмотреться, то обе части одинаковые
Код: pascal
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.
// подзапрос
  'ROUND('#13#10 +
  'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
  'FROM invoicing_working_norm iwn '#13#10 +
  'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10 +
  'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
  'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  '+ '#13#10 +
  'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
  'FROM invoicing_additional_service_editing e '#13#10 +
  'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
  'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE e.show_in_report = ''Y'' '#13#10 +
  'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  ', 2) AS sum_fact_prr_1, '#13#10 +


Они все-таки не совсем одинаковые. В первой джойн идет с таблицей iwn, во второй - с таблицей e.
Во второй есть строка WHERE e.show_in_report = ''Y''.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538841
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladА каким образом можно использовать параметры во вьюшках? Я не нашел. Был где-то обходной маневр, но это не рекомендовалось.
Никаким, вьюшки это объединение таблиц

svnvladпока не очень понимаю, или туплю, если вместо внутреннего скалярного подзапроса вставить хранимку с параметрами, то как осуществлять ее вызов
Весь нужный запрос пишется в хранимой процедуре, а из Delphi вызывается эта хранимка
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538844
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladкаким образом можно использовать параметры во вьюшках?тупо к select from view приделывать where-clause в надежде что сервер сдюжит, сам подобным грешен
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538847
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladОни все-таки не совсем одинаковые. В первой джойн идет с таблицей iwn, во второй - с таблицей e.
Во второй есть строка WHERE e.show_in_report = ''Y''.
Это не важно, бОльшая часть подзапроса одинаковая, а это значит что её можно вынести в константу.
Ну а переход на SP гораздо симпатичнее и удобнее править в дальнейшем
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538848
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrsvnvladпока не очень понимаю, или туплю, если вместо внутреннего скалярного подзапроса вставить хранимку с параметрами, то как осуществлять ее вызов
Весь нужный запрос пишется в хранимой процедуре, а из Delphi вызывается эта хранимка
А если саму хранимку написать с использованием вложенных хранимок, чтобы не писать один и тот же код много раз, там ведь есть много больших повторяющихся кусков (получение скалярных значений). Уже понял, что надо функцию писать, а не процедуру. А как с передачей в нее параметров внешнего запроса? То, что заменило бы джойн с внешним запросом.
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538859
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladкак с передачей в нее параметров внешнего запроса? То, что заменило бы джойн с внешним запросомне уверен что понял о чем речь но можно предварительно напихать в отдельную соединяемую таблицу(-ы) (по вкусу временную или gtt) что требуется
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538873
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavansvnvladкак с передачей в нее параметров внешнего запроса? То, что заменило бы джойн с внешним запросомне уверен что понял о чем речь но можно предварительно напихать в отдельную соединяемую таблицу(-ы) (по вкусу временную или gtt) что требуется

Вот это
Код: pascal
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.
  '(SELECT '#13#10 +
  // 1 район

// подзапрос
  'ROUND('#13#10 +
  'IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0) '#13#10 +
  'FROM invoicing_working_norm iwn '#13#10 +
  'INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id '#13#10 +
  'INNER JOIN additional_service a1 ON a1.id = cwnr.service_id '#13#10 +
  'INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = iwn.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc1.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  '+ '#13#10 +
  'IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) '#13#10 +
  'FROM invoicing_additional_service_editing e '#13#10 +
  'INNER JOIN additional_service a ON a.id = e.service_id '#13#10 +
  'INNER JOIN report_code rc ON rc.id = a.report_code_id '#13#10 +
  'INNER JOIN invoicing i ON i.id = e.invoicing_id '#13#10 +
  'INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id '#13#10 +
  'LEFT JOIN invoice_type it ON it.id = i.invoice_type_id '#13#10 +
  'INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id '#13#10 +
  'INNER JOIN contract c1 ON c1.id = cch1.contract_id '#13#10 +
  'INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id '#13#10 +
  'WHERE e.show_in_report = ''Y'' '#13#10 +
  'AND UPPER(it.invoice_type_name) IN (''ИМПОРТ'', ''ЭКСПОРТ'', ''КАБОТАЖ'') '#13#10 +
  'AND i.cooperated = ''Y'' '#13#10 +
  'AND c1.cargo_status = pcp.cargo_status '#13#10 +
  'AND cn.cargo_group_id = cg.id '#13#10 +
  'AND i.cargo_zone_id = cz.id '#13#10 +
  'AND cz1.cargo_zone_number = ''1'' '#13#10 +
  'AND i.invoicing_date BETWEEN :date_from AND :date_to '#13#10 +
  'AND UPPER(rc.report_code_name) = ''ПЕРЕГРУЗКА''), 0) '#13#10 +
  ', 2) AS sum_fact_prr_1, '#13#10 +

...
//таких подзапросов еще 18
...

  'FROM plan_cargo_processing pcp '#13#10 +
  'INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id '#13#10 +
  'INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id '#13#10 +
  'WHERE pcp.cooperated = ''Y'' '#13#10 +
  'AND pcp.year = :year '#13#10 +
  'AND pcp.month = :month ');



Преобразовать вот в это
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  '(SELECT '#13#10 +
  // 1 район

// подзапрос
  MyStoredFunction('Y', pcp.cargo_status, cg.id, '1', :date_from, :date_to, 'ПЕРЕГРУЗКА') AS sum_fact_prr_1,
...
//таких подзапросов еще 18
...
  MyStoredFunction('Y', pcp.cargo_status, cg.id, '1', :date_from, :date_to, 'ТЭО') AS sum_fact_teo_1,
  MyStoredFunction('Y', pcp.cargo_status, cg.id, '1', :date_from, :date_to, 'ДРУГИЕ') AS sum_fact_other_1
...

  'FROM plan_cargo_processing pcp '#13#10 +
  'INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id '#13#10 +
  'INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id '#13#10 +
  'WHERE pcp.cooperated = ''Y'' '#13#10 +
  'AND pcp.year = :year '#13#10 +
  'AND pcp.month = :month ');


Корректно?
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39538885
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad, мне столько не выпить чтоб подобные портяны разбирать, даже с учетом что я ночью улетаю на конфу по smartdata. соорудил бы примитивную демонстрацию что ли для разнообразия
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39539272
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavansvnvlad, мне столько не выпить чтоб подобные портяны разбирать, даже с учетом что я ночью улетаю на конфу по smartdata. соорудил бы примитивную демонстрацию что ли для разнообразия

Функция:
Код: sql
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.
62.
63.
CREATE DEFINER = 'cargoport'@'%' FUNCTION `profit_coop_yn`(
        `p_cargo_status` ENUM('export','import','domestic'),
        `p_cargo_group_id` INTEGER(11) UNSIGNED,
        `p_cargo_zone_id` INTEGER(11) UNSIGNED,
        `p_cargo_zone_number` VARCHAR(40),
        `p_invoicing_date_from` DATETIME,
        `p_invoicing_date_to` DATETIME,
        `p_report_code_name` VARCHAR(20),
        `p_cooperated` ENUM('Y','N')
    )
    RETURNS DECIMAL(11,2)
    NOT DETERMINISTIC
    READS SQL DATA
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
  DECLARE val DECIMAL(11,2);
  
  SELECT
  ROUND(
  IFNULL((SELECT COALESCE(SUM(iwn.sum_rub), 0)
  FROM invoicing_working_norm iwn
  INNER JOIN contract_working_norm_rate cwnr ON cwnr.id = iwn.contract_working_norm_rate_id 
  INNER JOIN additional_service a1 ON a1.id = cwnr.service_id
  INNER JOIN report_code rc1 ON rc1.id = a1.report_code_id 
  INNER JOIN invoicing i ON i.id = iwn.invoicing_id 
  INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id
  LEFT JOIN invoice_type it ON it.id = i.invoice_type_id 
  INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id
  INNER JOIN contract c1 ON c1.id = cch1.contract_id 
  INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id
  WHERE UPPER(it.invoice_type_name) IN ('ИМПОРТ', 'ЭКСПОРТ', 'КАБОТАЖ')
  AND i.cooperated = p_cooperated
  AND c1.cargo_status = p_cargo_status
  AND cn.cargo_group_id = p_cargo_group_id
  AND i.cargo_zone_id = p_cargo_zone_id 
  AND cz1.cargo_zone_number = p_cargo_zone_number
  AND i.invoicing_date BETWEEN p_invoicing_date_from AND p_invoicing_date_to
  AND UPPER(rc1.report_code_name) = p_report_code_name), 0) 
  + 
  IFNULL((SELECT COALESCE(SUM(e.sum_rub), 0) 
  FROM invoicing_additional_service_editing e 
  INNER JOIN additional_service a ON a.id = e.service_id 
  INNER JOIN report_code rc ON rc.id = a.report_code_id
  INNER JOIN invoicing i ON i.id = e.invoicing_id 
  INNER JOIN cargo_zone cz1 ON cz1.id = i.cargo_zone_id 
  LEFT JOIN invoice_type it ON it.id = i.invoice_type_id
  INNER JOIN contract_cargo_head cch1 ON cch1.id = i.contract_cargo_head_id 
  INNER JOIN contract c1 ON c1.id = cch1.contract_id 
  INNER JOIN cargo_nomenclature cn ON cn.id = cch1.cargo_id
  WHERE e.show_in_report = 'Y' 
  AND UPPER(it.invoice_type_name) IN ('ИМПОРТ', 'ЭКСПОРТ', 'КАБОТАЖ')
  AND i.cooperated = p_cooperated 
  AND c1.cargo_status = p_cargo_status
  AND cn.cargo_group_id = p_cargo_group_id
  AND i.cargo_zone_id = p_cargo_zone_id
  AND cz1.cargo_zone_number = p_cargo_zone_number
  AND i.invoicing_date BETWEEN p_invoicing_date_from AND p_invoicing_date_to
  AND UPPER(rc.report_code_name) = p_report_code_name), 0) 
  , 2) INTO val;

  RETURN val;
END;



Вызов функции в качестве скалярного подзапроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
  profit_coop_yn(pcp.cargo_status, cg.id, cz.id, '1', :date_from, :date_to, 'ПЕРЕГРУЗКА', 'N') AS sum_fact_prr_1,
  profit_coop_yn(pcp.cargo_status, cg.id, cz.id, '1', :date_from, :date_to, 'ТЭО', 'N') AS sum_fact_teo_1,
  profit_coop_yn(pcp.cargo_status, cg.id, cz.id, '1', :date_from, :date_to, 'ПРОЧИЕ', 'N') AS sum_fact_other_1

  FROM plan_cargo_processing pcp
  INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id
  INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id
  WHERE pcp.cooperated = 'N'
  AND pcp.year = :year 
  AND pcp.month = :month
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39539298
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, все красиво получилось!
Код: sql
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.
CREATE DEFINER = 'cargoport'@'%' PROCEDURE `profit_export_zones`(
        IN `p_year` INTEGER(11),
        IN `p_month_begin` INTEGER(11),
        IN `p_month_end` INTEGER(11),
        IN `p_date_from` DATETIME,
        IN `p_date_to` DATETIME,
        IN `p_div` INTEGER(11),
        IN `p_decimal_places` INTEGER(11)
    )
    NOT DETERMINISTIC
    READS SQL DATA
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
  SELECT *, 
  sum_fact_prr_1 + sum_fact_other_1 + sum_fact_teo_1 + sum_fact_fares_1 + sum_fact_storage_1 AS sum_fact_1,
  sum_fact_prr_2 + sum_fact_other_2 + sum_fact_teo_2 + sum_fact_fares_2 + sum_fact_storage_2 AS sum_fact_2,
  sum_fact_prr_4 + sum_fact_other_4 + sum_fact_teo_4 + sum_fact_fares_4 + sum_fact_storage_4 AS sum_fact_4,
  sum_fact_prr + sum_fact_other + sum_fact_teo + sum_fact_fares + sum_fact_storage AS sum_fact
  
  FROM

  (SELECT cg.cargo_group_name, 
  
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '1', p_date_from, p_date_to, 'ПЕРЕГРУЗКА')/p_div, p_decimal_places) AS sum_fact_prr_1,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '1', p_date_from, p_date_to, 'ПРОЧИЕ')/p_div, p_decimal_places) AS sum_fact_other_1,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '1', p_date_from, p_date_to, 'ТЭО')/p_div, p_decimal_places) AS sum_fact_teo_1,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '1', p_date_from, p_date_to, 'ПРОВОЗНАЯ ПЛАТА')/p_div, p_decimal_places) AS sum_fact_fares_1,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '1', p_date_from, p_date_to, 'ХРАНЕНИЕ')/p_div, p_decimal_places) AS sum_fact_storage_1,
  
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '2', p_date_from, p_date_to, 'ПЕРЕГРУЗКА')/p_div, p_decimal_places) AS sum_fact_prr_2,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '2', p_date_from, p_date_to, 'ПРОЧИЕ')/p_div, p_decimal_places) AS sum_fact_other_2,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '2', p_date_from, p_date_to, 'ТЭО')/p_div, p_decimal_places) AS sum_fact_teo_2,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '2', p_date_from, p_date_to, 'ПРОВОЗНАЯ ПЛАТА')/p_div, p_decimal_places) AS sum_fact_fares_2,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '2', p_date_from, p_date_to, 'ХРАНЕНИЕ')/p_div, p_decimal_places) AS sum_fact_storage_2,
  
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '4', p_date_from, p_date_to, 'ПЕРЕГРУЗКА')/p_div, p_decimal_places) AS sum_fact_prr_4,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '4', p_date_from, p_date_to, 'ПРОЧИЕ')/p_div, p_decimal_places) AS sum_fact_other_4,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '4', p_date_from, p_date_to, 'ТЭО')/p_div, p_decimal_places) AS sum_fact_teo_4,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '4', p_date_from, p_date_to, 'ПРОВОЗНАЯ ПЛАТА')/p_div, p_decimal_places) AS sum_fact_fares_4,
  ROUND(invoicing_sum_zonenum(pcp.cargo_status, cg.id, cz.id, '4', p_date_from, p_date_to, 'ХРАНЕНИЕ')/p_div, p_decimal_places) AS sum_fact_storage_4,
  
  ROUND(invoicing_sum(pcp.cargo_status, cg.id, cz.id, p_date_from, p_date_to, 'ПЕРЕГРУЗКА')/p_div, p_decimal_places) AS sum_fact_prr,
  ROUND(invoicing_sum(pcp.cargo_status, cg.id, cz.id, p_date_from, p_date_to, 'ПРОЧИЕ')/p_div, p_decimal_places) AS sum_fact_other,
  ROUND(invoicing_sum(pcp.cargo_status, cg.id, cz.id, p_date_from, p_date_to, 'ТЭО')/p_div, p_decimal_places) AS sum_fact_teo,
  ROUND(invoicing_sum(pcp.cargo_status, cg.id, cz.id, p_date_from, p_date_to, 'ПРОВОЗНАЯ ПЛАТА')/p_div, p_decimal_places) AS sum_fact_fares,
  ROUND(invoicing_sum(pcp.cargo_status, cg.id, cz.id, p_date_from, p_date_to, 'ХРАНЕНИЕ')/p_div, p_decimal_places) AS sum_fact_storage

  FROM plan_cargo_processing pcp
  INNER JOIN cargo_group cg ON cg.id = pcp.cargo_group_id
  INNER JOIN cargo_zone cz ON cz.id = pcp.cargo_zone_id
  WHERE pcp.cargo_status = 'export'
  AND pcp.year = p_year
  AND pcp.month BETWEEN p_month_begin AND p_month_end
  
  GROUP BY cg.id) iq
  ORDER BY cargo_group_name
  ;
END;
...
Рейтинг: 0 / 0
Ошибка - слишком длинная процедура
    #39539775
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

главное, че-то никто не посоветовал убрать НЕОБЯЗАТЕЛЬНОЕ слово INNER. Вместе с пробелом 6 байт неоднократно бы сэкономилось.

p.s. слова INNER и OUTER - необязательные. Прошу это запомнить.
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка - слишком длинная процедура
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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