2016-04-18 14 views
0

ich ein Problem habe, ich habe ein view in der Datenbank, die ein group BY macht, und hat eine andere Tabelle GraficoCor, mache ich jedes Mal die While die erste Funktion einen Zuwachs er für die Variable übergeben Sie den Zählerwert macht IdCor die zweite Funktion, die zweite Funktion wird abfragen, als Referenz den Wert von IdCor Rückkehr zur Farbe in Hex für die erste Funktion. Wie geht das?Probleme mit Funktionen 3

Funktion 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); 
      } 
     } 

Funktion 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

Haben Sie eine Frage hier? –

+1

Welcher Teil funktioniert nicht oder welchen Teil können Sie nicht implementieren? – bmm6o

+0

@ Bmm6o Hallo, ich kann nicht implementieren. –

Antwort

0

Vermutlich rufen Sie einfach so etwas wie:

Faturamento.SomeProperty = GetCor(Cont, Cn) 

Dies ist unwahrscheinlich zu sein, was man aus zwei Gründen wollen. Es ist normalerweise ein Fehler, einen solchen Zähler zu verwenden, um Datenbank-IDs zu erzeugen, stattdessen sollte die ID als Teil der Abfrage zurückgegeben werden. Und anstatt eine separate Anfrage für jede Zeile zu machen, sollten Sie die Abfragen zusammenfügen und die Daten alle auf einmal erhalten. Siehe z.B. this question.

0

Ich vermute, dass Sie in erster Linie eine andere Sprache sprechen - das ist gut und nicht Ihre Schuld - aber es ist wirklich schwer zu verstehen, was Sie fragen. Kannst du das, was du geschrieben hast, bearbeiten und anders schreiben?

Dies ist eine Gesamt Vermutung, aber ich glaube, Sie müssen Ihre erste Abfrage neu zu schreiben:

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

also, dass sie eine INNER JOIN oder LEFT OUTER JOIN zum dbo.GraficoCor verwendet, so dass Sie müssen nicht anrufen GetCor jedes Mal durch Ihre while Schleife.


Ich denke, man könnte entweder ein Unter wählen oder so etwas tun, sollten Sie zeigen, wie ROW_NUMBER() verwenden:

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] 

Ergebnisse:

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

So in Ihr Fall innerhalb Ihrer GetFaturamentoIVEL Funktion können Sie dies tun (ungetestet):

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); 
Verwandte Themen