CalcField als SQL darstellen [CC][GELÖST]

27. September 2017 13:06

Servus,
ich stehe vor einem Problem im Server Management Studio in Navision 2009. Und zwar würde ich dort gerne eine Summe darstellen, die sich im Calcfield folgendermaßen abbildet:
Code:
Sum("Sales Invoice Line".Quantity WHERE (Document No.=FIELD(No.),Type=CONST(Item)))


Wie kann ich dies mit SQL erreichen. Die Felder befinden sich alle im gleichen Table. Insbesondere das FIELD(No.) bereitet mir dabei Probleme :(
Über Hilfe würde ich mich sehr freuen.

Achja, mein Versuch schaut folgendermaßen aus:
Code:
Select Sum(dbo.[Sales Invoice Line].[Quantity]) FROM dbo.[Sales Invoice Line].[Quantity]
    WHERE (
      /*dbo.[Sales Invoice Line].[Document No_] = dbo.[Sales Invoice Line].[No_] and*/
      dbo.[Sales Invoice Line].[Type] like 'Item'
      GROUP BY dbo.[Sales Invoice Line].[No_]) AS [Total Quantity]

Vielen Dank!
Zuletzt geändert von karlNAV2009 am 28. September 2017 13:51, insgesamt 2-mal geändert.

Re: CALField als SQL darstellen [CC]

27. September 2017 13:31

Hallo,

du musst herausfinden, welchen Optionswert Type::"Item" hat. Dazu zählst du die Optionswerte bis zu dem gewünschten, beginnend bei 0 für den ersten Wert. Den Integer- Wert gibst du dann in der WHERE- Klausel im SQL ein.

Gruß Fiddi

Re: CALField als SQL darstellen [CC]

27. September 2017 13:41

Du hast Recht, das habe ich vergessen. Das von dir vorgeschlagene habe ich umgesetzt. Leider zeigt das Management Studio den Code immernoch als fehlerhaft an. Ansonsten würde die Abfrage so stimmen?

Re: CALField als SQL darstellen [CC]

27. September 2017 13:44

Hallo,

wenn du die Mandantennamen noch mit in die Abfrage einbaust (schau die mal die Tabellennamen der Datenbank an.)

Gruiß Fiddi

Re: CALField als SQL darstellen [CC]

27. September 2017 13:49

Hmm, da steh ich auf dem Schlauch. Welchen Mandantennamen? :X

Re: CALField als SQL darstellen [CC]

27. September 2017 13:57

die Tabelle heißt nicht [Sales Line] sondern z.B. [CRONUS AG$Sales Line] (zumindest wenn sie nicht Mandantenübergreifend ist)

Gruß Fiddi

Re: CALField als SQL darstellen [CC]

27. September 2017 13:59

Ja das ist schon klar, die Kennzeichnung habe ich hier rausgenommen. Also bei mir steht die Kennzeichnung drin.
Ich bekomme beim ausführen jedoch folgende Fehlermeldung:
Code:
Meldung 8120, Ebene 16, Status 1, Prozedur A_RechnungGutschrift, Zeile 4
Die dbo."iwas".Posting Date-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

Re: CALField als SQL darstellen [CC]

27. September 2017 15:08

Hallo,

die Frage, die sich hier stellt, ist doch wohl:
In welcher Tabelle ist das kalkulierte Feld definiert, das du hier nachbauen willst?
Denn im kalkulierten Feld wird das Feld "No." aus dieser Tabelle wird mit dem Feld "Document No." der "Sales Line" verknüpft.
Ich vermute im "Sales Header", oder?

Re: CALField als SQL darstellen [CC]

27. September 2017 15:24

Du hast recht. :-?

vielleicht sollte Karl mal beschreiben, was er eigentlich möchte. :wink:

Gruß Fiddi

Re: CALField als SQL darstellen [CC]

27. September 2017 15:37

Also, ich muss die Daten, die in Navision bereit stehen, in das Microsoft SQL Server Management Studio in einer View verfügbar machen. Das funktioniert soweit ganz gut bis auf bei dem ganz oben im Thread gezeigten Calcfield. Dieses Calcfield muss jedoch auch richtig berechnet in die View übertragen werden. Ich bin relativ neu in Navision und kann daher nicht genau nachvollziehen, wie sich dieses Calcfield seine Daten zusammen zieht. Im Sales Invoice Line die Daten zu vergleichen wirft immer keine gefundenen Daten. Zu dem Table Sales Invoice Line gibt es natürlich noch den Sales Invoice Header, in welchem dann das Ergebnis der Calcsum abgebildet wird.

Re: CALField als SQL darstellen [CC]

27. September 2017 16:03

Ok der Tip mit dem anderen Table war korrekt, danke :)
Allerdings habe ich jetzt ein neues Problm.
Code:
ALTER VIEW [dbo].[A_RechnungGutschrift] AS
SELECT
   dbo.[IWAS$Sales Invoice Header].[Posting Date] AS [Buchungsdatum],
   dbo.[IWAS$Sales Invoice Header].[Agent No_] AS [Vertreternummer],
   dbo.[IWAS$Sales Invoice Header].[Order Season] AS [Auftragssaison] ,
   dbo.[IWAS$Sales Invoice Header].[Order Collection] AS Auftragskollektion,
   dbo.[IWAS$Sales Invoice Header].[Document Date] AS [Belegdatum],
   dbo.[IWAS$Sales Invoice Header].[No_] AS [Nr.],
   (SELECT SUM(dbo.[IWAS$Sales Invoice Line].[Quantity]) AS [Total Quantity] FROM dbo.[IWAS$Sales Invoice Line] WHERE (
      dbo.[IWAS$Sales Invoice Line].[Document No_] = dbo.[IWAS$Sales Invoice Header].[No_] AND
      dbo.[IWAS$Sales Invoice Line].[Type] = '2' )
       ) AS [Total Quantity],
   dbo.[IWAS$Sales Invoice Header].[Sell-to Search Name] AS [Verkauf an Suchbegriff],
   dbo.[IWAS$Sales Invoice Header].[Sell-to Customer No_] AS [Verkauf an Deb. Nr.],
   dbo.[IWAS$Sales Invoice Header].[Sell-to Customer Name] AS [Verk. An Name],
   dbo.[IWAS$Sales Invoice Header].[Sell-to City] AS [Verk. an Ort],
   dbo.[IWAS$Sales Invoice Header].[Currency Code] AS [Währungscode],
   (Select SUM(dbo.[IWAS$Sales Invoice Line].[Amount]) AS [Betrag] FROM dbo.[IWAS$Sales Invoice Line] WHERE (
      dbo.[IWAS$Sales Invoice Line].[Document No_] = dbo.[IWAS$Sales Invoice Header].[No_]))
    AS [Betrag] ,
   dbo.[IWAS$Sales Invoice Header].[Sell-to Country_Region Code],
   dbo.[IWAS$Sales Invoice Header].[Order Type (variable)] AS [Auftragsart variabel],
   (CASE dbo.[IWAS$Sales Invoice Header].[Business Type] WHEN '0' THEN 'Großhandel' WHEN '1' THEN 'Einzelhandel' END) AS Kundengruppe,
   dbo.[IWAS$Sales Invoice Header].[VAT Bus_ Posting Group] AS [Mwst-Geschäftsbuchungsgruppe],
   (Case dbo.[IWAS$Sales Invoice Header].[Order Type] WHEN '0' THEN 'Vororder' WHEN '1' THEN 'Nachorder' WHEN '2' THEN 'Muster' WHEN '3' THEN 'Posten'END) AS [Belegzeile Art],
   dbo.[IWAS$Sales Invoice Header].[Return Doc_ No_] AS [Retourenbelegnr],
   dbo.[IWAS$Sales Invoice Header].[Order Type] AS [Auftragsart des Verkaufsauftrages],
   dbo.[IWAS$Sales Invoice Header].[External Document No_] AS [Externe Belegnummer],
   dbo.[IWAS$Sales Invoice Header].[Bal_ Account No_] AS [Sachkontonr.]

   FROM dbo.[IWAS$Sales Invoice Header], dbo.[IWAS$Sales Invoice Line]

   UNION SELECT

   dbo.[IWAS$Sales Cr_Memo Header].[Posting Date] AS [Buchungsdatum],
   dbo.[IWAS$Sales Cr_Memo Header].[Agent No_] AS [Vertreternummer],
   dbo.[IWAS$Sales Cr_Memo Header].[Order Season] AS [Auftragssaison],
   dbo.[IWAS$Sales Cr_Memo Header].[Order Collection] AS Auftragskollektion,
   dbo.[IWAS$Sales Cr_Memo Header].[Document Date] AS [Belegdatum],
   dbo.[IWAS$Sales Cr_Memo Header].[No_] AS [Nr.],
   NULL AS [Total Quantity],
   dbo.[IWAS$Sales Cr_Memo Header].[Sell-to Search Name] AS [Verkauf an Suchbegriff],
   dbo.[IWAS$Sales Cr_Memo Header].[Sell-to Customer No_] AS [Verkauf an Deb. Nr.],
   dbo.[IWAS$Sales Cr_Memo Header].[Sell-to Customer Name] AS [Verk. an Name],
   dbo.[IWAS$Sales Cr_Memo Header].[Sell-to City] AS [Verk. an Ort],
   dbo.[IWAS$Sales Cr_Memo Header].[Currency Code] AS [Währungscode],
   (SELECT SUM(dbo.[IWAS$Sales Invoice Line].[Amount]) AS [Betrag] FROM dbo.[IWAS$Sales Invoice Header] WHERE (
      dbo.[IWAS$Sales Invoice Line].[Document No_] = dbo.[IWAS$Sales Invoice Header].[No_]))
   AS [Betrag] ,
   dbo.[IWAS$Sales Cr_Memo Header].[Sell-to Country_Region Code] AS [Verkauf an Länder-/Regionscode],
   dbo.[IWAS$Sales Cr_Memo Header].[Order Type (variable)] AS [Auftragsart variabel],
   (CASE dbo.[IWAS$Sales Cr_Memo Header].[Business Type] WHEN '0' THEN 'Großhandel' WHEN '1' THEN 'Einzelhandel' END) AS Kundengruppe,
   dbo.[IWAS$Sales Cr_Memo Header].[VAT Bus_ Posting Group] AS [Mwst-Geschäftsbuchungsgruppe],
   (Case dbo.[IWAS$Sales Cr_Memo Header].[Order Type] WHEN '0' THEN 'Vororder' WHEN '1' THEN 'Nachorder' WHEN '2' THEN 'Muster' WHEN '3' THEN 'Posten' END) AS [Belegzeile Art],
   dbo.[IWAS$Sales Cr_Memo Header].[Return Doc_ No_] AS Retourenbelegnr,
   dbo.[IWAS$Sales Cr_Memo Header].[Order Type] AS [Auftragsart des Verkaufsauftrages],
   dbo.[IWAS$Sales Cr_Memo Header].[External Document No_] AS [Externe Belegnummer],
   dbo.[IWAS$Sales Cr_Memo Header].[Bal_ Account No_] AS [Sachkontonr.]


   FROM dbo.[IWAS$Sales Cr_Memo Header] , dbo.[IWAS$Sales Invoice Line]
   
GO


Oben mein SQL Code.
Er zeigt mir nun den Fehler: Meldung 8120, Ebene 16, Status 1, Prozedur A_RechnungGutschrift, Zeile 41
Die dbo.Iwas$Sales Cr_Memo Header.Posting Date-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Woran liegt das beziehungsweise was kann ich dagegen unternehmen?
Vielen Dank :)

Re: CALField als SQL darstellen [CC]

27. September 2017 16:54

karlNAV2009 hat geschrieben: FROM dbo.[IWAS$Sales Invoice Header], dbo.[IWAS$Sales Invoice Line]

Ich hoffe du weist das es sich hierbei um einen Cross-Join handelt und er jeden Record des Header's mit jedem Record der Zeilen verbindet


Code:
SELECT
   a.[Posting Date] AS [Buchungsdatum],
    (SELECT SUM(a2.[Quantity]) AS [Total Quantity] FROM dbo.[test$Sales Invoice Line] a2 WHERE (
      a2.[Document No_] = a.[No_] AND
      a2.[Type] = '2' )
       ) AS [Total Quantity]
FROM dbo.[test$Sales Invoice Header] as a


funktioniert im übrigen wunderbar.
Vielleicht solltest du dein Query's erst einmal einzeln probieren bevor du sie mit einem UNION zusammen schmeisst und ne View draus machst.

Re: CALField als SQL darstellen [CC][gelöst]

28. September 2017 08:12

Ah OK :D das mit dem crossjoin wusste ich nicht, danke. Bin leider erst von der Uni, da haben wir leider nicht so spezielle SQLs geschrieben. Vielen Dank jedenfalls! :-D