Rechnungsdruck + Rechnungsversand per Mail

dkzg

Gut bekanntes Mitglied
31. August 2013
89
27
Kümmersbruck
Um es hier auch mal festzuhalten.

Der Druck von neuen Rechnungen und der Versand per Mail funktionieren in 2.1.1 nicht sauber.

Hintergrund:

- Die 2.1.1-Migration (Schritt „WAWI-87515 ExtendFileStructure", heute 10:58 auf Mandant_4 gelaufen) hat die Spalte iBlobIdentifier an tFile neu angelegt, alle 7.644 Altzeilen mit echten GUIDs gefüllt und darauf einen eindeutigen Index mit Filter „nicht NULL" gesetzt.
- Der Client schreibt bei jeder Rechnungsvorschau aber die Null-GUID. Grund, per Dekompilierung der installierten DLLs belegt: die Entitätsklasse für tFile deklariert das Feld als nicht nullbaren Guid ohne Startwert, und die Routine, die die Druckvorschau speichert, setzt es nicht. Beim Einfügen werden trotzdem alle Spalten geschrieben.
- Der erste Druck nach der Migration (11:47, Datei 22265) ging deshalb noch durch. Jeder weitere kollidiert an genau dieser einen Zeile. Ohne Eingriff bleibt der Rechnungsdruck dauerhaft blockiert.
- Dieselbe Klasse für tBild hat den gleichen Konstruktionsfehler, und tBild hat den gleichen Index. Bilder, die über den alten Pfad angelegt werden, würden nach dem ersten Bild ebenso scheitern. Bisher gibt es in tBild noch keine Null-GUID.
- Gilt auch für gesendete Mails mit Rechnung, solange die Funktion "PDFs an Rechnung speichern" aktiv ist.

Abhilfe schafft die Funktion, PDFs an die Rechnung zu speichern, zeitweise zu deaktivieren. Sofern also nur Rechnungen gemailt werden, gibt es einen schnellen Workaround.

JTL ist bereits an dem Problem dran und wird da wohl kurzfristig ein Update raushauen.


Wer gerne am Limit lebt und jedes Risiko eingehen muss...


SQL:
-- JTL-Wawi 2.1.1 Überbrückung (15.09.2026): Null-GUID aus dem eindeutigen Filterindex auf dbo.tFile ausnehmen.
-- Hintergrund: der 2.1.1-Client schreibt bei jeder neuen Rechnungsvorschau iBlobIdentifier = 00000000-...,
-- der Index UX_dbo_tFile_iBlobIdentifier_INCL_FILTER (Filter: IS NOT NULL) lässt das nur einmal zu.
-- Ändert KEINE Daten, nur die Filterbedingung des Index. Rückbau: jtl211_tfile_index_rollback.sql
-- Ausführen mit einem Login mit ALTER-Recht (sa), Ziel-DB über -d bzw. USE wählen.
SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
DROP INDEX [UX_dbo_tFile_iBlobIdentifier_INCL_FILTER] ON [dbo].[tFile];
CREATE UNIQUE NONCLUSTERED INDEX [UX_dbo_tFile_iBlobIdentifier_INCL_FILTER]
    ON [dbo].[tFile] ([iBlobIdentifier] ASC) INCLUDE ([kFile])
    WHERE ([iBlobIdentifier] IS NOT NULL AND [iBlobIdentifier] <> '00000000-0000-0000-0000-000000000000');
COMMIT TRANSACTION;
SELECT DB_NAME() AS db, name, filter_definition FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.tFile') AND name = 'UX_dbo_tFile_iBlobIdentifier_INCL_FILTER';

Und für den Rollback wenn ein Fix da ist:


SQL:
-- Rückbau der Überbrückung: Originalfilter von JTL wiederherstellen.
-- VORHER prüfen, dass höchstens eine Zeile die Null-GUID trägt, sonst schlägt CREATE INDEX fehl:
--   SELECT COUNT(*) FROM dbo.tFile WHERE iBlobIdentifier = '00000000-0000-0000-0000-000000000000';
-- Mehrere Null-GUID-Zeilen vorher mit NEWID() versehen (nur nach JTL-Hotfix sinnvoll):
--   UPDATE dbo.tFile SET iBlobIdentifier = NEWID() WHERE iBlobIdentifier = '00000000-0000-0000-0000-000000000000';
SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; SET ANSI_WARNINGS ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
DROP INDEX [UX_dbo_tFile_iBlobIdentifier_INCL_FILTER] ON [dbo].[tFile];
CREATE UNIQUE NONCLUSTERED INDEX [UX_dbo_tFile_iBlobIdentifier_INCL_FILTER]
    ON [dbo].[tFile] ([iBlobIdentifier] ASC) INCLUDE ([kFile])
    WHERE ([iBlobIdentifier] IS NOT NULL);
COMMIT TRANSACTION;
SELECT DB_NAME() AS db, name, filter_definition FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.tFile') AND name = 'UX_dbo_tFile_iBlobIdentifier_INCL_FILTER';


NOCHMAL KLAR UND DEUTLICH. DER EINSATZ BEIDER SCRIPTE GESCHIEHT AUF EIGENE VERANTWORTUNG11
 

Ähnliche Themen