2010-01-11 5 views
2

J'ai la requête SQL suivante que j'exécute et j'essaie de trouver pourquoi il renvoie l'erreur 'overflow' lors de l'exécution de la requête.Accéder à VBA - imprimer le dernier enregistrement de SQL Query

Maintenant je veux imprimer le dernier enregistrement qu'il calcule avant de déborder, est-ce possible en utilisant MS Access VBA?

Private Sub Command0_Click() 
Dim sql As String 
Dim rs As DAO.Recordset 
Dim db As DAO.Database 

    Set db = CurrentDb() 

    sql = "SELECT DatumNaarWeeknummer([tbl_ArtikelVerwijderdUitZaaglijst]![RegistratieDatum]) AS WeeknummerGezaagdeOmzet, " _ 
    & "Sum([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal]) AS GezaagdeOmzet " _ 
    & "FROM (((tbl_ArtikelsPerOrder LEFT JOIN qry_Actieve_Orders ON tbl_ArtikelsPerOrder.OrderID = qry_Actieve_Orders.OrderID) LEFT JOIN qry_ArtikelPerOrderID_EenheidsPrijsBijFranco ON tbl_ArtikelsPerOrder.ArtikelsPerOrderID = qry_ArtikelPerOrderID_EenheidsPrijsBijFranco.ArtikelsPerOrderID) " _ 
    & "LEFT JOIN qry_AantalArtikelTypesPerArtikelPerOrder ON tbl_ArtikelsPerOrder.ArtikelsPerOrderID = qry_AantalArtikelTypesPerArtikelPerOrder.ArtikelsPerOrderID) " _ 
    & "RIGHT JOIN tbl_ArtikelVerwijderdUitZaaglijst ON tbl_ArtikelsPerOrder.ArtikelsPerOrderID = tbl_ArtikelVerwijderdUitZaaglijst.ArtikelsPerOrderID " _ 
    & "GROUP BY DatumNaarWeeknummer([tbl_ArtikelVerwijderdUitZaaglijst]![RegistratieDatum]);" 

    Set rs = db.OpenRecordset(sql, dbOpenDynaset) 
    End Sub 

Répondre

1

(Edit: réarrangé pour se concentrer sur cause probable)

Non, vous ne pouvez pas obtenir le dernier enregistrement facilement. Vous pouvez essayer Select Top 5000 . . . etc., augmenter la valeur si cela fonctionne, et baisser la valeur si ce n'est pas le cas, et zéro dans le sens. Mais, il est peu probable qu'un enregistrement particulier provoque le problème. Je ne pense pas qu'il y ait mauvaises données quelque part. C'est la requête. Concentrez-vous sur la somme dans la requête select.

Sortez-le, et vous aurez probablement la requête fonctionne. Il se pourrait bien que la somme dépasse le type numérique utilisé par sql pour ajouter vos valeurs. En fait, plus j'y pense, c'est probablement ça. Ouais. Dans ce cas, vous devrez forcer ce à un type qui peut gérer un plus grand nombre, comme celui-ci:

SELECT blah blah, SUM(CAST([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal] AS DECIMAL)) AS GezaagdeOmzet

La syntaxe peut être légèrement différent pour MSAccess, mais ce sera quelque chose comme ça. Étant Access, la valeur par défaut peut être int, auquel cas vous pourrez spécifier Long. Sinon, spécifiez Decimal. Essayez d'éviter les nombres réels si vous le pouvez (simple, etc.) et ils peuvent vous déranger si vous ne faites pas attention.

Bien que moins probable, voici quelques autres coupables possibles:

  • Êtes-vous sûr que cette requête est logiquement correcte? Cette requête peut être provoquée par trop grand un jeu de résultats étant renvoyé. Utilisez la syntaxe Select Top 1000 etc., et analysez les résultats pour vous assurer que vos jointures fonctionnent comme vous le souhaitez, et ne sont pas par erreur provoquant cartesian résultats, par exemple pour .
  • Si votre requête renvoie des résultats légitimes , alors est-il possible que le résultat légitime soit trop important? Si vous devriez vraiment obtenir un résultat milliards, ce qui est trop beaucoup, alors vous devrez changer votre stratégie globale , ou de réduire les colonnes retournées, etc.
+0

La requête a fonctionné jusqu'à il y a quelques jours, puis de nouvelles données ont été ajoutées et elle a cessé de fonctionner ... –

+0

Gotcha. Ma conjecture (et j'imagine que Tomalak) est que les nouvelles données font que la somme est trop grande, plutôt que les données elles-mêmes sont mauvaises. Bien sûr, si vous aviez par erreur de nouveaux enregistrements, cela entraînerait aussi cela. –

1

Je pense que cette expression:

Sum([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal]) 

produit un dépassement numérique pour certains enregistrements. Sans savoir quels types de données vos colonnes utilisent, je ne peux que recommander de les convertir en un type de données "plus grand" pendant le calcul.

+0

De toute façon, je peux parcourir tous les enregistrements avec cette requête sql pour savoir où se trouve ce débordement pourrait être? –

+0

Convertissez simplement l'expression en un type de données plus grand. Vous devrez le faire de toute façon, éventuellement. Bien sûr, vous pouvez sélectionner tous les nombres individuellement et calculer le nombre dans une boucle VBA 'While Not rs.EOF ... Wend', mais cela ne règle pas votre requête. ;-) – Tomalak

+0

btw: quel type de données faut-il pour un nombre avec des charges de chiffres décimaux. La plupart de ces types de données sont Long Ints –

0

Est-il possible que la partie de la requête

([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal]) 

Renvoie 0?Si cela provoque une erreur, il peut s'agir de données trop importantes mais de données trop petites ou inexistantes.

+0

Oui, il est possible que certains d'entre eux sont 0. Comment pourrions-nous résoudre cela sans avoir à faire quelque chose de trop extrême? –

+0

Vous pourriez essayer de l'emballer avec une instruction iif par exemple IIf ([My_value] = 0, "mettre ce que vous voulez afficher si 0 est trouvé", "faites-vous ici la somme réelle") –

Questions connexes