Just nu i M3-nätverket
Gå till innehåll

SQL Recordset och MAX


Axi

Rekommendera Poster

Hej.

Jag behöver hjälp.

 

Kortfattad förklaring.

Vi kör en prisberäkning på en artikel i Dynamics 2009, men har nu behov av att manuellt beräkna om den utförda prisberäkningen eftersom vi inte får ändra på resurskostnaderna i systemet.

Därför jag vi skrivit en SQL fråga som drar ut den senaste prisberäkningen för vald artikel. För att göra det hela smidigare så har vi valt att köra SQL frågan från ett makro. Då kan man enkelt skiva in artikelnummer, trycka på kör, och få ut resultatet sammanfattat.

 

Problemet uppstår dock med denna raden när jag kör den från VBA:

 

WHERE BOMCT.DataAreaId = 'xxx' AND BOMCT.PriceCalcId = (SELECT MAX(PriceCalcId) FROM BOMCalcTrans WHERE Key1 = '" & itemid & "') AND BOMCT.Key1 NOT LIKE 'f-%' AND BOMCT.CalcType NOT LIKE 2

 

Av någon anledning flippar SQL frågan ut och ger mig istället den första uppsättningen data som finns i Recordset, oavsett vad jag söker efter. Jag misstänker att jag använder Recordset på fel sätt, eftersom jag försöker ta ut ett nytt recordset för varje artikel. Kanske borde jag istället ta ut en större mängd data till recordset och sedan ställa frågan i makrot till samma set?

Om jag tar bort "select max" biten så funkar det, men jag får fel data. Syftet är att jag behöver hitta det högsta löpnumret för 'itemid' i 'BOMCT.PriceCalcId' (= senaste). Därefter drar jag ut allt med just det ID numret och får det jag behöver.

SQL frågan i sig fungerar utmärkt om jag kör den som en ren SQL. Det är bara när jag kör den på detta viset som den börjar bråka-

 

Nedan är hela mitt macro (- userform macrot).

Jag är enormt tacksam för hjälp.

 

 

Public itemid As String



Sub Add_Results_Of_ADO_Recordset()

  Dim cnt As ADODB.Connection
   Dim rst1 As New ADODB.Recordset
   Dim stSQL As String
   Dim wbBook As Workbook
   Dim wsSheet As Worksheet
   Dim rnStart As Range
   Dim lastrow As Long
   Dim pRange As Range
   Dim SelfCost As Long
   Dim Salesprice As Long


   Const stADO As String = "Provider=SQLOLEDB.1;" & _
   "Initial Catalog=AX2009;" & _
   "User ID=xxx;" & _
   "Password=xxx;" & _
   "Data Source=SVR-MSSQL"

   Set wbBook = ActiveWorkbook
   Set wsSheet = wbBook.Sheets("Komplett")
   'Tömmer allt gammalt'
   Sheets("Komplett").Cells.Clear
   With Sheets("Översikt")
    .Range("d2").ClearContents
    .Range("d5").ClearContents
    .Range("d6").ClearContents
    .Range("d8").ClearContents
    .Range("d11").ClearContents
    .Range("d12").ClearContents
    .Range("d13").ClearContents
    .Range("b20").ClearContents
    End With

   'Döp kolumnerna nedan'
   With wsSheet
       .Range("A1") = "Rad"
       .Range("B1") = "Post"
       .Range("C1") = "Namn"
       .Range("D1") = "Förbrukning"
       .Range("E1") = "Kostnad"
       .Range("F1") = "Typ"
       .Range("G1") = "Enhet"
       .Range("H1") = "Datum"

       Set rnStart = .Range("a2")
   End With

   'Hämta in användarvariabler'
   UserForm1.Show
   Sheets("Översikt").Range("d2").Font.Bold = True
   Sheets("Översikt").Range("d2") = itemid
   Sheets("Översikt").Range("b20") = ("Hämtar Data...")

  'SQL frågan'
stSQL = "SET NOCOUNT ON"
stSQL = stSQL & " SET DATEFIRST 1"
stSQL = stSQL & " SELECT"
stSQL = stSQL & " BOMCT.LineNum,"
stSQL = stSQL & " BOMCT.Key1,"
stSQL = stSQL & " CASE"
stSQL = stSQL & "   WHEN BOMCT.Key2 = 'Timmar' THEN WCT.Name"
stSQL = stSQL & "   ELSE IT.ItemName"
stSQL = stSQL & " END,"
stSQL = stSQL & " BOMCT.ConsumptionVariable,"
stSQL = stSQL & " CASE"
stSQL = stSQL & "   WHEN BOMCT.CalcType = 5 THEN BOMCT.ConsumptionVariable*550"
stSQL = stSQL & "   WHEN BOMCT.CalcType = 4 THEN (BOMCT.CostPriceQty/RCC.CostPrice)*550"
stSQL = stSQL & "   ELSE BOMCT.CostPriceQty"
stSQL = stSQL & " END,"
stSQL = stSQL & " CASE "
stSQL = stSQL & "   WHEN BOMCT.CalcType = 0 THEN 'Produktion'"
stSQL = stSQL & "   WHEN BOMCT.CalcType = 2 THEN 'Strukturlista'"
stSQL = stSQL & "   WHEN BOMCT.CalcType = 1 THEN 'Artikel'"
stSQL = stSQL & "   WHEN BOMCT.CalcType = 5 THEN 'Process'"
stSQL = stSQL & "   WHEN BOMCT.CalcType = 4 THEN 'Inställningar'"
stSQL = stSQL & " END,"
stSQL = stSQL & " BOMCT.Key2,"
stSQL = stSQL & " BOMCT.TransDate"
stSQL = stSQL & " FROM BOMCalcTrans BOMCT"
stSQL = stSQL & " LEFT JOIN RouteCostCategory RCC ON RCC.dataAreaId = BOMCT.dataAreaId AND RCC.CostCategoryId = BOMCT.Key1+'s'"
stSQL = stSQL & " LEFT JOIN InventTable IT ON IT.dataAreaId = BOMCT.dataAreaId AND BOMCT.Key1 = IT.ItemId"
stSQL = stSQL & " LEFT JOIN WrkCtrTable WCT ON WCT.dataAreaId = BOMCT.dataAreaId AND BOMCT.Key3 = WCT.WrkCtrId"
stSQL = stSQL & " WHERE BOMCT.DataAreaId = 'xxxx' AND BOMCT.PriceCalcId = (SELECT MAX(PriceCalcId) FROM BOMCalcTrans WHERE Key1 = '" & itemid & "') AND BOMCT.Key1 NOT LIKE 'f-%' AND BOMCT.CalcType NOT LIKE 2"



   Set cnt = New ADODB.Connection

   With cnt
       .CursorLocation = adUseClient
       .Open stADO
       .CommandTimeout = 0
       Set rst1 = .Execute(stSQL)

   End With

   'Konvererar till table i Komplett'
   rnStart.CopyFromRecordset rst1
   lastrow = Sheets("Komplett").Range("a65536").End(xlUp).Row
   Set pRange = Sheets("Komplett").Range("A1", Sheets("Komplett").Cells(lastrow, 8))
   wbBook.Names.Add Name:="pRange", _
   RefersTo:=pRange
   wsSheet.ListObjects.Add(xlSrcRange, pRange, , xlYes).Name = "Table1"
   wsSheet.ListObjects("Table1").TableStyle = "TableStyleMedium9"

    'Kalkylerar & Presenterar Komplett'
    With Sheets("Översikt")
    .Range("d2") = Sheets("Komplett").Range("b2")
    .Range("d3") = Sheets("Komplett").Range("c2")
    .Range("d5") = Sheets("Komplett").Range("e2")
    SelfCost = Application.WorksheetFunction.Sum(Sheets("Komplett").Range("e3:d" & lastrow))
    Salesprice = (SelfCost * 1.2)
    .Range("d6") = SelfCost
    .Range("d8") = Salesprice
    .Range("d11") = (Salesprice * (1 - 0.1))
    .Range("d12") = (Salesprice * (1 - 0.12))
    .Range("d13") = (Salesprice * (1 - 0.13))
    .Range("b20") = "Använder strukturberäkning från " & Format(Sheets("Komplett").Range("h2"), YYMMDD)
    End With


    'Städar'

   rst1.Close
   cnt.Close
   Set rst1 = Nothing
   Set cnt = Nothing

End Sub


Länk till kommentar
Dela på andra webbplatser

Jag ska faktiskt besvara min egen fråga.

 

Koden fungerar utmärkt, och den gör precis vad jag skrivit att den ska göra. Problemet var att jag TRODDE jag bett den göra något annat än den faktiskt gjorde.

 

Grundläggande felsökning inkluderar att ta reda på om utdata är = förväntat data innan man använder den till något. Det var här det fallerade för mig denna gång. Problemet fixat och allt är frid och fröjd.

 

Jag lämnar fråga och svar för framtida referenser.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...