Консультация № 182276
21.02.2011, 13:37
0.00 руб.
0 12 1
Добрый вечер.
Уважаемые эксперты помогите разобраться с задачой с работой с несколькими базами.
Задание:создать программу для свободных по каждому клиенту. Вывести на экран поля (наименование клиента,выполнение часов,сумма за выполнение).
URL Вот база и программа,которуя я пытался сделать...только ответ который от выводит,меня не удовлетворяет.

Приложение:
CLEAR
CLOSE ALL
SET DEFAULT TO D:\avtouslugi\
SET DATE GERMAN
SET CENTURY on
OPEN DATABASE avto
USE cars IN a
SELECT b
USE clients IN b
SELECT c
USE orders IN c
i=5
GO TOP
SCAN WHILE NOT EOF()
SELECT b
SET ORDER TO cid
c=b.c1id

SEEK c
IF FOUND()
@ i,1 say c1id
@ i,15 say fio
SCAN WHILE c=b.c1id
SELECT c
SET ORDER TO cid1
SEEK b.c1id
IF FOUND()
@ i,25 say c.hour1
@ i,30 say c.hour2
SCAN
SELECT a
SET ORDER TO car1
SEEK c.carid
IF FOUND()
@ i,45 say a.price*c.hour2
ENDIF
i=i+1
ENDSCAN
ENDIF
ENDSCAN
endif
ENDSCAN
CLOSE all

Обсуждение

Неизвестный
21.02.2011, 16:13
общий
это ответ
Здравствуйте, Нитрит Алексей!

Похоже, базы и программа на Visual FoxPro. С визуалом я не сталкивался ( сам пишу на VB6 ) , но предлагаю программу на обычном FoxPro 2.6 для DOS. Язык программ практически одинаковый.
Сразу для пункта 3 задания. Остальные получаются упрощением программы.

В программе для вывода данных применена функция " ? " , т.к. данных может быть много и они не поместятся на экране. К тому же так удобно будет выводить в текстовый отчет. Следует добавить команды в начале программы :
set alte to ('text.txt')
set cons off
set alte on

а потом в конце программы :
set alte off
set cons on
set alte to

Если будут вопросы - пишите.

С уважением.

Приложение:
clear
close all
set date german
set cent on

*открываем базы
sele a
use cars
set order to carid
sele b
use clients
set order to clid
sele c
use orders
set order to clid
*таблица заказов должна быть отсортирована по коду клиента
*устанавливаем связь со справочниками
set rela to clid into b
set rela to carid into a addi
*обнуляем переменные
klient=0
zak=0
vip=0
su=0
i=0
*сканируем таблицу заказов
do while !eof()
*если текущий код клиента не совпадает со значением переменной
if numord<>klient
*если до этого уже выводились значения для этого клиента, то выводим итоги
if klient<>0
? ' Всего заказано - '+str(zak,3,0)+' Всего выполнено - '+str(vip,4,0)+' Всего сумма - '+str(su,14,2)
endif
*пропускаем строку и выводим код и имя клиента
?
? '№ клиента - '+str(numord,5,0)+' ФИО - '+b.name
*обнуляем итоговые суммы и переменную кода клиента
zak=0
vip=0
su=0
i=0
klient=numord
endif
*выводим строку заказа
i=i+1
? ' поездка № '+str(i,3,0)+' Заказано часов - '+str(hour1,3,0)+' Выполнено часов - '+str(hour2,4,0)+' Сумма заказа - '+str(a.price*c.hour2,14,2)
*перемещаемся по таблице
skip
enddo
*выводим итоги для последнего клиента
if klient<>0
? ' Всего заказано - '+str(zak,3,0)+' Всего выполнено - '+str(vip,4,0)+' Всего сумма - '+str(su,14,2)
endif
5
Большущие Вам спасибо!!!<br>
Неизвестный
21.02.2011, 16:37
общий
Вроде бы все понятно)
Но почему то, выводит не все записи..а только 2.
Неизвестный
21.02.2011, 16:57
общий
Насколько вижу, в таблице Orders всего две записи. Это основная таблица, остальные используются только как справочники. И у меня что-то ошибка вылетает при импорте в Access - хотел проверить прогу.
Так что если в таблицу добавить записи, то будет больше.
Неизвестный
21.02.2011, 17:02
общий
Не знаю почему у вас показывает только две записи,но у меня их больше 2, если точнее то 6.
Щас попробую удалить все записи..и заново заполнит базу.
Неизвестный
21.02.2011, 17:13
общий
есть возможность написать значения таблицы Orders ?

Cars
CARID REGNUM MODEL PRICE
1 1204 M1 500
5 1111 AC 100
11 450 OLOLO 100
16 777 ABC 450

Client
C1ID FIO INN
4 Сидоров 111
5 Петров 122
10 Петренко 101
11 Иванова 121

у меня нормально импортировались
Неизвестный
21.02.2011, 17:25
общий
Щас все получилось, только назло сумму не считает)
№ клиента - 1 ФИО - Петров
поездка № 1 Заказано часов - 10 Выполнено часов - 5 Сумма заказа - 0.00
Всего заказано - 0 Всего выполнено - 0 Всего сумма - 0.00

№ клиента - 2 ФИО - Сидоров
поездка № 1 Заказано часов - 8 Выполнено часов - 4 Сумма заказа - 0.00
поездка № 2 Заказано часов - 4 Выполнено часов - 4 Сумма заказа - 0.00
Всего заказано - 0 Всего выполнено - 0 Всего сумма - 0.00

№ клиента - 3 ФИО - Иванов
поездка № 1 Заказано часов - 5 Выполнено часов - 5 Сумма заказа - 0.00
поездка № 2 Заказано часов - 4 Выполнено часов - 4 Сумма заказа - 0.00
Всего заказано - 0 Всего выполнено - 0 Всего сумма - 0.00


думаю,предыдущая проблема возникла из-за моей не внимательности,думал путь прописать и база открыта,а оказалась нет)
прошу прощения)
Неизвестный
21.02.2011, 17:44
общий
с суммой это я напортачил. нужно изменить немного код программы :

*выводим строку заказа
i=i+1
? ' поездка № '+str(i,3,0)+' Заказано часов - '+str(hour1,3,0)+' Выполнено часов - '+str(hour2,4,0)+' Сумма заказа - '+str(a.price*c.hour2,14,2)
zak=zak+hour1
vip=vip+hour2
su=su+round(a.price*c.hour2,2)


почему не выводит сумму заказа, нужно подумать

таблица cars проиндексирована по полю carid ? код машины в таблице orders правильно поставлен?
Неизвестный
21.02.2011, 18:00
общий
так точно,по ключу carid.
Alltrim(STR(carid)).
тип prymary
Неизвестный
21.02.2011, 18:03
общий
тогда нужно изменить строку связи таблиц :

set rela to alltrim(str(carid)) into a addi

а вообще лучше сделать ключ просто carid и связывать как в начальном варианте
Неизвестный
21.02.2011, 18:07
общий
дело в том, что поле числовое, а индекс построен по текстовому преобразованию числа в строку. это может приводить к ошибкам индексации - если включить индекс, то в списке будет примерно такая последовательность:
CARID REGNUM MODEL PRICE
1 1204 M1 500
11 450 OLOLO 100
16 777 ABC 450
5 1111 AC 100

т.к. символ "5" идет после символа "1" ( первый символ индексированного поля )

Неизвестный
21.02.2011, 18:10
общий
спасибо большое!!!
В следующий раз буду учитывать все это.

P.S. Просто изначально,при изучение связей..мне они сразу не понравились)
еще раз большое спасибо!!!
Неизвестный
21.02.2011, 18:28
общий
удачи.

связи - очень удобная вещь. у меня в некоторых программых до десятка таблиц связывается. удобство в том, что при перемещении в основной таблице сразу идет перемещение и во всех связанных ( но в них может и не быть записей с соответствующим значением поля связи - нужно обязательно проверять соответствие совпадения ключевого поля основной и вспомогательных таблиц )

т.е. в основной таблице есть значения 1,2,3,4,5 , а во вспомогательной 1,3,4

sele a
go top
do while !eof()
sele b
do while !eof() and kod=a.kod
*во вспомогательной таблице есть такие значения и мы их перебираем, если их несколько
*это пригодилось бы, если бы мы считали ключевой таблицей например Clients и перемещались по ней, а в Orders было бы несколько записей этого клиента

skip
enddo
sele a
skip
enddo
Форма ответа