:: Visual Foxpro, Foxpro for DOS
медленно работает код или это нормально...
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Привет всем!

Нужен совет(помощь) новичку.
Пользователь вставляет пустую строку в таблицу bd.
таблица содержит последовательности обработки деталей.
Есть поле pn (порядковый номер) по которому и происходит сортировка при отображение в гриде(курсора).
И при вставки строки внутрь последовательности я увеличиваю каждое значения pn после текущей записи на 1.
и затем добавляю запись с номером текущим.
к сожалению больше ни чего не смог придумать...

SELECT bd
FOR i=kolzap TO tekpn STEP -1
LOCATE FOR bd.mod=ALLTRIM(thisform.text1.Value) AND bd.pn=i
if FOUND( )=(.T.)
REPLACE bd.pn WITH (i+1)
ENDIF
ENDFOR
INSERT INTO bd (pn,ns,mod,tdata) ;
VALUES (tekpn,0,ALLTRIM(thisform.text1.Value),DATE())

в таблице bd пока 40 тыс. записей.
этим кодом изменяет примерно записей 200.
но процесс занимает примерно 4-5 секунд.
как-то долго...
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Ну как минимум
lcStr = ALLTRIM(thisform.text1.Value)
SELECT bd
FOR i=m.kolzap TO m.tekpn STEP -1
LOCATE FOR mod = m.lcStr AND pn = m.i
if FOUND()
REPLACE pn WITH m.i+1
ENDIF
ENDFOR
INSERT INTO bd (pn,ns,mod,tdata) ;
VALUES (m.tekpn,0,m.lcStr,DATE())
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
1. Если немного подумать, вспомнить,узнать про разницу между хранением и отображением и перестать считать порядковый номер исключительно целым числом, то вставка новой записи между двумя имеющимися превратиться всего лишь в вычисление среднего между порядковыми номерами двух этих самых имеющихся записей.
2. ALLTRIM(thisform.text1.Value) в любом количестве (а даже в приведенном куске использовано два раза) легко заменяется на установку латинской буквочки Т в свойство format поля thisform.text1.Value. Не понимаю упорства в размножении именно этой конструкции с alltrim() по коду в просто диких количествах. Вон хотя бы как Taran писали...


------------------
Лень - это неосознанная мудрость.




Исправлено 1 раз(а). Последнее : ssa, 01.03.18 09:45
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Taran
Спасибо.
код выполняется примерно 2 секунды. Ну это куда ни шло.
А можно есче быстрей?

ssa
Как ни странно, но я об этом думал(среднее значение), только, к сожалению, мысль не до развил.
Остановился на том что нужно будет считать среднее между уже средним и целым(например).
Посчитал несколько, дошел до 1.03125(это среднее между 1 и 1.0625), подумал, что занимаюсь глупостью и бросил...
По поводу alltrim() буду разбираться. Спасибо. И Вы совершенно правы, отображать эти номера мне(и пользователю) не нужно, только для сортировки.



Исправлено 1 раз(а). Последнее : ProbaSP, 01.03.18 10:45
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Ну и ко всему вышесказанному добавлю.
Не нравится цикл
А вот так подумайте.
update bd set pn=(Непонятная_логика+1) where mod = m.lcStr AND pn = (Непонятная_логика)
Точно летать будет.


------------------
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Индексировать конечно надо по искомым полям.

Ну можно еще попробовать. Но не факт что быстрее.
lcStr = ALLTRIM(thisform.text1.Value)
SELECT bd
set filter to mod = m.lcStr
FOR i=m.kolzap TO m.tekpn STEP -1
LOCATE FOR pn = m.i
if FOUND()
REPLACE pn WITH m.i+1
ENDIF
ENDFOR
set filter to
INSERT INTO bd (pn,ns,mod,tdata) ;
VALUES (m.tekpn,0,m.lcStr,DATE())
[/quote]
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
ProbaSP
Остановился на том что нужно будет считать среднее между уже средним и целым(например).
На самом деле как я понимаю, вы уже знаете число которое будете вставлять,
пусть это будет kolzap (нелепое название)
тогда запрос превращается в
update bd set pn=pn+1 where mod = m.lcStr AND pn >= kolzap
INSERT INTO bd (pn,ns,mod,tdata) ;
VALUES (m.tekpn,0,m.lcStr,DATE())


------------------




Исправлено 1 раз(а). Последнее : Аспид, 01.03.18 10:52
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Аспид
На самом деле как я понимаю, вы уже знаете число которое будете вставлять,
На самом деле он знает между какими записями ему надо вставить и весь код сжимается до единственной команды вставки без каких-либо пересчётов порядковых номеров в других записях.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
ssa
Аспид
На самом деле как я понимаю, вы уже знаете число которое будете вставлять,
На самом деле он знает между какими записями ему надо вставить и весь код сжимается до единственной команды вставки без каких-либо пересчётов порядковых номеров в других записях.
Это ясно. Я ж понял твою мысль)
Но практически, 200 записей = 200мс.
А вот раздвигать 200 записей, очень может не камильфо выйти, он выше описал проблему.


------------------
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Аспид
А вот раздвигать 200 записей, очень может не камильфо выйти, он выше описал проблему.
А зачем решать проблему, которую можно вообще не создавать? Зачем раздвигать если можно не раздвигать?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Taran
второй код выполняется чуть-чуть дольше, примерно сек 3.

ssa
т.е. среднее значение это самое верное решение?
мне мысль сразу понравилась, что не надо перелопачивать остальные записи.
Но, блин, 10 вставка между 1 и уже средним значением 1,0009765625 будет - 1,00048828125.
А если нужно будет вставить 100 значений(со временем)...



Исправлено 1 раз(а). Последнее : ProbaSP, 01.03.18 11:36
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Хорошо, пляши тогда не от 1, а от 1000000. Хватит?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
ssa
Зачем раздвигать если можно не раздвигать?

Ну порой если не раздвигать, то и вставить не получится.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Taran
ssa
Зачем раздвигать если можно не раздвигать?

Ну порой если не раздвигать, то и вставить не получится.
Решил пойти путем медстраха?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
ssa
Хорошо, пляши тогда не от 1, а от 1000000. Хватит?
эмм... видимо я чего-то не понимаю (или вообще ни чего)
"разницы" не увидел.
между 1000000 и 100001 - 10 вставка будет - 1000000,00048828125
только нули добавились...
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Похоже на Бейсике не программировал

Используй шаг приращения не i + 1, а i + 10000, тогда вставка 200 значений между записями с номерами 2000 и 3000 будет (3000-2000)/200 = 5, те i + 5.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
ProbaSP
ssa
Хорошо, пляши тогда не от 1, а от 1000000. Хватит?
эмм... видимо я чего-то не понимаю (или вообще ни чего)
Похоже... 1. Для начала я говорил о среднем значении двух соседних записей, а не записью и фиксированным числом.
2. Чем пугают знаки после запятой?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Тут вот какое дело. Прежде чем вставлять номер между двумя записями ( взяв средне значение ), надо проверить, не получилось ли это среднее значение равным уже существующему номеру (выше или ниже). И если оказалось, что лимит вставок уже превышен, то "свистать всех наверх" , то бишь написать юзеру сообщение "Ждите..." и массово переприсвоить все номера для всех таблиц, где эти номера используются. Возможно, что и пару минут придется подождать. Но зато после переприсвоения этих внутренних номеров можно будет уже вставлять записи между любыми двумя до достижения лимита вставок. В принципе, можно сделать и такую функцию администрирования - переприсвоение внутренних номеров. Конечно, такие переприсвоения возможны только в тех случаях, когда будет доступ ко всем таблицам, где переприсваиваются внутренние номера.

Когда-то я столкнулся с аналогичной проблемой, и вот таким образом ее решил.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
Simple777
Тут вот какое дело. Прежде чем вставлять номер между двумя записями ( взяв средне значение ), надо проверить, не получилось ли это среднее значение равным уже существующему номеру (выше или ниже).
И опять завернутость на ЦЕЛЫЕ числа. Как среднее двух чисел может быть равно одному из них, если эти два числа не равны друг другу и НЕ (ЦЕЛЫЕ/НАТУРАЛЬНЫЕ)?
Остальное совершенно неоригинально и проистекает из самой завернутости на целых числах.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: медленно работает код или это нормально...
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
ssa
Чем пугают знаки после запятой?
только тем, что вдруг когда-нибудь придется вручную исправлять(восстанавливать) таблицу которая по каким-то причинам "полетела", то с такими значениями визуально (лично мне) будет не комфортно "работать". Но скорее всего это паранойя...

Ну это уже тонкости...

И вижу, что
Simple777
так делал. ;)

Я так понял, что нужно смотреть в сторону среднего значения. И забыть про
Аспид
Непонятная_логика

правильно?
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 Владимир Максимов Guest (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика