1 (edited by adiziktdy 2022-09-06 09:35:14)

Topic: Заполнение TableGrid скриптом, содержащим UNION

procedure dogovor_OnShow (Sender: TObject; Action: string);
var
s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,s26,s27,s28,s29, addTable: string;
begin
  dogovor.PageControl1.ActivePageIndex:=0;
s1:='set @N = 0; ';
s2:='SELECT @N := @N + 1 AS number, (case when length(anketa.n_abit)=1 then CONCAT("00000",anketa.n_abit," ",anketa.fullname," ",anketa.name," ",anketa.fath) ';
s3:=' when length(anketa.n_abit)=2 then CONCAT("0000",anketa.n_abit," ",anketa.fullname," ",anketa.name," ",anketa.fath) ';
s4:=' when length(anketa.n_abit)=3 then CONCAT("000",anketa.n_abit," ",anketa.fullname," ",anketa.name," ",anketa.fath) ';
s5:=' when length(anketa.n_abit)=4 then CONCAT("00",anketa.n_abit," ",anketa.fullname," ",anketa.name," ",anketa.fath) ';
s6:=' when length(anketa.n_abit)=5 then CONCAT("0",anketa.n_abit," ",anketa.fullname," ",anketa.name," ",anketa.fath) ';
s7:=' else CONCAT(anketa.n_abit," ",anketa.fullname," ",anketa.name," ",anketa.fath) ';
s8:='end) as nom_fio, n_abit, fullname, name, fath , fakult.shortF, fo.name_fo, prioritet.nPrioritet, sprspec.nSpec, spec.short, spec2.short AS short_2, spec3.short AS short_3, dop.name_dop, anketa.vid_dop ';
s9:='FROM pk_adi.anketa anketa LEFT JOIN fakult ON anketa.id_fakult = fakult.id ';
s10:='LEFT JOIN fo ON anketa.id_fo = fo.id ';
s11:='LEFT JOIN prioritet ON anketa.id_prioritet = prioritet.id ';
s12:='LEFT JOIN sprspec ON sprspec.id = anketa.id_sprSpec ';
s13:='LEFT JOIN spec ON anketa.id_spec = spec.id ';
s14:='LEFT JOIN spec2 ON anketa.id_spec2 = spec2.id ';
s15:='LEFT JOIN spec3 ON anketa.id_spec3 = spec3.id ';
s16:='LEFT JOIN dop ON anketa.id_dop = dop.id ';
s17:='UNION ';
s18:='SELECT @N := @N + 1 AS number, (case when length(vosstanov.nDela)=1 then CONCAT("00000",vosstanov.nDela," ",vosstanov.fullname," ",vosstanov.name," ",vosstanov.fath) ';
s19:=' when length(vosstanov.nDela)=2 then CONCAT("0000",vosstanov.nDela," ",vosstanov.fullname," ",vosstanov.name," ",vosstanov.fath) ';
s20:=' when length(vosstanov.nDela)=3 then CONCAT("000",vosstanov.nDela," ",vosstanov.fullname," ",vosstanov.name," ",vosstanov.fath) ';
s21:=' when length(vosstanov.nDela)=4 then CONCAT("00",vosstanov.nDela," ",vosstanov.fullname," ",vosstanov.name," ",vosstanov.fath) ';
s22:=' when length(vosstanov.nDela)=5 then CONCAT("0",vosstanov.nDela," ",vosstanov.fullname," ",vosstanov.name," ",vosstanov.fath) ';
s23:=' else CONCAT(vosstanov.nDela," ",vosstanov.fullname," ",vosstanov.name," ",vosstanov.fath) ';
s24:='end) as nom_fio, nDela AS n_abit, fullname, name, fath, fakult.shortF, fo.name_fo, null AS nPrioritet, sprspec.nSpec, spec.short, NULL AS short_2, NULL AS short_3, dop.name_dop , vosstanov.name_dop ';
s25:='FROM pk_adi.vosstanov LEFT JOIN fakult ON fakult.id = vosstanov.id_fakult ';
s26:='LEFT JOIN fo ON vosstanov.id_fo = fo.id ';
s27:='LEFT JOIN sprspec ON sprspec.id = vosstanov.id_sprSpec ';
s28:='LEFT JOIN spec ON vosstanov.id_spec = spec.id ';
s29:='LEFT JOIN dop ON vosstanov.id_dop = dop.id ;';
addTable:=s1+s2+s3+s4+s5+s6+s7+s8+s9+s10+s11+s12+s13+s14+s15+s16+s17+s18+s19+s20+s21+s22+s23+s24+s25+s26+s27+s28+s29;
  dogovor.TableGrid1.dbSQL(addTable);
  dogovor.TableGrid1.dbGeneralTable := 'anketa';
 dogovor.TableGrid1.dbListFieldsNames('#,nom_fio,n_abit,fullname,name,fath,shortF,name_fo,nPrioritet,nSpec,short,short_2,short_3,name_dop,vid_dop');
  dogovor.TableGrid1.dbSQLExecute();
end;

Скрипт заполнения содержимым специально разбит на составляющие, чтобы визуально видеть разные таблицы, так как структура их отличается.

Ошибка 'Too many actual parameters' возникает на  строке dogovor.TableGrid1.dbSQL(addTable);

Сам запрос отрабатывает на ура (см. вложение).
https://dropmefiles.com/MG2At

Помогите, пожалуйста, разобраться в чём ошибка..

П.С. база данных MySQL

Yana

2 (edited by k245 2022-09-06 10:18:37)

Re: Заполнение TableGrid скриптом, содержащим UNION

В таблицу нельзя засунуть SQL-запрос, но его можно засунуть в кнопку, которая выполняет действие по заполнению таблицы.


В статье есть нужный вам пример: https://k245.ru/mvdb/otchetnost.html

Визуальное программирование: блог и телеграм-канал.

Re: Заполнение TableGrid скриптом, содержащим UNION

Спасибо!

10 минут назад наткнулась на это в "Справке" smile

http://myvisualdatabase.com/help_ru/but … query.html

Вроде бы что-то вырисовывается.

Yana

4 (edited by sparrow 2022-09-06 12:58:51)

Re: Заполнение TableGrid скриптом, содержащим UNION

Вот где у вас ошибки


вот так правильно


Form1.TableGrid1.dbSQL:= ...
Form1.TableGrid1.dbListFieldsNames := ...
dogovor.TableGrid1.dbSQLExecute;

И пихайте себе запрос в таблицу. Никто не запрещает.


P.S. И маленький вопрос. UNION это хорошо. Если у вас это конечная таблица для вывода и не предполагается редактирование
данных по этой таблице это одно.
Но если предполагается, то скажите, где вы получите номера записей (id) из разных таблиц для редактирования записей ???
Конечно возможен выход по номеру абитуриента получать id записи из одной или другой таблицы.


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

5 (edited by k245 2022-09-06 14:24:15)

Re: Заполнение TableGrid скриптом, содержащим UNION

sparrow wrote:

...И пихайте себе запрос в таблицу. Никто не запрещает.

действительно, всё работает! Век живи - век учись  smile
Спасибо, буду использовать.

Визуальное программирование: блог и телеграм-канал.

Re: Заполнение TableGrid скриптом, содержащим UNION

sparrow wrote:

Вот где у вас ошибки


вот так правильно


Form1.TableGrid1.dbSQL:= ...
Form1.TableGrid1.dbListFieldsNames := ...
dogovor.TableGrid1.dbSQLExecute;

И пихайте себе запрос в таблицу. Никто не запрещает.


P.S. И маленький вопрос. UNION это хорошо. Если у вас это конечная таблица для вывода и не предполагается редактирование
данных по этой таблице это одно.
Но если предполагается, то скажите, где вы получите номера записей (id) из разных таблиц для редактирования записей ???
Конечно возможен выход по номеру абитуриента получать id записи из одной или другой таблицы.


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

Спасибо!

Таблица не для редактирования. Для сбора информации о введенных абитуриентах/студентах, подавших заявление о восстановлении на учёбу и передачи её в другую таблицу (договора об обучении).

Yana