J'utilise la commande ADO Shape sur mon rapport de données, cela fonctionne bien, mais lorsque ma fonction d'agrégation Calc (AgrProfit / accordxtended * 100) est NULL ou 0/0 * 100 Il indique une erreur générale et un rapport de données ne s'affingeant pas. S'il vous plaît aider.
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
3 Réponses :
Si votre serveur SQL est 2005 ou plus récent, vous pouvez utiliser Nullif conjointement avec isnull < / a>: remplacer ceci reviendra zéro lorsqu'il sera d'accord = 0 plutôt que de provoquer une fracture par zéro erreur . p> p> agrProfit / accordxtended code> avec p>
Calc (Isnull (AgrProfit / NULLIF (ACCORXTONDED * 100,0), 0)) Il est indiqué que la colonne NULLIF a été utilisée dans une expression de calcul mais n'est pas définie dans les rowset
Calc n'est pas une fonction SQL intégrée (autant que je sache). Peut-être que vous pouvez montrer cette fonction et nous pouvons voir si la division par zéro peut être manipulée là-bas ...
Il semble que vous utilisiez l'accès MS ou quelque chose qui interface avec MS Access. Si tel est le cas, vous pouvez peut-être utiliser Remplacer: p> avec: p> L'idée est de remplacer commutateur code>:
CALC (AgrProfit / accordxtended * 100) Code> P>
null code> avec 0, remplacez la division de 0 avec 0, ou d'autres renvoyer le rapport réel. p> p>
Donc, on dirait que vous utilisez le Fonctions de mise en forme de données ADO ici, et le calc (expression) code> vous permet d'utiliser des fonctions VBA répertoriées ici dans l'expression. La suggestion de Guru @ c-livre provoque une erreur car 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))
Est-ce dans l'accès MS?