Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка - слишком длинная процедура / 25 сообщений из 58, страница 1 из 3
18.10.2017, 15:35:32
    #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
18.10.2017, 15:44:23
    #39538161
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка - слишком длинная процедура
svnvlad,

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

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

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

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

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

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

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

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

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

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

Может и не выдержать. :)
На разных серверах разные ограничения на размер процедуры, "количество контекстов" и т.д.
...
Рейтинг: 0 / 0
18.10.2017, 18:11:35
    #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
18.10.2017, 18:16:33
    #39538338
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка - слишком длинная процедура
svnvladПри отладке запроса, когда сохраняешь его SQL.SaveToFile() и потом отдельно смотришь текст
в менеджере запросов - это помогает

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

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

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

С первого раза пишешь запросы прямо в Delphi, без DB-tool? Силён.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.10.2017, 18:35:40
    #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
18.10.2017, 18:38:54
    #39538355
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка - слишком длинная процедура
Гаджимурадов Рустамsvnvlad> Обычно получается с первого раза.

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

Большинство не сложные, а те, что сложные, берутся с других похожих, уже работающих.
...
Рейтинг: 0 / 0
18.10.2017, 18:39:44
    #39538356
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка - слишком длинная процедура
Ну что ты каждый вечер городишь.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ошибка - слишком длинная процедура / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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