Я создаю программу на VBA, которая генерирует файлы доступа для разных стран. Каждой стране нужны разные сегменты в своем файле доступа, поэтому я должен сгенерировать эти файлы для конкретной страны. Мои данные поступают с MS SQL Server, и после вставки запроса SQL в VBA я получил ошибку ODBC, поэтому я решил сначала решить проблему на стороне SQL. Коды vba проходят по entity_id-s в таблице tbl_entity с помощью цикла for (у меня есть страны в этой таблице) и проверяют их entity_ID-s. В зависимости от их entity_ID у них будут требуемые Segment_ID.
Вот мой код в SQL:
select case when b.entity_id = 7 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 5, 13))
when b.entity_id = 25 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 13))
when b.entity_id = 462 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 8, 13))
when b.entity_id = 12 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13))
when b.entity_id = 13 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13, 7))
when b.entity_id = 24 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 13, 9, 10))
else (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 13)) end
from (select * from sclr.Tbl_entity where entity_id = 7) b
select * from sclr.Tbl_entity, где entity_id = 7 является частьюв конце приведен лишь пример, потому что версия этого VBA будет выглядеть следующим образом:
strSQL = "select case when " & rsRecSet("Entity_ID") & " = 7 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 5, 13)) "
strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 25 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 13)) "
strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 462 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 8, 13)) "
strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 12 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13)) "
strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 13 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 12, 13, 7)) "
strSQL = strSQL & "when " & rsRecSet("Entity_ID") & " = 24 then (select Segment_ID, Segment_name as Segment, explanation from sclr.Tbl_Segment where segment_id in (4, 1, 11, 13, 9, 10)) "
strSQL = strSQL & "else (select Segment_ID, Segment_name as Segment from sclr.Tbl_Segment, explanation where segment_id in (4, 13)) end into tmp_segment from sclr.Tbl_segment c "
'--ODBC CALL FAILED
Set qsQuery = dbSet.CreateQueryDef("")
qsQuery.Connect = ConnectionString
qsQuery.ReturnsRecords = False
qsQuery.SQL = strSQL
qsQuery.Execute
Как вы можете видеть, к операторам when будет добавлено значение набора записей, и операторы выбора должнызапустить на основе этого. В VBA я получаю сообщение об ошибке «Не удалось вызвать ODBC», вызванное неправильным запросом, а в SQL «У меня может быть указано только одно выражение в списке выбора, если подзапрос не введен с EXISTS». ошибка.
Может кто-нибудь посоветовать, пожалуйста?