DJ_FleX
Messages postés29Date d'inscriptionsamedi 1 novembre 2003StatutMembreDernière intervention 8 février 2007
-
23 avril 2006 à 10:56
haplo67
Messages postés31Date d'inscriptionmercredi 4 janvier 2006StatutMembreDernière intervention 4 juillet 2007
-
29 avril 2006 à 22:36
Bonjour,
Cela fait quelques jours que je me creuse la tête pour trouver un algorythme me permettant de transformer des requetes en lagage algébrique (par exemple : R1 = projection Table (attribut) R2 selection R1 (attribut "10")
Ceci a pour but bien evidement d'afficher le résultat de la requete dans une datagrid
Mon programme est adapté pour n'importe qu'elle base access, et le nombre de requetes peut etre illimitée. J'ai déjà fait la partie analyse sémantique des requetes algébriques et l'exécution des requetes sql dans la base access. Mais il me manque le milieu
cs_Axel971
Messages postés51Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention 9 août 2006 23 avril 2006 à 16:31
Salut,
Interessant ce que tu veux faire, çà peut être simple si les requêtes algébriques restent simple, mais si elles sont plus complexes je pense que tu vas galérer. Sinon si ce ne sont que des projection et des selection ca ne me semble pas trop compliqué a réaliser.
Dans un premier temps il faudrait créer une tableau les_tables (chaine de caractères string) un tableau les_champs, et un tableau les restrictions ou selection les_restrictions.
Ensuite il faudrait parcourir tes requêtes algébriques en utilisant de sfonctions de manipulations de chaine de caractères et récupérer à chaque fois, table, champ et restriction.
Ensuite tu reconstruis ta requêtes SQL en commencant par le tableau les_champs
exemple :
marequete = "SELECT ";
Tant que les_champs Faire
marequete = les_champs[i];
FTQ
et ainsi de suite pour les tables et pour les restrictions.
Mais franchement ce sera tranquil pour des requetes simples, mais pour le reste
DJ_FleX
Messages postés29Date d'inscriptionsamedi 1 novembre 2003StatutMembreDernière intervention 8 février 2007 23 avril 2006 à 19:36
Oui c'est sur, mais j'ai aussi l'opérateur JOINTURE, UNION, INTERSECTION, DIFFERENCE, PRODUIT. en langage algébrique c'est facil suffit de faire ligne a ligne, mais en sql c'est différent ... la derniere projection doit se retrouver au niveau du select etc ... y'a pas d'ordre précis.
Alors j'avais penser à effectuer chaque requete algébrique (transformée en sql) les une a la suite des autres, mais le probleme est le suivant:
imaginons R1 selection client (ville "paris")
R2 = projection R1 (nom)
Ce qui donnerait si on les fait les unes a la suite des autres
pour R1 :
select *
from client
where ville = 'PARIS'
et pour R2
select nom
from ??????
si tu pouvais juste me dire si y'a moyen de faire comme ca, alors j'ai trouver ma solution, sinon je suis dans la *****
J'ai deja réussi a tout découper, récupéré les noms de tables et attributs de chacune présente dans la bas, vérifié que les nom s des tables et attributs existent bien, j'ai aussi fait la fin du programme, c'est a dire envoyer la requete et recevoir et afficher le résultat. Il me manque plus que la transformation
cs_Axel971
Messages postés51Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention 9 août 2006 23 avril 2006 à 22:52
Euh je vois pas trop le problème ..., moi je préconisais de récupérer les tables, les champs, mais aussi les restrictions. donc dance le cas que tu proposes dans le tableau restriction il y aurai ville="paris" et dans le tableau champ (champ a afficher) il y aurait nom donc en reconstruisant en sql je ne vois pas trop le problème.Si c'est la première restriction tu met where ... pour les autres tu met and ...
tu disais que ct la dernière projection qu'il fallait prendre en compte ben dans ce cas tu ne prend que les champs de la dernière projection... et les autres tu les utilises uniquement dans tes restrictions ou selections (j'ai jamais compris pourquoi ils ont appelé ca sélection sachant qu'en sql select c'est une projection m'enfin)...
Je sais pas si tu as bien compris ce que je voulais dire ... tiens moi au courant
cs_Axel971
Messages postés51Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention 9 août 2006 23 avril 2006 à 22:56
J'ai une idée qui me tourne dans la tête ta méthode peut être aussi bonne mais je ne sais pas si tous les sgbd acceptent ce genre de requêtes sql, j'en ai fais je crois sur PostgreSQL. En fait il est possible pour reprendre ton exemple de faire des requêtes du style:
SELECT nom FROM (SELECT * FROM client WHERE ville="paris") R1;
Cela permettrait de traiter les requêtes une par une mais je ne sais pas si ca fonctionnerais aussi bien dans tous les types de requêtes , voilà ciao
Vous n’avez pas trouvé la réponse que vous recherchez ?
=187611 DJ_FleX, la technique d'516584 Axel971 n'était pas mauvaise, mais elle n'est pas complètement compatible avec toutes les bases de données (Access, par exemple, n'exécutera pas un traitement de lots SQL me semble-t-il. Donc si tu fais 2 projections sans aucun lien entre elle, Access n'en exécutera qu'une!).
=2359 Renfield préconise de t'appuyer sur le moteur d'exécution du langage VB (et les objets d'accès aux données, bien entendu), et c'est, à mon avis aussi, un bon choix. Dans ton exemple R1 est un recordset résultant de la 1ère sélection, et il est la source de la projection suivante.
Mais c'est là qu'intervient une difficulté supplémentaire.
En effet, dans le cas d'une imbrication de plusieurs opérations algébriques, tu risques de retrouver avec des tas de curseurs (et autant de recordset) dans tous les sens, et une foison d'algorithmes à optimiser toi-même (tu perds l'optimisation native d'un moteur SQL, autant dire que tu perds beaucoup).
Il conviendrait mieux alors de, systématiquement, créer une table temporaire du résultat de tes opérations (à chacune d'entre elles). Et comme, ce n'est une sinécure en s'appuyant sur VB (problèmes d'ordre de création de règles d'intégrité sur toute la structure de la table, et taille du code à fournir), il te serait plutôt utile de demander à SQL de le faire (en implémentant tout le temps un INSERT INTO, pour chaque opération algébrique traduite).
Ensuite, il ne reste, à ta charge, qu'une gestion des diverses tables temporaires créées par tes opérations, pour éviter que la base de données n'explose. Pour cela, tu pourrais gérer une entité transactionnelle qui encapsulerait un traitement de lots (un groupe d'opérations traduites), et affecter aux tables temporaires une durée de vie, une portée,une visibilité... (comme des variables).
Cependant, tu dis avoir conçu la partie exécution des requêtes SQL. Il est donc important que tu nous dises quel choix technique tu as retenu pour ce faire.
à+
rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
blankoworld
Messages postés3Date d'inscriptionsamedi 22 avril 2006StatutMembreDernière intervention29 avril 2006 27 avril 2006 à 10:08
Bien je ne sais pas, mais cela fonctionne. On a une console DOS qui s'ouvre, demande une phrase, on écrit R1 = PROJECTION BUREAU (Attribut1, Attribut) par exemple, et lui il ressort SELECT Attribut1, Attribut FROM BUREAU;
Evidemment avant ce programme il en faut un autre qui vérifie la syntaxe, c'est pour cela que je montre la syntaxe sur laquelle je me suis basée, une seule faute d'espace et le programme plante lamentablement (du moins je crois, je me suis pas amusé à entrer des données fausses ...)
c'est juste pour savoir où on en est, je m'attendais à voir un moteur d'exécution, et je vois un moteur de génération de requête! d'où ma question.
Remarque constructive :
on peut critiquer la répartition des portées des variables, les variables globales, c'est pas l'idéal, surtout si tu utilises un langage fort en objet (un framework fort en objet), c'est dommage de démarrer sur une structure procédurale.
Donc, conseil avant que tu en ais écrit beaucoup, penses tout de suite en objet, et architectures en conséquence, ça t'évitera beaucoup de boulot plus tard. Qu'en penses-tu?
à+
rvblogn
<sup>
</sup><sup>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</sup>
DJ_FleX
Messages postés29Date d'inscriptionsamedi 1 novembre 2003StatutMembreDernière intervention 8 février 2007 27 avril 2006 à 20:00
lol non, je suis pas blankoworld :). Mais c'est un projet à 3. Et comme on savait pas trop comment faire vis a vis de cette transformation j'ai posé la question, mais c'est blanko qui bosse dessus, moi j'moccupe de l'analyse syntaxique
DJ_FleX
Messages postés29Date d'inscriptionsamedi 1 novembre 2003StatutMembreDernière intervention 8 février 2007 28 avril 2006 à 11:54
un cadeau d'une note .... mais bon, au moins on apprend c'est ce qui compte.
le projet est en form VB.NET mais bon blanko a tout compris et il nous le fait en mode console :)
ce qui nous obligera de retravailler sa partie.
et qui plus est, il a utilisé une syntaxe autre que celle choisie à la base. Vraiment dans son monde et rien a foutre des autres ...
Bref, finalement le projet touche bientot au but et c'est le principal !
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 28 avril 2006 à 12:04
ce qui a de bien dans les équipes forcées, c'est qu'on voit toujours rapidement les qualités qu'on aprécie le plus chez les autres, et les défauts que l'on a soit même :)
rvblogn
<sup>
</sup><sup>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</sup>
haplo67
Messages postés31Date d'inscriptionmercredi 4 janvier 2006StatutMembreDernière intervention 4 juillet 20072 29 avril 2006 à 19:57
Salut a tous, je suis le 3e faisant partie du projet. J'ai une question : en utilisant le programme VB qui transforme les commandes d'algebre relationnelle en requetes SQL, je voudrais ajouter la requete créée à la base access sur laquelle je travaille. Quelqu'un connait il le code qui permette d'effectuer cette action? Merci d'avance!