2015-10-08 6 views
0

Привет ребята я написал функцию, которая имеет проверить идентификатор данную функцию в качестве iID и затем выводит имя члена он найден, в противном случае она должна выход, что он не найденне может выполнить эту операцию в открытом/закрытом наборе данных?

Различный таблица активна, когда эта функция вызывается, поэтому он должен изменить таблицу Members (для поиска идентификатора), а затем снова после этого (у меня есть несколько таблиц)

function fCheckID(iID:integer):String; 
var sTable:string; 
begin 
sTable:=datamoduleX.tableX.TableName; 
datamoduleX.tableX.TableName:='Members'; 
if datamoduleX.tableX.Locate('RefNo',iID,[]) then 
    result:=dmRooiX.tblRooiX['Name']+' '+datamoduleX.tableX['Surname'] 
    else 
    result:='ID: '+inttostr(iID)+' does not exist'; 
datamoduleX.tableX.TableName:=sTable; 
end; 

но проблема каждый раз, когда я называю эту функцию Я получаю сообщение об ошибке «Не удается выполнить эту операцию в открытом наборе данных»

, если я закрою набор данных, прежде чем запускать функцию, которую я получаю «Не удается выполнить эту операцию в закрытом наборе данных»

Я знаю, что ошибка возникает, когда я пытаюсь получить доступ к названию таблицы или ее изменить (функция не дает ошибка, когда эти 3 строки закомментированы)

Я понятия не имею, как сделать эту работу любая помощь будет принята с благодарностью

+1

Используйте подготовленный запрос для такого рода операций –

+0

мне очень жаль, но я не знаю, что вы имеете в виду, что – RaymondSWalters

+2

Ваш подход совершенно неправильно, IMO: а) вы, кажется, не знают, что вы можете одновременно открыть несколько таблиц; b) Не изменяйте TableName таблицы для доступа к другой таблице в базе данных, вместо этого используйте отдельный компонент Table; c) Вы выполняете поиск в наборе данных в одном datamodule, но затем смотрите данные из другой таблицы в другой формат данных. Я думаю, было бы лучше, если бы вы изучили базовый онлайн-курс Delphi db и начали снова. – MartynA

ответ

2

Пример:

Table1.TableName := 'TABLE1'; 
    Table1.Open; 
    Table1.TableName := 'TABLE2'; <-- Cannot perform this operation on Open data set. Because Table1 is open 
    Table1.Locate('ID',11,[]); 

простофиля ле решение

Table1.TableName := 'TABLE1'; 
Table1.Open; 
Table1.Close; <--Close table before change table name 
Table1.TableName := 'TABLE2'; 
Table1.Open; <-- Open new table before do Locate 
Table1.Locate('ID',11,[]); 
+2

Извините, я думаю, что для новичка, такого как OP, использование одного и того же компонента набора данных для доступа к различным наборам данных только вызовет путаницу и непонимание. Почему бы просто не использовать другой TDataSet? Я предполагаю, что «IBTable1» - опечатка? – MartynA

+0

@MartynA Я согласен с вами. У меня теперь разные компоненты таблицы с их собственными данными в виде унций – RaymondSWalters

+0

@MartynA Полностью верно. Но это всего лишь пример того, откуда они исходят из сообщений об ошибках. –