Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Cursor

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Cursor

    Hallo,

    ich habe ein Problem mit meinem Cursor.. Ich bin kein Entwickler und versuche gerade einen Cursor zu bauen, der eine Gruppenzugehörigkeit anhand des Datentyps ändert..

    Ich hole mir im ersten Moment das Feld ANR und DisplayType.. Hierbei ist der DisplayType der "Typ" der Adresse (int 1, 2, 3...)

    Nun möchte ich den Datentyp abfragen (was schon geht) und anhand dessen in die richtige Gruppe stopfen..

    ich habe nun folgendes Problem, wenn ich mein Update in der Tabelle [AdrGrpZord] mache, kann es passieren, dass ein Datensatz 2 mal vorhanden ist, da er mehr als einer Gruppe angehören kann.

    Die GrpID ist ein PK und genau das ist mein Problem..

    Mein Update versucht beide Datensätze auf z.B. GrpID = 10 zu ändern (wenn Datentyp z.B. 1 ist) was natürlich nicht geht..

    Ich möchte in so einem Fall den Datensatz != 10 ändern.. Nur ich bekomme das Filtern einfach nicht hin..

    Ich hoffe ihr versteht so einigermaßen was ich möchte


    GrpID: 1 ANR: ADR1061 CID: 0...
    GrpID: 9 ANR: ADR1061 CID: 0..

    Ich möchte einen der beiden Datensätze auf z.B. GrpID 10 anpassen.

    DECLARE
    @c_ANR varchar(15),
    @c_DT integer;

    DECLARE update_type CURSOR
    FOR SELECT ANR, DisplayType FROM [con_backup_2014].[dbo].[Address];

    OPEN update_type
    FETCH NEXT FROM update_type into @c_ANR, @c_DT

    WHILE @@FETCH_STATUS = 0 BEGIN
    IF(@c_DT = 1)
    BEGIN
    UPDATE [dbo].[AdrGrpZord]
    SET GrpID = 10 WHERE ANR = @c_ANR AND GrpID != 10
    FETCH NEXT FROM update_type into @c_ANR, @c_DT
    END

    ELSE IF(@c_DT = 2)
    BEGIN
    UPDATE [dbo].[AdrGrpZord]
    SET GrpID = 9 WHERE ANR = @c_ANR AND GrpID != 9
    FETCH NEXT FROM update_type into @c_ANR, @c_DT
    END

    ELSE FETCH NEXT FROM update_type into @c_ANR, @c_DT

    END
    CLOSE update_type
    DEALLOCATE update_type;

  • #2
    Zitat von sands Beitrag anzeigen
    Die GrpID ist ein PK und genau das ist mein Problem..
    Beschreib Dein Problem mal so, daß es nachvollziehbar ist.
    • create table
    • Beispieldaten
    • was geändert werden soll


    Vermutlich schießt Du mit Kanonen auf Spatzen, ein Luftgewehr tät reichen.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Hallo,

      danke für die Antwort.. Ich versuche es mal

      Das create table kann ich leider nicht posten, da die Tabellen bereits angelegt sind (nicht von mir)..

      Ich habe 3 Tabellen die für das Problem relevant sind..

      Tabellen:
      Tabelle1: AdrGrp (Adressgruppen)
      Tabelle2: AdrGrpZord (Adressgruppenzuordnung)
      Taeblle3: Address (Adressen)

      Werte aus SQL Server Management Studio Reiter "Spalten":
      Tabelle1:
      GrpID (PS, int, NICHT NULL)
      GrpName (varchar(80), NULL)
      GrpType (smallint, NULL)
      GrpCategory (int, NULL)
      .....
      Schlüssel: PK_AdrGrpGrpID

      Taeblle2:
      GrpID (PS, int, NICHTNULL)
      ANR (PS, varchar(15), Nicht NULL)
      CID (PS, int, Nicht NULL)
      DelDate (datetime NULL)
      .....
      Schlüssel: PK_AdrGrpZordGrpIDANRCID

      Tabelle3:
      ANR (PS. varchar(15), Nicht NULL)
      Name1 (varchar(255), NULL)
      .....
      DisplayType (smallint, Null)
      .....
      Schlüssel: PK_AddressANR


      Beispieldaten:
      Tabelle1: GrpID = 1, GrpName = Handel, GrpCategory = 7...

      Tabelle2: GrpID = 1, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy...

      Tabelle3: ANR = ADR100, InfoText = NULL, Name1 = Musterfirma, DisplayType = 3....


      Kurze Erklärung zum DisplayType: Dieser gibt wieder, um welchen Adresstypen es sich bei diesem Datensatz handelt (also z.B. Handel, Grosshandel etc)


      So, ich will nun folgendes machen.. Ich möchte alle Adressen aus Tabelle 3 nach ihrem DisplayType abfragen.. Wenn dieser z.B. 1 ist (Handel), soll in Tabelle 2 die GrpID auf z.B. 1000 geändert werden.. Wenn dieser z.B. 2 ist, dann auf 2000 usw..

      Eine Adresse kann jetzt mehreren Gruppen haben, somit sind auch mehrere Einträge in Tabelle 2 vorhanden.

      Beispiel:
      Tabelle2: GrpID = 1, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy..
      Tabelle2: GrpID = 2, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy..

      Dieser Datensatz mit GrpID = 1 darf nur einmal in der Tabelle vorkommen (ich denke das ist dem PK geschuldet? was ja auch Sinn macht)

      Ich möchte nun den ersten Eintrag, den ich bei der Suche finde, der ungleich der Gruppe ist, in den ich den Datensatz stopfen will, manipulieren..

      Beispiel:
      ANR = ADR100, InfoText = NULL, Name1 = Musterfirma, DisplayType = 3

      Hier frage ich den DisplayType ab, in diesem Fall 3 (somit soll dieser Datensatz in die Gruppe 3000 gesteckt werden)

      in Tabelle 2 sind diese beiden Einträge vorhanden:
      Tabelle2: GrpID = 1, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy..
      Tabelle2: GrpID = 2, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy..

      Mit meinem "Skrtipt" würde er ja nun die GrpID von beiden Einträgen ändern, da er ja beide Datensätze finden würde.. Dies führt logischerweise immer zu einem Fehler.. Nur wie kann ich sagen, dass er, wenn er einen Datensatz geändert hat, den Rest ignoriert?

      Ich hoffe die Erklärung ist etwas besser .. Wie gesagt, ich bin kein Programmierer und habe keine Ahnung wie ich solche Probleme fachlich korrekt erläutern kann.. Ich bitte Euch dies zu berücksichtigen

      Kommentar


      • #4
        -------

        Kommentar


        • #5
          Zitat von sands Beitrag anzeigen

          Dieser Datensatz mit GrpID = 1 darf nur einmal in der Tabelle vorkommen (ich denke das ist dem PK geschuldet? was ja auch Sinn macht)

          Ich möchte nun den ersten Eintrag, den ich bei der Suche finde, der ungleich der Gruppe ist, in den ich den Datensatz stopfen will, manipulieren..

          Beispiel:
          ANR = ADR100, InfoText = NULL, Name1 = Musterfirma, DisplayType = 3

          Hier frage ich den DisplayType ab, in diesem Fall 3 (somit soll dieser Datensatz in die Gruppe 3000 gesteckt werden)

          in Tabelle 2 sind diese beiden Einträge vorhanden:
          Tabelle2: GrpID = 1, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy..
          Tabelle2: GrpID = 2, ADR1034, CID = 0, DelDate = Null, CreatedBy = xy..

          Mit meinem "Skrtipt" würde er ja nun die GrpID von beiden Einträgen ändern, da er ja beide Datensätze finden würde.. Dies führt logischerweise immer zu einem Fehler.. Nur wie kann ich sagen, dass er, wenn er einen Datensatz geändert hat, den Rest ignoriert?

          Ich hoffe die Erklärung ist etwas besser .. Wie gesagt, ich bin kein Programmierer und habe keine Ahnung wie ich solche Probleme fachlich korrekt erläutern kann.. Ich bitte Euch dies zu berücksichtigen
          Das klingt alles recht wirr. Machbar wäre dies z.B. mit einer row_number() über Deine Merkmale da und immer nur dann die Records ändern, die row_number = 1 haben. Dumm nur für Dich, daß MySQL das nicht kann.

          Aber insgesamt denke ich, daß ganze 'Konzept' von Dir ist für die Tonne.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Okay.. Wie wäre es denn anders lösbar? Es muss genau dieser Effekt erreicht werden..!

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen
              Das klingt alles recht wirr. Machbar wäre dies z.B. mit einer row_number() über Deine Merkmale da und immer nur dann die Records ändern, die row_number = 1 haben. Dumm nur für Dich, daß MySQL das nicht kann.
              dbo und [] sind ziemlich eindeutig. Das ist Mssql und kein Mysql. Mit Mysql wäre das aber kein Problem... es unterstützt LIMIT in UPDATE Statments.

              Zitat von akretschmer Beitrag anzeigen
              Aber insgesamt denke ich, daß ganze 'Konzept' von Dir ist für die Tonne.
              Jap...

              Es muss genau dieser Effekt erreicht werden..!
              Was für ein Effekt? Du sagst "den ersten Eintrag, ... , der ungleich der Gruppe ist" und genau diese Gruppe soll geändert werden aber ist mit der PK. Was denkst du was passiert wenn du das mehrmals ausführst?

              Kommentar

              Lädt...
              X