2016-06-28 9 views
0

Ich habe eine datengebundene Listbox, die für jede Auswahl autoposts. Ich möchte alle ausgewählten Werte in einem Parameter (@ Product_Type2) speichern und in einer SQL-Update-Abfrage verwenden können. Ich kann die Listbox-Werte als eine Zeichenfolge in einem Textfeld (TextBox1) speichern, aber die Abfrage kann nicht alle Werte verwenden. Dies ist in einer SharePoint-ASP und kann nicht Code hinter verwenden. Ich habe einen Code-Snipit eingefügt.mehrfache Auswahl datengebundene Listbox gespeichert als Parameter für sql Datenquellenaktualisierung

<asp:ListBox runat="server" id="ListBox2" DataTextField="ProductDesc" DataSourceID="SqlDataSourceDropdownProd_2" DataValueField="Product_Type2" AutoPostBack="True" SelectionMode="Multiple"> 
</asp:ListBox> 
<br /> 
<br /> 
<script type="text/javascript"> 
     $(function() { 
       var values = "('"; 

       var selected = $("[id*=ListBox2] option:selected"); 

       selected.each(function() { 
        values += $(this).val() + "','"; 
       }); 
       document.getElementById('TextBox1').value =(values)+'zzz' + "')"; 
       return false; 
      }); 

    </script> 
<asp:TextBox runat="server" id="TextBox1" Width="255px" Height="334px" AutoPostBack="True"> 
</asp:TextBox> 

<asp:SqlDataSource id="SqlDataSourceDropdownProd_2" runat="server" ... 
SelectCommand="SELECT DISTINCT sdt.[Product Type2] AS Product_Type2, pd2.ProductDesc, pd2.line 
FROM   dbo.sportsCD_Data_TEST AS sdt INNER JOIN 
         dbo.Dim_Product_Type2 AS pd2 ON sdt.[Product Type2] = pd2.Product 
ORDER BY pd2.line" OldValuesParameterFormatString="original_{0}"> 

    </asp:SqlDataSource> 

<asp:SqlDataSource id="SqlDataSourceDropdownProd_3" runat="server" ... 
SelectCommand="SELECT  [Sales Pro Number] AS Sales_Pro_Number, [New Price] AS New_Price, [Product Type2] AS Product_Type2, [Percent], Dollar 
FROM   dbo.sportsCD_Data_TEST 

WHERE  ([Product Type2] in (@Product_Type2))" 
UPDATE [sportsCD_Data_TEST] SET 

[New Price] = CONVERT(decimal(10, 2), CAST([Sell Price] AS float) * (CAST(@Percent AS float)/100) 
         + CAST([Sell Price] AS float)+ CAST(@Dollar as float)) , [Percent] = 0, [Dollar] = 0 

WHERE  ([Product Type2] in (@Product_Type2))" <SelectParameters> 

     <asp:controlparameter ControlID="TextBox1" PropertyName="Text" Name="Product_Type2" /> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:parameter Name="Percent" Type="Decimal" /> 
     <asp:parameter Name="Dollar" Type="Decimal" /> 

     <asp:parameter Name="Product_Type2" /> 
    </UpdateParameters> 
    </asp:SqlDataSource> 

</form> 
+0

Es sieht aus wie Sie versuchen, Ihre Update-Anweisung eine Zeichenfolge (wie "('A', 'B', 'C', 'zzz')" zu füttern), so dass Ihre Update-Anweisung es als eine einzelne Zeichenfolge liest, anstatt es zu analysieren. Wenn Sie analysieren möchten, was in der Zeichenfolge enthalten ist, müssen Sie dynamisches SQL verwenden. Alternativ könnten Sie den Code neu schreiben, um eine kommagetrennte Eingabe zu erhalten, die Eingabe zu teilen und dann basierend darauf zu aktualisieren. – ZLK

+0

Könnten Sie mir helfen, dies in eine brauchbare Form zu bringen? –

Antwort

0

Hier ist ein Weg, wie Sie es tun könnten.

Wenn Ihre Datenbank bereits eine String-Splitting-Funktion hat, verwenden Sie diese. Wenn dies nicht der Fall ist und Sie eine hinzufügen können, wählen Sie eine, die für Sie geeignet ist. Hier sind ein paar Ideen, wie man einen erstellt: http://sqlperformance.com/2012/07/t-sql-queries/split-strings (Wenn Sie Ihrer Eingabe vertrauen können, dass sie nur alphanumerisch mit Kommas und Leerzeichen ist, dann sollte die XML gut funktionieren). z.B.

-- USE [DatabaseName] 
CREATE FUNCTION dbo.SplitStrings_XML 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    ( 
     SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)') 
     FROM 
     ( 
     SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') 
      + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i) 
    ); 
GO 

Als nächstes Ihre Jquery Funktion ändern etwas wie folgt aussehen:

$(function() { 
      var values; 

      var selected = $("[id*=ListBox2] option:selected"); 

      selected.each(function() { 
       values += "," + $(this).val(); 
      }); 
      document.getElementById('TextBox1').value = values; 
      return false; 
     }); 

Sie wollen einfach nur Ihre Update-Anweisung so etwas wie füttern "A, B, C", markiert keine Notierungen notwendig. Dann machen Sie Ihre Update-Anweisung wie folgt aussehen:

UPDATE sCDT 
SET [New Price] = CAST(1.0 * [Sell Price] * @Percent/100 + [Sell Price] + @Dollar AS DECIMAL(10,2)) 
    , [Percent] = 0 
    , [Dollar] = 0 
FROM dbo.SplitStrings_XML(STUFF(@Product_Type2, 1, 1, ''), ',') T -- insert appropriate string-splitting table-function, the STUFF is to get rid of leading comma 
JOIN [sportsCD_Data_TEST] sCDT ON sCDT.[Product Type2] = T.[Item]; 
+0

Ich erhalte einen Null-Wert für die textbox1document.getElementById ('TextBox1'). Value = Werte –

+0

Ich erhalte einen Null-Wert für die Textbox1 document.getElementById ('TextBox1'). Value = values. Ich kann den Wert in der Textbox anzeigen, aber beim Aktualisieren mit nur UPDATE dbo.sportsCD_Data_TEST SET [Neuer Preis] = @ Product_Type2 Ich bekomme NULL-Werte. Ich muss auch nur eine Auswahl zulassen, da eine andere Abfrage von dieser abhängt. Vielen Dank für die Hilfe –

+0

Eine Auswahl würde gut mit dieser Abfrage funktionieren, glaube ich. Wenn Sie einen Nullwert erhalten, liegt das daran, dass das Textfeld nicht an die Abfrage übergeben wird? z.B. '' sollte ' ZLK