Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с Recordset-ом / 25 сообщений из 26, страница 1 из 2
20.05.2010, 17:07
    #36639748
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Доброго времени суток!)Помогите пожалуйста!.
Я делаю выборку в VB6 из базы данных MS SQL server в рекордсет, потом по каждому полю рекордсета нахожу среднее значение.А теперь мне надо эти средние значения поместить в новый рекордсет,что в дальнейшем к ним обращаться.
Вот код для нахождения среднего значения


Set sred = Conn.Execute("Select сol1,col2,col3,col4 from Forma2 inner join Nalogoplatelchik on Forma2.INN=Nalogoplatelchik.INN where (Forma2.OtchetniiGod=" & a1 & ") and (Nalogoplatelchik.UN_OKVED_osnov=" & c & ")")
j = 0
For i = 0 To sred.EOF
sred.MoveFirst
s = 0
Do While Not sred.EOF
If i = 0 Then j = j + 1
If Not IsNull(sred.Fields(i).Value) Then s = s + sred.Fields(i).Value
sred.MoveNext
Loop
sr = sr + s / j
Next


И вообще правильно ли я нахожу среднее по стобцу??
...
Рейтинг: 0 / 0
20.05.2010, 17:11
    #36639766
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
1) Во-первых в SQL есть функция AVG
...
Рейтинг: 0 / 0
20.05.2010, 17:12
    #36639769
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
2) Во-вторых, вы уверены, что результат вы хотите поместить в рекордсет, а не в таблицу в базе данных?
...
Рейтинг: 0 / 0
20.05.2010, 17:18
    #36639791
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Вы предлагаете поместиь их таблицу, а потом обратно делать выорку уже из это таблицы??Я еще об этом не думала))Спасибо)А программа не будет каждый раз пересчитывая дублировать данные в таблице???
среднее должно подсчитываться с учетом года и кода ОКВЭД
Было бы хорошо,чтобы это хранилось потом в аблице..а как сделать...чтоб программа подсчитала их 1 раз и потом не пересчитывала
...
Рейтинг: 0 / 0
20.05.2010, 17:18
    #36639795
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
В общем примерно так:

Код: plaintext
1.
2.
Conn.Execute("Select AVG(сol1) AS Col1, AVG(col2) AS Col2, AVG(col3) AS Col3, AVG(col4) " + _
"AS Col4 INTO NewTable from Forma2 inner join Nalogoplatelchik on Forma2.INN=Nalogoplatelchik.INN " + _
"where (Forma2.OtchetniiGod=" & a1 & ") and (Nalogoplatelchik.UN_OKVED_osnov=" & c & ")")

и вы получаете таблицу NewTable с готовыми средними значениями
...
Рейтинг: 0 / 0
20.05.2010, 17:20
    #36639801
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
AliseА программа не будет каждый раз...???

Так это же ваша программа. Как напишете, так и будет.
...
Рейтинг: 0 / 0
20.05.2010, 17:21
    #36639811
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
AliseВы предлагаете поместиь их таблицу, а потом обратно делать выорку

Я вообще не вижу необходимости помещать это в таблицу. Если только конечно у вас не миллион записей в таблице. Делайте запрос - получайте сразу средние значения, а не высчитывайте их на клиенте.
...
Рейтинг: 0 / 0
20.05.2010, 17:47
    #36639876
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
спасибо большое!!))Я попробую:)
...
Рейтинг: 0 / 0
20.05.2010, 19:49
    #36640160
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Каждый раз ,как программа запускается создается новая таблица???теперь VB ругается,что такая таблица уже существует..
...
Рейтинг: 0 / 0
20.05.2010, 20:09
    #36640200
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
AliseКаждый раз ,как программа запускается создается новая таблица???теперь VB ругается,что такая таблица уже существует..

Я предложил вам несколько вариантов, определитесь, какой вам нужен.
Либо делайте предварительно DROP TABLE, либо уберите INTO
...
Рейтинг: 0 / 0
20.05.2010, 23:10
    #36640427
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Shocker.ProЛибо делайте предварительно DROP TABLE, либо уберите INTOЕсли не ошибаюсь, drop нужно делать и перед into.
...
Рейтинг: 0 / 0
20.05.2010, 23:14
    #36640429
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
AntonariyShocker.ProЛибо делайте предварительно DROP TABLE, либо уберите INTOЕсли не ошибаюсь, drop нужно делать и перед into.

Зачем? Если таблицы нет, DROP вызовет ошибку.
Так что, либо DROP, но тогда еще ваять проверку, либо DROP, точно зная, что таблицы нет, либо просто убрать INTO.

Насколько я понимаю, автору нужен как раз третий вариант, без создания лишней таблицы.
...
Рейтинг: 0 / 0
21.05.2010, 11:00
    #36640940
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Не ошибаюсь. Если таблица уже существует, select into вызовет ошибку.
...
Рейтинг: 0 / 0
21.05.2010, 11:06
    #36640962
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
AntonariyНе ошибаюсь. Если таблица уже существует, select into вызовет ошибку.

Вызовет. Я что, против что ли?
Я же предложил автору либо дропать, либо убрать INTO

ДРУГОЙ вопрос, что если таблица не существует, то DROP тоже вызовет ошибку.
...
Рейтинг: 0 / 0
21.05.2010, 11:18
    #36640989
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
> Автор: Shocker.Pro
> > Antonariy
> > Не ошибаюсь. Если таблица уже существует, select into вызовет ошибку.
> Вызовет. Я что, против что ли?
> Я же предложил автору либо дропать, либо убрать INTO
>
> ДРУГОЙ вопрос, что если таблица не существует, то DROP тоже вызовет ошибку.

Куда не кинь, везде клин.

А что batch'и уже отменили?
Что-бы проверить если объект есть, дропнуть или что-бы не дропать несуществующий объект :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.05.2010, 11:49
    #36641075
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Игорь ГорбоносА что batch'и уже отменили?
Что-бы проверить если объект есть, дропнуть или что-бы не дропать несуществующий объект :)


Шота мы переливаем из пустого в порожнее. Я про это уже писал.
...
Рейтинг: 0 / 0
21.05.2010, 20:01
    #36642518
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
просто Drop не помогает))!я пробовала применить и Drop(перед запросом,чтоб он удалял эту таблицу) и Into одновременно.Работает))Если дальше с этой таблицей не проводить никаких операций))А если проводить, то появляется ошибка "Операция не допускается,если объект закрыт"
...
Рейтинг: 0 / 0
21.05.2010, 20:03
    #36642521
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Aliseпросто Drop не помогает))!я пробовала применить и Drop(перед запросом,чтоб он удалял эту таблицу) и Into одновременно.Работает))Если дальше с этой таблицей не проводить никаких операций))А если проводить, то появляется ошибка "Операция не допускается,если объект закрыт"

для устранения этой ошибки требуется
set nocount on
в начале пакета.

сложно советовать, когда вы не приводите код.
...
Рейтинг: 0 / 0
21.05.2010, 21:54
    #36642608
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
это я тоже пробовала, та же ошибка..пишет объект закрыт.А если убрать sred.moveFirst- ошибка"Не удается найти объект в семействе, соответствующий требуемому имени и порядковому номеру "
В приведенном коде нахожу стандартное отклонение sigma=корень из суммы(xi-xsred)^2/n

Private Sub CommandButton1_Click()
Dim Conn As ADODB.Connection, f, doh, sred, sred1, sred2, sred3 As Recordset
Dim strConn As String, i, j, l As Long, v, NS As Variant
Dim ss(1 To 50) As Long, so(1 To 50) As Variant, NN(1 To 50) As Variant, sr, s, N As Long, sigma As Double

If (okved.Text = "") And (Inn.Text = "") And (God1.Text = "") And (God2.Text = "") And (God3.Text = "") Then
MsgBox "Введите параметры для расчета"
Else
If okved.Text = "" Then
MsgBox "Введите ОКВЭД"
Else

Set Conn = New ADODB.Connection

strConn = "PROVIDER=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;"
strConn = strConn & "Data Source=ALISA-2B337005A;INITIAL CATALOG=Nalog;"
strConn = strConn & "User ID=;Password=;"
Conn.ConnectionString = strConn
Conn.Open
c = okved.Text
b = Inn.Text
a1 = God1.Text
a2 = God2.Text
a3 = God3.Text

'srednee
Set sred = Conn.Execute("set nocount on")
Set sred = Conn.Execute("Drop table Srednee")

Set sred = Conn.Execute("Select avg(Viruchka) as Viruchka,avg(ProcentiKpolucheniu) as ProcentiKpolucheniu,avg(ProchieDohodi) as ProchieDohodi," + _
"avg(DohodiOtUchastiyaVdrugihOrg) as DohodiOtUchastiyaVdrugihOrg,avg(PribilUbitokOtProdag) as ПрибыльУбыток_от_продаж," + _
"avg(PribilUbitokDoNO)as PribilUbitokDoNO,avg(SebestoimostProdTovarov)as SebestoimostProdTovarov,avg(KomerchesRashodi) as KomerchesRashodi," + _
"avg(UpravlenRashodi)as UpravlenRashodi,avg(ProchieRashodi) as ProchieRashodi," + _
"avg(ProcentiKUplate) as ProcentiKUplate into Srednee from Forma2 inner join Nalogoplatelchik on Forma2.INN=Nalogoplatelchik.INN" + _
" where (Forma2.OtchetniiGod=" & a1 & ") and (Nalogoplatelchik.UN_OKVED_osnov=" & c & ")and (UpravlenRashodi is not null ) group by OtchetniiGod, UN_OKVED_osnov")

Set f = Conn.Execute("Select Viruchka,ProcentiKpolucheniu,ProchieDohodi," + _
"DohodiOtUchastiyaVdrugihOrg,PribilUbitokOtProdag," + _
"PribilUbitokDoNO,SebestoimostProdTovarov,KomerchesRashodi," + _
"UpravlenRashodi,ProchieRashodi," + _
"ProcentiKUplate from Forma2 inner join Nalogoplatelchik on Forma2.INN=Nalogoplatelchik.INN" + _
" where (Forma2.OtchetniiGod=" & a1 & ") and (Nalogoplatelchik.UN_OKVED_osnov=" & c & ")and (UpravlenRashodi is not null )")

'sigma
sred.MoveFirst
sr = 0
j = 0
For j = 0 To 3
sr = sr + sred.Fields(j).Value
'sred.Fields(0).Value sred.Fields(1).Value + sred.Fields(2).Value + sred.Fields(3).Value
Next
sred.MoveNext
RPsr = sred.Fields(4).Value / sr

f.MoveFirst
i = 0
s = 0
For i = 0 To f.EOF

Do While Not f.EOF
v = f.Fields(0).Value + f.Fields(1).Value + f.Fields(2).Value + f.Fields(3).Value
RP = f.Fields(4).Value / v
ss(i) = RP
NN(i) = (ss(i) - RPsr) ^ 2
s = s + NN(i) / i
i = i + 1
j = j + 1
f.MoveNext
Loop
Next
MsgBox s
sigma = Sqr(s)
MsgBox sigma
...
Рейтинг: 0 / 0
21.05.2010, 21:57
    #36642614
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Нельзя ли правильно оформлять код? И вообще, почитать правила форума?

Код: plaintext
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.
66.
67.
68.
69.
70.
71.
72.
73.
Private Sub CommandButton1_Click()
Dim Conn As ADODB.Connection, f, doh, sred, sred1, sred2, sred3 As Recordset
Dim strConn As String, i, j, l As Long, v, NS As Variant
Dim ss( 1  To  50 ) As Long, so( 1  To  50 ) As Variant, NN( 1  To  50 ) As Variant, sr, s, N As Long, sigma As Double

If (okved.Text = "") And (Inn.Text = "") And (God1.Text = "") And (God2.Text = "") And (God3.Text = "") Then
MsgBox "Введите параметры для расчета"
Else
If okved.Text = "" Then
MsgBox "Введите ОКВЭД"
Else

Set Conn = New ADODB.Connection

strConn = "PROVIDER=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;"
strConn = strConn & "Data Source=ALISA-2B337005A;INITIAL CATALOG=Nalog;"
strConn = strConn & "User ID=;Password=;"
Conn.ConnectionString = strConn
Conn.Open
c = okved.Text
b = Inn.Text
a1 = God1.Text
a2 = God2.Text
a3 = God3.Text

'srednee
Set sred = Conn.Execute("set nocount on")
Set sred = Conn.Execute("Drop table Srednee")

Set sred = Conn.Execute("Select avg(Viruchka) as Viruchka,avg(ProcentiKpolucheniu) as ProcentiKpolucheniu,avg(ProchieDohodi) as ProchieDohodi," + _
"avg(DohodiOtUchastiyaVdrugihOrg) as DohodiOtUchastiyaVdrugihOrg,avg(PribilUbitokOtProdag) as ПрибыльУбыток_от_продаж," + _
"avg(PribilUbitokDoNO)as PribilUbitokDoNO,avg(SebestoimostProdTovarov)as SebestoimostProdTovarov,avg(KomerchesRashodi) as KomerchesRashodi," + _
"avg(UpravlenRashodi)as UpravlenRashodi,avg(ProchieRashodi) as ProchieRashodi," + _
"avg(ProcentiKUplate) as ProcentiKUplate  into Srednee from Forma2 inner join Nalogoplatelchik on Forma2.INN=Nalogoplatelchik.INN" + _
" where  (Forma2.OtchetniiGod=" & a1 & ") and (Nalogoplatelchik.UN_OKVED_osnov=" & c & ")and (UpravlenRashodi is not null ) group by  OtchetniiGod, UN_OKVED_osnov")

Set f = Conn.Execute("Select Viruchka,ProcentiKpolucheniu,ProchieDohodi," + _
"DohodiOtUchastiyaVdrugihOrg,PribilUbitokOtProdag," + _
"PribilUbitokDoNO,SebestoimostProdTovarov,KomerchesRashodi," + _
"UpravlenRashodi,ProchieRashodi," + _
"ProcentiKUplate from Forma2 inner join Nalogoplatelchik on Forma2.INN=Nalogoplatelchik.INN" + _
" where  (Forma2.OtchetniiGod=" & a1 & ") and (Nalogoplatelchik.UN_OKVED_osnov=" & c & ")and (UpravlenRashodi is not null )")

'sigma
sred.MoveFirst
sr =  0 
j =  0 
For j =  0  To  3 
sr = sr + sred.Fields(j).Value
'sred.Fields(0).Value sred.Fields(1).Value + sred.Fields(2).Value + sred.Fields(3).Value
Next
sred.MoveNext
RPsr = sred.Fields( 4 ).Value / sr

f.MoveFirst
i =  0 
s =  0 
For i =  0  To f.EOF

Do While Not f.EOF
v = f.Fields( 0 ).Value + f.Fields( 1 ).Value + f.Fields( 2 ).Value + f.Fields( 3 ).Value
RP = f.Fields( 4 ).Value / v
ss(i) = RP
NN(i) = (ss(i) - RPsr) ^  2 
s = s + NN(i) / i
i = i +  1 
j = j +  1 
f.MoveNext
Loop
Next
MsgBox s
sigma = Sqr(s)
MsgBox sigma
...
Рейтинг: 0 / 0
21.05.2010, 22:02
    #36642617
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
неправильно:
Код: plaintext
Dim sred1, sred2, sred3 As Recordset

правильно (касаемо других переменных - тоже)
Код: plaintext
Dim sred1 As ADODB.Recordset, sred2 As ADODB.Recordset, sred3 As ADODB.Recordset


бессмысленно:
Код: plaintext
Set sred = Conn.Execute("set nocount on")
эта команда должна быть в одном пакете с остальными. То есть Execute на всех один.
Лучше, конечно, сделать процедуру на сервере и пихать весь SQL-код туда. Если не хотите процедуру делать, наполняйте нужную текстовую переменную, а потом выполняйте одним Execute
...
Рейтинг: 0 / 0
21.05.2010, 22:10
    #36642629
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Aliseэто я тоже пробовала, та же ошибка..пишет объект закрыт.А если убрать sred.moveFirst- ошибка"Не удается найти объект в семействе, соответствующий требуемому имени и порядковому номеру "

Не очень понятно, что вы хотите от рекордсета sred
Пока ваш код вернет его пустым в любом случае, потому что select... into не возвращает данные в клиента, он просто формирует таблицу на сервере.

Поэтому, если вы хотите получить средние значения в рекордсете sred, либо пишите в конце пакета "select * from Srednee", либо уж избавьтесь вообще от таблицы Srednee: уберите "drop table", уберите "into Srednee", тогда в рекордсете sred вы будете получать ваши средние значения (и set nocount on тоже не понадобится)
...
Рейтинг: 0 / 0
21.05.2010, 22:13
    #36642635
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
AliseВ приведенном коде нахожу стандартное отклонение

И третий момент, а вам вообще нужно всю эту муть писать?
В SQL есть агрегатная функция STDEV - стандартное отклонение. Она все посчитает за вас.
...
Рейтинг: 0 / 0
21.05.2010, 22:15
    #36642637
Alise
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Sorry,забыла:(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
'sigma
sred.MoveFirst  [color=red]'здесь выходит ошибка 3704 "Операция не допускается, если объект закры"[/color]
sr =  0 
j =  0 
For j =  0  To  3 
sr = sr + sred.Fields(j).Value
'sred.Fields(0).Value sred.Fields(1).Value + sred.Fields(2).Value + sred.Fields(3).Value
Next
sred.MoveNext
RPsr = sred.Fields( 4 ).Value / sr

Убираю sred.MoveFirst и sred.MoveNext
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
sr =  0 
j =  0 
For j =  0  To  3 
sr = sr + sred.Fields(j).Value 'ошибка 3265 "Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру"
'sred.Fields(0).Value sred.Fields(1).Value + sred.Fields(2).Value + sred.Fields(3).Value
Next
sred.MoveNext
RPsr = sred.Fields( 4 ).Value / sr

...
Рейтинг: 0 / 0
21.05.2010, 22:17
    #36642641
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Recordset-ом
Alise, я ответил уже выше, прочтите посты, которые появились, пока вы писали свой.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с Recordset-ом / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]