2013-07-08 1 views
0

J'essaie de filtrer un TDBGrid via un TEdit, en gérant l'événement TEditonChange. J'ai TIBQuery à la liste tous les enregistrements de la grille:Modifier la requête de base de données à l'exécution

SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto; 

Lorsque l'utilisateur insère des caractères dans le TEdit, la grille doit être actualisé par le champ Cliente.

Mon code essaie de le faire, mais lorsqu'il exécute le gestionnaire, la requête renvoie un jeu de résultats vide. J'utilise Firebird 2.5 et IB Components.

pertinentes du Code:

query := Self.qryTodos; 
query.Close(); 
query.SQL.Clear(); 
query.SQL.Add('SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto WHERE cliente LIKE :Cliente'); 
query.ParamByName('Cliente').AsString := QuotedStr('%'+Self.busqueda.Text+'%'); 
query.Open(); 
DMConnect.Transaction.Commit(); 
+1

Supprimez/commentez la dernière ligne ('DMConnect.Transaction.Commit();') et réessayez. En validant la transaction, vous fermez implicitement tous les ensembles de données attachés. – LightBulb

Répondre

2

Vous n'avez pas besoin QuotedStr lorsque vous fournir des paramètres de chaîne. En l'utilisant, vous le faites ne plus correspondre (par exemple "String" devient '' '% String%' '')

+0

J'essaie ce '... LIKE '+'% '' '+ Self.busqueda.Text +'% '' ''. Mais, le programme ¿crash? avec ce message: "Tentative d'exécution d'une instruction SQL dynamique non préparée" – ramiromd

+0

Problèmes de couple ici: si vous avez toujours le paramètre referent (: Cliente), la requête doit recevoir des valeurs de paramètre avant l'exécution. En outre, dans l'expression ci-dessus, vous ajoutez le caractère générique * avant * le guillemet ouvrant dans la chaîne: cela ne sera pas analysé correctement. En outre, en remarque, si votre valeur de chaîne contient des guillemets simples imbriqués, cette approche sera interrompue. Il est préférable d'utiliser des paramètres pour créer des chaînes de requête. – Curt

0

Si vous êtes autour de votre terme de recherche en% j'utiliserais la contenant la clause, donc vous pouvez écrire votre requête comme:

query := Self.qryTodos; 
query.Close(); 
query.SQL.Clear(); 
query.SQL.Add('SELECT id,obra,cliente,fecha,nro_estudio,sondeo FROM proyecto WHERE cliente CONTAINING :Cliente'); 
query.ParamByName('Cliente').AsString := Self.busqueda.Text; 
query.Open(); 

et de supprimer l'instruction Commit comme indiqué @LightBulb. Cela fonctionnera si vous souhaitez inclure le% dans votre terme de recherche pour une raison quelconque.

Questions connexes