Announcement

Collapse
No announcement yet.

Update mit Inner join

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

  • Update mit Inner join

    Hallo habe folgendes Problem. Ich will einen Update Befehl mit Innerjoin ausführen.

    UPDATE tb_Angebotsdetails SET AngebotsNr=@AngebotsNr, Lieferantenname=@Lieferantenname, Angebotseingang=@Angebotseingang,Liefertermin=@Lie fertermin, Lieferzeit=@Lieferzeit, Angebotspreis=@Angebotspreis,Bemerkungen=@Bemerkun gen
    Bis hierher ist soweit klar.

    Ab hier weiß ich nicht weiter :

    Der Lieferantenname (char) steht in der Textbox14.
    In die tabelle soll aber die LieferantenNr (int). Die Beziehungen zwischen LieferantenNr und Lieferantenname steht in der Tabelle tb_Lieferanten .


    WHERE AngebotsPos=@AngebotsPos
    [FROM tb_Angebotsdetails INNER JOIN tb_Lieferanten ON tb_Angebotsdetails.LieferantenNr = tb_Lieferanten.LieferantenNr
    WHERE tb_Lieferanten.Lieferantenname=@Lieferantenname]

    ich habe Paremeter wendet diese wurden konvertiert

    wie hier: cmd.Parameters.Add("@Firmenname", SqlDbType.NVarChar).Value = TextBox14.Text


    Kann da wer Helfen, Ist sicher nur ein Syntaxfehler.

  • #2
    Sorry, aber irgendwie fällt es mir schwer zu verstehen, was das Problem ist.

    2 Hinweise aber schon mal

    1. FROM kommt vor WHERE
    2. Lass mal bei [FROM ... =@Lieferantenname] die eckigen Klammern weg, das dürfte kein DBMS mögen; ist auch nicht gerade ANSI-SQL
    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
      Hallo,

      es gibt verschiedene Möglichkeiten den Update-Vorgang einfacher/transparenter zu gestalten.
      • du kannst im Frontend anstatt der TextBoxen ComboBoxen verwenden. Bei diesen kannst du die Daten (tb_Lieferanten) binden. Desweitern kann eingestellt werden dass der Lieferantenname angezeigt wird während für die Werte die LieferatnenNr verwendet wird.
        Somit ist ein Update direkt möglich.
      • Der Update-Vorgang kann auch über eine gespeicherte Prozedur (SPROC) stattfinden. In der Prozedur kann per Abfrage der tb_Liederanten die LieferantenNr zum Lieferantenname ermittelt werden und dann die Tabelle updaten.
      • Oder es kann ein Trigger (INSTEAD OF UPDATE) verwendet werden. Für den Trigger gilt das selbe wie für die SPROC.


      mfG Gü

      Nachfolgend ein Trigger-Bsp (für SQL Server 2005) eines ähnlichen Problems:

      [highlight=sql]
      USE Test;
      GO
      -------------------------------------------------------------------------------
      -- Tabellen erstellen:
      CREATE TABLE tblVereine
      (
      VerID int IDENTITY CONSTRAINT pkVerein PRIMARY KEY,
      Verein nvarchar(100) NOT NULL CONSTRAINT unVerein UNIQUE
      );

      CREATE TABLE tblTN
      (
      TNID int IDENTITY CONSTRAINT pkTN PRIMARY KEY,
      Nachname nvarchar(100) NOT NULL,
      Vorname nvarchar(100) NOT NULL,
      Jahrgang int NOT NULL,
      VerID int CONSTRAINT fkVerein REFERENCES tblVereine(VerID),
      StartNr int
      );
      GO
      -------------------------------------------------------------------------------
      -- View erstellen:
      CREATE VIEW vwTeilnehmer
      AS
      SELECT t.Nachname, t.Vorname, t.Jahrgang, v.Verein
      FROM tblTN AS t
      INNER JOIN tblVereine AS v
      ON t.VerID = v.VerID;
      GO
      -------------------------------------------------------------------------------
      -- Trigger erstellen:
      CREATE TRIGGER trTeilnehmerINSERT
      ON vwTeilnehmer
      INSTEAD OF INSERT
      AS
      DECLARE @Verein nvarchar(50)
      SET @Verein = (SELECT Verein FROM inserted)

      IF EXISTS
      (
      SELECT *
      FROM tblVereine
      WHERE Verein = @Verein
      )
      BEGIN -- falls vorhanden
      -- Hilfvariablen deklarieren:
      DECLARE @VerID int;
      DECLARE @Nachname nvarchar(50);

      -- Vereins-ID ermitteln:
      SELECT @VerID = VerID
      FROM tblVereine
      WHERE Verein = @Verein;

      -- Nachname ermitteln
      SET @Nachname = (SELECT Nachname FROM inserted);

      -- Teilnehmer einfügen:
      INSERT INTO tblTN (Nachname, Vorname, Jahrgang)
      SELECT Nachname, Vorname, Jahrgang FROM inserted;

      -- Im 2. Schritt die Vereins-ID setzen:
      UPDATE tblTN
      SET VerID = @VerID
      WHERE Nachname = @Nachname;
      END
      ELSE
      BEGIN -- falls nicht vorhanden -> neu anlegen
      -- Verein zur Tabelle hinzufügen:
      INSERT INTO tblVereine (Verein)
      SELECT Verein FROM inserted;

      -- Teilnehmer hinzufügen:
      INSERT INTO tblTN (Nachname, Vorname, Jahrgang, VerID)
      SELECT Nachname, Vorname, Jahrgang, @@IDENTITY FROM inserted;
      END
      -------------------------------------------------------------------------------
      -- Teilnehmer einfügen:
      INSERT INTO vwTeilnehmer
      VALUES ('Foidl', 'Günther', '1982', 'SC Waidring');
      [/highlight]
      Zuletzt editiert von gfoidl; 27.06.2008, 11:58. Reason: Formatierung im Code geändert
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment

      Working...
      X