2015-10-08 3 views
0

Salut les gars j'ai écrit une fonction qui doit vérifier l'ID donnée à la fonction comme iID puis sortie le nom du membre de celui-ci se trouve, sinon il doit la sortie qu'il ne se trouve pasne peut pas effectuer cette opération sur un jeu de données ouvert/fermé?

Un autre la table est active lorsque cette fonction est appelée donc il faut changer la table Members (pour rechercher l'ID), puis de nouveau par la suite (j'ai plusieurs tables)

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; 

mais le problème est à chaque fois que j'appelle cette fonction Je reçois une erreur qui dit "Impossible d'effectuer cette opération sur un dataset ouvert"

si je ferme l'ensemble de données avant d'exécuter la fonction je reçois "Impossible d'effectuer cette opération sur un ensemble de données fermé"

Je sais que l'erreur se produit lorsque j'essaie d'accéder au nom de la table ou de la changer (la fonction ne donne pas l'erreur lors de ces 3 lignes sont commentées)

Je ne sais pas comment faire ce travail toute aide serait grandement appréciée

+1

Utilisez une requête préparée pour ce genre d'opérations –

+0

Je suis désolé mais je ne sais pas ce que vous entendez par là – RaymondSWalters

+2

Votre approche est tout à fait tort, imo: a) vous semblez ignorer que vous pouvez avoir plus d'une table ouverte en même temps; b) Ne modifiez pas TableName d'une table pour accéder à une table différente dans la base de données, utilisez plutôt un composant Table distinct; c) Vous effectuez une localisation sur un ensemble de données dans un module de données, mais regardez les données depuis une autre table dans un autre module de données. Je pense que ce serait mieux si vous étudiez un tutoriel Delphi db en ligne de base et recommencez. – MartynA

Répondre

2

Exemple:

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

simp le solution

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

Désolé, je pense que pour un débutant comme le PO, l'utilisation du même jeu de données pour accéder à différents jeux de données ne va que susciter la confusion et l'incompréhension. Pourquoi ne pas simplement utiliser un autre TDataSet? Je suppose que "IBTable1" est une faute de frappe? – MartynA

+0

@MartynA Je suis d'accord avec vous. J'ai maintenant différents composants de table avec leur propre dat comme onces – RaymondSWalters

+0

@MartynA Totalement vrai. Mais ce n'est qu'un exemple d'où ils viennent des messages d'erreur. –