none
"#Gelöscht" in Formuar/Sicht

    Allgemeine Diskussion

  • Hallo,

    bei der Umstellung eines ADP auf ACCDB habe ich ein Formular an eine eingebundene Sicht gebunden.

    Es funktioniert alles bestens, außer, dass bei Eingabe eines NULL-Wertes nach dem Speichern in allen Feldern "#Gelöscht" steht, obwohl die Daten korrekt gespeichert werden.

    Lt. Profiler tritt der Fehler auf, wenn beim Speichern die ID geholt wird:
    exec sp_executesql N'SELECT "dbo"."AB"."aID" FROM "dbo"."AB" WHERE "aText" = @P1',N'@P1 varchar(255)',NULL

    Meine Testobjekte:

    USE [test] ;
    GO
    
    SET ANSI_NULLS ON ;
    GO
    
    SET QUOTED_IDENTIFIER ON ;
    GO
    
    IF EXISTS ( SELECT *
          FROM  sys.triggers
          WHERE  object_id = OBJECT_ID(N'[dbo].[tr_AB_Del]') )
      DROP TRIGGER [dbo].[tr_AB_Del] ;
    GO
    
    IF EXISTS ( SELECT *
          FROM  sys.views
          WHERE  object_id = OBJECT_ID(N'[dbo].[AB]') )
      DROP VIEW [dbo].[AB] ;
    GO
    
    IF EXISTS ( SELECT *
          FROM  sys.objects
          WHERE  object_id = OBJECT_ID(N'[dbo].[A]')
              AND type IN ( N'U' ) )
      DROP TABLE [dbo].[A] ;
    GO
    
    IF EXISTS ( SELECT *
          FROM  sys.objects
          WHERE  object_id = OBJECT_ID(N'[dbo].[B]')
              AND type IN ( N'U' ) )
      DROP TABLE [dbo].[B] ;
    GO
    
    CREATE TABLE [dbo].[A]
      (
       [aID] [int] IDENTITY,
       [aText] [varchar](255) NULL,
       [aTS] [timestamp] NOT NULL,
       [abID] [int] NULL,
       PRIMARY KEY CLUSTERED ( [aID] ASC )
        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
            IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
            ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
      )
    ON [PRIMARY] ;
    GO
    
    CREATE TABLE [dbo].[B]
      (
       [bID] [int] IDENTITY,
       [bText] [varchar](255) NULL,
       [bTS] [timestamp] NOT NULL,
       PRIMARY KEY CLUSTERED ( [bID] ASC )
        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
            IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
            ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
      )
    ON [PRIMARY] ;
    GO
    
    CREATE VIEW [dbo].[AB]
    AS SELECT A.*,
          B.*
      FROM  A
          LEFT OUTER JOIN B ON A.abID = B.bID ;
    GO
    
    CREATE TRIGGER [dbo].[tr_AB_Del] ON [dbo].[AB]
      INSTEAD OF DELETE
    AS
      SET NOCOUNT ON ;
      DELETE FROM dbo.A
      WHERE  aID IN ( SELECT aID
               FROM  DELETED ) ;
    GO
    
    

    Wenn ich aID nicht auf IDENTITY setze, funktioniert es, aber ich kann doch den Key nicht in jedem Datensatz manuell schreiben?

    Diesen Artikel habe ich gefunden, komme aber auch nicht weiter:
    http://support.microsoft.com/kb/128809/de

    Bin für jeden Tip dankbar!!

    Gruß Thomas

    Dienstag, 19. Oktober 2010 14:59

Alle Antworten

  • Hallo Thomas,

    der "Fehler" ist relativ simpel erklärt. Der PK ist geclustered. Ein geclusterter Index führt immer zu einer Neuorganisation der Tabelle.
    Nimm' doch mal den Cluster raus:

    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.A', 'U'))
     DROP TABLE dbo.A
     GO
    
    CREATE TABLE [dbo].[A]
    (
     [aID] [int] IDENTITY PRIMARY KEY NONCLUSTERED,
     [aText] [varchar](255) NULL,
     [aTS] [timestamp] NOT NULL,
     [abID] [int] NULL
    )
    
    GO
    
    
    
    
    

    Weiterhin gibt es bei ADP die Option des Resyn-Commands. Da bin ich aber in Bezug auf ODBC etwas überfragt, da ich auch weiterhin ausschließlich mit ADP arbeite. Ich bin mir aber sicher, dass das nur noch beschränkt möglich sein wird, je größer die Version wird ;-)


    Uwe Ricken
    Microsoft Certified Database Administrator SQL Server 2005
    db Berater GmbH
    http://www-db-berater.de

    Donnerstag, 21. Oktober 2010 15:32
  • Hallo Uwe,

    daran liegt es leider nicht. Der Fehler tritt auch auf, wenn ich die Keys NONCLUSTERED erstelle.

    Bisher habe ich auch mit ADPs gearbeitet. Aber da momentan eine Überarbeitung ansteht, habe ich mich für den empfohlenen Weg entschlossen.

    Wenn es nicht anders geht, werde ich die Keys beim Erfassen ("BeforeUpdate") manuell zuweisen, dann funktioniert alles.

    Gruß Thomas

    Montag, 25. Oktober 2010 07:20