Letzter EK über SQL-Statement

15. Februar 2010 16:02

Hallo zusammen,

für die Inventurbewertung benötige ich den letzten EK einer bestimmten Periode.
Das wollte ich so lösen:
Code:
SELECT     CONVERT(money, [Cost per Unit]) AS Letzter_EK, [Item No_], MAX([Posting Date]) AS LetztesEkDat
FROM         [db$Value Entry]
WHERE     ([Item Ledger Entry Type] = 0) AND ([Document Type] = 6) AND ([Posting Date] BETWEEN CONVERT(DATETIME, '2008-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2008-12-31 00:00:00', 102))
GROUP BY CONVERT(money, [Cost per Unit]), [Item No_]
HAVING      ([Item No_] = 'A169')


dabei erhalte ich zwei Sätze:
Code:
Letzter_EK   Item No_   LetztesEkDat
0,168   A169   2008-09-19 00:00:00.000
0,178   A169   2008-01-15 00:00:00.000


richtig wäre lediglich ein Satz und zwar den vom 19.09.2008

Kann mir jemand auf die Sprünge helfen?

Grüße aus der Pfalz
Shunkskill
Zuletzt geändert von shunkskill am 16. Februar 2010 08:33, insgesamt 4-mal geändert.

Re: Letzter EK über SQL-Statement

15. Februar 2010 16:57

Hi Shunkskill,

herzlich willkommen bei MSDynamics.de :-P

Versuch mal das:
Code:
SELECT TOP 1 CONVERT(money, [Cost per Unit]) AS Letzter_EK, [Item No_], [Posting Date] AS LetztesEkDat
FROM [dbo].[Häussling$Value Entry]
WHERE ([Item Ledger Entry Type] = 0) AND ([Document Type] = 6)
  AND ([Posting Date] BETWEEN CONVERT(DATETIME, '2008-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2008-12-31 00:00:00', 102))
  AND ([Item No_] = 'A169')
ORDER BY [Posting Date] DESC

Klappt das?

Gruß,
Jörg

Re: Letzter EK über SQL-Statement

16. Februar 2010 07:59

Guten Morgen Jörg,

"Select Top 1" in Verbindung mit der Order by-Klausel funktioniert in meinem Beispiel. Danke!

Leider habe ich der Einfachheit wegen in meinem Beispiel nur einen Artikel (A169) selektiert. Ich benötige jedoch zu jeden Artikel aus der Tabelle "Value Entry" den letzten Einkaufspreis in einem bestimmten Zeitraum.

Hat jemand eine Idee wie ich das in einem Rutsch abfragen kann?

Vielen Dank für die Unterstützung
Shunskill

Re: Letzter EK über SQL-Statement

16. Februar 2010 09:44

Hallo shunkskil,

ich glaube, dieses SQL-Statement ist ein bisschen zu einfach :wink:

Mal ganz davon abgesehen, das es Lagerorte und/oder Kostenstellen nicht berücksichtigt, geht es über das Buchungsdatum der Rechnung, und nicht der Lieferung. Ich denke der Preis wird auch bei euch am Lieferdatum festgemacht.

Sollte irgend jemand einen Zuschlag (z.B. Frachtrechnung) auf diesen Artikel gebucht haben, bekommst du den Frachtbetrag als EK-Preis gemeldet :-( .
Benötigst du den effektiven Einstandspreis eines Artikels (d.h. inkl. aller Kosten), musst du über die Artikelposten gehen, und die Wertposten pro Artikelposten aufaddieren, und dann durch die Menge teilen. (was in NAV mit Flowfields mit wenig Aufwand erledigen kann :wink: )

Gruß, Fiddi

Re: Letzter EK über SQL-Statement

16. Februar 2010 10:05

Habe eine Unterabfrage eingebaut und bin momentan ganz zufrieden mit dem Ergebnis:
Code:
SELECT     unterabfrage.*, CONVERT(money, [Cost per Unit]) AS Letzter_EK
FROM         
  (SELECT     [Item No_], MAX([Posting Date]) AS LetztesEkDat
  FROM         [db$Value Entry]
  WHERE     ([Item Ledger Entry Type] = 0) AND ([Document Type] = 6) AND ([Posting Date] BETWEEN CONVERT(DATETIME, '2008-  01-01 00:00:00', 102) AND CONVERT(DATETIME, '2008-12-31 00:00:00', 102))
  GROUP BY [Item No_]) as unterabfrage
INNER JOIN [db$Value Entry] on unterabfrage.[Item No_]= [db$Value Entry].[Item No_]
and unterabfrage.LetztesEkDat = [db$Value Entry].[Posting Date]
AND ([db$Value Entry].[Document Type] = 6)
AND ([db$Value Entry].[Item Ledger Entry Type] = 0)
;

@ Fiddi
Danke für den Hinweis. Mir ist allerdings nich klar wie ich nach deiner Vorgehensweise an den letzten EK kommen soll, der in meinem Fall die Grundlage zur Inventurbewertung ist. Und natürlich wird der Preis über Zu- und Abschläge beeinflusst - soll er ja auch.

Gruß
Shunkskill

Re: Letzter EK über SQL-Statement

16. Februar 2010 10:33

Wenn du das zeitnah zur Inventur machst, findest du den Preis in der Tabelle Item "Last Direct Unit Cost" (das ist allerdings der letzte EK-Preis und nicht der Einstandspreis).

Mit was möchtest du deine Inventur denn bewerten? (EK-Preis oder Einstands-Preis).

Übrigens eine Sache habe ich noch vergessen: Wenn ihr auch mit Direktlieferungen arbeitet, gehören diese Artikel- bzw. Wertposten nicht zum Lager.

Wenn du die Inventur korrekt in NAV verbuchen möchtest, was aus Nachweisgründen zu empfehlen ist, solltest du dir zum Zähltag ein Inventurbuchblatt berechnen lassen. Das enthält dann den durchschnittlichen Einstandpreis der Ware, die du noch im Lager hast (bei Lagerabgangsmethode FIFO).
Möchtest du die Inventur mit dem letzten EK-Preis bzw. letzten Einstandspreis bewerten, ist das mit einem 5 bis 10 zeiligen NAV-Report zu bewerkstelligen, der auch alle Felder des Inventurbuchblatts aktualisiert, damit es korrekt verbucht werden kann. Diese Tabelle kannst du dir im Zweifel auch nach Excel exportieren, und dort bearbeiten.

Warnung:
Mit SQL würde ich hier nicht NAV-Tabellen modifizieren, schon gar keine Buchblätter oder Postentabellen, da du hier die teilweise sehr komplexe Programmlogik der Buchblätter/Buchungsroutinen nachbilden müsstest, was auch Programmierern in C/AL nur selten gelingt :wink:

Gruß, Fiddi