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

Problem med sql anrop till access databas


Riker

Rekommendera Poster

Jag vet inte om jag kanske borde postat detta i access forum delen, eftersom jag misstänker att det är sql anropen som är problemet.

Databaser är inte något jag är speciellt bra på utan jag brukar använda sql frågor skrivna i access.

Är det någon som är bra på sql anrop/ databas kommunikation, som kan kolla på vad som är fel?

 

Jag har 2 olika sql anrop till en databas. När jag anropar databasen med den första sql anropen så får jag inte ut något svar alls.

 

Sql anrop

 

SELECT TOP 20 * FROM Tider INNER JOIN (Påsarkivet INNER JOIN ((Mängd INNER JOIN ((Lager INNER JOIN LagringsData ON Lager.LID = LagringsData.LagerID) INNER JOIN Lagringstider ON (Lagringstider.LGID = LagringsData.LagringstidID) AND (Lager.LID = Lagringstider.LID)) ON Mängd.DID = LagringsData.MängdID) INNER JOIN Plats ON (Plats.PID = LagringsData.ArkivplatsID) AND (Lager.LID = Plats.LID)) ON Påsarkivet.APID = LagringsData.APID) ON Tider.TID = Lagringstider.TID WHERE [LagringsData].[LagerID] = 2 AND Not [LagringsData].[Kastad] ORDER BY [LagringsData].[Arkiveringsdatum] asc, [LagringsData].[LDID] asc

 

Detta anrop har tidigare fungerat, ända tills jag började fylla på en tom tabell, Stora_arkivet, med värden. (Jag bifogar ett relations chema över databasen)

 

Det andra sql anropet (till den nya tabellenm stora_arkivet) ger samma resultat, i princip på alla poster, endast arkiv plats fälten har olika värden. Resultatet är dessutom felaktigt, det ger fler träffar än antalet poster i tabellen, sql anrop:

 

SELECT TOP 20 * FROM ((Lager INNER JOIN (Tider INNER JOIN Lagringstider ON Tider.TID = Lagringstider.TID) ON Lager.LID = Lagringstider.LID) INNER JOIN Plats ON Lager.LID = Plats.LID) INNER JOIN ((LagerVara INNER JOIN Stora_arkivet ON LagerVara.LVID = Stora_arkivet.LVID) INNER JOIN (Mängd RIGHT OUTER JOIN LagringsData ON Mängd.DID = LagringsData.MängdID) ON Stora_arkivet.APID = LagringsData.APID) ON Lager.LID = LagringsData.LagerID WHERE [LagringsData].[LagerID] = 3 AND Not [LagringsData].[Kastad] ORDER BY [LagringsData].[Arkiveringsdatum] asc, [LagringsData].[LDID] asc

 

Här är koden som används vid anrop av databas:

 

Sub VisaLista()
Dim cnn       ' References Connection Object
Dim str        ' References Connection String
Dim rs        ' References RecordSet Object
Dim SQL
Dim cmd       ' Command Object
Const adCmdTable = 2       
Dim Arkiv, SQL2
Dim ColNames()
Dim AntFields, ICnt, Falt, LID, JCnt
Dim NamnLista(), NIDMax, NID
Dim TidLista(), TIDMax, TID, SokOrder, AntPoster, Metod
on error resume next
Arkiv = CStr(Request("Tabell"))
LID = GetIDForLager(Arkiv)
SokOrder = Request("Sok")
AntPoster = Request("Ant")
Metod = Request("Metod")
str = "Data Source=ArkivTest"

Set cnn = CreateObject("ADODB.Connection")
cnn.ConnectionString = str
cnn.Open
Set rs = cnn.OpenSchema(adSchemaColumns, Array(Empty, Empty, Arkiv))
AntFields = 0
While Not Rs.EOF
 If Rs.Fields("COLUMN_NAME") <> "APID" Then
  AntFields = AntFields + 1
  ReDim Preserve ColNames(AntFields)
  ColNames(AntFields) = Rs.Fields("COLUMN_NAME")
 End If
 Rs.movenext
Wend
Rs.Close

' *************** Skapa NamnLista ***************

SQL =  "SELECT * "
SQL = SQL & "FROM Namn ORDER BY NID asc"

rs.Open SQL,cnn

NIDMax = 0
If rs.Eof Or Err Then

Else
 While Not rs.Eof  
  NID = rs("NID")
  ReDim Preserve NamnLista(NID)
  NamnLista(NID) = rs("Namn")
  rs.MoveNext
 Wend
 NIDMax = NID
End If

rs.close

' *************** Skapa TidLista ***************

If AntPoster = 0 Then
 SQL =  "SELECT "
 JCnt = - 1
Else
 SQL =  "SELECT TOP " & CStr(AntPoster) & " "
 JCnt = 0
End If

SQL = SQL & "* "

Select Case Arkiv
Case "Stora_arkivet"

 SQL = SQL & "FROM ((Lager INNER JOIN (Tider INNER JOIN Lagringstider ON Tider.TID = Lagringstider.TID) ON Lager.LID = Lagringstider.LID) "
 SQL = SQL & "INNER JOIN Plats ON Lager.LID = Plats.LID) INNER JOIN ((LagerVara RIGHT OUTER JOIN Stora_arkivet ON LagerVara.LVID = Stora_arkivet.LVID) "
 SQL = SQL & "INNER JOIN (Mängd RIGHT OUTER JOIN LagringsData ON Mängd.DID = LagringsData.MängdID) ON Stora_arkivet.APID = LagringsData.APID) "
 SQL = SQL & "ON Lager.LID = LagringsData.LagerID "
 SQL = SQL & "WHERE [LagringsData].[LagerID] = " & LID & " AND Not [LagringsData].[Kastad]"
Case Else
 SQL = SQL & "FROM Tider INNER JOIN (" & Arkiv & " INNER JOIN ((Mängd INNER JOIN ((Lager INNER JOIN LagringsData ON Lager.LID = "
 SQL = SQL & "LagringsData.LagerID) INNER JOIN Lagringstider ON (Lagringstider.LGID = LagringsData.LagringstidID) AND (Lager.LID = "
 SQL = SQL & "Lagringstider.LID)) ON Mängd.DID = LagringsData.MängdID) INNER JOIN Plats ON (Plats.PID = LagringsData.ArkivplatsID) "
 SQL = SQL & "AND (Lager.LID = Plats.LID)) ON " & Arkiv & ".APID = LagringsData.APID) ON Tider.TID = Lagringstider.TID "
 SQL = SQL & "WHERE [LagringsData].[LagerID] = " & LID & " AND Not [LagringsData].[Kastad]"
End Select

Select Case SokOrder
Case "ArkD"
 SQL = SQL & " ORDER BY [LagringsData].[Arkiveringsdatum] "
Case "Kast"
 SQL = SQL & " ORDER BY [LagringsData].[berKastDatum] "
Case "KSnr"
 SQL = SQL & " ORDER BY [LagringsData].[KSnr] "
Case "PNR"
 SQL = SQL & " ORDER BY [" & Arkiv & "].[Provnr] "
Case Else
 SQL = SQL & " ORDER BY [LagringsData].[berKastDatum] "
End Select

If Metod = "L" Then ' Lägst först
 SQL = SQL & "asc"
 SQL = SQL & ", [LagringsData].[LDID] asc"
Else
 SQL = SQL & "desc"
 SQL = SQL & ", [LagringsData].[LDID] desc"
End If
%>
<P class="head">Arkiverade poster i <%= replace(Arkiv,"_"," ")%></P>
<BR>
<FORM NAME="Form1" METHOD="POST" ACTION="VisaArkiv2.asp"> 
<TABLE HEIGHT=89% WIDTH=100% VALIGN=MIDDLE>
 <TR>
  <TD ALIGN=CENTER>
   <TABLE BORDER="1">
    <TR>
    <%
    Select Case Arkiv
    Case "Påsarkivet"
     Response.Write("<TD colspan=" + CStr(Antfields-1) + "> </TD><TD colspan=""3"" class=""mitten"">Arkivplats:</TD><TD colspan=""12""> </TD>")
     Response.Write("</TR>")
     Response.Write("<TR>")
    Case "Stora_arkivet"
     Response.Write("<TD colspan=" + CStr(Antfields-1) + "> </TD><TD colspan=""3"" class=""mitten"">Arkivplats:</TD><TD colspan=""12""> </TD>")
     Response.Write("</TR>")
     Response.Write("<TR>")
    Case Else

    End Select

    For iCnt = 1 To AntFields
     If InStr(ColNames(iCnt), "IsValid") = 0 Then 
      If Arkiv = "Stora_arkivet" And ColNames(iCnt) = "LVID" Then
       Response.Write("<TD>Lagervara:</TD>")
      Else
       Response.Write("<TD>" + ColNames(iCnt) +":</TD>")
      End If
     End If
    Next
    Select Case Arkiv
    Case "Stora_arkivet"
     Response.Write("<TD>Vagn:</TD><TD>Hylla:</TD><TD>Låda:</TD>")
    Case "Påsarkivet"
     Response.Write("<TD>Vagn:</TD><TD>Hylla:</TD><TD>Låda:</TD>")
    Case Else
     Response.Write("<TD colspan=""3"">Arkivplats:</TD>")
    End Select
    Response.Write("<TD>KSnr:</TD>")
    Response.Write("<TD>Fyndighet:</TD>")
    Response.Write("<TD>Arkiverad av:</TD>")
    Response.Write("<TD>Arkiverings datum:</TD>")
    Response.Write("<TD>Lagringstid:</TD>")
    Response.Write("<TD>Ansvarig:</TD>:")
    Response.Write("<TD>Reviderings datum:</TD>")
    Response.Write("<TD>Kastas:</TD>")
    Response.Write("<TD>Emballage:</TD>")
    Response.Write("<TD>Mängd:</TD>")
    Response.Write("<TD>Anmärkning:</TD>")
    If Arkiv = "Påsarkivet" Then Response.Write("<TD>Tom påse:</TD>")
    %>
    </TR>
    <%
    rs.Open SQL, cnn

    NID = 0
    While (Not rs.EOF) And cint(JCnt) < cint(antposter)
     Response.Write("<TR>")
     For iCnt = 1 To AntFields
      If InStr(ColNames(iCnt), "IsValid") = 0 Then
       If IsNull(rs( ColNames(iCnt) )) Or CStr(rs(ColNames(iCnt))) = " " Then
        Response.Write("<TD>   </TD>")
       Else
        If Arkiv = "Stora_arkivet" And ColNames(iCnt) = "LVID" Then
         Response.Write("<TD>" + CStr(rs("Lagervara")) + "</TD>")
        Else
         Response.Write("<TD>" + CStr(rs(ColNames(iCnt))) + "</TD>")
        End If
       End If
      End If

     Next

     Select Case Arkiv
     Case "Påsarkivet"
      Response.Write("<TD>" + rs("Fält1") + "</TD><TD>" + rs("Fält2") + "</TD><TD>" + rs("Fält3") + "</TD>")
     Case "Stora_arkivet"
      Response.Write("<TD>" + rs("Fält1") + "</TD><TD>" + rs("Fält2") + "</TD><TD>" + rs("Fält3") + "</TD>")
     Case Else
      Response.Write("<TD colspan=""3"">" + rs("Fält1") + "</TD>")
     End Select
     If IsNull(rs("KSnr")) Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + rs("KSnr") + "</TD>")
     End If
     If IsNull(rs("Fyndighet")) Or CStr(rs("Fyndighet")) = " " Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + rs("Fyndighet") + "</TD>")
     End If
     If IsNull(NamnLista(CInt(rs("ArkiveradID")))) Or CInt(rs("ArkiveradID")) = 0 Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + NamnLista(CInt(rs("ArkiveradID"))) + "</TD>")
     End If
     If IsNull(rs("Arkiveringsdatum")) Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + CStr(rs("Arkiveringsdatum")) + "</TD>")
     End If
     If IsNull(rs("LText")) Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + rs("LText") + "</TD>")
     End If
     If IsNull(NamnLista(CInt(rs("AnsvarigID")))) Or CInt(rs("AnsvarigID")) = 0 Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + NamnLista(CInt(rs("AnsvarigID"))) + "</TD>")
     End If
     If IsNull(rs("Revideringsdatum")) Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + Trim(CStr(rs("Revideringsdatum"))) + "</TD>")
     End If
     If IsNull(rs("BerKastdatum")) Then 'If rs("BerKastdatum") = "" Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + Trim(CStr(rs("BerKastdatum"))) + "</TD>")
     End If
     If IsNull(rs("Emballage")) Or CStr(rs("Emballage")) = " " Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + rs("Emballage") + "</TD>")
     End If
     If rs("MängdID") = 0 Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + rs("MängdTxt") + " " + rs("Mängd") + "</TD>")
     End If
     If IsNull(rs("Anmärkning")) Then
      Response.Write("<TD>   </TD>")
     Else
      Response.Write("<TD>" + rs("Anmärkning") + "</TD>")
     End If
     If Arkiv = "Påsarkivet" Then
      If rs("IsEmpty") Then
       Response.Write("<TD> Ja </TD>")
      Else
       Response.Write("<TD> Nej </TD>")
      End If
     End If
     Response.Write("</TR>")
     If JCnt >= 0 Then JCnt = JCnt + 1
     rs.Movenext
    Wend

    %>   
   </TABLE>
  </TD>
 </TR>
 <TR>
     <TD COLSPAN=1 ALIGN=CENTER>
      <BUTTON TYPE=button NAME="Skicka" VALUE="Sänd" onclick="RTS()">OK</BUTTON>   <BUTTON TYPE=Button NAME="Sk" VALUE="Klar" NAME="utskrift" onClick="printframe()"><IMG SRC="./Images/Fileprint32.gif" height=15 width=20></BUTTON>
     </TD>
    </TR>
</TABLE>
</FORM>
<%
Cnn.Close
Set Cnn = Nothing

End Sub

post-125952-0-64212200-1370328264_thumb.png

Länk till kommentar
Dela på andra webbplatser

Har du testat anropet direkt mot databasen / i Access?

Möjligen får du tydligare felmeddelande där.

Länk till kommentar
Dela på andra webbplatser

Har du testat anropet direkt mot databasen / i Access?

Möjligen får du tydligare felmeddelande där.

 

Nej. jag är inte speciellt bra på access utan använder den endast för att bygga databas, samt ta fram en sql sats.

 

Jag skall se om jag lyckas köra sql satserna

Länk till kommentar
Dela på andra webbplatser

Har du testat anropet direkt mot databasen / i Access?

Möjligen får du tydligare felmeddelande där.

 

Jag har testat det nu. Jag fick inget felmeddelande utan resultaten blev ungefär samma.

 

Jag vet inte om jag gjorde rätt. Jag har inte hittat något sätt att mata in sql frågan och köra den, så jag gjorde på följande vis:

 

Jag öppnade en befintlig sql fråga.gick in i menyn och tittade på sql frågan.

 

Bytte ut sql frågan mot min sql sats och sparade sql frågan

 

Därefter körde jag sql frågan.

 

 

 

Som sagt så gav det i princip samma resultat, den ena sql frågan gav inget resultat, resultat tabellen var tom.

 

Den andra sql frågan gav konstigt nog fler än 20 resultat, trots att frågan startar med "select top 20"

Länk till kommentar
Dela på andra webbplatser

Tydligt tecken på att det inte är serverkoden som är felet - flyttar till SQL Syntax.

 

Hoppas att någon kan hjälpa dig. :)

Länk till kommentar
Dela på andra webbplatser

Om du vill ha ett inlägg borttaget klickar du på inläggets Anmäl-knapp och skriver en förklaring. En moderator kommer då att överväga om inlägget ska tas bort.

 

Cecilia

Moderator

Länk till kommentar
Dela på andra webbplatser

Det verkar vara sql syntaxen som det verkligen är fel på.

 

Jag gjorde en enkel sql sats som bara tar fram alla poster ur den tabellen som är intressant:

 

SELECT * FROM Stora_arkivet RIGHT OUTER JOIN LagringsData ON Stora_arkivet.APID = LagringsData.APID WHERE [LagringsData].[LagerID] = 3 ORDER BY [LagringsData].[Arkiveringsdatum] asc, [LagringsData].[LDID] asc

Den fungerar

 

Men när jag kommbinerar resultatet ur sql frågan ovan med sql frågan i 1:a inlägget så ger sql frågan inget resultat:

 

SELECT TOP 20 * FROM ((Lager INNER JOIN (Tider INNER JOIN Lagringstider ON Tider.TID = Lagringstider.TID) ON Lager.LID = Lagringstider.LID) INNER JOIN Plats ON Lager.LID = Plats.LID) INNER JOIN ((LagerVara RIGHT OUTER JOIN Stora_arkivet ON LagerVara.LVID = Stora_arkivet.LVID) INNER JOIN (Mängd RIGHT OUTER JOIN LagringsData ON Mängd.DID = LagringsData.MängdID) ON Stora_arkivet.APID = LagringsData.APID) ON Lager.LID = LagringsData.LagerID WHERE [LagringsData].[LagerID] = 3 AND [LagringsData].[Kastad] = 7 AND ([LagringsData].[LDID] = 23487 OR [LagringsData].[LDID] = 23488 OR [LagringsData].[LDID] = 23489 OR [LagringsData].[LDID] = 23490 ) ORDER BY [LagringsData].[Arkiveringsdatum] asc, [LagringsData].[LDID] asc

 

Så uppenbarligen så kan inte sql frågan ta fram datat ur tabellerna och visa denna.

 

Jag testade även köra frågan i access och den kan inte heller ta fram något resultat

Länk till kommentar
Dela på andra webbplatser

Syntaxen är det inget fel på, snarare logiken.

 

(Testa syntax här http://developer.mimer.com/validator/parser200x/, ANSI SQL kräver dock dubbelfnuttar i stället för hakparenteser, samt TOP 20 är inte heller enligt SQL-standarden. Fel syntax ska ge "syntax error". Fel logik ger resultat, fast fel resultat.)

 

Din SQL-sats är allt annat än lättläst.

 

Utan tabeller med data är det knepigt att hitta problemet.

 

Mitt tips är att backa tillbaka. Börja med en enkel sats som du vet ger rätt resultat. Strunta i TOP 20, order by och where-villkoren tills vidare.

 

När du ser att du får vettigt resultat så bygger du vidare med nästa join. Blir det rätt resultat? Om nej, fundera på vad som är fel. Om ja, ta hand om nästa join. etc.

 

När alla joinar är på plats kan du lägga på WHERE, ORDER BY och TOP. (Om det blir ohyggligt stort resultat kan du iofs behöva WHERE-villkor tidigare.)

Länk till kommentar
Dela på andra webbplatser

Problemet är att jag inte är speciellt kunnig på databas programmering. Det är därför jag byggt databasen i access (och frågan mha av dess sqlfråge guide).

 

(Och jag håller med om att sql frågan inte är lättläst, det var därför jag lade in en bild på databasens relationer i 1:a inlägget)

 

Jag skall dock se om jag får det att fungera på det sättet

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...