powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка - слишком длинная процедура
25 сообщений из 58, страница 1 из 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
25 сообщений из 58, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка - слишком длинная процедура
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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