none
In ACCESS SQL Datensätze anfügen, falls diese noch nicht vorhanden sind.

    Frage

  • Hallo zusammen,

    in Access habe ich in SQL eine Abfrage erstellt, um Daten zu aktuallisieren (UPDATE TempExcelImport INNER JOIN [tbl_Auftragsmeldung-INST/INV] ON TempExcelImport.Auftragsnummer=[tbl_Auftragsmeldung-INST/INV].Auftragsnummer SET [tbl_Auftragsmeldung-INST/INV].[GesamtIstkosten Auftrag] = [TempExcelImport].[GesamtIstkosten Auftrag], [tbl_Auftragsmeldung-INST/INV].Obligo = [TempExcelImport].[Obligo];). wie kann ich diese Abfrage erweitern, um der Tabelle Datensätze anzuhängen wenn diese noch nicht vorhanen sind? Leider habe ich nicht viel Ahnung in SQL.

     

    Mit freundlichen Grüßen

    Wolfgang

    Freitag, 7. Juni 2013 04:52

Antworten

Alle Antworten

  • Hallo Wolfgang

    Erweitern geht nicht, Du musst eine zweite Anfrage machen. Du kannst nicht gleichzeitig einen INSERT und einen UPDATE machen, entweder oder.

    Die zweite Abfrage könnte wie folgt aussehen:

    INSERT INTO [tbl_Auftragsmeldung-INST/INV]
     (Auftragsnummer,
      Obligo,
      [GesamtIstkosten Auftrag])
    SELECT I.Auftragnummer,
           I.Obligo,
           I.[GesamtIstkosten Auftrag]
      FROM TempExcelImport I
     WHERE NOT EXISTS (SELECT *
                         FROM [tbl_Auftragsmeldung-INST/INV] T
                        WHERE T.Auftragsnummer = I.Auftragsnummer)

    Gruss

    Henry

    Freitag, 7. Juni 2013 07:26
  • Hallo Henry,

    habe mal die Komplette Abfrage zusammengestellt:

    INSERT INTO tbl_Auftragsmeldung ( Auftragsnummer, Bezeichnung, Technischer_Platz, PSP_Element, Verantwortlicher_Arbeitsplatz, Beantragtes_Budget, Plankosten_Auftrag, GesamtIstkosten_Auftrag, Obligo, MAnf_CS_Auftragsnummer, MAnf, Auftragsart_PM, MANAS_ID, Bezeichnung_MAnf, IMPlanNummer, Jahr, Kostenstelle, Produktnummer )
    SELECT I.Auftrag, I.Kurztext, I.Techn_Platz, I.PSP_Element, I.VerArbPl, I.Beantr_Budget, I.Auftragsplankosten, I.Summe_Ist, I.Summe_Obligo, I.MANF, I.Jahres_Budget_MANF, I.Art, I.Manas_ID, I.Jahres_Budget_MANF_Bez, I.I_Plan_Pos, I.GenehmJahr, I.Kostenst, I.[Gesamte_Produktnummer]
    FROM ImportDatenExcel AS I
    WHERE Not Exists (Select *
                                       From [tbl_Auftragsmeldung] T
                                     Where T.Auftragsnummer = I.Auftrag);

    Es funktioniert nur, wenn ich in der Zieltabelle alle Datensätze lösche. Stehen aber dort Datensätze schon drin, kommt die Fehlermeldung "Datentypen in Kriterienausdruck unverträglich. Was habe ich falsch gemacht, das keine Datensätze angefügt werden können, die noch nicht vorhanden sind?

    Kann ich eventuell auch direkt auf eine Excel-Tabelle zugreifen, ohne diese erst in Access importieren zu müssen? Die Excel-Tabelle wird aus SAP erzeugt.

    mfg

    Wolfgang

    Dienstag, 11. Juni 2013 08:13
  • Hallo Wolfgang

    In diesem Fall gehe ich davon aus, dass Auftragnummer und Auftrag unterschiedlich definiert sind.

    Welchen Datentypen hat Auftragnummer in der Zieltabelle? Long? Falls ja, kannst Du folgendes tricksen (in der Not Exists() Bedingung:

    WHERE T.Auftragsnummer = CLng(Auftrag);

    Dennoch solltest Du kontrollieren, ob da im Feld Auftrag auch wirklich nur numberische Werte drin sind, indem Du zusätzlich folgende Bedingung hinten nach schiesst:

      AND isNumeric(I.Auftrag)

    Sonst wird CLng() einen Fehler auslösen.

    Falls es immer noch nicht geht, dann musst Du die einzelnen Felder mit Funktionen wie CDate(), Format(), CLng(), CDbl(), etc. dem Zeildatentypen zuweisen.

    Zu Deiner Frage bezüglich Importieren des Excel Sheets: Nein, Du musst das nicht importieren, Du kannst es linken oder sogar einfach in einer Query abfragen. Wie's geht steht in 

    Deutsche Access FAQ 7.22

    HTH

    Henry

    Dienstag, 11. Juni 2013 08:21
  • Hallo Henry,

    die Zieltabelle (in der die fehlenden Daten angefügt werden sollen) ist die tbl_Auftragsmeldung. Dort ist das Feld Auftragsnummer numerisch (Zahl). In der Ausgangstabelle ist das Feld Auftrag Text.

    Habe es so geändert:

    WHERE Not Exists (Select *
                                       From [tbl_Auftragsmeldung] T
                                     Where T.Auftragsnummer = CLng (Auftrag))

    Bei ausführen kommt die Fehlermeldung "Verwendung von Null unzulässig"

    mfg

    Wolfgang

    Dienstag, 11. Juni 2013 09:39
  • Da hast Du noch was vergessen, nämlich den Test auf isNumeric(). Und es gibt scheinbar Zellen, die leer sind.

    Du musst diese Zeilen ebenfalls ausschliessen. Versuch's mal so

    INSERT INTO tbl_Auftragsmeldung ( Auftragsnummer, Bezeichnung, Technischer_Platz, PSP_Element, Verantwortlicher_Arbeitsplatz, Beantragtes_Budget, Plankosten_Auftrag, GesamtIstkosten_Auftrag, Obligo, MAnf_CS_Auftragsnummer, MAnf, Auftragsart_PM, MANAS_ID, Bezeichnung_MAnf, IMPlanNummer, Jahr, Kostenstelle, Produktnummer )
    SELECT I.Auftrag, I.Kurztext, I.Techn_Platz, I.PSP_Element, I.VerArbPl, I.Beantr_Budget, I.Auftragsplankosten, I.Summe_Ist, I.Summe_Obligo, I.MANF, I.Jahres_Budget_MANF, I.Art, I.Manas_ID, I.Jahres_Budget_MANF_Bez, I.I_Plan_Pos, I.GenehmJahr, I.Kostenst, I.[Gesamte_Produktnummer]
    FROM ImportDatenExcel AS I
    WHERE Not Exists (Select * From [tbl_Auftragsmeldung] T WHERE T.Auftragsnummer = CLng(Nz(I.Auftrag, 0)))
      AND I.Auftrag IS NOT NULL
      AND isNumeric(I.Auftrag)

    Gruss

    Henry


    Dienstag, 11. Juni 2013 09:50
  • Hallo Henry,

    dann kommt ein Syntexfehlerin Abfrageausdruck WHERE Not Exists (Select * From [tbl_Auftragsmeldung] T T.Auftragsnummer = CLng(Nz(I.Auftrag, 0)))
      AND I.Auftrag IS NOT NULL
      AND isNumeric(I.Auftrag)

    mfg

    Wolfgang

    Dienstag, 11. Juni 2013 10:49
  • Am 11.06.2013 schrieb Wolfgang56:

    dann kommt ein Syntexfehlerin Abfrageausdruck WHERE Not Exists (Select * From [tbl_Auftragsmeldung] T T.Auftragsnummer = CLng(Nz(I.Auftrag, 0)))
      AND I.Auftrag IS NOT NULL   AND isNumeric(I.Auftrag)

    Da scheint sich ein T eingeschlichen zu haben:

    [tbl_Auftragsmeldung] T T.Auftragsnummer

    Servus
    Winfried


    WSUS Package Publisher: http://wsuspackagepublisher.codeplex.com/
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Dienstag, 11. Juni 2013 16:40
  • Sorry, zwischeb T T fehlt das WHERE, also '....T WHERE T.Auf....'

    Gruss Henry

    Dienstag, 11. Juni 2013 18:06
  • Hallo Henry,

    besten Dank! Es funktioniert bestens!

    mfg

    Wolfgang

    • Als Antwort markiert Wolfgang56 Mittwoch, 12. Juni 2013 06:46
    Mittwoch, 12. Juni 2013 06:17