Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Дан файл DAN.DBF
GRUPPA           N    3     0
TOVAR C 30
DATE_P D
CENA N 6 2
KOL_VO N 3 0

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

Ниже у меня представлен мой вариант программы. Но что-то мне подсказывает, что он далеко не оптимальный. Помогите оптимизировать.
*.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
4 апр 07, 22:51    [3981754]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Студент?
4 апр 07, 23:20    [3981786]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Да. А это что-то меняет?
4 апр 07, 23:50    [3981826]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Это надо обязательно в FoxPro for DOS делать? А в VFP - нельзя? Хотя, Select-SQL работал уже и в FPD...

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
5 апр 07, 01:17    [3981920]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Да, к сожалению использовать только DOSовский FP.
Владимир М, как я понимаю это вариант для VFP
5 апр 07, 09:12    [3982239]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Тут вопрос возник:когдая я редактирую мою БД DAN.DBF, то при запуске программы рез-ат совершенно другой. МБ надо использовать REINDEX?
5 апр 07, 09:21    [3982279]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Станислав С
Guest
w2000
Тут вопрос возник:когдая я редактирую мою БД DAN.DBF, то при запуске программы рез-ат совершенно другой. МБ надо использовать REINDEX?


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

Недостаток первого решения - время (чем больше данных - тем более значительное), необходимое для индексирования. Зато оно универсальное...
ИМХО, второе решение более правильное, если только Вы не хотите доверить Ваши данные другим xBase языкам (Clipper'у и иже с ним) или какие-то "кривые ручки" не полезут к Вашим данным "напрямую", в обход стандартных средств FoxPro...
5 апр 07, 10:13    [3982575]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
-=AlexiS=-
Member

Откуда: Одесса
Сообщений: 712
Если уж хочеться без SQL
примерно так

*.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 Не проверял так что возможны ошибки.

Ну и лучше сделать структурный индексный файл , чтобы не приходилось строить каждый раз
5 апр 07, 10:53    [3982925]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Станислав С,спасибо за исчерпывающий ответ.
5 апр 07, 16:14    [3985668]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
w2000
Владимир М, как я понимаю это вариант для VFP

Нет. Это все будет работать и в FPD 2.x
5 апр 07, 18:10    [3986707]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
-=AlexiS=-

M=''
--------------
IF M<>'' 

Подправил. Не знаю, почему он с пустыми значениями не работает
M=space(1)
--------------
IF M<>SPACE(1)
5 апр 07, 19:43    [3987130]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
ВладимирМ

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. У меня что-то нет рез-та от такого запроса.
5 апр 07, 20:15    [3987227]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
Подправил. Не знаю, почему он с пустыми значениями не работает

Потому что оператор сравнения = для символьных строк работает по следующему алгоритму - берем первый символ сравниваем, если равно то берем следующий и так далее, пока не кончится более короткая строка. Поэтому пустая строка всегда равно любой непустой. Чтобы этого избежать есть другой оператор - == абсолютное сравнение. Он возвращает .t. только в случае полного совпадения строк
6 апр 07, 09:21    [3987981]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
ВладимирМ, протестируйте свой вариант пожалуйста с
SELECT-SQL
вFPD
6 апр 07, 12:40    [3989536]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
Для FPD пожалуй заменил бы конструкцию с Between на чтото вроде

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. У меня что-то нет рез-та от такого запроса
Вы кусок таблички то выложите а то ломы создавать и вбивать туда инфу
6 апр 07, 13:01    [3989696]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
-=AlexiS=-
Member

Откуда: Одесса
Сообщений: 712
Как бы "в догонку"
если бы у товара был идентификатор , а не символьное наименование
все было-бы гораздо проще
M=заведомо_не_существующее значение
и уже сравнение M<>ID_tovar

Ну и как совет - пользуйтесь SQL - сами видите насколько меньше кода, да и удобнее - ведь в результате вы получаете набор данных с которым можно работать дальше.
6 апр 07, 13:05    [3989729]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Burn

Вы кусок таблички то выложите а то ломы создавать и вбивать туда инфу


К сообщению приложен файл (DAN.rar - 332bytes) cкачать
6 апр 07, 14:03    [3990164]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
-=AlexiS=-
Как бы "в догонку"
если бы у товара был идентификатор , а не символьное наименование
все было-бы гораздо проще
M=заведомо_не_существующее значение
и уже сравнение M<>ID_tovar


GRUPPA N 3 0
TOVAR C 30
DATE_P D
CENA N 6 2
KOL_VO N 3 0
6 апр 07, 14:07    [3990192]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Станислав С
Guest
w2000
ВладимирМ

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. в условии отбора:
WHERE Date_P Between m.D1 AND m.D1 ; //Сравнение будет идти только за одну дату(!!!), а не за интервал

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

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

Кстати, очень распространена эта ошибка была на рубеже 1999-2000 гг., сам на нее кучу раз попадался... А потом в config.fp просто прописал CENTURY=ON
6 апр 07, 14:56    [3990572]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
Подтверждаю - с учетом исправлений Станислава все работает
6 апр 07, 15:16    [3990750]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
Вот тут есть 2 варианта. Первый выложил AlexiS, второй сам только что сделал. Как вы думаете, какой быстрее?
1.

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.
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
9 апр 07, 17:15    [3998274]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
w2000
Member

Откуда:
Сообщений: 22
И как вообще проверить, какой из вариантов будет работать быстрее?
11 апр 07, 08:47    [4004130]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Станислав С
Guest
w2000
И как вообще проверить, какой из вариантов будет работать быстрее?

Странный ты... Запусти оба (естественно, по очереди) и определи время, которое каждый фрагмент работал до выдачи результатов. Затем сравни время...

ИМХО, быстрее, чем SQL-запрос процедура, написанная на FP, работать не будет...
11 апр 07, 10:03    [4004451]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
КонецЦикла
Member

Откуда:
Сообщений: 273
Быстродействие программ на VFP

К сообщению приложен файл (Быстродействие программ на VFP.zip - 20Kb) cкачать
11 апр 07, 12:03    [4005311]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация программы. Дайте дельный советы.  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Станислав С
ИМХО, быстрее, чем SQL-запрос процедура, написанная на FP, работать не будет...
Скорее команда TOTAL работать быстрее будет чем SELECT для FPD 2.6 ... Учитель может быть хочет именно ее от учеников
11 апр 07, 12:42    [4005592]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить