Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перенос кода из vba в sql  [new]
Timonn
Guest
Есть необходимость перенести код из VBA в хранимку на SQL, но никогда, к сожалению, не пользовался курсорами. Суть запроса следующая: имеется две таблицы, которые построчно сравниваются между собой и результат заносится в третью таблицу. Код на VBA следующий:

    rst.Open "Table1", cn, ADODB.adOpenForwardOnly, ADODB.adLockReadOnly
    rst1.Open "Table2", cn, ADODB.adOpenForwardOnly, ADODB.adLockReadOnly
    rst2.Open "Table3", cn, ADODB.adOpenDynamic, ADODB.adLockOptimistic
    
    rst.MoveFirst
    rst1.MoveFirst
    
    Do While Not rst.EOF
          Do While Not rst1.EOF
          If rst1.Fields("Field1") = rst.Fields("Field1") Then
                     rst2.AddNew
                     rst2.Fields("Field1") = rst1.Fields("Field1")
                     rst2.Fields("Field2") = rst.Fields("Field2")
                     rst2.Update
          End If
          rst1.MoveNext
          Loop
    rst1.MoveFirst
    rst.MoveNext
    Loop

Как его перенести в SQL? Если кто подскажет буду благодарен.
13 окт 09, 14:38    [7778902]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
ТОП 10, Вопрос 9
13 окт 09, 14:42    [7778931]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
а зачем тут курсор?
все в одном sql-запросе делается
13 окт 09, 14:42    [7778942]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
На T-SQL такие вещи пишутся без курсоров...
insert
      Table3
             (Field1, Field2)
  select
        t2.Field1 as Field1
        , t1.Field1 as Field2
  from Table1 t1
  inner join Table2 t2 on t1.Field1 = t2.Field1
13 окт 09, 14:45    [7778967]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timmon
Guest
vba запрос был предельно упрощен, чтобы показать идеологию. Каждая запись Таблицы1 сравнивается с каждой записью таблицы2 по нескольким условиям и если эти условия выполняются, то определенный результат записывается в таблицу3, причем таких совпадений для записи из таблицы один может быть несколько
13 окт 09, 15:28    [7779329]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Timmon
vba запрос был предельно упрощен, чтобы показать идеологию. Каждая запись Таблицы1 сравнивается с каждой записью таблицы2 по нескольким условиям и если эти условия выполняются, то определенный результат записывается в таблицу3, причем таких совпадений для записи из таблицы один может быть несколько

А записи из таблиц получается берутся в произвольном порядке ?
13 окт 09, 15:30    [7779338]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timmon,

огласите весь список пожалуйста. В плане - задачу поставьте корректно и полностью. А то код на T-SQL полностью соответствует "упрощенному скрипту", но вам почему-то не нравится.
13 окт 09, 15:46    [7779465]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
cargo
Member

Откуда: Москва
Сообщений: 26
tpg, все правильно написал
13 окт 09, 16:16    [7779761]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timonn
Guest
Полность код выглядит следующим образом:

    rst.Open "Table1", cn, ADODB.adOpenForwardOnly, ADODB.adLockReadOnly
    rst1.Open "Table2", cn, ADODB.adOpenForwardOnly, ADODB.adLockReadOnly
    rst2.Open "Table3", cn, ADODB.adOpenDynamic, ADODB.adLockOptimistic
    
    rst.MoveFirst
    rst1.MoveFirst
    
    Do While Not rst.EOF
    
          Do While Not rst1.EOF
          If rst1.Fields("Adr") Like "*" & Trim(rst.Fields("str")) & "*" And Trim(rst.Fields("str")) <> "" And rst1.Fields("Cpc") = rst.Fields("pc") Then
                     rst2.AddNew
                     rst2.Fields("str_or") = rst1.Fields("adr")
                     rst2.Fields("str_like") = rst.Fields("str")
                     rst2.Fields("stn") = rst.Fields("stn")
                     rst2.Fields("rte") = rst.Fields("rte")
                     rst2.Fields("ab") = rst1.Fields("ab")
                     rst2.Fields("pc") = rst.Fields("pc")
                     rst2.Update
          End If
          rst1.MoveNext
          Loop
    rst1.MoveFirst
    rst.MoveNext
    Loop
13 окт 09, 16:45    [7780045]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
и что вам мешает эти условия перенести в запрос на выборку?

If rst1.Fields("Adr") Like "*" & Trim(rst.Fields("str")) & "*" And Trim(rst.Fields("str")) <> "" And rst1.Fields("Cpc") = rst.Fields("pc") Then
13 окт 09, 16:46    [7780053]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timonn
Guest
Konst_One
и что вам мешает эти условия перенести в запрос на выборку?

If rst1.Fields("Adr") Like "*" & Trim(rst.Fields("str")) & "*" And Trim(rst.Fields("str")) <> "" And rst1.Fields("Cpc") = rst.Fields("pc") Then


Если не сложно, то объясните, пожалуйста, поподробнее
13 окт 09, 17:37    [7780536]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
посмотрите в БОЛ про SELECT, FROM, WHERE, LIKE и тд и тп
13 окт 09, 17:40    [7780554]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
cargo
Member

Откуда: Москва
Сообщений: 26
Timonn,
как-то так:
insert into Table3(str_or, str_like, stn, rte, ab, pc)
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc
13 окт 09, 18:08    [7780745]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timonn,

в варианте tpg модифицируйте условие on на ваше условие в if. А вообще вы не понимаете основной принцип SQL- работа идет не с отдельными записями, а с множествами.
13 окт 09, 18:18    [7780799]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timonn
Guest
cargo
Timonn,
как-то так:
insert into Table3(str_or, str_like, stn, rte, ab, pc)
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc


Извините, но данный код не возвращает ни одного значения
14 окт 09, 16:37    [7786171]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Timonn
cargo
Timonn,
как-то так:
insert into Table3(str_or, str_like, stn, rte, ab, pc)
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc


Извините, но данный код не возвращает ни одного значения


а откуда вы взяли что insert должен возвращать значение?
14 окт 09, 16:39    [7786188]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timonn
Guest
Ramin
Timonn
cargo
Timonn,
как-то так:
insert into Table3(str_or, str_like, stn, rte, ab, pc)
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc


Извините, но данный код не возвращает ни одного значения


а откуда вы взяли что insert должен возвращать значение?


в Table3 он ведь что-то вставлять должен :)
14 окт 09, 16:41    [7786204]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timonn,

вставлять - не значит возвращать. Посмотрите что в таблице Table3. Ну или такой код выполните
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc
14 окт 09, 16:45    [7786235]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timonn
Guest
Ramin
Timonn
cargo
Timonn,
как-то так:
insert into Table3(str_or, str_like, stn, rte, ab, pc)
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc


Извините, но данный код не возвращает ни одного значения


а откуда вы взяли что insert должен возвращать значение?


в Table3 он ведь что-то вставлять должен :)
14 окт 09, 16:45    [7786239]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Glory
Member

Откуда:
Сообщений: 104760
Timonn


в Table3 он ведь что-то вставлять должен :)

Никто за вас не будет угадывать, возвращает ли запрос на ваших реальных данных результат или не возвращает. Потому что ваши данные есть только у вас.
Если вы так уверены, что запрос неверен, то потрудитесь привести тестовые данные, на которых каждый сможет проверить ваше утверждение
14 окт 09, 16:45    [7786242]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
iljy
Member

Откуда:
Сообщений: 8711
Timonn,

да, еще условие можно подправить - если str может начальные-конечные пробелы содержать

on r1.Adr like '%'+ltrim(rtrim(r.str))+'%' 
    and len(r.[str]) > 0
    and r1.Cpc = r.pc
14 окт 09, 16:49    [7786272]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Timonn
Ramin
Timonn
cargo
Timonn,
как-то так:
insert into Table3(str_or, str_like, stn, rte, ab, pc)
select r1.adr, r.[str], r.stn, r.rte, r1.ab, r.pc
from Table1 as r join Table2 as r1
	on r1.Adr like '%'+r.str+'%'
		and ltrim(rtrim(r.[str])) <> '' 
		and r1.Cpc = r.pc


Извините, но данный код не возвращает ни одного значения


а откуда вы взяли что insert должен возвращать значение?


в Table3 он ведь что-то вставлять должен :)

вставлять должен не должен это уже зависит от запроса инсерт, если все правильно то да. Но возвращать записи точно не должен.
14 окт 09, 16:52    [7786302]     Ответить | Цитировать Сообщить модератору
 Re: Перенос кода из vba в sql  [new]
Timonn
Guest
iljy
Timonn,

да, еще условие можно подправить - если str может начальные-конечные пробелы содержать

on r1.Adr like '%'+ltrim(rtrim(r.str))+'%' 
    and len(r.[str]) > 0
    and r1.Cpc = r.pc



Спасибо большое!!! Помогло!
14 окт 09, 17:50    [7786801]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить