bounz_56
Messages postés11Date d'inscriptionvendredi 24 octobre 2003StatutMembreDernière intervention22 décembre 2009
-
11 sept. 2008 à 01:33
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 2012
-
14 sept. 2008 à 23:51
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;
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 14 sept. 2008 à 23:51
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.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 11 sept. 2008 à 05:42
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..
bounz_56
Messages postés11Date d'inscriptionvendredi 24 octobre 2003StatutMembreDernière intervention22 décembre 2009 11 sept. 2008 à 06:31
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.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 11 sept. 2008 à 06:33
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 />
Vous n’avez pas trouvé la réponse que vous recherchez ?
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 11 sept. 2008 à 06:38
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..
bounz_56
Messages postés11Date d'inscriptionvendredi 24 octobre 2003StatutMembreDernière intervention22 décembre 2009 11 sept. 2008 à 07:00
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 :
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 12 sept. 2008 à 14:01
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.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 12 sept. 2008 à 15:28
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 />
bounz_56
Messages postés11Date d'inscriptionvendredi 24 octobre 2003StatutMembreDernière intervention22 décembre 2009 14 sept. 2008 à 22:50
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 !!!
@+