在vb中调用过程时出错:无法在给定的上下文中返回结果集

时间:2015-02-26 15:57:43

标签: mysql vb.net stored-procedures

这是我的程序代码:

CREATE DEFINER=`produccion`@`%` PROCEDURE `indicadorGlobal`(in mesi int(8),in anhoi int(8))
BEGIN
     declare indMat double;
     declare indMatEf double;
     declare indMant double;
     declare indMantEf double;
     declare ppmC double;
     declare tiempoR double;
     declare contador int (8);
     declare acumulado double;
     declare total double;
     declare codd int (8);
     declare indMantTres double;
#primer indicador de matriceria
SELECT  SUM(  CASE 
     WHEN ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))>=264 THEN ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)*0
     WHEN ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))>=168 AND ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))<264 THEN ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)*40
     WHEN ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))>=72 AND ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))<168 THEN ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)*70
     WHEN ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))>=24 AND ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))<72 THEN ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)*90
     WHEN ABS(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)-ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_real_entrega)/3600))<24 THEN ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600)*100
     END  ) / SUM(ABS(TIMESTAMPDIFF(SECOND,fecha_asignacion,fecha_esti_entrega)/3600))  into indMat
     FROM plan_trabajo
          WHERE culminado = 1 And Month(fecha_real_entrega)=mesi And Year(fecha_real_entrega) =anhoi
     GROUP BY MONTH(fecha_real_entrega);        

#segundo indicador de matriceria
SELECT 

     (((select COUNT(*) FROM plan_trabajo WHERE MONTH(fecha_real_entrega)=mesi AND YEAR(fecha_real_entrega)=anhoi) - COUNT(*)) / (select COUNT(*) FROM plan_trabajo WHERE MONTH(fecha_real_entrega)=mesi AND YEAR(fecha_real_entrega)=anhoi ))*100 into indMatEf
            FROM(plan_trabajo)
      WHERE culminado = 1 AND repetir=1 AND MONTH(fecha_real_entrega)=mesi AND YEAR(fecha_real_entrega)=anhoi;      

#primer indicador de mantenimiento
SELECT  ((select COUNT(*) FROM mmt_plantrabajo WHERE MONTH(CAST(fechaEntrega AS DATE))=mesi AND YEAR(CAST(fechaEntrega AS DATE))=anhoi) - 
        (select COUNT(*) FROM mmt_plantrabajo WHERE MONTH(CAST(fechaEntrega AS DATE)) = mesi AND YEAR(CAST(fechaEntrega AS DATE))= anhoi and 
         tipoOrden = 'CORRECTIVO' and statusPT = 'FINALIZADO')) / (select COUNT(*) FROM mmt_plantrabajo WHERE MONTH(CAST(fechaEntrega AS DATE))=mesi
         AND YEAR(CAST(fechaEntrega AS DATE))=anhoi)*100 into indMant FROM mmt_plantrabajo WHERE statusPT = 'FINALIZADO' 
         AND MONTH(CAST(fechaEntrega AS DATE))=mesi AND YEAR(CAST(fechaEntrega AS DATE))=anhoi;

#segundo indicador de mantenimiento
select  (SUM(Oplp)/SUM(Ohpl)) indMantEf FROM mmt_plantrabajo WHERE 
        MONTH(CAST(fechaEntrega AS DATE)) = mesi AND YEAR(CAST(fechaEntrega AS DATE))= anhoi and statusPT = 'FINALIZADO';

#tercer indicador de mantenimiento
select (((SUM(horasDesOp)-SUM(horasParada))/SUM(horasDesOp))*100) into indMantTres FROM mmt_plantrabajo WHERE MONTH(CAST(fechaEntrega AS DATE)) = mesi AND YEAR(CAST(fechaEntrega AS DATE))= anhoi and statusPT = 'FINALIZADO';

#indicador de SGC partes por millon cliente
select ind into ppmC from ind_ppmc where mes=mesi and anho=anhoi; 
#indicador de SGC tiempo de respuesta no conformidades
select valor into tiempoR from tiempo_resp_nc where mes=mesi and anho=anhoi;

select count(*), avg (valor)  into contador, acumulado from indicadores_valor where mes=mesi and anho=anhoi and status=1;


if acumulado is null then
    set acumulado=0;
    set contador=0;
end if;

if indMat is null then
    set indMat=0;
else
    set acumulado=acumulado+indMat;
    set contador=contador+1;
end if;

if indMatEf is null then
   set indMatEf=0;
else
    set acumulado=acumulado+indMatEf;
    set contador=contador+1;    
end if;

if indMant is null then
   set indMant=0;
else
    set acumulado=acumulado+indMant;
    set contador=contador+1;    
end if;

if indMantEf is null then
   set indMantEf=0;
else
    set acumulado=acumulado+indMantEf;
    set contador=contador+1;    
end if;

if indMantTres is null then
   set indMantTres=0;
else
    set acumulado=acumulado+indMantTres;
    set contador=contador+1;    
end if;

if ppmC is null then
   set ppmC=0;
else
    set acumulado=acumulado+ppmC;
    set contador=contador+1;    
end if;

if tiempoR is null then
   set tiempoR=0;
else
    set acumulado=acumulado+tiempoR;
    set contador=contador+1;    
end if;

#el indicador global sera la suma de los indicadores entre el numero de indicadores
set total = acumulado/contador;
if total is null then
   set total=0;
end if;

#tecnica para generar codigo irrepetible
set codd=(mesi*10000)+anhoi;

insert into ind_global (codigo,anho,mes,ind,acum,esperado,numero) values (codd,anhoi,mesi,format(total,2),acumulado,contador*95,contador ) on duplicate key update 
codigo=codd, anho=anhoi, mes=mesi, ind=format(total,2), acum=acumulado, esperado=contador*95, numero=contador;

END;

以下是我在vb中调用它的方式

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim cmd As New MySQLCommand
    cmd = conxv.crear_consulta(cnn, "call indicadorGlobal(@mes,@anho)")
    cmd.Parameters.Add("@mes", meses.SelectedIndex + 1)
    cmd.Parameters.Add("@anho", Integer.Parse(anho.Text))
    Try
        If cmd.ExecuteNonQuery() > 0 Then
            MsgBox("Generado exitosamente",   MsgBoxStyle.Information,"S.I.P.")
        End If
        Me.Close()
    Catch ex As Exception
        MsgBox("Ha ocurrido un error: " & ex.ToString(),      MsgBoxStyle.Critical, "S.I.P.")
    End Try

End Sub

它给我留下了以下错误:&#34;无法在给定的上下文中返回结果集&#34;但是如果你查看我的代码我使用的是executetenonquery,它不应该&#39什么也没有回报......我不明白,任何想法?

1 个答案:

答案 0 :(得分:0)

问题出在我的代码中:

segundo indicador de mantenimiento

select  (SUM(Oplp)/SUM(Ohpl)) indMantEf FROM mmt_plantrabajo WHERE 
  MONTH(CAST(fechaEntrega AS DATE)) = mesi AND YEAR(CAST(fechaEntrega AS DATE))= anhoi and statusPT = 'FINALIZADO';

正确的方法是

#segundo indicador de mantenimiento
    select  (SUM(Oplp)/SUM(Ohpl)) into indMantEf FROM mmt_plantrabajo WHERE 
      MONTH(CAST(fechaEntrega AS DATE)) = mesi AND YEAR(CAST(fechaEntrega AS DATE))= anhoi and statusPT = 'FINALIZADO';

我完全忘记将&#34;放入&#34;我希望如果有人现在得到这个错误我们现在先去哪里看看。