powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация программы. Дайте дельный советы.
25 сообщений из 25, страница 1 из 1
Оптимизация программы. Дайте дельный советы.
    #34438958
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дан файл DAN.DBF
Код: plaintext
1.
2.
3.
4.
GRUPPA           N    3     0
TOVAR            C    30
DATE_P           D 
CENA             N    6     2
KOL_VO           N    3     0

со сведениями о поступивших в магазин товарах. Составить программу для формирования справки о товарах, поступивших в магазин в период с 1 января 2005г. по 31 марта 2005г. Список товаров выдать в справку в алфавитном порядке их наименований с указанием общей суммы патрии (сумма = цена*количество)

Ниже у меня представлен мой вариант программы. Но что-то мне подсказывает, что он далеко не оптимальный. Помогите оптимизировать.
Код: 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.
*.Task2 page44
SET TALK OFF
SET DATE BRITISH
CLEAR
SET COLOR TO W+/N, GR+/B
USE DAN
IF .NOT.FILE("DAN_K.IDX"))
   INDEX ON TOVAR to DAN_K
ENDIF
SET INDEX TO DAN_K
? "SHOW RESULTS"
D1={ 01 / 01 / 05 }
D2={ 31 / 03 / 05 }
N= 1 
M1=SPACE( 10 )
FLAG=.f.
GOTO RECORD  1 
   LOCATE FOR ((DATE_P>D1)AND(DATE_P<D2))
   IF FOUND()
       DO WHILE !EOF()
          M=TOVAR
          S= 0 
          N=RECNO()
             IF M1=M
                 CONTINUE
             ENDIF
                 DO WHILE M=TOVAR
                      S=S+CENA*KOL_VO
                      CONTINUE
                      FLAG=.T.
                 ENDDO
             IF FLAG=.T. 
                 ?"TOBAP",M,"cmouMocmb",S  
                 M1=M
             ENDIF
             FLAG=.F.
          GOTO RECORD N    
          CONTINUE      
       ENDDO
   ENDIF
WAIT "PLEASE, PRESS ANY KEY FOR EXIT..."  
USE
CLEAR
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34438979
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Студент?
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34438995
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. А это что-то меняет?
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34439029
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это надо обязательно в FoxPro for DOS делать? А в VFP - нельзя? Хотя, Select-SQL работал уже и в FPD...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SET DATE TO GERMAN
D1={ 01 / 01 / 2005 }
D2={ 31 / 03 / 2005 }

SELECT ;
	Tovar, ;
	SUM(Cena*Kol_Vo) as Sum_Tov ;
FROM dan ;
INTO CURSOR curResult ;
WHERE Date_P Between m.D1 AND m.D1 ;
GROUP BY Tovar ;
ORDER BY Tovar 

select curResult
SCAN
	?"TOBAP ",Tovar," Сумма=",Sum_Tov  
ENDSCAN
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34439225
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, к сожалению использовать только DOSовский FP.
Владимир М , как я понимаю это вариант для VFP
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34439243
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут вопрос возник:когдая я редактирую мою БД DAN.DBF , то при запуске программы рез-ат совершенно другой. МБ надо использовать REINDEX ?
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34439411
w2000Тут вопрос возник:когдая я редактирую мою БД DAN.DBF , то при запуске программы рез-ат совершенно другой. МБ надо использовать REINDEX ?

1. Вариант ВладимираМ ДОЛЖЕН идти на FPD без доработки...
2. Так как индексы у Вас независимые (*.idx), то подразумевается, что программист САМ отслеживает их использование. При внесении изменений в файл ВСЕ ОТКРЫТЫЕ ИНДЕКСЫ автоматически актуализируются (в них вносятся изменения). Если индекс закрыт, а данные в таблице исправляются, то может получиться неприятная ситуация, когда данные уже новые, а индексы еще старые.
Из этой проблемы есть два выхода:
- делать Reindex (а еще лучше index on, так как кто-нибудь может удалить Ваш индексный файл...) по мере необходимости
- сделать для файла структурный индекс, который открывается АВТОМАТИЧЕСКИ вместе с файлом *.dbf.

Недостаток первого решения - время (чем больше данных - тем более значительное), необходимое для индексирования. Зато оно универсальное...
ИМХО, второе решение более правильное, если только Вы не хотите доверить Ваши данные другим xBase языкам (Clipper'у и иже с ним) или какие-то "кривые ручки" не полезут к Вашим данным "напрямую", в обход стандартных средств FoxPro...
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34439587
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж хочеться без 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.
*.Task2 page44
SET TALK OFF
SET DATE BRITISH
CLEAR
SET COLOR TO W+/N, GR+/B
USE DAN
IF .NOT.FILE("DAN_K.IDX"))
   INDEX ON TOVAR to DAN_K
ENDIF
SET INDEX TO DAN_K
? "SHOW RESULTS"
D1={ 01 / 01 / 05 }
D2={ 31 / 03 / 05 }

GO top

M=''
S= 0 

scan  FOR (DATE_P>D1)AND(DATE_P<D2)
    if   M<>TOVAR
       if M<>'' 
          ?"TOBAP",M,"cmouMocmb",S  
       endif
       M=TOVAR
       S=CENA*KOL_VO
    else
       S=S+CENA*KOL_VO
    endif
endscan

WAIT "PLEASE, PRESS ANY KEY FOR EXIT..."  
USE
CLEAR

PS Не проверял так что возможны ошибки.

Ну и лучше сделать структурный индексный файл , чтобы не приходилось строить каждый раз
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34441069
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав С ,спасибо за исчерпывающий ответ.
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34441562
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w2000 Владимир М , как я понимаю это вариант для VFP
Нет. Это все будет работать и в FPD 2.x
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34441771
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=AlexiS=-
Код: plaintext
1.
2.
M=''
--------------
IF M<>'' 

Подправил. Не знаю, почему он с пустыми значениями не работает
Код: plaintext
1.
2.
3.
M=space( 1 )
--------------
IF M<>SPACE( 1 )
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34441804
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SET DATE TO GERMAN
D1={ 01 / 01 / 2005 }
D2={ 31 / 03 / 2005 }

SELECT ;
	Tovar, ;
	SUM(Cena*Kol_Vo) as Sum_Tov ;
FROM dan ;
INTO CURSOR curResult ;
WHERE Date_P Between m.D1 AND m.D1 ;
GROUP BY Tovar ;
ORDER BY Tovar 

select curResult
SCAN
	?"TOBAP ",Tovar," Сумма=",Sum_Tov  
ENDSCAN

Протестируйте в среде FPD. У меня что-то нет рез-та от такого запроса.
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34442266
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подправил. Не знаю, почему он с пустыми значениями не работает
Потому что оператор сравнения = для символьных строк работает по следующему алгоритму - берем первый символ сравниваем, если равно то берем следующий и так далее, пока не кончится более короткая строка. Поэтому пустая строка всегда равно любой непустой. Чтобы этого избежать есть другой оператор - == абсолютное сравнение. Он возвращает .t. только в случае полного совпадения строк
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443121
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ , протестируйте свой вариант пожалуйста с
Код: plaintext
SELECT-SQL
вFPD
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443218
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для FPD пожалуй заменил бы конструкцию с Between на чтото вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT ;
	Tovar, ;
	SUM(Cena*Kol_Vo) as Sum_Tov ;
FROM dan ;
INTO CURSOR curResult ;
WHERE Date_P>=m.D1 AND Date_P<=m.D1 ;
GROUP BY Tovar ;
ORDER BY Tovar 
а то честно не помню работает она там или еще нет.
Хотя нет - хелп утверждает что работает.

>Протестируйте в среде FPD. У меня что-то нет рез-та от такого запроса
Вы кусок таблички то выложите а то ломы создавать и вбивать туда инфу
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443245
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы "в догонку"
если бы у товара был идентификатор , а не символьное наименование
все было-бы гораздо проще
M=заведомо_не_существующее значение
и уже сравнение M<>ID_tovar

Ну и как совет - пользуйтесь SQL - сами видите насколько меньше кода, да и удобнее - ведь в результате вы получаете набор данных с которым можно работать дальше.
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443496
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Burn
Вы кусок таблички то выложите а то ломы создавать и вбивать туда инфу
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443512
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=AlexiS=-Как бы "в догонку"
если бы у товара был идентификатор , а не символьное наименование
все было-бы гораздо проще
M=заведомо_не_существующее значение
и уже сравнение M<>ID_tovar

Код: plaintext
1.
2.
3.
4.
 GRUPPA           N    3     0 
TOVAR            C    30
DATE_P           D 
CENA             N    6     2
KOL_VO           N    3     0
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443738
w2000 ВладимирМ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SET DATE TO GERMAN
D1={ 01 / 01 / 2005 }
D2={ 31 / 03 / 2005 }

SELECT ;
	Tovar, ;
	SUM(Cena*Kol_Vo) as Sum_Tov ;
FROM dan ;
INTO CURSOR curResult ;
WHERE Date_P Between m.D1 AND m.D1 ;
GROUP BY Tovar ;
ORDER BY Tovar 

select curResult
SCAN
	?"TOBAP ",Tovar," Сумма=",Sum_Tov  
ENDSCAN

Протестируйте в среде FPD. У меня что-то нет рез-та от такого запроса.

Конечно, результата - нет. Здесь две ошибки:
1. в условии отбора:
Код: plaintext
1.
WHERE Date_P Between m.D1 AND m.D1 ; //Сравнение будет идти только за одну дату(!!!), а не за интервал

правильно будет:
Код: plaintext
1.
WHERE Date_P Between m.D1 AND m.D2 ; 

2. В самой таблице.
Данные, насколько я понял, заносились вручную при установке SET CENTURY OFF
В результате "интеллектуальный" Фокс автоматически (по умолчанию) добавил 1900 и в таблицу попал 1905 год
А выборку Вы пытаетесь сделать за 2005 год. Естественно, что таких данных в таблице нет!

Кстати, очень распространена эта ошибка была на рубеже 1999-2000 гг., сам на нее кучу раз попадался... А потом в config.fp просто прописал CENTURY=ON
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34443834
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подтверждаю - с учетом исправлений Станислава все работает
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34447999
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот тут есть 2 варианта. Первый выложил AlexiS , второй сам только что сделал. Как вы думаете, какой быстрее?
1.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
USE DAN
INDEX ON TOVAR TAG TOVAR
? "SHOW RESULTS"
D1={ 01 / 01 / 05 }
D2={ 31 / 03 / 05 }

GO top

M=''
S= 0 

scan  FOR (DATE_P>D1)AND(DATE_P<D2)
    if   M<>TOVAR
       if M<>'' 
          ?"TOBAP",M,"cmouMocmb",S  
       endif
       M=TOVAR
       S=CENA*KOL_VO
    else
       S=S+CENA*KOL_VO
    endif
endscan
2.
Код: 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.
USE DAN
INDEX ON TOVAR TAG TOVAR
D1={ 01 / 01 / 05 }
D2={ 31 / 03 / 05 }

GO TOP

M=SPACE( 5 )

DO WHILE !EOF()
   S= 0 
   M=TOVAR
       DO WHILE (M=TOVAR)
            IF (DATE_P>=D1) AND (DATE_P<=D2)
                 S=S+CENA*KOL_VO
                 SKIP
            ELSE
                 SKIP
            ENDIF
       ENDDO
     IF S<> 0 
         ?M,S
     ENDIF  
ENDDO
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34451627
w2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И как вообще проверить, какой из вариантов будет работать быстрее?
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34451814
w2000И как вообще проверить, какой из вариантов будет работать быстрее?
Странный ты... Запусти оба (естественно, по очереди) и определи время, которое каждый фрагмент работал до выдачи результатов. Затем сравни время...

ИМХО, быстрее, чем SQL-запрос процедура, написанная на FP, работать не будет...
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34452286
Быстродействие программ на VFP
...
Рейтинг: 0 / 0
Оптимизация программы. Дайте дельный советы.
    #34452452
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С ИМХО, быстрее, чем SQL-запрос процедура, написанная на FP, работать не будет...Скорее команда TOTAL работать быстрее будет чем SELECT для FPD 2.6 ... Учитель может быть хочет именно ее от учеников
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация программы. Дайте дельный советы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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