powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация кода
25 сообщений из 37, страница 1 из 2
Оптимизация кода
    #32583647
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа не судите меня строго, на ADO начал писать месяц назад, поэтому пишу в силу своих возможностей.
Надо увеличить скорость работы программы, сейчас она равна 6с.
Обрабатывает 110 записей, если записей будет больше время увеличится до критических значений.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Private Sub summa2()
Dim month As String
Dim summa As Long
Dim rcd As ADODB.Recordset
Dim rcd2 As ADODB.Recordset
DoCmd.RunSQL "ALTER TABLE svod ADD COLUMN Итого long;"
    
    Set rcd2 = New ADODB.Recordset
    rcd2.Open "svod", CurrentProject.Connection, , adLockOptimistic, adCmdTable
While Not rcd2.EOF
    Set rcd = New ADODB.Recordset
    rcd.Open "Period", CurrentProject.Connection, , adLockOptimistic, adCmdTable
    summa =  0 
While Not rcd.EOF
    month = CStr(Left(rcd!start_time,  2 )) & "_" & CStr(Right(rcd!start_time,  2 ))
    rcd.MoveNext
    summa = summa + Nz(rcd2.Fields(month),  0 )
Wend
    rcd.Close
    rcd2!Итого = summa
    rcd2.MoveNext
Wend
    rcd2.Close
End Sub
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583669
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожелание (на будующее)

Есть такая кнопка при добавлении поста - называется
Код: plaintext
[SRC]

ИМХО - текс программ будет легче читать
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583674
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял, учту, если надо сделаю прямо сейчас.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583679
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно все это можно запросто засунуть в запрос на обновление, который работает во стоко раз быстрее как долго вы крутите свой цикл по recordset'у

А так как разбираться с кодом с вынимаем оттуда логики самого алгортима влом (я думаю влом будет не токо мне), то если автор хочет подсказки, то пусть для начала напишет что он имеет и что хочет получить
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583682
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то все непонятно у тебя

А занчения в таблице Period меняются?
Или они константами пробиты, раз и навсегда?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583694
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Progaпонял, учту, если надо сделаю прямо сейчас.
Кто-то добрый уже сделал :)
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583697
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы было быстрее - не надо открывать/закрывать в цикле rcd. Открой один раз и пользуйся findnext

А лучше запросами пользоваться. Какой смысл у таблицы period? Или это вообще запрос? И, кстати, это MDB или ADP?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583698
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблице Period может быть сколько угодно столбцов, т.к. изначально не известно сколько длится проект строительства.
Количество этих столбцов берётся из 3-ей таблы, которая в свою очередь получается с помощью из 4-ой, а 4-ая образуется путём выимки данных из проекта Project-a.
Короче давно код пишу.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583699
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ. А вот это:

rcd2!Итого = summa
rcd2.MoveNext

что делает?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583701
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжая вопрос GEO - если адп - то ВСЮ логику на сервер в храниммые - и с песней по жизни:)
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583702
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв таблице Period может быть сколько угодно столбцов

Это вы заблуждаетесь, батенька. Не больше 250 для мдб или 400 (кажется) для mssql2000
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583705
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to geo:
Это просто
1) записывает в Итого сумму на строке
2) переход на следующую строку
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583708
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сомневаюсь, что 1-й пункт выполняется. rs.update
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583712
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой господи, это понятно, что не более 255 столбцов, просто имеется ввиду не известно заранее сколько их будет.
Всё в mdb.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583714
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпользуйся findnext
Т.е.
rcd.find "блабла"
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583725
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это ничего не даст. Или вы имеете ввиду не открывать и закрывать rcd.
А пользоваться find-ом.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583727
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень хорошо, а не покажет ли уважаемый джин, каким образом таблица period формируется из "3-й таблицы"?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583728
Sven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
Set rcd = New ADODB.Recordset
не надо внутри цикла делать
в принципе можно создавать рекордсет и при объявлении :
Код: plaintext
Dim rst as New ADODB.recordset
но это не всегда корректно
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583734
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Private Sub summa2()
Dim month As String
Dim rcd As ADODB.Recordset
 'Dim rcd2 As ADODB.Recordset
 
Dim strSQL as String
DoCmd.RunSQL "ALTER TABLE svod ADD COLUMN Итого long;"
    
    strSQL = ""

    Set rcd = New ADODB.Recordset
    rcd.Open "Period", CurrentProject.Connection, , adLockOptimistic, adCmdTable
    summa =  0 
While Not rcd.EOF
    month = CStr(Left(rcd!start_time,  2 )) & "_" & CStr(Right(rcd!start_time,  2 ))
    rcd.MoveNext
     'summa = summa + Nz(rcd2.Fields(month), 0)
 
    if Len(strSQL) >  0  then strSQL = strSQL & " + "
    strSQL = strSQL & "Nz(" & month & ", 0)"
Wend
    rcd.Close

    strSQL = "UPDATE svod SET [ИТОГО] = " & strSQL & ";"
DoCmd.RunSQL strSQL

End Sub
?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583737
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кто хочет, могу выкинуть весь код, что я написал,
только заранее необходимо установить MS Project(файл пример скину тоже), может так будет понятнее.
P.S.Все предложения хорошие, но они не увеличивают скорость.
А это ГЛАВНОЕ.
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583756
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположу сам:
period создается посредством transform некоей Table3, заголовки столбцов - format(ПолеДаты,"yy mm").

Тогда искомую таблицу с итогами можно получить запросом типа

Код: plaintext
1.
2.
select svod.*, sumfield 
from svod left join (select [month], sum(valuefield) from Table3 group by [month]) as q1
  on month(svod.start_time)=q1.[month]

Кстати, зачем создавать столбец и заполнять его данными, если в любой момент времени можно эти данные быстро вычислить?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583763
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если все-таки надо через... код вба, то попробуй вместо

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    rcd.Open "Period", CurrentProject.Connection, , adLockOptimistic, adCmdTable
    summa =  0 
While Not rcd.EOF
    month = CStr(Left(rcd!start_time,  2 )) & "_" & CStr(Right(rcd!start_time,  2 ))
    rcd.MoveNext
    summa = summa + Nz(rcd2.Fields(month),  0 )
Wend
    rcd.Close
    rcd2!Итого = summa

написать

Код: plaintext
1.
    month = CStr(Left(rcd!start_time,  2 )) & "_" & CStr(Right(rcd!start_time,  2 ))
    rcd2!Итого = dsum(month,"Period")
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583765
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to paparome:
Выдаёт ошибку
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583772
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Progato paparome:
Выдаёт ошибку
strSQL = strSQL & "Nz( [ " & month & " ] , 0)"
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583784
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем всё работает!!!
Особенно paparome
Получился код такой:
Код: 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.
Private Sub summa3()
Dim month As String
Dim rcd As ADODB.Recordset
 'Dim rcd2 As ADODB.Recordset
 
Dim summa As Long
Dim strSQL As String
DoCmd.RunSQL "ALTER TABLE svod ADD COLUMN Èòîãî long;"
    
    strSQL = ""

    Set rcd = New ADODB.Recordset
    rcd.Open "Period", CurrentProject.Connection, , adLockOptimistic, adCmdTable
    summa =  0 
While Not rcd.EOF
    month = CStr(Left(rcd!start_time,  2 )) & "_" & CStr(Right(rcd!start_time,  2 ))
    rcd.MoveNext
     'summa = summa + Nz(rcd2.Fields(month), 0)
 
    If Len(strSQL) >  0  Then strSQL = strSQL & " + "
    strSQL = strSQL & "Nz([" & month & "], 0)"
Wend
    rcd.Close

    strSQL = "UPDATE svod SET [ÈÒÎÃÎ] = " & strSQL & ";"
DoCmd.RunSQL strSQL

End Sub
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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