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 :
-
arrêtez Watchdoc
-
rendez-vous dans la base de données de Watchdoc ;
-
sauvegardez la base de données avant d'y apporter des modifications ;
-
à 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
-
redémarrez Watchdoc ;
-
accédez à la page des bilans pour vérifier que le problème a été résolu.