Announcement

Collapse
No announcement yet.

Umzug von Access nach SQL Server

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Umzug von Access nach SQL Server

    Hallo,
    ich habe ein Problem mit einer SQL Abfrage nachdem mit meiner Anwendung von Access zum SQL Server gewechselt habe.

    Die Ausgabe der Abfrage soll sortiert sein aber das Feld nach dem sortiert wird ist ein Textfeld mit nummern.
    z.B. E10-3-2-4
    oder E1-3-2-4
    deshalb haut das nicht so einfach hin weil die 10 dann vor 1 steht.

    Da es als text erkannt wird wird es auch so sortiert. Ich habe mir mit iif() und Instr() auf das "-" gefiltert und dann die sortierung beinflusst. Das hat auch super geklappt aber leider nur bei Access, beim Server geht das nicht mehr weil der Instr() und iif() nicht kennt.

    Das hier http://msdn.microsoft.com/de-de/library/ms181765.aspx
    habe dazu im MSDN gefunden wo der "Fehler" beschrieben wird aber ich bekomme das einfach nicht zum laufen.
    Ich bin auch nicht so fit was SQL angeht.
    Vielleicht könnte hier mal jemand einen Blick auf die Abfrage werfen und mir sagen was ich machen muss um es zum laufen zu bekommen.

    So lief es unter Access:
    Code:
    qdef = "SELECT * FROM Bauteil WHERE KAnr ='" & KA & "' AND Tower = 0 AND NOT LagerOrt ='Fertigung'" & _
            "ORDER BY Maschine ASC, iif(instr(lagerort,'-')>3,'zzzzz','000') ASC, right(lagerort,len(lagerort)-1) ASC, ArtNr ASC"

    So habe ich es fersucht:
    Code:
    qdef = "SELECT * FROM Bauteil WHERE KAnr ='" & KA & "' AND Tower = 0 AND NOT LagerOrt ='Fertigung'" & _
            "ORDER BY Maschine ASC,CASE lagerort WHEN CHARINDEX(lagerort,'-')>3 THEN 'zzzzz' Else '000' END ASC, right(lagerort,len(lagerort)-1) ASC, ArtNr ASC"
    Irgendwie muss das mit Case When Else End gemacht werden, aber wie?

    mfg
    Jabberwock

  • #2
    Hallo Jabberwock,

    stimmt schon fast, nur den Feldnamen "Lagerort" nach dem CASE musst Du in dem Fall weglassen
    =>

    [highlight=SQL]SELECT *
    FROM Bauteil
    WHERE KAnr = 'KA' AND Tower = 0 AND NOT LagerOrt ='Fertigung'
    ORDER BY Maschine ASC,
    CASE WHEN CHARINDEX(lagerort,'-') > 3
    THEN 'zzzzz' Else '000' END ASC,
    RIGHT(lagerort, len(lagerort) - 1) ASC, ArtNr ASC[/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hi,
      vielen Dank Olaf.
      Ich werde das morgen gleich mal testen.

      Comment


      • #4
        Hallo,

        leider haut das noch nicht ganz hin.
        Vom Syntax ist es richtig, es wird vom Server verarbeitet und ich bekomme auch das Ergebnis nur leider ist die Funktion anscheinend nicht ganz die Gleiche.

        Vielleicht kann man das ja aber auch ganz anders lösen als ich es bischer versucht habe. Allerdings hatte es unter Access so funktioniert.

        ich will meine Liste nach Lagerort sortieren. Die sehen so aus:

        E1-2-3-4
        E2-1-2-3
        E3-3-3-3
        E10-1-2-3
        E11-1-1-1

        wenn ich das einfach so in OrderBy benutze kommt E10 vor E1
        Weil es halt Textfelder sind.

        Wie kann ich da eine "richtige" Sortierung hin bekommen?

        Comment


        • #5
          Die Parameter von CHARINDEX müssen umgedreht werden (hatte ich auch nicht darauf geachtet:
          [highlight=SQL]SET NOCOUNT ON;

          CREATE TABLE #Lager (Ort varchar(10));
          GO

          INSERT INTO #Lager VALUES('E1-2-3-4');
          INSERT INTO #Lager VALUES('E2-1-2-3');
          INSERT INTO #Lager VALUES('E3-3-3-3');
          INSERT INTO #Lager VALUES('E10-1-2-3');
          INSERT INTO #Lager VALUES('E11-1-1-1');
          GO

          -- Ungewünschte Sort
          SELECT *, CHARINDEX('-', Ort) FROM #Lager ORDER BY Ort;

          -- Wie richtig sortieren
          SELECT *
          FROM #Lager
          ORDER BY CAST(SUBSTRING(Ort, 2, CHARINDEX('-', Ort) - 2) AS INT)
          GO
          DROP TABLE #Lager[/highlight]
          [highlight=code]Ort
          ---------- -----------
          E1-2-3-4 3
          E10-1-2-3 4
          E11-1-1-1 4
          E2-1-2-3 3
          E3-3-3-3 3

          Ort
          ----------
          E1-2-3-4
          E2-1-2-3
          E3-3-3-3
          E10-1-2-3
          E11-1-1-1
          [/highlight]
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Na toll, da muss man erst mal drauf kommen...

            Super vielen Dank für deine Hilfe! Ohne Dich würde ich da wohl noch nächset Woche drüber grübeln.

            Danke schön

            Comment

            Working...
            X