Fusion de 2 requetes en une seule

[Résolu]
Signaler
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009
-
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
-
Bonjour,

Je souhaiterais fusionner 2 requêtes d'une base Access en une seule afin de pouvoir l'exploiter directement dans un DataSet (pour pouvoir ensuite le lier à un Datagrid).
Les requêtes sont les suivantes :



Requete1 :

Extraction d'une liste de X (ici 2) derniers enregistrements les plus récent d'une table.
Récupération d'une date, d'un numéro de bon et d'un numéro unique d'enregistrement.


SELECT TOP 2 DateValue([Livraison]![Date_livraison]) AS Expr1, LISTE_ARTICLE.Numero_bon, Livraison.Numero FROM Livraison INNER JOIN LISTE_ARTICLE ON Livraison.Numero_bon = LISTE_ARTICLE.Numero_bon GROUP BY DateValue([Livraison]![Date_livraison]), LISTE_ARTICLE.Numero_bon, Livraison.Numero, Livraison.Code_Client
HAVING (((Livraison.Code_Client)=208)) ORDER BY DateValue([Livraison]![Date_livraison]) DESC





Requete2 :
Extraction de la liste des articles (code article, libellé et quantité) contenu dans la table LISTE_ARTICLE, en fonction de la liste des numéros unique trouvée à partir de la requête 1


SELECT Liste_last_BL.Expr1, LISTE_ARTICLE.Numero_bon, LISTE_ARTICLE.Code_Article, LISTE_ARTICLE.Libellé, LISTE_ARTICLE.Quantité
FROM Liste_last_BL INNER JOIN LISTE_ARTICLE ON Liste_last_BL.Numero = LISTE_ARTICLE.Numero
ORDER BY Liste_last_BL.Expr1 DESC;




Merci d'avance...

10 réponses

Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonsoir,
ça a donc l' air de marcher !
Pour le temps de réponse, cela dépend de l' ordennoncement dans ta table livraison
selon que ce que tu cherches en premier: Numero_bon ou Client.
Ta table doit donc être triée

 soit:
- Date_livraison
- Code_Client
- Numero_bon

Soit:
- Date_livraison
- Numero_bon
- Code_Client

D' un autre côté, il faut savoir que parfois le tri sur une requete ([Livraison]![Date_livraison] DESC ,  en occurence) ralenti  cinsidérableùment l' exécussion.

Il faut donc savoir "jongler" avec les deux pour optimiser le temps de réponse.

Bonne continuation.

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Salut,

Tu as donc en tout et pour tout 2 tables :
Livraison et LISTE_ARTICLE
-Liées sur Livraison.Numero_bon pour la 1° requete
-Et sur LISTE_ARTICLE.Numero pour la 2°


Et d' après son nom, Liste_last_BL représente le Dernier
Bl , il suffit sonc d' inclure les champs de la 2° requete dans
la partue SELECT de la première avec l' expression de regroupement Last pour chacun des champs /
Numero_bon, Code_Article, ibellé, Quantité
de la table LISTE_ARTICLE .


SELECT TOP 2 DateValue([Livraison]![Date_livraison]) AS Expr1, LISTE_ARTICLE.Numero_bon, Livraison.Numero,
Last(Livraison.Numero_bon), Last(Livraison.Code_Article), Last(Livraison.ibellé) Last(Livraison.Quantité ) From Livraison INNER JOIN LISTE_ARTICLE ON Livraison.Numero_bon = LISTE_ARTICLE.Numero_bon GROUP BY DateValue([Livraison]![Date_livraison]), Last(Livraison.Numero_bon), Last(Livraison.Code_Article), Last(Livraison.ibellé), Last(Livraison.Quantité )


Sans conviction niveau synthaxe mais l' idée est là !
A tester donc..





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009

Je te remercie Libre_Max,

J'avais bien pensé également à cela mais, le regroupement ne fonctionne pas et l'ordre d'extraction des enregistrements n'est pas respecté.
Après quelques petites corrections de ton code, je viens de tester sous Access et il y a une erreur concernant l'impossibilité d'avoir une fonction d'agrégat dans la cause Group BY (Last(Livraison.Numero_bon).






J'ai migré ces requêtes sous Access de façon à pouvoir illustrer les structures des tables et les résultats attendues avec quelques données mais, n'étant pas un utilisateur fréquent de ce forum (pourtant très intéressant et je vais m'y mettre !), je ne sais pas comment envoyer ces copies d'écran.






Merci encore...
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Après refléxion, la jointure étant sur code article, il faudra donc mettre :
...INNER JOIN LISTE_ARTICLE ON Livraison.Code_Article= LISTE_ARTICLE.Code_Article GROUP BY ...
<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
poste croisé, ma page ne s' est pas rafraichie, j' ai pas vu ta réponse.
Concernant l' erreur, il faudra enlever tout ce qui est Last dans la partie GROUP BY..

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Pour les captures, déposes les sur un site (http://www.imagup.com) par exemple.

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009

Merci Libre_MAx,

La jointure se fait bien par rapport au numéro du bon (numéro unique auto crée dans la table livraison et inscrit dans la table Article).
Pour les copies d'écran, voici les url :

Structure Requete 1 : http://www.imagup.com/imgs/1221115912.html
Exemple de données requete 1 : http://www.imagup.com/imgs/1221116003.html
Structure requete 2 : http://www.imagup.com/imgs/1221116044.html
Résultat attendu : http://www.imagup.com/imgs/1221116636.html

J'espère que cela sera plus clair pour toi !!
Merci encore
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonjour,
Désolé pour ce retard. J' avais plus de connection toute la journée d' hier.


Je pense avoir compris ce que tu cherches à avoir.
D' après ce que j' ai vu,tu n' as pas besoin de passer par le regroupement.
Puisque pour chaque bon tu veux avoir le détail.
Le plus important pour toi c' était le choix du client et le nombre de bl que tu veux avoir.
Pour le client, c' est facile.Par contre pour le nombre,c' est pas faisable à travers la requete.
Mais tu peux le faire après renvoi du résultat.Tu choisis alors l' affichage d' un nombre déterminé.
Autre solution tu spécifies dans ta requete une plage de date.


Et voilà ce que je te propose:
Dans Accessn tu crées une nouvelle requete.
1* Ajoutes table Linraison puis table Articles
2* Etablis une jointure sur Numero_bon
3* De la table Livraison, dais glisser, dans cet ordre les champs :


- Date_livraison
- Code_Client
- Numero_bon
 


4* De la table Liste_Article


-  Code_Article
-  Libelle
-  Quantité
 
Ensuite tu passes au critère.
-Choisis pour date une limite (11/08/2008 pa exemple)
-Choisis pour Client le code (208)


Et sur la colonne Date, tu tries en decroissant.


Enregistres ta requete, zet exécute la dans Access.
Si elle marche, passes en mode sql et copies l' expression.


A+


Pour les captures je n' ai pu les voir toutes






       
<hr />



[] Ce qui va sans dire. va mieux en le disant.


<hr />
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Pour avoir le dernier bl pour chaque client :
-Click droit sur la 1 ière colonne (date_livraisin) puis sur regroupement.
-Dans la colonne Numero_bon, tu changes regroupement par Dernier.
Et c' est tout ! Tu ne touches à rien pour les autres colonnes.

Bien sûr, cette phase viendera après avoir fait riut ce qui a été dit dans pour la première.
(message juste avant celui-ci ).
<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
Messages postés
11
Date d'inscription
vendredi 24 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2009

Bonjour Libre_Max,
Je te remercie pour ta réponse.
Je vais essayer tout cela et te tiens au courant...
Pour info, j'ai réalisé une classe dans VB.net dans laquelle j'ai les 3 fonctions suivantes :

 Public Overloads Function Get_CLIENT_ALL_BL(ByVal Code_Client As Integer) As DataSet

        Dim conn As OleDb.OleDbConnection = Mod_BDD.GetConnection("BL MDB")
        Try
            Dim ds As New DataSet
            Dim da_B As OleDb.OleDbDataAdapter

            Dim requete2$ = "SELECT DateValue([Livraison]![Date_livraison]) AS Expr1, LISTE_ARTICLE.Numero_bon, Livraison.Numero"            Dim requeteB$ requete2$ & " FROM Livraison INNER JOIN LISTE_ARTICLE ON Livraison.Numero_bon LISTE_ARTICLE.Numero_bon"
            requeteB$ = requeteB$ & " GROUP BY DateValue([Livraison]![Date_livraison]), LISTE_ARTICLE.Numero_bon, Livraison.Numero, Livraison.Code_Client"            requeteB$ requeteB$ & " HAVING(((Livraison.Code_Client) " & Trim(Str(Code_Client)) & ")) ORDER BY DateValue([Livraison]![Date_livraison]) DESC"

            da_B = New OleDb.OleDbDataAdapter(requeteB$, conn)
            Try
                da_B.Fill(ds, "TABLE ALL")
            Finally
                da_B.Dispose()
            End Try
            Me.m_ACCESS_BL_Total_Bon = ds.Tables("TABLE ALL").Rows.Count
            Return ds
        Finally
            conn.Close()
            conn.Dispose()
        End Try
    End Function

Public Overloads Function Get_CLIENT_LAST_BL(ByVal X_LAST_RECORDS As Integer, ByVal Code_Client As Integer) As DataSet

        Dim conn As OleDb.OleDbConnection = Mod_BDD.GetConnection("BL MDB")
        Try
            Dim ds As New DataSet
            Dim da_A As OleDb.OleDbDataAdapter
            Dim requete1$ = "SELECT TOP " & Trim(Str(X_LAST_RECORDS)) & " DateValue([Livraison]![Date_livraison]) AS Expr1, LISTE_ARTICLE.Numero_bon, Livraison.Numero"            Dim requeteA$ requete1$ & " FROM Livraison INNER JOIN LISTE_ARTICLE ON Livraison.Numero_bon LISTE_ARTICLE.Numero_bon"
            requeteA$ = requeteA$ & " GROUP BY DateValue([Livraison]![Date_livraison]), LISTE_ARTICLE.Numero_bon, Livraison.Numero, Livraison.Code_Client"            requeteA$ requeteA$ & " HAVING(((Livraison.Code_Client) " & Trim(Str(Code_Client)) & ")) ORDER BY DateValue([Livraison]![Date_livraison]) DESC"
            da_A = New OleDb.OleDbDataAdapter(requeteA$, conn)
            Try
                da_A.Fill(ds, "TABLE")
            Finally
                da_A.Dispose()
            End Try
            Return ds
        Finally
            conn.Close()
            conn.Dispose()
        End Try
    End Function

Public Overloads Function Get_CLIENT_LAST_ARTICLES(ByVal LE_RECORDS As Long) As DataSet
        Dim conn As OleDb.OleDbConnection = Mod_BDD.GetConnection("BL MDB")
        Try
            Dim ds As New DataSet
            Dim requete1$ "SELECT Numero_bon, Code_Article, Libellé, Quantité FROM LISTE_ARTICLE WHERE Numero " & Trim(Str(LE_RECORDS))
            Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(requete1$, conn)
            Try
                da.Fill(ds, "TABLE_DETAIL")
            Finally
                da.Dispose()
            End Try
            Return ds
        Finally
            conn.Close()
            conn.Dispose()
        End Try
    End Function

A l'ouverture de mon formulaire, je connais le numéro du client...Je recherche donc tous les bon de livraison rattaché au client dans un DataSet
        dsLAST_LAST_BON_CLIENT = CLASS_ACCESS_BL_DATA.Data_ACCESS_BL.Get_CLIENT_ALL_BL(CInt(Me.Cmb_Code_Client.Text))
que j'affecte ensuite à un DataGridView.
L'événement "CellClick" de ce DataGridView déclenche ensuite l'appel à la fonction de détail suivante :
   Private Sub DGV_LST_LAST_BON_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_LST_LAST_BON.CellClick
        '-----------------------------------------------------------------------------------------------
        'Affichage des articles de la liste des derniers bons
        '-----------------------------------------------------------------------------------------------
        If e.RowIndex < 0 Then Return
        Dim value As Object = DGV_LST_LAST_BON.Rows(e.RowIndex).Cells(2).Value
        If value.GetType Is GetType(DBNull) Then Return

        Dim Id_NumDetail = CType(value, Long)
        dsLAST_LAST_ARTICLE_CLIENT = CLASS_ACCESS_BL_DATA.Data_ACCESS_BL.Get_CLIENT_LAST_ARTICLES(Id_NumDetail)
        Me.DGV_LST_LAST_ARTICLES.DataSource = dsLAST_LAST_ARTICLE_CLIENT.Tables("TABLE_DETAIL")
        Me.DGV_LST_LAST_ARTICLES.Columns(0).Visible = False
        Me.DGV_LST_LAST_ARTICLES.Columns(1).HeaderText = "Code"
        Me.DGV_LST_LAST_ARTICLES.Columns(2).HeaderText = "Libellé"
        Me.DGV_LST_LAST_ARTICLES.Columns(3).HeaderText = "Qté"
        Me.DGV_LST_LAST_ARTICLES.ClearSelection()
    End Sub

La fonction Get_CLIENT_LAST_BL serviera dans un second temps.

Cela fonctionne pas mal et les temps de réponse sont pour le moment acceptable.
Merci en tous les cas pour tes réponses  !!!
@+