[Gelöst] Die komprimierte Datei hat ein ungültiges Format

24. Oktober 2011 11:38

Hallo zusammen,

damit ihr nicht genauso dumm aus der Wäsche guckt, falls sich euch mal die Fehlermeldung
Microsoft Dynamics NAV hat geschrieben:"Die komprimierte Datei hat ein ungültiges Format"
präsentiert, hier die Ursache sowie die Lösung zu dieser Meldung.

Ursache: Mindestens ein Objekt ist in der Datenbank kaputt (fehlerhafte Informationen in dem BLOB-Feld der Tabelle Objekt).

Lösung: Wir müssen das Objekt (aus einer noch funktionierenden Sicherung) wiederherstellen, da das Objekt in der Datenbank nicht mehr zu retten ist.
Lösungsweg:
  1. Identifizierung des fehlerhaften Objektes
    • Kompilieren aller Objekte, dabei genau auf die Fortschrittsanzeige achten, um den Objekttyp und annähernd die betroffene Objekt-ID zu erkennen.
    • Fehlermeldung wegklicken und sich im Object Designer langsame der Objekt-ID nähern, um die letzte heile Objekt-ID vor dem fehlerhaften Objekt zu identifizieren.
    • In einer (möglichst exakt gleichen) Datenbank die nachfolgende Objekt-ID ermitteln.
  2. Löschen des fehlerhaften Objektes
    Da es nicht möglich ist, das Objekt durch eine fehlerfreie Version zu ersetzen, muss das Objekt zuerst aus der Datenbank gelöscht werden.
    Da es jedoch bei einem direkten Zugriff auf die Objekttabelle zu der besagten Fehlermeldung kommt, müssen wir den betroffenen Datensatz aus der Tabelle löschen, ohne ihn direkt anzusprechen.
    Hierzu erstellen wir uns eine neue Form, platzieren dort einen CommandButton und tragen im OnPush-Trigger folgende Zeilen ein:
    (Als Beispiel möchten wir den Report 393 löschen.)
    Code:
    Object.SETRANGE(Type,Object.Type::Report);
    Object.SETRANGE("Company Name",'');
    Object.SETRANGE(ID,393);           // ID direkt eingeben! Nicht Report::"393" o. ä. schreiben!
    Object.DELETEALL;                  // Direkt ohne GET, FIND o. ä. löschen!

    Diese Form braucht nicht gespeichert werden, sondern kann direkt aus dem Designer heraus mit [Strg]+[R] gestartet werden.
  3. Wiederherstellung des Objektes
    Da das Objekt nun nicht mehr existiert, können wir es aus einer Datensicherung/Datenbankkopie/... wiederherstellen, indem wir es dort als FOB exportieren und in unserer DB importieren.
  4. Prüfung auf weitere fehlerhafte Objekte
    Die Schritte 1-4 solange wiederholen, bis sich alle Objekte ohne die oben zitierte Fehlermeldung kompilieren lassen.
    (Nicht kompilierbare Objekte interessieren uns in diesem konkreten Fall nicht, da sie nicht für die o. g. Fehlermeldung verantwortlich sind.)

Hinweis:
Es könnte sein, dass eure Lizenz das Löschen des Objektes nicht zulässt.
Wenn ihr End-Anwender seid, dann wendet euch bitte an euren zuständigen Microsoft Partner, damit er den Schritt 2 mit seiner Lizenz durchführt.
Wenn ihr Microsoft Partner seid, dann wendet euch an den Eigentümer des Objektes, damit dieser das Objekt mit seiner Lizenz löschen kann.

Sollte jemand von euch eine elegantere/einfachere/... Methode kennen, so lasst uns an eurem Wissen teilhaben.

Re: [Gelöst] Die komprimierte Datei hat ein ungültiges Forma

24. Oktober 2011 13:06

Kannst du dir erklären, warum das Kommentierte notwendig ist?

Timo Lässer hat geschrieben:
Code:
Object.SETRANGE(ID,393);           // ID direkt eingeben! Nicht Report::"393" o. ä. schreiben!
Object.DELETEALL;                  // Direkt ohne GET, FIND o. ä. löschen!

Re: [Gelöst] Die komprimierte Datei hat ein ungültiges Forma

24. Oktober 2011 13:16

Ich denke mal, weil er sonst versucht das Objekt zu lesen und das dann mit einer Fehlermeldung quittiert.

Re: [Gelöst] Die komprimierte Datei hat ein ungültiges Forma

24. Oktober 2011 14:48

Natalie hat geschrieben:Kannst du dir erklären, warum das Kommentierte notwendig ist?
Timo Lässer hat geschrieben:
Code:
Object.SETRANGE(ID,393);           // ID direkt eingeben! Nicht Report::"393" o. ä. schreiben!
Object.DELETEALL;                  // Direkt ohne GET, FIND o. ä. löschen!
Sebastian Pfliegel hat geschrieben:Ich denke mal, weil er sonst versucht das Objekt zu lesen und das dann mit einer Fehlermeldung quittiert.

Richtig!
Da der Eintrag in der Objekttabelle fehlerhaft ist, darf ich auf keinen Fall den defekten Datensatz in die (NAV-)Finger bekommen.
Da der DELETEALL an den SQL-Server gesendet wird und der einfach alle Datensätze in der Tabelle löscht, welche den Kriterien entsprechen, interessiert sich der SQL-Server nicht für die Inhalte des BLOB-Feldes.
Und selbst wenn: Dem SQL-Server ist es egal, was für ein Müll in dem BLOB-Feld steht ;-)

Re: [Gelöst] Die komprimierte Datei hat ein ungültiges Forma

24. Oktober 2011 15:04

Hallo,

eine andere etwas rabiate Methode könnte sein (habs nicht selbst getestet), das Objekt auf dem - so man hat - SQL- Server mit dem SQL- Management- Studio und einem SQL-Befehl aus der Tabelle dbo.object zu entfernen, um es dann neu einzulesen. Das könnte auch funktionieren, wenn der Anwender keine Lizenz zum Objekte löschen hat.

Gruß, Fiddi