powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация кода
37 сообщений из 37, показаны все 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
Оптимизация кода
    #32583798
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я щаc кого-то из модераторов укушу
Надо блокировку ставить на редактирование :)
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583807
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Тёмный: кто-то письмена трёт
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583809
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
[/SRC]a[SRC vba]
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583816
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
a
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583820
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё допетрил
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583821
Sven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...как то раз проверял на себе советы из одной однотематической статьи:
например
при "сложении" заведомо string переменных можно склеивать их не & а +
Вместо Left() пользоваться Left$() (так же и right$)
конечно на мелких циклах разници и не ощущается, но когда попался весьма и весьма длинный, с множеством склеиваний строк и отрезанием букв - разница была очень ощутима....
...ну это так - к слову :)
...
Рейтинг: 0 / 0
Оптимизация кода
    #32583822
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для проверки возможностей редактора новых сообщений
Есть:
- предварительный просмотр
- форум тест
...
Рейтинг: 0 / 0
Оптимизация кода
    #32585188
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 paparome:
Забыл спросить, код был сделан для просчёта суммы по горизонтали, а возможно ли сделать с помощью SQL-запроса по вертикали.
Вот как я это сделал:
Код: 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.
Private Sub summa()
Dim month As String
Dim sum As Long
Dim rcd As ADODB.Recordset
Dim rcd1 As ADODB.Recordset
Dim cnn As ADODB.Connection
Set rcd = New ADODB.Recordset
rcd.Open "svod", CurrentProject.Connection, , adLockOptimistic, adCmdTable
    rcd.AddNew
    rcd!name_balance = "Итого"
    rcd.Update
    rcd.Close
   
Set rcd1 = New ADODB.Recordset
rcd1.Open "period", CurrentProject.Connection, , adLockOptimistic, adCmdTable
Do
If rcd1.EOF Then Exit Do
    month = CStr(Left(rcd1!start_time,  2 )) & "_" & CStr(Right(rcd1!start_time,  2 ))
sum =  0 
Set rcd = New ADODB.Recordset
rcd.Open "svod", CurrentProject.Connection, , adLockOptimistic, adCmdTable
While Not rcd.EOF
    sum = sum + Nz(rcd.Fields(month),  0 )
    rcd.MoveNext
Wend
    rcd.MoveLast
     'rcd.EditMode
 
    rcd.Fields(month) = sum
    rcd.Update
    rcd1.MoveNext
Loop
     rcd.Close
     rcd1.Close
End Sub
...
Рейтинг: 0 / 0
Оптимизация кода
    #32585251
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
INSERT INTO svod (name, [04_01], ...)
Select  'итого' as name, Sum([04_01]) as s04, ...
 
From svod
?

Естественно, SQL строку придется генерить динамически, примерно как я сделал.

Справишься?
...
Рейтинг: 0 / 0
Оптимизация кода
    #32585291
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, было бы желание, а оно как всегда есть!
...
Рейтинг: 0 / 0
Оптимизация кода
    #32585316
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 paparome:
И ещё вопрос: а как часто тебе приходится оптимизировать код, я в смысле начальство требует или самому хочется, ведь иногда записей, с которыми работаешь, бывает не больше 50 и пофигу как написано главное результат
...
Рейтинг: 0 / 0
Оптимизация кода
    #32585363
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Proga2 paparome:
И ещё вопрос: а как часто тебе приходится оптимизировать код, я в смысле начальство требует или самому хочется, ведь иногда записей, с которыми работаешь, бывает не больше 50 и пофигу как написано главное результат
Оптимизацией кода приходится заниматься, когда что-то оч. долго открывается - на глаз (типа пользователь задолбается ждать - и след. задолбает нас)
Иногда приходиться все переделывать с нуля, но с другим алгоритмом

Если записей 50 и все работает быстро - на газ, то конечно забивам на всю оптимизацию - зачем зря париться :)

+ Предложенные мною варианты были сделаны исходя из того, что один запрос будет работать быстрее (естественно, это проявиться только на больших объемах данных), чем елозенье в цикле по рекордсету (туда-сюда, туда-сюда, ...)
ЗЫ: как там в мультике говорилось:
- Нет, не догонишь, у него 2 ноги - он бежит: раз-два, раз-два, а у твоей лошади 4 - она бежит: раз-два-три-четыре, раз-два-три-четыре!
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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