Offen Primary Key Verletzung bei Zahlung setzen (dbo.tZahlung)

rote-locke

Gut bekanntes Mitglied
9. Dezember 2011
304
9
Produktiv läuft bei uns aktuell die Wawi 1.0.7.3, hier tritt nun beim Versuch Zahlungen zu setzen der unten angegeben Fehler auf.
In unserem Testsystem haben wir inzwischen auf die aktuellste Version 1.0.8.2 aktualisiert (Fehlermeldung hieraus), was den Fehler bei gleichem Datenstand aber nicht behebt. Muss hier evtl. die Tabelle dbo.tZahlung repariert bzw. die Spalte kZahlung neu aufgebaut werden? Wenn ja, wie lautet dafür der SQL-Befehl?
@JTL: Ticket#103869046126


Code:
Unbehandelte Ausnahme #761E037A5E9D6536 vom Typ jtlCore.Classes.CppConnector.CppException in 
jtlCore.Classes.CppConnector.CppException: SQLState=23000, NativeError=2627, Message=[Microsoft][ODBC SQL Server Driver][SQL Server]Verletzung der PRIMARY KEY-Einschränkung 'PK_tZahlung'. Ein doppelter Schlüssel kann in das dbo.tZahlung-Objekt nicht eingefügt werden. Der doppelte Schlüsselwert ist (0).

SQLState=01000, NativeError=3621, Message=[Microsoft][ODBC SQL Server Driver][SQL Server]Die Anweisung wurde beendet.



2016-01-27T09:07:51 DEBUG - [SQL] SELECT TOP 1 * FROM tBestellung WHERE tBestellung.dErstellt > CONVERT(DATETIME, '01.01.2004') ORDER BY tBestellung.dErstellt
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 44ms
2016-01-27T09:07:51 DEBUG - [SQL] WITH DateTable
                                AS
                                (
                                    SELECT      
                                    CASE 
                                        WHEN 'mm' = 'yy' THEN CONVERT(DATETIME, '01.01.' + CONVERT(VARCHAR, DATEPART(year, CAST('16.02.2010' as Datetime)))) 
                                        WHEN 'mm' = 'mm' THEN CONVERT(DATETIME, '01.' + CONVERT(VARCHAR, DATEPART(month, CAST('16.02.2010' as Datetime))) + '.' + CONVERT(VARCHAR, DATEPART(year, CAST('16.02.2010' as Datetime)))) 
                                        ELSE CAST('16.02.2010' as Datetime)
                                    END AS DATE
                                    UNION ALL
                                    SELECT DATEADD(mm, 1, DATE)
                                    FROM DateTable
                                    WHERE DATEADD(mm, 1, DATE) <= cast('27.01.2016' as Datetime)
                                )
                                SELECT TOP 10 
                                    CASE 
                                    WHEN '' IS NOT NULL THEN /*#FORMELBEGINN#*/ COUNT(DISTINCT tbestellpos.tBestellung_kBestellung) /*#FORMELENDE#*/   
                                    WHEN '' IS NULL THEN 0
                                    END AS Y,
                                CONVERT(VARCHAR, ISNULL(tartikel.cArtNr, 'unbekannt')) + ' - (' + ISNULL(tartikel.cName, 'unbekannt') + ')' AS X,
                                /*#SERIESBEGINN#*/ ISNULL('Anzahl Bestellungen', 'unbekannt') AS Series /*#SERIESENDE#*/
                                FROM tbestellpos     
                                LEFT JOIN tbestellung ON tbestellpos.tBestellung_kBestellung = tbestellung.kBestellung        
                                 JOIN vStandardartikel AS tartikel ON tartikel.kArtikel = tbestellpos.tArtikel_kArtikel 
                                /*#REPLACEWITHJOIN#*/
                                WHERE (((tbestellung.nStorno = 0) AND tbestellung.cType = 'B') OR tbestellung.kBestellung IS NULL)
                                AND ((tbestellung.dErstellt >= CAST('16.02.2010' as Datetime) AND tbestellung.dErstellt <= CAST('27.01.2016' as Datetime)) OR tbestellung.dErstellt IS NULL)
                                 AND (tartikel.kArtikel IN (3564, 3565, 3566, 3567, 3560, 3561, 3562, 3563))
                                /*#REPLACEWITHWHERE#*/
                                GROUP BY tartikel.cArtNr, tartikel.cName
                                
                                ORDER BY Y DESC
                                OPTION (MAXRECURSION 30000)
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 2ms
2016-01-27T09:07:51 DEBUG - [SQL] SELECT TOP 1 * FROM tBestellung WHERE tBestellung.dErstellt > CONVERT(DATETIME, '01.01.2004') ORDER BY tBestellung.dErstellt
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 60ms
2016-01-27T09:07:51 DEBUG - [SQL] SELECT TOP 1 * FROM tBestellung WHERE tBestellung.dErstellt > CONVERT(DATETIME, '01.01.2004') ORDER BY tBestellung.dErstellt
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 46ms
2016-01-27T09:07:51 DEBUG - [SQL] WITH DateTable
                                AS
                                (
                                    SELECT      
                                    CASE 
                                        WHEN 'mm' = 'yy' THEN CONVERT(DATETIME, '01.01.' + CONVERT(VARCHAR, DATEPART(year, CAST('16.02.2010' as Datetime)))) 
                                        WHEN 'mm' = 'mm' THEN CONVERT(DATETIME, '01.' + CONVERT(VARCHAR, DATEPART(month, CAST('16.02.2010' as Datetime))) + '.' + CONVERT(VARCHAR, DATEPART(year, CAST('16.02.2010' as Datetime)))) 
                                        ELSE CAST('16.02.2010' as Datetime)
                                    END AS DATE
                                    UNION ALL
                                    SELECT DATEADD(mm, 1, DATE)
                                    FROM DateTable
                                    WHERE DATEADD(mm, 1, DATE) <= cast('27.01.2016' as Datetime)
                                )
                                SELECT TOP 10 
                                    CASE 
                                    WHEN '' IS NOT NULL THEN /*#FORMELBEGINN#*/ COUNT(DISTINCT tbestellpos.tBestellung_kBestellung) /*#FORMELENDE#*/   
                                    WHEN '' IS NULL THEN 0
                                    END AS Y,
                                CONVERT(VARCHAR, ISNULL(tartikel.cArtNr, 'unbekannt')) + ' - (' + ISNULL(tartikel.cName, 'unbekannt') + ')' AS X,
                                /*#SERIESBEGINN#*/ ISNULL('Anzahl Bestellungen', 'unbekannt') AS Series /*#SERIESENDE#*/
                                FROM tbestellpos     
                                LEFT JOIN tbestellung ON tbestellpos.tBestellung_kBestellung = tbestellung.kBestellung        
                                 JOIN vStandardartikel AS tartikel ON tartikel.kArtikel = tbestellpos.tArtikel_kArtikel 
                                /*#REPLACEWITHJOIN#*/
                                WHERE (((tbestellung.nStorno = 0) AND tbestellung.cType = 'B') OR tbestellung.kBestellung IS NULL)
                                AND ((tbestellung.dErstellt >= CAST('16.02.2010' as Datetime) AND tbestellung.dErstellt <= CAST('27.01.2016' as Datetime)) OR tbestellung.dErstellt IS NULL)
                                 AND (tartikel.kArtikel IN (3564, 3565, 3566, 3567, 3560, 3561, 3562, 3563))
                                /*#REPLACEWITHWHERE#*/
                                GROUP BY tartikel.cArtNr, tartikel.cName
                                
                                ORDER BY Y DESC
                                OPTION (MAXRECURSION 30000)
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 2ms
2016-01-27T09:07:51 DEBUG - [SQL] SELECT     
                                    tbestellung.cBestellNr as 'Auftrags Nr.',
                                    CASE 
                                    WHEN tbestellung.dBezahlt is null then 
                                    convert(varchar,tbestellung.dErstellt,104)
                                    ELSE 
                                    convert(varchar,tbestellung.dBezahlt,104)    
                                    END as 'Datum',
                                    CASE 
                                    WHEN tbestellung.dBezahlt is null then 
                                    convert(varchar,tbestellung.dErstellt,102)
                                    ELSE 
                                    convert(varchar,tbestellung.dBezahlt,102)    
                                    END as 'Datum_Sort'
                                ,dbo.tbestellung.kColor as RowColor  ,dbo.tkunde.cVorname as Vorname, dbo.tkunde.cName as Name  ,dbo.tFirma.cName as Firma ,CASE WHEN (DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel < 0)
                        THEN
                            '0'
                        ELSE
                            DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel 
                        END                        
                        AS 'Verzug (Tage)' ,XX.Betrag AS 'Betrag (Netto)' FROM    tbestellung 
                                LEFT JOIN tZahlungsart on tZahlungsart.kZahlungsart = tbestellung.kZahlungsArt
                                 JOIN dbo.tkunde ON dbo.tbestellung.tKunde_kKunde = dbo.tkunde.kKunde  JOIN dbo.tFirma ON dbo.tbestellung.kFirma = dbo.tFirma.kFirma  LEFT JOIN (SELECT tBestellung_kBestellung, CAST(ROUND(SUM((nAnzahl*fVKNetto*(100-fRabatt)/100.0)*(100+fMwSt)/100), 2) AS DECIMAL(10,2)) AS Betrag 
                           FROM dbo.tbestellpos 
                           GROUP BY tBestellung_kBestellung) as XX ON  XX.tBestellung_kBestellung = dbo.tbestellung.kBestellung WHERE     
                                (( (datediff(d, 0, tbestellung.dbezahlt) <= datediff(d, 0, @enddate)) and [tbestellung].dBezahlt is not null) 
                                OR (tZahlungsart.nAusliefernVorZahlung = 1 and (datediff(d, 0, tbestellung.dErstellt) <= datediff(d, 0, @enddate)))
                                )
                                and cType = 'B' and nstorno = 0 and nKomplettAusgeliefert = 0
      enddate = '2016-27-01 09:07:51' -- 27.01.2016 09:07:51
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 168ms
2016-01-27T09:07:51 DEBUG - [SQL] SELECT 
                        tbestellung.cBestellNr as 'Auftrags Nr.',
                        convert(varchar,tbestellung.dErstellt,104) as 'Erstellt',
                        convert(varchar,tbestellung.dErstellt,102) as 'Erstellt_Sort'
                    ,dbo.tbestellung.kColor as RowColor  ,dbo.tkunde.cVorname as Vorname, dbo.tkunde.cName as Name  ,dbo.tFirma.cName as Firma ,CASE WHEN (DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel < 0)
                        THEN
                            '0'
                        ELSE
                            DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel 
                        END                        
                        AS 'Verzug (Tage)' ,XX.Betrag AS 'Betrag (Netto)' FROM    tbestellung 
                    
                     JOIN dbo.tkunde ON dbo.tbestellung.tKunde_kKunde = dbo.tkunde.kKunde  JOIN dbo.tFirma ON dbo.tbestellung.kFirma = dbo.tFirma.kFirma  LEFT JOIN (SELECT tBestellung_kBestellung, CAST(ROUND(SUM((nAnzahl*fVKNetto*(100-fRabatt)/100.0)*(100+fMwSt)/100), 2) AS DECIMAL(10,2)) AS Betrag 
                           FROM dbo.tbestellpos 
                           GROUP BY tBestellung_kBestellung) as XX ON  XX.tBestellung_kBestellung = dbo.tbestellung.kBestellung WHERE     
                    ([tbestellung].dErstellt >= 0) 
                    AND datediff(d, 0, tbestellung.dErstellt) <= datediff(d, 0, @enddate)                     
                    and ([tbestellung].dBezahlt is null)
                    
                    AND cType = 'B' and nstorno = 0
      enddate = '2016-17-01 09:07:51' -- 17.01.2016 09:07:51
2016-01-27T09:07:51 DEBUG - [SQL] Dauer: 159ms
2016-01-27T09:07:51 DEBUG - [SQL] SELECT tbestellung.cBestellNr Bestellung, tbestellung.dErstellt Erstellt,tbestellung.kBestellung as kBestellung                    
                    ,dbo.tbestellung.kColor as RowColor  ,dbo.tkunde.cVorname as Vorname, dbo.tkunde.cName as Name  ,dbo.tFirma.cName as Firma ,CASE WHEN (DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel < 0)
                        THEN
                            '0'
                        ELSE
                            DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel 
                        END                        
                        AS 'Verzug (Tage)' ,XX.Betrag AS 'Betrag (Netto)' FROM    tbestellung
                     JOIN dbo.tkunde ON dbo.tbestellung.tKunde_kKunde = dbo.tkunde.kKunde  JOIN dbo.tFirma ON dbo.tbestellung.kFirma = dbo.tFirma.kFirma  LEFT JOIN (SELECT tBestellung_kBestellung, CAST(ROUND(SUM((nAnzahl*fVKNetto*(100-fRabatt)/100.0)*(100+fMwSt)/100), 2) AS DECIMAL(10,2)) AS Betrag 
                           FROM dbo.tbestellpos 
                           GROUP BY tBestellung_kBestellung) as XX ON  XX.tBestellung_kBestellung = dbo.tbestellung.kBestellung WHERE    ISNULL (tVersandArt_kVersandArt,0) = 0
                    AND cType = 'B'
                    AND nkomplettausgeliefert = 0
                    AND nStorno = 0
                    ORDER BY tbestellung.dErstellt; 
2016-01-27T09:07:52 DEBUG - [SQL] Dauer: 131ms
2016-01-27T09:07:52 DEBUG - [SQL] SELECT tbestellung.cBestellNr Bestellung, tbestellung.dErstellt Erstellt,tbestellung.kBestellung as kBestellung                    
                    ,dbo.tbestellung.kColor as RowColor  ,dbo.tkunde.cVorname as Vorname, dbo.tkunde.cName as Name  ,dbo.tFirma.cName as Firma ,CASE WHEN (DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel < 0)
                        THEN
                            '0'
                        ELSE
                            DATEDIFF(dd,dbo.tbestellung.dErstellt,GETDATE()) - dbo.tbestellung.nZahlungsziel 
                        END                        
                        AS 'Verzug (Tage)' ,XX.Betrag AS 'Betrag (Netto)' FROM    tbestellung
                     JOIN dbo.tkunde ON dbo.tbestellung.tKunde_kKunde = dbo.tkunde.kKunde  JOIN dbo.tFirma ON dbo.tbestellung.kFirma = dbo.tFirma.kFirma  LEFT JOIN (SELECT tBestellung_kBestellung, CAST(ROUND(SUM((nAnzahl*fVKNetto*(100-fRabatt)/100.0)*(100+fMwSt)/100), 2) AS DECIMAL(10,2)) AS Betrag 
                           FROM dbo.tbestellpos 
                           GROUP BY tBestellung_kBestellung) as XX ON  XX.tBestellung_kBestellung = dbo.tbestellung.kBestellung WHERE    ISNULL (tbestellung.kZahlungsArt,0) = 0
                    AND tbestellung.cType = 'B'
                    AND tbestellung.nkomplettausgeliefert = 0
                    AND tbestellung.nStorno = 0
                    ORDER BY tbestellung.dErstellt; 
2016-01-27T09:07:52 DEBUG - [SQL] Dauer: 38ms
2016-01-27T09:07:52 DEBUG - [SQL] SELECT * FROM dbo.tVersandArt WHERE (nEigeneVersandart = @nEigeneVersandart) AND (kMainVersandart = @kMainVersandart)
      nEigeneVersandart = '0',
      kMainVersandart = '0'
2016-01-27T09:07:52 DEBUG - [SQL] Dauer: 3ms
2016-01-27T09:07:52 DEBUG - [SQL] EXEC Auslieferung.spPicklistenAufraeumen
      
2016-01-27T09:07:52 DEBUG - [SQL] Dauer: 18ms
2016-01-27T09:07:53 DEBUG - [SQL] UPDATE [tWidgetLayout] SET cLayout=@cLayout WHERE 1=1 AND kWidgetLayout=@kWidgetLayout;
      @cLayout = '<?xml version="1.0" encoding="utf-16"?><LayoutRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SelectedTheme="Standard"><RootPanel Orientation="Horizontal"><LayoutDocumentPaneGroup Orientation="Horizontal"><LayoutDocumentPaneGroup Orientation="Vertical"><LayoutDocumentPane Id="1330042d-6db1-4bd0-9dd3-8fbf4a819fa7"><LayoutDocument Title="Beschaffung erforderlich" IsSelected="True" ContentId="262" FloatingLeft="-832" FloatingTop="158" FloatingWidth="1920" FloatingHeight="292" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane><LayoutDocumentPane><LayoutDocument Title="Eloxieren" IsSelected="True" IsLastFocusedDocument="True" ContentId="263" FloatingLeft="40" FloatingTop="631" FloatingWidth="379" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane></LayoutDocumentPaneGroup><LayoutDocumentPaneGroup Orientation="Vertical"><LayoutDocumentPane><LayoutDocument Title="Werkstatt" IsSelected="True" ContentId="264" FloatingLeft="-38" FloatingTop="594" FloatingWidth="1920" FloatingHeight="292" LastActivationTimeStamp="01/27/2016 09:07:48" PreviousContainerId="1330042d-6db1-4bd0-9dd3-8fbf4a819fa7" PreviousContainerIndex="0" /></LayoutDocumentPane><LayoutDocumentPane><LayoutDocument Title="Sandstrahlen" IsSelected="True" ContentId="265" FloatingLeft="484" FloatingTop="622" FloatingWidth="476" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane></LayoutDocumentPaneGroup><LayoutDocumentPaneGroup Orientation="Vertical"><LayoutDocumentPane><LayoutDocument Title="Pulverbeschichtung" IsSelected="True" ContentId="266" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane><LayoutDocumentPane><LayoutDocument Title="Endmontage" IsSelected="True" ContentId="267" FloatingLeft="1007" FloatingTop="628" FloatingWidth="379" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane></LayoutDocumentPaneGroup><LayoutDocumentPaneGroup Orientation="Vertical" DockWidth="1.26107594936709*"><LayoutDocumentPane><LayoutDocument Title="Anzahl Bestellungen" IsSelected="True" ContentId="268" FloatingLeft="1251" FloatingTop="324" FloatingWidth="315" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane><LayoutDocumentPane DockWidth="0.949894514767933*"><LayoutDocument Title="Offene Aufträge" IsSelected="True" ContentId="269" FloatingLeft="1533" FloatingTop="590" FloatingWidth="379" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane><LayoutDocumentPane><LayoutDocument Title="Nicht bezahlte Aufträge" IsSelected="True" ContentId="270" FloatingLeft="1185" FloatingTop="625" FloatingWidth="331" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane></LayoutDocumentPaneGroup><LayoutDocumentPaneGroup Orientation="Vertical" DockWidth="0.738924050632911*"><LayoutDocumentPane><LayoutDocument Title="Aufträge ohne Versandart" IsSelected="True" ContentId="271" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane><LayoutDocumentPane><LayoutDocument Title="Aufträge ohne Zahlungsart" IsSelected="True" ContentId="272" FloatingLeft="1626" FloatingTop="631" FloatingWidth="269" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane><LayoutDocumentPane><LayoutDocument Title="Ungemappte Versandarten" IsSelected="True" ContentId="273" FloatingLeft="1640" FloatingTop="852" FloatingWidth="315" FloatingHeight="889" LastActivationTimeStamp="01/27/2016 09:07:48" /></LayoutDocumentPane></LayoutDocumentPaneGroup></LayoutDocumentPaneGroup></RootPanel><TopSide /><RightSide /><LeftSide /><BottomSide /><FloatingWindows /><Hidden /></LayoutRoot>',
      @kWidgetLayout = 23
2016-01-27T09:07:53 DEBUG - [SQL] Dauer: 2ms
2016-01-27T09:07:53 DEBUG - [TableTable] Invalidate: [tWidgetLayout]
Zeitstempel: 2016-01-27T09:10:37
Locale: German (Germany)
Locale: German (Germany)
Version: 1.0.8.2
Plattform: Wawi
Versionshash: 6BE075F5
Prozessname: System.Diagnostics.Process (JTL-wawi)
Physikalischer Speicher: 286973952 / Peak: 468733952
Basispriorität: 8
Prioritätsklasse: Normal
CPU-Zeit (User): 0:00:12,0432772
CPU-Zeit (System): 0:00:03,2604209
Page-Size (Sytem): 1012016 / Peak: 402821120
Page-Size: 208699392 / Peak: 402821120
Offene Handles: 870
 

rote-locke

Gut bekanntes Mitglied
9. Dezember 2011
304
9
AW: Primary Key Verletzung bei Zahlung setzen (dbo.tZahlung)

Vielen Dank an @mike59999, hier seine Lösung, welche wir gerade erfolgreich testen und umsetzen konnten:

In der Tabelle dbo.tpk war in der Zeile "tZahlung" der Wert "NULL" gesetzt. Hierbei handelt sich um den Index für das o.g. Problem.

Um diesen Zähler korrekt hoch zu setzen fragt man zunächst in der Tabelle "dbo.tZahlung" den höchsten Wert für die Spalte "kZahlung" ab:
Code:
SELECT TOP(1) kZahlung FROM tZahlung ORDER BY kZahlung DESC

Zu diesem Wert addiert man eine 1 und schreibt diesen sodann in der Tabelle "dbo.tpk" in die Zeile "tZahlung". Fertig, nun werden neue Zahlungseingänge beginnend mit diesem Wert hochgezählt.