Arkezis Posté(e) 21 février 2011 Posté(e) 21 février 2011 Bonsoir à tous, J'essaye de réaliser cette requête, mais à priori, cela semble impossible : return db.rawQuery("SELECT transactions._id, utilisateurs._id, SUM(transactions.montantTransaction) as total , utilisateurs.nomUtilisateur FROM transactions " + "JOIN utilisateurs ON utilisateurs._id=transactions.idUtilisateurTransaction " + "WHERE transactions.idUtilisateurTransaction=" + argument + " GROUP BY utilisateurs.nomUtilisateur, transactions._id, utilisateurs._id" , null); En y allant à tatons, je me suis rendu compte que je pouvais aller jusqu'ici : return db.rawQuery("SELECT transactions._id, utilisateurs._id, utilisateurs.nomUtilisateur FROM transactions " + "JOIN utilisateurs ON utilisateurs._id=transactions.idUtilisateurTransaction " + "WHERE transactions.idFichierTransaction=" + argument + " GROUP BY utilisateurs.nomUtilisateur, transactions._id, utilisateurs._id" , null); Mais que dès que je rajoutais ma fonction d'agrégat, ça ne fonctionnait plus ! En effet, dans ce cas, j'ai droit à cette erreur : 02-21 18:08:41.705: ERROR/AndroidRuntime(862): java.lang.IllegalArgumentException: column '_id' does not exist Cependant, dans mon GROUP BY, je fais bien apparaître mes 2 champs _id de mes 2 tables... Si, c'est effectivement impossible de le faire par ce moyen, comment puis je faire ? Merki :)
chpil Posté(e) 21 février 2011 Posté(e) 21 février 2011 Est-ce que, par hasard, tu injectes le Cursor résultant de rawQuery dans un Adapter ? Parce que ce genre d'erreur est plutôt généré par un Cursor; ça ne serait pas forcément un problème de requête impossible, mais plutôt d'incompatibilité de la requête avec un Cursor...
Arkezis Posté(e) 21 février 2011 Auteur Posté(e) 21 février 2011 Est-ce que, par hasard, tu injectes le Cursor résultant de rawQuery dans un Adapter ? Parce que ce genre d'erreur est plutôt généré par un Cursor; ça ne serait pas forcément un problème de requête impossible, mais plutôt d'incompatibilité de la requête avec un Cursor... Très bonne remarque ! Effectivement, tu vises dans le mille ! Voici ce que je fais avec lerésultat (qui vient de recuprererRecapParFichier()) : Cursor c = db.recupererRecapParFichier(argument); startManagingCursor(c); SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listrecapfichier, c, new String[]{"utilisateurs.nomUtilisateur"}, new int[] {R.id.listTotal}); this.getListView().setAdapter(adapter); Cependant, comme ma requête est censée me retourner plusieurs lignes, que dois je utiliser à la place d'un cursor ? Merci à toi en tout cas ! :)
chpil Posté(e) 22 février 2011 Posté(e) 22 février 2011 En fait le problème n'est pas, à la base, le Cursor, mais le CursorAdapter, qui a besoin d'une colonne nommée _id dans la réponse du Cursor, pour pouvoir fonctionner. Dans ton cas, tu n'as pas de telle colonne dans ton résultat (tes colonnes étant nommées 'transactions._id', 'utilisateurs._id' et 'utilisateurs.nom') (Ceci-dit, c'est le cas dans les deux exemples de requêtes que tu donnes, y compris celle qui fonctionne, ce qui est en contradiction avec mon explication... ) Tu peux peut-être résoudre ton problème en donnant des alias à tes colonnes de résultat. Ce qui donnerai return db.rawQuery("SELECT transactions._id as _id, utilisateurs._id as userId, SUM(transactions.montantTransaction) as total , utilisateurs.nomUtilisateur FROM transactions " + "JOIN utilisateurs ON utilisateurs._id=transactions.idUtilisateurTransaction " + "WHERE transactions.idUtilisateurTransaction=" + argument + " GROUP BY utilisateurs.nomUtilisateur, transactions._id, utilisateurs._id" , null);
Arkezis Posté(e) 22 février 2011 Auteur Posté(e) 22 février 2011 En fait le problème n'est pas, à la base, le Cursor, mais le CursorAdapter, qui a besoin d'une colonne nommée _id dans la réponse du Cursor, pour pouvoir fonctionner. Dans ton cas, tu n'as pas de telle colonne dans ton résultat (tes colonnes étant nommées 'transactions._id', 'utilisateurs._id' et 'utilisateurs.nom') (Ceci-dit, c'est le cas dans les deux exemples de requêtes que tu donnes, y compris celle qui fonctionne, ce qui est en contradiction avec mon explication... ) Tu peux peut-être résoudre ton problème en donnant des alias à tes colonnes de résultat. Ce qui donnerai return db.rawQuery("SELECT transactions._id as _id, utilisateurs._id as userId, SUM(transactions.montantTransaction) as total , utilisateurs.nomUtilisateur FROM transactions " + "JOIN utilisateurs ON utilisateurs._id=transactions.idUtilisateurTransaction " + "WHERE transactions.idUtilisateurTransaction=" + argument + " GROUP BY utilisateurs.nomUtilisateur, transactions._id, utilisateurs._id" , null); Effectivement, le problème venait du fait que _id n'existait pas ... (à force de triturer la requête dans tout les sens, on en perd l'essentiel !) Ceci dit, ce qui est étrange, c'est qu'un champ _id est obligatoire, même si c'est juste l'alias du champ... Donc je comprend pas trop le pourquoi du comment... M'enfin ! Pour ceux que ça pourrait titiller : return db.rawQuery("SELECT SUM(transactions.montantTransaction) as total , utilisateurs.nomUtilisateur as _id FROM transactions " + "JOIN utilisateurs ON utilisateurs._id=transactions.idUtilisateurTransaction " + "WHERE transactions.idFichierTransaction=" + argument + " GROUP BY utilisateurs.nomUtilisateur" , null); Merci chpil, tu as été le plus rapide ;-) (http://stackoverflow.com/questions/5081096/android-query-with-2-linked-tables-and-1-aggregate-function-sum-cant-be-used)
Orel Posté(e) 3 mai 2011 Posté(e) 3 mai 2011 En fait le problème n'est pas, à la base, le Cursor, mais le CursorAdapter, qui a besoin d'une colonne nommée _id dans la réponse du Cursor, pour pouvoir fonctionner. Dans ton cas, tu n'as pas de telle colonne dans ton résultat (tes colonnes étant nommées 'transactions._id', 'utilisateurs._id' et 'utilisateurs.nom') (Ceci-dit, c'est le cas dans les deux exemples de requêtes que tu donnes, y compris celle qui fonctionne, ce qui est en contradiction avec mon explication... ) Tu peux peut-être résoudre ton problème en donnant des alias à tes colonnes de résultat. Ce qui donnerai return db.rawQuery("SELECT transactions._id as _id, utilisateurs._id as userId, SUM(transactions.montantTransaction) as total , utilisateurs.nomUtilisateur FROM transactions " + "JOIN utilisateurs ON utilisateurs._id=transactions.idUtilisateurTransaction " + "WHERE transactions.idUtilisateurTransaction=" + argument + " GROUP BY utilisateurs.nomUtilisateur, transactions._id, utilisateurs._id" , null); Merci chpil tu viens de me dépanner d'un lourd poids :P
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.