Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Из VBA в SQL перенос типа данных date - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Из VBA в SQL перенос типа данных date (Макросы/Sub)
Из VBA в SQL перенос типа данных date
Elhust Дата: Среда, 15.03.2017, 13:42 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код

Dim Conn
Sub test_connALL()
Dim cmd         As ADODB.Command
Dim Conn        As ADODB.Connection
Dim rs          As ADODB.Recordset
Dim lLastrow, i As Long
Dim iCell       As Range
Dim whereID     As Long
Dim FAM, IM, OT   As String
Dim DAT As Date

'On Error GoTo Err
iTimer! = Timer
Set Conn = New ADODB.Connection
'------------------------------------------------------------------------------------------------------------------
If UserForm1.TextBox2.Text = "" And UserForm1.TextBox1.Text = "" Then
UserForm1.Show
Else
End If
'------------------------------------------------------------------------------------------------------------------
Application.ScreenUpdating = False
'Range("G2:G65536").Clear
lLastrow = Cells(Rows.Count, 5).End(xlUp).Row
i = 1
'------------------------------------------------------------------------------------------------------------------
Conn.ConnectionString = "driver={SQL Server};server=197.76.8.177;uid=" & UserForm1.TextBox1.Text & ";pwd=" & UserForm1.TextBox2.Text & ";database=MainDWH"
Conn.Open
'------------------------------------------------------------------------------------------------------------------
'On Error Resume Next
With ThisWorkbook.Worksheets(2)
For Each iCell In .Range("E2", Cells(lLastrow, 5))
i = i + 1
If Cells(i, 68) <> "" Then GoTo Point

'FAM = iCell
'IM = iCell.Offset(0, 1)
'OT = iCell.Offset(0, 2)
DAT = iCell.Offset(0, 4)
MsgBox DAT
'MsgBox FAM & " " & IM & " " & OT
Set cmd = New ADODB.Command
     With cmd
          .ActiveConnection = Conn
          '.Parameters.Append cmd.CreateParameter("@FAM", adBSTR, adParamInput, Value:=FAM)
          '.Parameters.Append cmd.CreateParameter("@IM", adBSTR, adParamInput, Value:=IM)
          '.Parameters.Append cmd.CreateParameter("@OT", adBSTR, adParamInput, Value:=OT)
          .Parameters.Append cmd.CreateParameter("@DAT", adDate, adParamInput, Value:=DAT)
          .CommandType = adCmdStoredProc
          .CommandText = "port.sp_AfsSOAP_RequestTEST_ALLL"
     End With
     Set rs = cmd.Execute()
     Cells(i, 68).CopyFromRecordset rs
     rs.Close
Point:
Next
End With
[/vba]
везде стоит тип данных DATE а в SQL принимает значение
[vba]
Код

ALTER PROCEDURE [port].[sp_AfsSOAP_RequestTEST_ALLL]
(
@DAT date
)
AS
BEGIN
DECLARE @ID nvarchar(20)
SELECT @ID= ANKETA_ID FROM port.Ankets
WHERE  ANKETA_BIRTH_DATE=CONVERT(DATETIME,'@DAT',104)
EXEC port.sp_AfsSOAP_RequestTEST_ID
@ID
END
GO
[/vba]
ANKETA_BIRTH_DATE в этой колонке дата типа DATETIME
пробовал многими способами выдаёт ошибку

--------------------------------------------------
Microsoft Visual Basic for Applications
--------------------------------------------------
System Error &H80040E21 (-2147217887).
--------------------------------------------------
ОК Справка
--------------------------------------------------
Heeeelp, guru VBA


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Среда, 15.03.2017, 13:43
 
Ответить
Сообщение[vba]
Код

Dim Conn
Sub test_connALL()
Dim cmd         As ADODB.Command
Dim Conn        As ADODB.Connection
Dim rs          As ADODB.Recordset
Dim lLastrow, i As Long
Dim iCell       As Range
Dim whereID     As Long
Dim FAM, IM, OT   As String
Dim DAT As Date

'On Error GoTo Err
iTimer! = Timer
Set Conn = New ADODB.Connection
'------------------------------------------------------------------------------------------------------------------
If UserForm1.TextBox2.Text = "" And UserForm1.TextBox1.Text = "" Then
UserForm1.Show
Else
End If
'------------------------------------------------------------------------------------------------------------------
Application.ScreenUpdating = False
'Range("G2:G65536").Clear
lLastrow = Cells(Rows.Count, 5).End(xlUp).Row
i = 1
'------------------------------------------------------------------------------------------------------------------
Conn.ConnectionString = "driver={SQL Server};server=197.76.8.177;uid=" & UserForm1.TextBox1.Text & ";pwd=" & UserForm1.TextBox2.Text & ";database=MainDWH"
Conn.Open
'------------------------------------------------------------------------------------------------------------------
'On Error Resume Next
With ThisWorkbook.Worksheets(2)
For Each iCell In .Range("E2", Cells(lLastrow, 5))
i = i + 1
If Cells(i, 68) <> "" Then GoTo Point

'FAM = iCell
'IM = iCell.Offset(0, 1)
'OT = iCell.Offset(0, 2)
DAT = iCell.Offset(0, 4)
MsgBox DAT
'MsgBox FAM & " " & IM & " " & OT
Set cmd = New ADODB.Command
     With cmd
          .ActiveConnection = Conn
          '.Parameters.Append cmd.CreateParameter("@FAM", adBSTR, adParamInput, Value:=FAM)
          '.Parameters.Append cmd.CreateParameter("@IM", adBSTR, adParamInput, Value:=IM)
          '.Parameters.Append cmd.CreateParameter("@OT", adBSTR, adParamInput, Value:=OT)
          .Parameters.Append cmd.CreateParameter("@DAT", adDate, adParamInput, Value:=DAT)
          .CommandType = adCmdStoredProc
          .CommandText = "port.sp_AfsSOAP_RequestTEST_ALLL"
     End With
     Set rs = cmd.Execute()
     Cells(i, 68).CopyFromRecordset rs
     rs.Close
Point:
Next
End With
[/vba]
везде стоит тип данных DATE а в SQL принимает значение
[vba]
Код

ALTER PROCEDURE [port].[sp_AfsSOAP_RequestTEST_ALLL]
(
@DAT date
)
AS
BEGIN
DECLARE @ID nvarchar(20)
SELECT @ID= ANKETA_ID FROM port.Ankets
WHERE  ANKETA_BIRTH_DATE=CONVERT(DATETIME,'@DAT',104)
EXEC port.sp_AfsSOAP_RequestTEST_ID
@ID
END
GO
[/vba]
ANKETA_BIRTH_DATE в этой колонке дата типа DATETIME
пробовал многими способами выдаёт ошибку

--------------------------------------------------
Microsoft Visual Basic for Applications
--------------------------------------------------
System Error &H80040E21 (-2147217887).
--------------------------------------------------
ОК Справка
--------------------------------------------------
Heeeelp, guru VBA

Автор - Elhust
Дата добавления - 15.03.2017 в 13:42
Elhust Дата: Среда, 15.03.2017, 13:52 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
это точно ошибка в соответствии с типом данных в этой цепи, но вот какие типы расставить чтобы приходило к верному ( подскажите оптимальное решение


Каждый сам выбирает правила игры
 
Ответить
Сообщениеэто точно ошибка в соответствии с типом данных в этой цепи, но вот какие типы расставить чтобы приходило к верному ( подскажите оптимальное решение

Автор - Elhust
Дата добавления - 15.03.2017 в 13:52
devilkurs Дата: Среда, 15.03.2017, 14:11 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 167
Репутация: 43 ±
Замечаний: 0% ±

Excel 2007, 2010
Elhust, В каком виде данные типа datetime в SQL ? Я на в Access сталкивался с тем что в запрос приходилось ложить типа '01/01/2011' (с апострофами)
В данном варианте в запрос падает значение типа 01.01.2011 .

[offtop]SQL знаю очень слабо (((




Сообщение отредактировал devilkurs - Среда, 15.03.2017, 14:13
 
Ответить
СообщениеElhust, В каком виде данные типа datetime в SQL ? Я на в Access сталкивался с тем что в запрос приходилось ложить типа '01/01/2011' (с апострофами)
В данном варианте в запрос падает значение типа 01.01.2011 .

[offtop]SQL знаю очень слабо (((

Автор - devilkurs
Дата добавления - 15.03.2017 в 14:11
Elhust Дата: Среда, 15.03.2017, 14:46 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
devilkurs,дд.мм.гггг на сколько я понимаю так как там стоит тип 104 он отвечает за такую раскладку но точно не помню с минутами или нет у меня пока нет доступа к msdn (


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Среда, 15.03.2017, 14:47
 
Ответить
Сообщениеdevilkurs,дд.мм.гггг на сколько я понимаю так как там стоит тип 104 он отвечает за такую раскладку но точно не помню с минутами или нет у меня пока нет доступа к msdn (

Автор - Elhust
Дата добавления - 15.03.2017 в 14:46
Elhust Дата: Среда, 15.03.2017, 14:48 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
devilkurs, но я так понимаю что соль в том что данные SQL не принимает на уровне @DAT если там будет нужный тип то будет работать


Каждый сам выбирает правила игры
 
Ответить
Сообщениеdevilkurs, но я так понимаю что соль в том что данные SQL не принимает на уровне @DAT если там будет нужный тип то будет работать

Автор - Elhust
Дата добавления - 15.03.2017 в 14:48
Elhust Дата: Среда, 15.03.2017, 15:07 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
devilkurs, а нет это Date (гггг-мм-дд) а Datetime (гггг-мм-дд чч:мм:сс.000)


Каждый сам выбирает правила игры
 
Ответить
Сообщениеdevilkurs, а нет это Date (гггг-мм-дд) а Datetime (гггг-мм-дд чч:мм:сс.000)

Автор - Elhust
Дата добавления - 15.03.2017 в 15:07
Elhust Дата: Среда, 15.03.2017, 15:20 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
Тема в том что у меня не доходят данные даже до конвертации описанной в запросе
[vba]
Код

ALTER PROCEDURE [port].[sp_AfsSOAP_RequestTEST_ALLL]
(
@DAT date
)
AS
BEGIN
DECLARE @ID nvarchar(20)
SELECT @ID= ANKETA_ID FROM port.Ankets

WHERE  ANKETA_BIRTH_DATE=CONVERT(DATETIME,'@DAT',104)

EXEC port.sp_AfsSOAP_RequestTEST_ID
@ID
END
GO
[/vba]

попробовал с типом данных INT, везде расставил его и в экселе тоже и в параметре , ошибка изменилась как я понял дошло до конвертации так как окно с ошибкой вообще пустое окно !


Каждый сам выбирает правила игры

Сообщение отредактировал Elhust - Среда, 15.03.2017, 15:22
 
Ответить
СообщениеТема в том что у меня не доходят данные даже до конвертации описанной в запросе
[vba]
Код

ALTER PROCEDURE [port].[sp_AfsSOAP_RequestTEST_ALLL]
(
@DAT date
)
AS
BEGIN
DECLARE @ID nvarchar(20)
SELECT @ID= ANKETA_ID FROM port.Ankets

WHERE  ANKETA_BIRTH_DATE=CONVERT(DATETIME,'@DAT',104)

EXEC port.sp_AfsSOAP_RequestTEST_ID
@ID
END
GO
[/vba]

попробовал с типом данных INT, везде расставил его и в экселе тоже и в параметре , ошибка изменилась как я понял дошло до конвертации так как окно с ошибкой вообще пустое окно !

Автор - Elhust
Дата добавления - 15.03.2017 в 15:20
Elhust Дата: Среда, 15.03.2017, 15:57 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 184
Репутация: -1 ±
Замечаний: 0% ±

Excel 2010
Нашел решение )
тут у нас SQL
[vba]
Код
CREATE PROCEDURE [port].[sp_AfsSOAP_RequestTEST_ALL]
(
@FAM nvarchar(15),
@IM nvarchar(15),
@OT nvarchar(15),
@DAT date
)
AS
BEGIN
DECLARE @ID nvarchar(20)
SELECT @ID = ANKETA_ID FROM port.Ankets
WHERE  ANKETA_FAM=@FAM AND ANKETA_IM=@IM AND ANKETA_OT=@OT AND ANKETA_BIRTH_DATE=@DAT
EXEC port.sp_AfsSOAP_RequestTEST_ID
@ID
END
GO
[/vba]

[vba]
Код

Dim Conn
Sub test_connALL()
Dim cmd         As ADODB.Command
Dim Conn        As ADODB.Connection
Dim rs          As ADODB.Recordset
Dim lLastrow, i As Long
Dim iCell       As Range
Dim whereID     As Long
Dim FAM, IM, OT   As String
Dim DAT As Date

'On Error GoTo Err
iTimer! = Timer
Set Conn = New ADODB.Connection
'------------------------------------------------------------------------------------------------------------------
If UserForm1.TextBox2.Text = "" And UserForm1.TextBox1.Text = "" Then
UserForm1.Show
Else
End If
'------------------------------------------------------------------------------------------------------------------
Application.ScreenUpdating = False
'Range("G2:G65536").Clear
lLastrow = Cells(Rows.Count, 5).End(xlUp).Row
i = 1
'------------------------------------------------------------------------------------------------------------------
Conn.ConnectionString = "driver={SQL Server};server=197.76.8.177;uid=" & UserForm1.TextBox1.Text & ";pwd=" & UserForm1.TextBox2.Text & ";database=MainDWH"
Conn.Open
'------------------------------------------------------------------------------------------------------------------
'On Error Resume Next
With ThisWorkbook.Worksheets(2)
For Each iCell In .Range("E2", Cells(lLastrow, 5))
i = i + 1
If Cells(i, 68) <> "" Then GoTo Point
FAM = iCell
IM = iCell.Offset(0, 1)
OT = iCell.Offset(0, 2)
DAT = iCell.Offset(0, 4)
'MsgBox FAM & " " & IM & " " & OT
Set cmd = New ADODB.Command
     With cmd
          .ActiveConnection = Conn
          .Parameters.Append cmd.CreateParameter("@FAM", adBSTR, adParamInput, Value:=FAM)
          .Parameters.Append cmd.CreateParameter("@IM", adBSTR, adParamInput, Value:=IM)
          .Parameters.Append cmd.CreateParameter("@OT", adBSTR, adParamInput, Value:=OT)
          .Parameters.Append cmd.CreateParameter("@DAT", adDBTimeStamp, adParamInput, Value:=DAT)
          .CommandType = adCmdStoredProc
          .CommandText = "port.sp_AfsSOAP_RequestTEST_ALL"
     End With
     Set rs = cmd.Execute()
     Cells(i, 68).CopyFromRecordset rs
     rs.Close
Point:
Next
End With
'------------------------------------------------------------------------------------------------------------------
Application.ScreenUpdating = True
    MsgBox "Время выполнения макроса составило " & _
    Timer - iTimer! & " сек.", vbExclamation, ""
Conn.Close
Set rs = Nothing
Set con = Nothing
Exit Sub
'------------------------------------------------------------------------------------------------------------------
'Err:
'MsgBox ("Проверьте корректность ввода")
End Sub
[/vba]


Каждый сам выбирает правила игры
 
Ответить
СообщениеНашел решение )
тут у нас SQL
[vba]
Код
CREATE PROCEDURE [port].[sp_AfsSOAP_RequestTEST_ALL]
(
@FAM nvarchar(15),
@IM nvarchar(15),
@OT nvarchar(15),
@DAT date
)
AS
BEGIN
DECLARE @ID nvarchar(20)
SELECT @ID = ANKETA_ID FROM port.Ankets
WHERE  ANKETA_FAM=@FAM AND ANKETA_IM=@IM AND ANKETA_OT=@OT AND ANKETA_BIRTH_DATE=@DAT
EXEC port.sp_AfsSOAP_RequestTEST_ID
@ID
END
GO
[/vba]

[vba]
Код

Dim Conn
Sub test_connALL()
Dim cmd         As ADODB.Command
Dim Conn        As ADODB.Connection
Dim rs          As ADODB.Recordset
Dim lLastrow, i As Long
Dim iCell       As Range
Dim whereID     As Long
Dim FAM, IM, OT   As String
Dim DAT As Date

'On Error GoTo Err
iTimer! = Timer
Set Conn = New ADODB.Connection
'------------------------------------------------------------------------------------------------------------------
If UserForm1.TextBox2.Text = "" And UserForm1.TextBox1.Text = "" Then
UserForm1.Show
Else
End If
'------------------------------------------------------------------------------------------------------------------
Application.ScreenUpdating = False
'Range("G2:G65536").Clear
lLastrow = Cells(Rows.Count, 5).End(xlUp).Row
i = 1
'------------------------------------------------------------------------------------------------------------------
Conn.ConnectionString = "driver={SQL Server};server=197.76.8.177;uid=" & UserForm1.TextBox1.Text & ";pwd=" & UserForm1.TextBox2.Text & ";database=MainDWH"
Conn.Open
'------------------------------------------------------------------------------------------------------------------
'On Error Resume Next
With ThisWorkbook.Worksheets(2)
For Each iCell In .Range("E2", Cells(lLastrow, 5))
i = i + 1
If Cells(i, 68) <> "" Then GoTo Point
FAM = iCell
IM = iCell.Offset(0, 1)
OT = iCell.Offset(0, 2)
DAT = iCell.Offset(0, 4)
'MsgBox FAM & " " & IM & " " & OT
Set cmd = New ADODB.Command
     With cmd
          .ActiveConnection = Conn
          .Parameters.Append cmd.CreateParameter("@FAM", adBSTR, adParamInput, Value:=FAM)
          .Parameters.Append cmd.CreateParameter("@IM", adBSTR, adParamInput, Value:=IM)
          .Parameters.Append cmd.CreateParameter("@OT", adBSTR, adParamInput, Value:=OT)
          .Parameters.Append cmd.CreateParameter("@DAT", adDBTimeStamp, adParamInput, Value:=DAT)
          .CommandType = adCmdStoredProc
          .CommandText = "port.sp_AfsSOAP_RequestTEST_ALL"
     End With
     Set rs = cmd.Execute()
     Cells(i, 68).CopyFromRecordset rs
     rs.Close
Point:
Next
End With
'------------------------------------------------------------------------------------------------------------------
Application.ScreenUpdating = True
    MsgBox "Время выполнения макроса составило " & _
    Timer - iTimer! & " сек.", vbExclamation, ""
Conn.Close
Set rs = Nothing
Set con = Nothing
Exit Sub
'------------------------------------------------------------------------------------------------------------------
'Err:
'MsgBox ("Проверьте корректность ввода")
End Sub
[/vba]

Автор - Elhust
Дата добавления - 15.03.2017 в 15:57
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Из VBA в SQL перенос типа данных date (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!