Страницы: 1
RSS
Ошибка запроса через ADODB (получаю recordset из MS SQL сервера), Recordset to array (Empty)
 
Доброго вренени суток уважаемые.
запросом через ADODB получаю  recordset из MS SQL  сервера, далее при передаче данных из рекордсета в массив получаю вот это - <Variable uses an Automation type not supported in Visual Basic>,  вот на этотм этапе imprep = rs.GetRows, рекордсет не пустой однозначно,  записи в нем есть.
грешу на сам SQL запрос, так как это не превый раз,  у меня  с десяток подобных запросов работают как часы .


Код
Function imprep(x)

    Set conn = New ADODB.connection
    Set rs = New ADODB.Recordset
    
sSql = "SELECT mseg.[EBELN] [PO],marm.[EAN11] [EAN IT],lips.[CHARG] [Lot Number],format(mch1.[ERSDA_SIMP_DT],'yyyy-MM-dd') [Production Date],format(mch1.[VFDAT_SIMP_DT],'yyyy-MM-dd') [Expiration Date], CASE WHEN mseg.[BWART]='102' " & _
"THEN cast(concat('-',lips.[LFIMG]*marm.[UMREN]) AS numeric) else lips.[LFIMG]*marm.[UMREN] END [IT QTY],mkpf.[BKTXT] [Customs Declaration Number],mkpf.[BKTXT] [Import Date],( SELECT [LANDA] FROM LIB_F6P_RTP.sap.[T005] t005 WHERE( " & _
"t005.[MANDT]='430') AND (t005.[LAND1]=lfa1.[LAND1])) [Country Code Import From],( SELECT [LANDA] FROM LIB_F6P_RTP.sap.[T005] t005 WHERE(t005.[MANDT]='430') AND(t005.[LAND1]=marc.[HERKL])) [Country Code Of Origin],'zzz' [sep],mseg. " & _
"[BUDAT_MKPF_SIMP_DT] [Posting date],mseg.[CPUTM_MKPF_SIMP_TM] [Time of entry],mseg.[MBLNR] [Material Document],mseg.[ERFME] [Entry UOM],mseg.[MEINS][Base UOM],marm.[UMREZ] [UMREZ Numerator],marm.[UMREN] [UMREN Denominator], " & _
"mseg.[BWART] [mvmtyp],ekko.[UNSEZ] [Delivery],mseg.[XBLNR_MKPF] [Invoice],mseg.[MATNR] [MSEG matnr],lips.[LFIMG] [LIPS QTY] FROM LIB_F6P_RTP.sap.[MSEG] mseg INNER JOIN LIB_F6P_RTP.sap.[MKPF] mkpf ON mkpf.[MANDT]=mseg.[MANDT] AND mkpf. " & _
"[MBLNR]=mseg.[MBLNR] INNER JOIN LIB_F6P_RTP.sap.[MARM] marm ON marm.[MANDT]=mkpf.[MANDT] AND marm.[MANDT]=mseg.[MANDT] AND marm.[MATNR]=mseg.[MATNR] INNER JOIN LIB_F6P_RTP.sap.[MARC] marc ON marc.[MANDT]=marm.[MANDT] AND marc.[WERKS]= " & _
"mseg.[WERKS] AND marc.[MATNR]=marm.[MATNR] AND mseg.[MATNR]=marc.[MATNR] INNER JOIN LIB_F6P_RTP.sap.[MARA] mara ON mara.[MANDT]=marc.[MANDT] AND mara.[MATNR]=mseg.[MATNR] AND marm.[MANDT]=mara.[MANDT] AND marc.[MATNR]=mara.[MATNR] AND " & _
"marm.[MATNR]=mara.[MATNR] INNER JOIN LIB_F6P_RTP.sap.[LFA1] lfa1 ON lfa1.[MANDT]=mseg.[MANDT] AND lfa1.[LIFNR]=mseg.[LIFNR] AND mara.[MANDT]=lfa1.[MANDT] AND marc.[MANDT]=lfa1.[MANDT] AND marm.[MANDT]=lfa1.[MANDT] AND mkpf. " & _
"[MANDT]=lfa1.[MANDT] INNER JOIN LIB_F6P_RTP.sap.[T005] t005 ON t005.[MANDT]=lfa1.[MANDT] AND t005.[LAND1]=lfa1.[LAND1] INNER JOIN LIB_F6P_RTP.sap.[EKKO] ekko ON ekko.[MANDT]=mseg.[MANDT] AND ekko.[EBELN]=mseg.[EBELN] INNER JOIN " & _
"LIB_F6P_RTP.sap.[LIPS] lips ON lips.[MANDT]=mseg.[MANDT] AND lips.[VBELN]=ekko.[UNSEZ] AND lips.[MATNR]=mseg.[MATNR] AND mara.[MANDT]=lips.[MANDT] AND mara.[MATNR]=lips.[MATNR] AND marc.[MANDT]=lips.[MANDT] AND marc.[MATNR]=lips. " & _
"[MATNR] INNER JOIN LIB_F6P_RTP.sap.[MCH1] mch1 ON mch1.[MANDT] COLLATE SQL_Latin1_General_CP1_CI_AS=mseg.[MANDT] AND mch1.[MANDT] COLLATE SQL_Latin1_General_CP1_CI_AS=mseg.[MANDT] AND mch1.[MATNR] COLLATE " & _
"SQL_Latin1_General_CP1_CI_AS=lips.[MATNR] AND mch1.[CHARG] COLLATE SQL_Latin1_General_CP1_CI_AS=lips.[CHARG] WHERE(mseg.[MANDT]='430') AND (mseg.[BWART] IN('101','102')) AND (mseg.[WERKS]='2751') AND (marm.[MEINH]='IT') AND " & _
"(mara.[MTART]='FERT') AND mseg.[MATNR] IN " & x & " AND (lips.[CHARG]<>'') AND (mseg.[BUDAT_MKPF]>='20201001' AND mseg.[BUDAT_MKPF]<='20201101') ORDER BY [Posting date], [Time of entry];"

  conn.Open ConnStr
    Set rs = conn.Execute(sSql)

    If Not rs.EOF Then
        imprep = rs.GetRows ' Здесь ошибка 
        rs.Close
    Else
        MsgBox "Error: No Records  returned.", vbCritical
        imprep = Empty
    End If
    If CBool(conn.State And adStateOpen) Then conn.Close
    Set conn = Nothing
    Set rs = Nothing
    
End Function

update:
подсунул другой запрос  - все работае, значит все таки загвоздка в самом запросе ,что то в возвращенном результате не нравится екселю,  и не хочет его в масссив переносить
 
Сообщение означает, что какое-то поле из списка выбираемых полей не может быть преобразовано в тип Variant. Можно найти это поле, например, методом "половинного деления", сокращая список выбираемых полей.
Владимир
 
ВОт что запос возвращает (MS SQL Studio), что моежт ему не нравится ?  
Изменено: Евгений Квитницкий - 14.11.2020 14:56:59
 
Цитата
sokol92 написал:
Можно найти это поле, например, методом "половинного деления", сокращая список выбираемых полей.
Спасибо Владимир, выяснил причину , время вот эту часть (mseg.[CPUTM_MKPF_SIMP_TM] [Time of entry]) , из за нее  ошибка..  
 
Отлично! Теперь преобразуйте это поле во что-нибудь "знакомое" VBA.
Изменено: sokol92 - 14.11.2020 15:27:43
Владимир
 
Преобразовывать я так понимаю надо  на стороне SQL?
 
Да, разумеется.
Возможно, что-нибудь типа Cast ... as Datetime
Изменено: sokol92 - 14.11.2020 16:36:08
Владимир
 
Спасибо за помощь, дружище.
Код
       cast(mseg.[CPUTM_MKPF_SIMP_TM]AS nvarchar)[Time of entry], 
 
Успехов!
Владимир
Страницы: 1
Наверх