2016-02-22 1 views
8

J'utilise la commande ado shape sur mon rapport de données, ça fonctionne bien mais quand ma fonction d'agrégation CALC (agrProfit/agrExtended * 100) est nulle ou 0/0 * 100 il montre l'erreur générale et le rapport de données ne montrant pas. S'il vous plaît aidez.VB6 CALC Agrégation sur ADO Shape quand retourne Null obtenir Erreur générale dans le rapport de données

mRS.Open "SHAPE {select products.productid,products.productcode,isnull(products.description,descr) as description,isnull(vendor.description,'*** NOT FOUND ***') as groupdescription, " & _ 
    "isnull(sum(totalcost),0) as mTotalCost,isnull(sum(extended) - (sum(totalcost)),0) as mProfit, " & _ 
    "sum(charges) as mCharges,sum(discount) as mDiscounts, sum(retextended) as mReturns, " & _ 
    "reportuom, sum(totalcost) as mTotalCost, isnull(case when sum(extended) = 0 then 0 else (sum(extended) - (sum(totalcost)))/sum(extended)*100 end,0) as mgpm, sum(totalcost) as mTotalCost, case when sum(extended) = 0 then 0 else (sum(extended) - (sum(totalcost)))/sum(extended)*100 end as mgpm, sum(case when extended < 0 then (0 - (totalqty/products.reportqty)) else (totalqty/products.reportqty) end) as mTotalQty, isnull(sum(extended),0) as mExtended, sum(case when extended < 0 then (0 - (totalqty/products.reportqty)) else (totalqty/products.reportqty) end)/" & mTotalQty & " * 100 as mPercTotalQty, sum(extended)/" & mTotalExtended & " * 100 as mPercExtended " & _ 
    "From " & _ 
     "(select finishedsales.QtyReturned,finishedsales.productid,finishedsales.description as descr, finishedsales.averageunitcost* case when [return]=1 then convert(money,0-totalqty) else totalqty end as TotalCost,(chargeallowance * qty) + (chargeamountdiscounted * qty) as charges,(allowance * qty) + (amountdiscounted * qty)+ (extended-(extended * multiplier)) as discount,0 as rettotalqty, 0 as retextended,totalqty,round(extended * multiplier,4) as extended From finishedsales " & _ 
     " left join products on products.productid = finishedsales.productid " & _ 
     .gReportCriteria & _ 
     "Union All " & _ 
     "select finishedsales.QtyReturned, finishedsales.productid,finishedsales.description as descr,0 as totalcost,0 as charges,0 as discount,totalqty as rettotalqty ,abs(round(extended,4)) as retextended,0 as totalqty, 0 as extended From finishedsales " & _ 
      "left join products on products.productid = finishedsales.productid " & _ 
     Replace(UCase(.gReportCriteria & " and [RETURN] = 1"), "[RETURN] = 0", "[return] = 1") & _ 
    ") as finishedsales " & _ 
    "left join products on products.productid=finishedsales.productid " & _ 
    "left join vendor on products.vendorcode=vendor.vendorcode " & _ 
    "group by descr,products.productid,products.productcode,products.description,vendor.description,reportuom " & _ 
    "order by groupdescription, " & IIf(frmReportProducts.chkTop And fVal(frmReportProducts.txtTop) > 0, "finishedsales.mtotalqty desc,", "") & " products.description} AS Command1 COMPUTE Command1, SUM(Command1.mTotalQty) AS agrTotalQty, SUM(Command1.mExtended) AS agrExtended, SUM(Command1.mProfit) AS agrProfit, CALC(agrProfit/agrExtended*100) As agrGPM BY groupdescription", mcn 
+0

Est-ce que c'est dans MS Access? –

+0

nope SQL Server – FatalError

Répondre

2

Il semble donc que vous utilisiez le ADO Data Shaping functions ici, et le CALC(expression) vous permet d'utiliser les fonctions VBA listées here dans l'expression. @ Suggestion de C-Pound Guru provoque une erreur depuis NULLIF() n'est pas une fonction VBA, mais toute l'expression peut être réécrite comme ceci:

CALC(IIF(IsNull(agrProfit), 0, IIF(agrProfit=0, 0, agrProfit/agrExtended) *100)) 

Laissez-moi savoir si cela prend soin de votre question.

+0

Il a travaillé votre un génie! – FatalError

1

Si votre serveur SQL est 2005 ou plus récent, vous pouvez utiliser NULLIF conjointement avec ISNULL:

Remplacer agrProfit/agrExtended avec

ISNULL(agrProfit/NULLIF(agrExtended,0),0) 

Ce sera de retour à zéro lorsque agrExtended = 0 plutôt que de provoquer un diviser par zéro erreur.

+0

CALC (ISNULL (agrProfit/NULLIF (agrExtended * 100,0), 0)) il dit Colonne NULLIF a été utilisé dans une expression CALC mais n'est pas défini dans l'ensemble de lignes – FatalError

+0

Calc n'est pas un intégré Fonction SQL (pour autant que je sache). Peut-être que vous pouvez montrer cette fonction et nous pouvons voir si la division par zéro peut être traitée là ... –

0

Il semble que vous utilisiez MS Access ou quelque chose qui s'interface avec MS Access. Si tel est le cas, vous pouvez peut-être utiliser Switch:

Remplacer:

CALC(agrProfit/agrExtended * 100)

Avec:

Switch(
    ISNULL(SUM(Command1.mExtended)), 0, 
    ISNULL(SUM(Command1.mProfit)), 0, 
    IIF(SUM(Command1.mExtended) = 0, 0, SUM(Command1.mProfit)/SUM(Command1.mExtended) * 100) 
    ) 

L'idée est de remplacer NULL avec 0, remplacer division par 0 avec 0, ou bien renvoyer le rapport réel.