* Выводим записи
LIST amount,name_unit,price_unit
* Выбираем из таблицы все записи о товарах низкого качества
BROWSE FOR quality_goods='низкое'
* Выбираем из таблицы первую запись о товаре в количестве 10
LOCATE FOR amount=10
ПРИЛОЖЕНИЕ Б
Текст программы поиска с помощью циклов WHILE и SCAN
* Очищаем экран
CLEAR
* Открываем таблицу из базы данных
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Ищем все товары, поставленные из России, с помощью цикла WHILE
?'Товары из России (цикл WHILE) :'
* Ищем первый товар
LOCATE FOR supplier='Россия'
* Если нашли...
IF FOUND()
* Печатаем название
?name_unit
ENDIF
* Продолжаем поиск до исчерпания записей
DO WHILE .NOT. EOF()
CONTINUE
IF FOUND()
?name_unit
ENDIF
ENDDO
* Ищем все товары из России с помощью SCAN-цикла
?'Товары из России (цикл SCAN) :'
SCAN FOR supplier='Россия'
* Выводим наименование, цену и количество товара
? name_unit+' '+STR(price_unit)+' '+STR(amount)
ENDSCAN
* С помощью WHILE находим общую цену товаров, поступивших
* в период с 15.01.2001 по 15.03.2001
* _SUM - переменная суммирования
_SUM=0
* Находим первую запись
LOCATE FOR date_recep>={^2001/01/15} .AND. date_recep<={^2001/03/15}
IF FOUND()
* Если нашли - суммируем
_SUM=_SUM+NTOM(price_unit)*amount
ENDIF
* Продолжаем поиск
DO WHILE .NOT. EOF()
CONTINUE
IF FOUND()
_SUM=_SUM+NTOM(price_unit)*amount
ENDIF
ENDDO
?'Общая стоимость искомых товаров равна (цикл WHILE) :'+STR(_SUM)
* Вычисляем то же самое с помощью SCAN-цикла
_SUM=0
SCAN FOR date_recep>={^2001/01/15} .AND. date_recep<={^2001/03/15}
_SUM=_SUM+NTOM(price_unit)*amount
ENDSCAN
?'Общая стоимость искомых товаров равна (цикл SCAN) :'+STR(_SUM)
ПРИЛОЖЕНИЕ В
Текст программы построения меню и выдачи сообщений
* Очищаем экран
CLEAR
* Открываем таблицу из базы данных
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Определяем параметры POPUP-меню:
DEFINE POPUP _Menu FROM 1,10 TO 15,70;
TITLE 'Наименование Качество Поставщик';
SCROLL;
PROMPT FIELD name_unit+' '+quality_goods+' '+supplier
* Определяем, нужно ли активизировать POPUP-меню
LOCATE FOR price_unit<100
* Если нашли хоть один требуемый товар...
IF FOUND()
IF price_unit<>0
* и если это не нулевая строка, то
ACTIVATE POPUP _Menu
ENDIF
ENDIF
* Отслеживаем нажатие сочетания клавиш Alt+F1
ON KEY LABEL ALT+F1 MESSAGEBOX("Ошибка памяти!")
ПРИЛОЖЕНИЕ Г
Текст программы построения диаграммы
* Очищаем экран
CLEAR
* Открываем таблицу из базы данных
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Определяем количество записей в текущей таблице
_Number_records=RECCOUNT()
* Заносим в соответствующие массивы наименования и количества товаров
DIMENSION _Names (_Number_records)
DIMENSION _Amounts (_Number_records)
* Переменная - max высота столбца
_Max_col_height=0
* Устанавливаемся на первую запись
GOTO 1
* Ищем самый дорогой и самый дешевый товары (_Max_price и _Min_price),
* а также их порядковые номера (_Number_max_price и _Number_min_price)
_Names(1)=name_unit
_Amounts(1)=amount
_Min_price=price_unit
_Max_price=0
_Number_min_price=1
_Number_max_price=1
* Цикл по всем записям
FOR I=2 TO _Number_records
* Устанавливаемся на I-ю запись
GOTO I
* Заносим имя и количество в массивы
_Names(I)=name_unit
_Amounts(I)=amount
* Если текущая цена>максимальной...
IF price_unit>_Max_price
* то делаем текущую максимальной
_Max_price=price_unit
* и запоминаем ее номер
_Number_max_price=I
ENDIF
* Если текущая цена<минимальной...
IF price_unit<_Min_price
* то делаем текущую минимальной
_Min_price=price_unit
* и запоминаем ее номер
_Number_min_price=I
ENDIF
IF amount>_Max_col_height
* Ищем max количество товара
_Max_col_height=amount
ENDIF
ENDFOR
* ==============Построение диаграммы=============
* Рисуем оси
@3,20 TO 25,20
@25,20 TO 25,120
* Надписываем оси
@13,1 SAY 'Количество товара' COLOR B+/W*
@4,10 SAY _Max_col_height COLOR B+/W*
@28,60 SAY 'Номер товара'
* Рисуем легенду
@1,80 FILL TO 2,83 COLOR W/G*
@3,80 FILL TO 4,83 COLOR W/R*
@1,84 SAY 'Самый дешевый товар'
@3,84 SAY 'Самый дорогой товар'
* Расстояние между столбцами диаграммы
_Diagram_step_size=2
* Ширина одного столбца диаграммы
_Diagram_col_width=(100-_Diagram_step_size*(_Number_records+1))/_Number_records
* Масштабный множитель
_Scale_factor=20/_Max_col_height
* Рисуем столбцы
FOR I=1 TO _Number_records
* Вычисляем координаты вершин для текущего столбца
_Y1=ROUND(25-_Amounts(I)*_Scale_factor,0)
_X1=ROUND(20+_Diagram_step_size*I+_Diagram_col_width*(I-1),0)
_Y2=25
_X2=ROUND(20+(_Diagram_step_size+_Diagram_col_width)*I,0)
* Если высота нулевая...(из-за округления)
IF _Y1=25
* то делаем высоту = 1
_Y1=24
ENDIF
* Если рисуем столбец, соответствующий самому дешевому товару...
IF I=_Number_min_price
* то закрашиваем его зеленым цветом
@_Y1,_X1 FILL TO _Y2,_X2 COLOR W/G*
* Иначе если рисуем столбец, соответствующий самому дорогому товару...
ELSE
IF I=_Number_max_price
* то закрашиваем его красным цветом
@_Y1,_X1 FILL TO _Y2,_X2 COLOR W/R*
ELSE
* Иначе закрашиваем синим цветом
@_Y1,_X1 FILL TO _Y2,_X2 COLOR W/B*
ENDIF
ENDIF
* Ставим по оси X номера товаров
@26,_X1-ROUND(_Diagram_col_width/2,0) SAY I
ENDFOR
ПРИЛОЖЕНИЕ Д
Текст программы, использующей модули
* Очищаем экран
CLEAR
* Открываем таблицу из базы данных
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Вызов процедуры, выводящей сведения об искомых товарах
DO Show_units_for_date
?''
* Вызов процедуры, показывающей товары с единицей измерения 'шт.'
DO Show_units_for_measure
* Описание процедуры Show_units_for_date
PROCEDURE Show_units_for_date
?'Товары, поступившие позже 15.02.2001.'
?''
?'Наименование цена количество'
SCAN FOR date_recep>{^2001/02/15}
* Выводим наименование, цену и количество товара
? name_unit+' '+STR(price_unit)+' '+STR(amount)
ENDSCAN
ENDPROC
* Описание процедуры Show_units_for_measure
PROCEDURE Show_units_for_measure
?'Товары, у которых единица измерения - шт.'
?''
?'Наименование цена количество'
SCAN FOR unit_measure='Штука'
* Выводим наименование, цену и количество товара
? name_unit+' '+STR(price_unit)+' '+STR(amount)
ENDSCAN
ENDPROC
ПРИЛОЖЕНИЕ Е
Текст программы страхового копирования и контекстной справки
* ----Использование страхового копирования данных
SET CLEAR OFF
SET SAFETY OFF
* Если файл NORM.MEM есть...
IF FILE('C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm.mem')
* ...он загружается в память.
RESTORE FROM('C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm.mem')
* Если переменная завершения истинна...
IF normz
* ...копируем все файлы таблиц в страховую директорию
!COPY C:\MY_WORKS\TRANSF~1\MYPROJ~1\*.dbf C:\MY_WORKS\TRANSF~1\MYPROJ~1\Insure\*.dbf>NUL
* иначе сообщение.
ELSE
WAIT normd+' было аварийное завершение .'+;
'Восстановить (ENTER) данные?' WINDOW
* В случае нажатия Enter файлы восстанавливаются из страховой директории.
IF LASTKEY()=13
!COPY C:\MY_WORKS\TRANSF~1\MYPROJ~1\Insure\*.dbf C:\MY_WORKS\TRANSF~1\MYPROJ~1\*.dbf>NUL
ENDIF
ENDIF
ENDIF
* Устанавливается переменная завершения, переменная текущей даты и обе запоминаются в файл.
normz= .T.
normd=DTOC( DATE( ))
SAVE ALL LIKE norm? TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm
*===============================================================
* ----Вызов контекстно-зависимой экранной подсказки по нажатию F1.
* ----Esc - выход из программы.
* ----Справка выдается по названию поля таблицы.
* Открываем таблицу из базы данных
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* По нажатию F1 вызываем процедуру Helper
ON KEY LABEL F1 DO Helper WITH VARREAD()
* Бесконечный цикл BROWSE
DO WHILE .T.
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Отображаем таблицу
BROWSE
* Если нажата клавиша Esc...
IF LASTKEY()=27
* ... то на выход.
EXIT
ENDIF
ENDDO
* Описание процедуры Helper
PROCEDURE Helper
* Параметр процедуры - имя поля, которое требуется пояснить
PARAMETERS _Item
* Открываем базу помощи
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_Help
* Ищем нужное поле
LOCATE FOR index_help=_Item
* Если нашли нужное поле (оно одно) - выводим
IF FOUND()
_Out_text=text_help
MESSAGEBOX(_Out_text)
ELSE
MESSAGEBOX('Справка по данному разделу не предусмотрена. Извините.')
ENDIF
RETURN
ПРИЛОЖЕНИЕ Ж
Текст программы создания новых таблиц и арифметических действий
* Очищаем экран
CLEAR
* Открываем таблицу из базы данных
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Создаем новую таблицу, вкоторую входят все товары с ценой>50
COPY TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\New_Goods FIELDS name_unit,price_unit,amount,unit_measure FOR price_unit>50
* Обращаемся к новой таблице
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\New_Goods
* Просматриваем ее
BROWSE
* Создаем новый файл, отсортированный в соответствии с заданием
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
SORT TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\Sort_Goods ON price_unit/A,name_unit/A
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Sort_Goods
* Выводим отсортированную таблицу
LIST OFF price_unit,name_unit
USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods
* Выводим количество товаров на букву 'С'
COUNT FOR (LEFT(name_unit,1)='С') TO _Count
?'В исходной таблице содержится'+STR(_Count)+' товара(-ов) на букву `С`'
* Выводим общую стоимость всех товаров
?'Общая стоимость всех товаров равна'
SUM price_unit*amount
* Выводим среднее арифметическое цен всех товаров
?'Среднее арифметическое цен всех товаров равно'
AVERAGE price_unit