2016-04-18 49 views
0

我有一个问题,我有,使一个group BY数据库中的view,并有另一个表GraficoCor,我尽了While第一功能使增量时间他通过计数器值的变量IdCor第二个函数,第二个函数将查询以IdCor的值作为参考返回第一个函数的十六进制颜色。 如何做到这一点?问题与功能3

功能GetFaturamentoIVEL

public static FatoFaturamentoIVELBO[] GetFaturamentoIVEL(string Operacao, Connection Cn) 
     {    
      var RsFaturamento = new Recordset(); 
      int Cont = 0; 
      try 
      { 
       RsFaturamento.Open(String.Format("SELECT Operacao, AnoMes, TradeMarketing, SUM(ValorNF)AS ValorTotal FROM dbo.FatoFaturamentoIVEL WHERE TradeMarketing = 0 and AnoMes = '2016/04' GROUP BY Operacao, AnoMes, TradeMarketing ORDER BY SUM(ValorNF) ASC", Operacao), Cn, CursorTypeEnum.adOpenStatic, LockTypeEnum.adLockReadOnly); 
       var ArrayRetorno = new FatoFaturamentoIVELBO[RsFaturamento.RecordCount]; 
       while (!RsFaturamento.EOF) 
       { 
        FatoFaturamentoIVELBO Faturamento = new FatoFaturamentoIVELBO(); 
        Faturamento.Operacao = RsFaturamento.Fields["Operacao"].Value.ToString(); 
        Faturamento.AnoMes = RsFaturamento.Fields["AnoMes"].Value.ToString(); 
        Faturamento.ValorNF = decimal.Parse(RsFaturamento.Fields["ValorTotal"].Value.ToString()); 
        ArrayRetorno[Cont] = Faturamento;  
        Cont++; 
        RsFaturamento.MoveNext(); 
       } 
       RsFaturamento.Close(); 
       return ArrayRetorno; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Erro: " + ex.Message); 
      } 
     } 

功能GetCor

public static FatoFaturamentoIVELBO GetCor(int IdCor, Connection Cn) 
     { 
      var Cor = new FatoFaturamentoIVELBO(); 
      var RsCor = new Recordset(); 
      try 
      { 
       RsCor.Open(String.Format("SELECT IdCor, CodHex from dbo.GraficoCor where IdCor = " + IdCor), Cn, CursorTypeEnum.adOpenStatic, LockTypeEnum.adLockReadOnly); 
       if (!RsCor.EOF) 
       { 
        Cor.CodHex = RsCor.Fields["CodHex"].Value.ToString(); 
       } 
       return Cor; 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Erro :" + ex.Message); 
      } 
     } 
+6

你有问题吗? –

+1

哪部分不工作,或哪部分不知道如何实施? – bmm6o

+0

@ Bmm6o你好,我不知道如何实现。 –

回答

0

想必,你只需要调用是这样的:

Faturamento.SomeProperty = GetCor(Cont, Cn) 

这是不太可能是你想要的,原因有二。使用像这样的计数器来生成数据库ID,通常是一个错误,而应该将ID作为查询的一部分返回。而不是为每一行都提出单独的请求,您应该一起加入查询并一次获取数据。见例如this question

0

我猜你主要是说另一种语言 - 这很好,而不是你的错 - 但很难理解你问的是什么。你能编辑你写的东西吗?

这是一个总的猜测,但我认为你需要重写你的第一个查询:

SELECT Operacao, AnoMes, TradeMarketing, SUM(ValorNF)AS ValorTotal FROM dbo.FatoFaturamentoIVEL WHERE TradeMarketing = 0 and AnoMes = '2016/04' GROUP BY Operacao, AnoMes, TradeMarketing ORDER BY SUM(ValorNF) ASC

,以便它使用一个INNER JOINLEFT OUTER JOINdbo.GraficoCor,这样你就不用调用GetCor每次通过您的while循环。


我想你既可以做一个子选择或这样的事情应该告诉你如何使用ROW_NUMBER()

SELECT 
[Person Name], 
[Row Type] 
FROM 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER(ORDER BY [Person Name] ASC) AS [Id] 
    FROM 
    (
     SELECT 'Alice' [Person Name] UNION 
     SELECT 'Bob' [Person Name] UNION 
     SELECT 'Charlie' [Person Name] UNION 
     SELECT 'Daniel' [Person Name] 
    ) [Alias] 
) AS [Main] 

LEFT OUTER JOIN 
(
    SELECT 0 [Parity], 'Even Row' [Row Type] UNION 
    SELECT 1 [Parity], 'Odd Row' [Row Type] 
) [Lookup] 
ON [Main].[Id] % 2 = [Lookup].[Parity] 

结果:

Person Name | Row Type 
---------------------- 
Alice  | Odd Row 
Bob   | Even Row 
Charlie  | Odd Row 
Daniel  | Even Row 

所以在你的情况下你的GetFaturamentoIVEL功能,你可以做到这一点(未经测试):

RsFaturamento.Open(String.Format("@ 
SELECT 
[OrderedQuery].[Operacao], 
[OrderedQuery].[AnoMes], 
[OrderedQuery].[TradeMarketing], 
[OrderedQuery].[ValorTotal], 
[GraficoCor].[CodHex] 
FROM 
(
    SELECT 
    *, 
    (ROW_NUMBER() OVER(ORDER BY SUM(ValorNF) ASC)) - 1 AS [IdCor] 
    FROM 
    (
     SELECT 
     Operacao, 
     AnoMes, 
     TradeMarketing, 
     SUM(ValorNF) AS ValorTotal 
     FROM dbo.FatoFaturamentoIVEL 
     WHERE TradeMarketing = 0 and AnoMes = '2016/04' 
     GROUP BY Operacao, AnoMes, TradeMarketing   
    ) [Query] 
) AS [OrderedQuery]  
LEFT OUTER JOIN [dbo].[GraficoCor] [GraficoCor] ON [OrderedQuery].[IdCor] = [GraficoCor].[IdCor] 
", Operacao), Cn, CursorTypeEnum.adOpenStatic, LockTypeEnum.adLockReadOnly);