Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Excel 2003 / VBA] SQL veld niet mee in sheet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Via VBA in Excel haal ik een recordset op middels ADODB.
Dit gaat allemaal prima op 1 ding na.

Er is 1 veld die hij ophaalt wat ervoor zorgt dat de rest van de kolommen na dat veld niet meer gevuld worden.
Voorbeeld kolommen:

Art.Nr - Art.Omschrijving - Leverancier - Oms.Art.Lev - Datum - Omzet - etc.

De query haalt alles op maar laat na de kolom "Oms.Art.Lev" niets meer zien in Excel.
Als ik uit de select query het veld verwijderen dan laat hij alles weer zien.

Als ik het veld uitlees met een loop en deze in MsgBox (.Fields(3)) gooi, dan zie ik hem gewoon wel.

Waarom wordt deze niet gekopieerd naar Excel? Ik ben lost.


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Sub ConnectionExample1()

    Dim objMyConn As ADODB.Connection
    Dim objMyCmd As ADODB.Command
    Dim objMyRecordset As ADODB.Recordset
    Dim strSQL As String
    
    
    Set objMyConn = New ADODB.Connection
    Set objMyCmd = New ADODB.Command
    Set objMyRecordset = New ADODB.Recordset
    
    ' Open a Connection using an ODBC DSN named "Pubs".
    objMyConn.Open "...", "...", "...."
  
    
    
    Set objMyCmd.ActiveConnection = objMyConn
        
    
    strSQL = "select a.ArtCode, a.ArtZoekcode, a.ArtOms, a.ArtOmsEenheid, c.VAdrNaam1, ald.AldArtCodeBijLeverancier"
    strSQL = strSQL & ",  ald.AldOmsBijLeverancier, ald.AldInkoopeenheid, ald.AldInkoopprijs, ald.AldMinimumAfname"
    strSQL = strSQL & ", (select sum(omz.OmzAantal) from kingsystem.tabOmzet omz where  omz.OmzArtGid = a.ArtGid and omz.OmzDatum >= '2009-01-01' and omz.OmzDatum <= '2009-12-31' group by omz.OmzArtGid)"
    strSQL = strSQL & ", (select sum(omz.OmzOmzetBasis) from kingsystem.tabOmzet omz where omz.OmzArtGid = a.ArtGid and omz.OmzDatum >= '2009-01-01' and omz.OmzDatum <= '2009-12-31' group by omz.OmzArtGid)"
    strSQL = strSQL & ", (select count(VrdMutAantal) from kingsystem.tabVoorraadMutatie tvm where tvm.VrdMutArtGid = a.ArtGid and tvm.VrdMutSoort = 1 and tvm.VrdMutDatum > '2009-01-01')"
    strSQL = strSQL & ", (select substr(og.OpbrGrpNummer,1,2) from kingsystem.tabOpbrengstGroep og where og.OpbrGrpGid = a.ArtOpbrGrpGid)"
    strSQL = strSQL & ", (select og.OpbrGrpOms from kingsystem.tabOpbrengstGroep og where og.OpbrGrpNummer = (select substr(og.OpbrGrpNummer,1,2) from kingsystem.tabOpbrengstGroep og where og.OpbrGrpGid = a.ArtOpbrGrpGid))"
    strSQL = strSQL & " from kingsystem.tabArtikel a"
    strSQL = strSQL & " left join kingsystem.tabArtikelLeverancier al"
    strSQL = strSQL & " on a.ArtGid = al.ArtLevGid"
    strSQL = strSQL & " left join kingsystem.vwKMBCredStam c"
    strSQL = strSQL & " on al.ArtLevNawGid = c.NawFilGid"
    strSQL = strSQL & " left join kingsystem.tabArtikelLeverancierDetail ald"
    strSQL = strSQL & " on al.ArtLevGid = ald.AldArtLevGid"
    strSQL = strSQL & " where a.ArtCode = '0,27'"
    strSQL = strSQL & " order by a.ArtCode"
    
  
    objMyCmd.CommandText = strSQL

    
    Set rs = objMyCmd.Execute

    With rs
        Do While Not .EOF
        MsgBox (.Fields(6))
        
        .MoveNext
        Loop
        End With
        Set rs = Nothing

    
    'Open Recordset
    Set objMyRecordset.Source = objMyCmd
    objMyRecordset.Open
    
    
    'Copy Data to Excel
    ActiveSheet.Range("A4").CopyFromRecordset objMyRecordset
    
    ' Close the connection.
    objMyConn.Close

End Sub


De MsgBox geeft me dus de ald.AldOmsBijLeverancier uit de database maar in Excel wordt maar t/m kolom 6 gevuld. De rest is leeg.

Verwijderd

googlen naar dit probleem levert niet veel op. geeft .fields.count het correcte aantal velden weer?
in dat geval kan je ipv de CopyFromRecordset methode zelf een lusje schrijven dat de recordsetdata in excel plaatst.
welk resultaat krijg je indien je de maxrows & colums parameters gebruikt? (zet foutafhandeling uit)
Visual Basic:
1
ActiveSheet.Range("A4").CopyFromRecordset objMyRecordset, objMyRecordset.recordcount, objMyRecordset.fields.count

Verwijderd

Topicstarter
Als ik de velden tel dan kom ik op 15 en dat is het juiste.
Nu heb ik dit gemaakt:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
    objMyCmd.CommandText = strSQL
    
    Set rs = objMyCmd.Execute
    

    fldCount = rs.Fields.Count
    For iCol = 1 To fldCount
        Sheets("Blad1").Cells(1, iCol).Value = rs.Fields(iCol - 1).Name
    Next
    
    Sheets("Blad1").Cells(2, 1).CopyFromRecordset rs


Dit geeft hetzelfde probleem. Hij kapt hem net voor die omschrijving af.
Hij geeft alle 15 kolomnamen maar de values op rij 2 kapt hij dus af na AldArtCodeBijLeverancier.

Maar nu komt het... als ik een MsgBox toevoeg aan de loop:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
    objMyCmd.CommandText = strSQL
    
    Set rs = objMyCmd.Execute
    

    fldCount = rs.Fields.Count
    For iCol = 1 To fldCount
        Sheets("Blad1").Cells(1, iCol).Value = rs.Fields(iCol - 1).Name
        MsgBox (rs.Fields(iCol - 1))    <----- hier zit die MsgBox
    Next
    
    Sheets("Blad1").Cells(2, 1).CopyFromRecordset rs


...dan krijg ik 15 keer een MsgBox met daarin alle goede values en krijg ik ook ALLE values in regel 2. Kortom, dan is mijn data wel volledig.

Het probleem lijkt nu dus nog vreemder.
Wat kan ik, op de plek van die MsgBox doen als alternatief hiervoor zodat ik wel alle data krijg?

Verwijderd

Topicstarter
Ok, met deze loop gaat het wel goed:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
    Do While Not rs.EOF
        r = r + 1
        For f = 0 To rs.Fields.Count
            On Error Resume Next
            Sheets("Blad1").Cells(r, c + f).Value = rs.Fields(f).Value
            On Error GoTo 0
        Next f
        rs.MoveNext
    Loop
    


Toch blijf ik het vreemd vinden dat een volledige kopieerslag van de recordset niet voleldig werkt.