Bilans - Erreur de division par zéro

(décembre 2020)

Contexte

Lors de la consultation des bilans dans Watchdoc (depuis l'interface d'administration, Menu principal > section Analyse > clic sur Bilan), l'administrateur voit s'afficher le message d'erreur suivant : "Error while calling method adminStatsListUsers (exec CrystalProxy)" - Description : Division par zéro - Code d'erreur : 0x80131904

Cause

Ce message résulte d'une erreur d'analyse des spools (analyse du nombre de pages) qui génère alors une valeur "0" dans la colonne "doclpages" de la table "Documents".

Résolution

Pour résoudre ce problème :

  1. arrêtez Watchdoc

  2. rendez-vous dans la base de données de Watchdoc ;

  3. sauvegardez la base de données avant d'y apporter des modifications ;

  4. à l'aide de SQL® Server Management Studio (SSMS) ou avec SQL cmd, lancez la requête suivante sur la table "Watchdocstats >Documents" :

    DECLARE @BATCH INTEGER = 2000

    DECLARE @VMAX INTEGER

    DECLARE @VMIN INTEGER = 0

    -- Nombre de document à redresser.

    SET @VMAX = (select count(*) from documents where docINNUMCOPIES = 0 or docINLPAGES = 0 or docLPAGES = 0 or docNUMCOPIES = 0 or docPAGES = 0 or docINSHEETS = 0)

    While exists (select top 1 docid from documents where docINNUMCOPIES = 0 or docINLPAGES = 0 or docLPAGES = 0 or docNUMCOPIES = 0 or docPAGES = 0 or docINSHEETS = 0)

    BEGIN

    IF OBJECT_ID('tempdb..#Results') IS NOT NULL

    DROP TABLE #Results

    -- On charge une table temporaire avec les documents à redresser.

    Select top (@BATCH) docid into #Results from documents where docINNUMCOPIES = 0 or docINLPAGES = 0 or docLPAGES = 0 or docNUMCOPIES = 0 or docPAGES = 0 or docINSHEETS = 0

    PRINT 'Lancement du premier batch '+ cast(@VMIN as varchar(6))+'/'+ cast(@VMAX as varchar(6))

    SET @VMIN = @VMIN + isnull((select count(*) from #results),0)

    -- Première passe sur les éléments primaires

    UPDATE documents

    set docNUMCOPIES = case when docNUMCOPIES = 0 then 1 else docNUMCOPIES end

    ,docLPAGES = case when docLPAGES = 0 then 1 else docLPAGES end

    ,docPAGES = case when docPAGES = 0 then 1 else docPAGES end

    where docid in (select docID from #results)

    -- Deuxième passe sur les éléments calculés

    UPDATE documents

    set docINNUMCOPIES = case when docINNUMCOPIES = 0 then docNUMCOPIES else docINNUMCOPIES end

    ,docINLPAGES = case when docINLPAGES = 0 then docLPAGES else docINLPAGES end

    ,docINSHEETS = case when docINSHEETS = 0 then docPAGES else docINSHEETS end

    where docid in (select docID from #results)

    END

 

  1. redémarrez Watchdoc ;

  2. accédez à la page des bilans pour vérifier que le problème a été résolu.