2016-07-28 14 views
1

Ich schrieb einige Code heute für die Arbeit, und ich habe ein Problem, wo der Befehl ich den SQL-Server über VBA bieten nicht die gleiche Menge an Informationen, als ob ich genau den gleichen Befehl ausführen würde auf dem Server selbst. Wenn ich den Code unten in VBA ausführe, erhalte ich ungefähr 25 Reihen von 68 Spalten. Wenn ich denselben Befehl auf dem Server selbst ausführe, erhalte ich nur über 1500 Zeilen mit 68 Spalten. Ich wähle entweder eine Bestellnummer oder ein Datum in einem Formular aus und streiche den Datenberg auf genau das, was mein Kunde sucht. Ich bin sicher, dass dies nicht der beste Weg ist, Daten über eine Tabelle zu verteilen. Ich suche nach Vorschlägen und Fehlerkorrekturen!Verteilen Cell Daten

Vielen Dank im Voraus,

Adam

Set conn = New ADODB.Connection 
Set cmd = New ADODB.Command 
constr = "Provider=REMOVEDFORPRIVACY" 
If (ComboBox1.Value <> "" And ComboBox2.Value <> "") Or (ComboBox1.Value = "" And ComboBox2.Value = "") Then 
    MsgBox "Please select one search method.", vbOKOnly 
    ComboBox2.Value = "" 
    ComboBox1.Value = "" 
ElseIf (ComboBox1.Value <> "" And ComboBox2.Value = "") Then 
    cmd.CommandText = "SELECT * FROM [Run_Data].[dbo].[RunLog_Data] WHERE SnapShot_Date = '" & ComboBox1.Value & "'" 
    conn.Open constr 
    cmd.ActiveConnection = conn 
    Set rst = cmd.Execute() 
    Do While Not rst.EOF 
     o = o + 1 
     If o > 67 Then 
      o = 1     'Column Position 
      n = n + 1    'Row Position 
     End If 
     Range(Cells(n, o), Cells(n, o)).Value = rst(o) 
     rst.MoveNext 
    Loop 
    rst.Close 
    conn.Close 
ElseIf (ComboBox1.Value = "" And ComboBox2.Value <> "") Then 
    cmd.CommandText = "SELECT * FROM [Run_Data].[dbo].[RunLog_Data] WHERE OrderNumber = '" & ComboBox2.Value & "'" 
    conn.Open constr 
    cmd.ActiveConnection = conn 
    Set rst = cmd.Execute() 
    Do While Not rst.EOF 
     'Duplicate above and consolidate code 
    rst.MoveNext 
    Loop 
    rst.Close 
    conn.Close 
End If 
+0

Statt 'Do while not rst.EOF' ...' Loop', können Sie möglicherweise einfach sagen 'Cells (n, o) .CopyFromRecordSet rst'. (Ich denke) (z. B. "Zellen (2,1) .CopyFromRecordSet rst" sollte [hoffentlich] das Recordset ab Zelle A2) kopieren. – YowE3K

+0

Dang, danke. Ich weiß nicht, wie ich das vermisst habe. Gereinigt es auch. – Flibertyjibbet

Antwort

2

Das Problem, das Sie haben, ist, dass Sie ausführen Ihre rst.MoveNext, nachdem Sie in jeder Zelle gefüllt haben. In der ersten Zeile der Ausgabe nehmen Sie also die erste Spalte des ersten Datensatzes, die zweite Spalte des zweiten Datensatzes, ... die 68. Spalte des 68. Datensatzes auf. Dann bevölkern Sie die zweite Zeile der Ausgabe mit der ersten Spalte der 69th Aufzeichnung usw.

Ich glaube, Sie Ihre gesamte Schleife mit

Cells(1,1).CopyFromRecordset rst 

ersetzen können (die Zellen zu ersetzen (1,1) mit was Zelle, die Sie wollen, dass die Top-linke Ecke Ihrer Ergebnisse sein)

aber alternativ könnten Sie Ihren rst.MoveNext Befehl in Ihrer If-Anweisung bewegen, dh

If o > 67 Then 
     o = 1     'Column Position 
     n = n + 1    'Row Position 
     rst.MoveNext 
    End If 
0
Private Sub acceptButton_Click() 
    Set conn = New ADODB.Connection 
    Set cmd = New ADODB.Command 
    constr = "REMOVEDFORPRIVACY" 
    Dim sel_str, sel_type As String 
    If (ComboBox1.Value <> "" And ComboBox2.Value <> "") Or (ComboBox1.Value = "" And ComboBox2.Value = "") Then 
     MsgBox "Please select one search method.", vbOKOnly 
     ComboBox2.Value = "" 
     ComboBox1.Value = "" 
    ElseIf (ComboBox1.Value <> "" And ComboBox2.Value = "") Then 
     sel_type = "SnapShot_Date" 
     sel_str = ComboBox1.Value 
    ElseIf (ComboBox1.Value = "" And ComboBox2.Value <> "") Then 
     sel_type = "OrderNumber" 
     sel_str = ComboBox2.Value 
    End If 
    cmd.CommandText = "SELECT * FROM [Run_Data].[dbo].[RunLog_Data] WHERE " & sel_type & " = '" & sel_str & "'" 
    conn.Open constr 
    cmd.ActiveConnection = conn 
    Set rst = cmd.Execute() 
     Cells(2, 1).CopyFromRecordset rst 
    rst.Close 
    conn.Close 
    Me.Hide 
End Sub