Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Доступ к полям с повторяющимися названиями / 4 сообщений из 4, страница 1 из 1
25.12.2012, 20:18
    #38092527
vlad52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к полям с повторяющимися названиями
В следующей процедуре с помощью стандартного компонента подключения к базам данных SQLite в Delphi XE3 я выполняю 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.
	procedure CreationListOfFields(SQLConn: TSQLConnection; DBSchema : TDBSchemaSpec);
	var
	  NameField : TField;
	  PositionField : TField;
	  DescriptionField : TField;
	  CanInputField : TField;
	  CanEditField : TField;
	  ShowInGridField : TField;
	  ShowInDetailsField : TField;
	  IsMeanField : TField;
	  AutocalculatedField : TField;
	  RequiredField : TField;
	  Name1 : TField;
	  Name2 : TField;
	begin
		SQLConn.Execute('select f.id, f.position, f.name, f.description, f.can_input, '
		+' f.can_edit, f.show_in_grid, f.show_in_details, f.is_mean, f.autocalculated, f.required, tables.name tablemame, domains.name domainname'
		+' from fields f left join tables on f.table_id=tables.id '
		+' left join domains on f.domain_id=domains.id order by tables.name, domains.name ', nil, results);
		if not results.IsEmpty then
		  begin
			results.First;
			Name1:=results.FieldByName('name_1');
			Name2:=results.FieldByName('name_2');
			lastTable:=Name1.AsString;
			TableSpec:=TTableSpec(DBSchema.Tables.FindComponent(lastTable));
			lastDomain:=Name2.AsString;
			DomainSpec:=TDomainSpec(DBSchema.Domains.FindComponent(lastDomain));
			NameField:=results.FieldByName('name');
			PositionField:=results.FieldByName('position');
			DescriptionField:=results.FieldByName('description');
			CanInputField:=results.FieldByName('can_input');
			CanEditField:=results.FieldByName('can_edit');
			ShowInGridField:=results.FieldByName('show_in_grid');
			ShowInDetailsField:=results.FieldByName('show_in_details');
			IsMeanField:=results.FieldByName('is_mean');
			AutocalculatedField:=results.FieldByName('autocalculated');
			RequiredField:=results.FieldByName('required');
			while not results.Eof do
			  begin
				if (Name1.AsString<>lastTable) then
				begin
				  lastTable:=Name1.AsString;
				  TableSpec:=TTableSpec(DBSchema.Tables.FindComponent(lastTable));
				end;
				if (Name2.AsString<>lastDomain) then
				begin
				  lastDomain:=Name2.AsString;
				  DomainSpec:=TDomainSpec(DBSchema.Domains.FindComponent(lastDomain));
				end;
				FieldSpec:=TFieldSpec.Create(TableSpec.Fields);
				FieldSpec.Setup( DomainSpec, PositionField.AsInteger,
				NameField.AsString, DescriptionField.AsString,
				FieldToBoolean(CanInputField),FieldToBoolean(CanEditField),
				FieldToBoolean(ShowInGridField), FieldToBoolean(ShowInDetailsField),
				FieldToBoolean(IsMeanField),FieldToBoolean(AutocalculatedField),
				FieldToBoolean(RequiredField));
				TComponent(FieldSpec).Name:=NameField.AsString;
				TableSpec.Fields.InsertComponent(FieldSpec);
				results.Next;
			  end;
		  end;
	end;


Но при вызове этой процедуры в результате получаю сообщение Field 'tablename' not found. Как обратиться к полям с повторяющимися названиями, чтобы не было проблем? (варианты 'name_1' и 'name_2' не подходят, при отладке я обнаружил, что соответствующие значения пустые и как следствие из-за этого у меня возник вопрос на http://hashcode.ru/questions/177512/delphi-access-violation-at-address-00822135-in-module-gui-exe-read-of-address-00000040 и http://www.sql.ru/forum/actualthread.aspx?tid=993266). Использую компонент подключения к базе данных в Delphi XE3, указанный здесь - http://www.webdelphi.ru/2012/10/sqlite-v-delphi-xe3/ ).
...
Рейтинг: 0 / 0
25.12.2012, 20:22
    #38092529
vlad52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к полям с повторяющимися названиями
vlad52,

извините при копипасте совершил ошибку
Код: pascal
1.
2.
3.
4.
		SQLConn.Execute('select f.id, f.position, f.name, f.description, f.can_input, '
		+' f.can_edit, f.show_in_grid, f.show_in_details, f.is_mean, f.autocalculated, f.required, tables.name tablename, domains.name domainname'
		+' from fields f left join tables on f.table_id=tables.id '
		+' left join domains on f.domain_id=domains.id order by tables.name, domains.name ', nil, results);


Ошибка все равно возникает (правильный вариант вопроса на http://hashcode.ru/questions/177590/delphi-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-%D0%BF%D0%BE%D0%BB%D1%8F%D0%BC-%D1%81-%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D1%8F%D1%8E%D1%89%D0%B8%D0%BC%D0%B8%D1%81%D1%8F-%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8). Поэтому дело не в первичной опечатке.
...
Рейтинг: 0 / 0
25.12.2012, 20:44
    #38092560
vlad52
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к полям с повторяющимися названиями
vlad52,

простите также ошибся в спешке
Код: pascal
1.
2.
	Name1:=results.FieldByName('tablename');
	Name2:=results.FieldByName('domainname');


Но ошибка все равно возникает. Это чисто из-за неправильного копипаста я вас дезинвформировал, но проблема остается, ошибка по-прежнему возникает.
...
Рейтинг: 0 / 0
26.12.2012, 21:14
    #38094133
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к полям с повторяющимися названиями
Задай псевдонимы для колонок и все.
select somefield as ABC, otherfield as DEF ...
А еще к колонкам рекордсета можно обращаться по номеру.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Доступ к полям с повторяющимися названиями / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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