powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / кнопочные формы
25 сообщений из 41, страница 1 из 2
кнопочные формы
    #32514615
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу:DO FORM 'c:\devstudio\vfp\texn_praktika\иии.scx'
не получается
Подскажите пожалуйста, а как еще можно, нажав на кнопку в одной форме открыть вторую?
...
Рейтинг: 0 / 0
кнопочные формы
    #32514681
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень подробно это написано здесь

http://www.foxclub.ru/kb/index.php?sid=40248&aktion=artikel&rubrik=004&id=4&lang=ru
...
Рейтинг: 0 / 0
кнопочные формы
    #32515747
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, большое спасибо тебе!!!
У меня получилось.
Всего тебе наилучшего!!!
...
Рейтинг: 0 / 0
кнопочные формы
    #32516106
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Умные люди!!! Ау!!! Подскажите пожалуйста!
Есть таблицы с названиями "Педагогический совет", "Методический совет", "Редакционный совет"; в каждой из которых представлены следующие поля:

-номер совета (тип:целое)
-дата заседания (тип:дата)
-тема заседания (тип:символьный)
-перечень вопросов (тип:мемо)
-ФИО выступающих (тип:мемо)
Таблицы связаны с таблицей "Перечень советов" с полями:
-номер совета (тип:целое)
-название совета (тип:символьный)

Необходимо составить запросы:

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

-появляется диалоговое окно "введите ФИО выступающего" , пользователь вводит ФИО в диалоговое окно , а затем выводится вся информация из всех таблиц, где он встречается, по всем советам.
Заранее всем СПАСИБО!!!
...
Рейтинг: 0 / 0
кнопочные формы
    #32518016
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста, какую команду надо применить, чтобы щелкнув на кнопке в форме открылся отчет, созданный на таблицу.
...
Рейтинг: 0 / 0
кнопочные формы
    #32518346
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отчет запускается командой вида:

REPORT FORM MyReport.frx TO PRINTER PROMPT PREVIEW

Разумеется, отчет MyReport.frx должен быть создан заранее. Впрочем, если предполагается выполнить отчет только по одной таблице, то можно создать отчет "на лету"

CREATE REPORT MyReport FROM MyTable.dbf
REPORT FORM MyReport.frx TO PRINTER PROMPT PREVIEW

При этом таблица MyTable.dbf должна быть закрыта перед подачей команды CREATE REPORT

Для ввода параметра, начиная с версии VFP7 используется функция (если не ошибаюсь)

INPUTBOX()
...
Рейтинг: 0 / 0
кнопочные формы
    #32519134
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БОЛЬШОЕ СПАСИБО ЗА ВСЕ, ВладимирМ !!!
Этот вопрос исчерпан.
Была бы очень рада, если бы Вы помогли мне с запросами (см. выше)
...
Рейтинг: 0 / 0
кнопочные формы
    #32519796
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос, вобщем-то элементарный. Делается 3 отдельных запроса объединенный по UNION ALL. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
LOCAL ldFromDate
ldFromDate = INPUTBOX()
IF EMPTY(ldFromDate)
ldFromDate = Date()
ENDIF

SELECT a.[дата заседания], b.[название совета], a.[тема заседания] ;
FROM [Педагогический совет] a ;
INNER JOIN [Перечень советов] b ON a.[номер совета]=b.[номер совета] ;
WHERE a.[дата заседания]>=m.ldFromDate ;
UNION ALL ;
SELECT a.[дата заседания], b.[название совета], a.[тема заседания] ;
FROM [Методический совет] a ;
INNER JOIN [Перечень советов] b ON a.[номер совета]=b.[номер совета] ;
WHERE a.[дата заседания]>=m.ldFromDate ;
UNION ALL ;
SELECT a.[дата заседания], b.[название совета], a.[тема заседания] ;
FROM [Редакционный совет] a ;
INNER JOIN [Перечень советов] b ON a.[номер совета]=b.[номер совета] ;
WHERE a.[дата заседания]>=m.ldFromDate 

С INPUTBOX() я мог и напутать. У меня VFP6SP5. Но общий принцип именно такой. Если в итоговой таблице нужно больше полей, то "добавь по вкусу"
...
Рейтинг: 0 / 0
кнопочные формы
    #32520586
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ !
Действительно у нас не понимает INPUTBOX; выходит сообщение, что файл с таким именем не существует. Подскажи, что можно сделать, может можно обойтись без этого слова или заменить его другим? У нас foxpro v.5.0.
...
Рейтинг: 0 / 0
кнопочные формы
    #32520634
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так сделайте простую модальную формочку с единственным TextBox. Для особо непонятливых пользователей можно добавить на эту формочку 2 кнопки "Ok", "Отмена". Ну, и далее как и было написано:

Код: plaintext
1.
2.
3.
4.
5.
6.
LOCAL ldFromDate

DO FROM MyForm.scx TO m.ldFromDate

IF EMPTY(ldFromDate)
	ldFromDate = Date()
ENDIF
Как организовать возврат значения из модальной формы надо расписывать?
...
Рейтинг: 0 / 0
кнопочные формы
    #32520696
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Распиши, пожалуйста.
...
Рейтинг: 0 / 0
кнопочные формы
    #32520745
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-) Создаете в дезайнере форм новую форму
-) Установи модальность этой формы (свойство WindowType=1 - Modal)
-) Подкорректируй заголовок этой формы

Caption = "Введите дату"

-) В этой форме надо добавить новое свойство (пункт главного меню Form, подпункт "new Property" или подпункт "edit Property\Method") с именем, например, ReturnValue. Это свойство будет содержать возвращаемое из формы значение.
-) В свойствах формы теперь появится это новое свойство ReturnValue (самое последнее в списке свойств). Чтобы указать, что это свойство имеет тип Date, надо ввести прямо в окне свойств формы его значение как {} (подряд 2 фигурные скобки)
-) В методе Unload-самой формы надо написать такую строку

RETURN ThisForm.ReturnValue

-) На форму кладешь объект TextBox и в его свойстве Value прописываешь такое выражение

=Date()

Знак равенства обазательно нужен

-) На форму кладешь кнопку в свойствах которой делаешь присвоения

Caption = "Ok"

В событии Click этой кнопки пишешь

ThisForm.ReturnValue = This.Value

-) На форму кладешь еще одну кнопку в свойствах которой пишешь

Caption = "Отмена"
Cancel = .T.

В событии Click этой кнопки пишешь

ThisForm.Release()

Все. Сохраняешь эту форму и далее как уже было написано:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
LOCAL ldFromDate

DO FROM MyForm.scx TO m.ldFromDate

IF EMPTY(ldFromDate)
* Пользователь не ввел дату, устанавливаю значение по умолчанию
	ldFromDate = Date()
ENDIF
...
Рейтинг: 0 / 0
кнопочные формы
    #32520750
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл, что в кнопке "Ok" также надо дописать последней командой ThisForm.Release()
...
Рейтинг: 0 / 0
кнопочные формы
    #32520757
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять промахнулся

Событие Click конпки "Ok"

ThisForm.ReturnValue = ThisForm.Text1.Value
ThisForm.Release()

Здесь Text1 - это имя того TextBox в котором вводится значение пользователем.
...
Рейтинг: 0 / 0
кнопочные формы
    #32520889
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я все сделала, как ты сказал. Но при выполнении:

Код: plaintext
1.
2.
3.
4.
LOCAL ldFromDate
DO FROM MyForm.scx TO m.ldFromDate
IF EMPTY(ldFromDate)
	ldFromDate = Date()
ENDIF
он выделяет эту строку: DO FROM fff.scx TO m.ldFromDate и выводит:"синтаксическая ошибка". Хотя я поставила имя созданной формы.
Подскажи, пожалуйста, в чем дело?
...
Рейтинг: 0 / 0
кнопочные формы
    #32520916
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня пальцы иногда не поспевают за мыслями Поэтому желательно все-таки читать HELP для проверки синтаксической корректности команд.

В частности, для вызова формы нужно

DO FORM, а не как здесь DO FROM

всего 2 буквы местами поменялось - и вот такая неприятность :((

В качестве имени формы в данной команде надо указывать имя ФАЙЛА с расширением SCX, а не значение свойства Name-формы
...
Рейтинг: 0 / 0
кнопочные формы
    #32521021
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, почему-то при выполнении запроса появляется пустая таблица, хотя я ввожу дату, которая есть в одном из советов. По идее он должен выводить дату и название этого совета?
...
Рейтинг: 0 / 0
кнопочные формы
    #32521039
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так отлаживаться надо. Мало ли где, что забыли ввести.

1) Посмотрите какая дата возвращается из формы

...
ENDIF
MessageBox(DTOC(ldFromDate))

2) Выполните приведенный запрос отдельно явно указав какую-либо дату, заведомо меньшую даты существующей записи. Например:

...
ENDIF
ldFromDate={^2004-01-01}

3) Выполните каждый из запросов объединенных по UNION ALL отдельно от других

4) У меня в коде стоит объединение по INNER JOIN - это значит, что если в таблице названия совета не указан [номер совета] или же указан не существующий в таблице [названий советов] [номер совета], то такая запись не попадет в выборку. Возможно, имеет смысл сделать объединение по LEFT JOIN

Т.е. причин много. Но раз сам запрос выполнился, то причина именно в условиях отбора. Вот на эти условия и надо смотреть.
...
Рейтинг: 0 / 0
кнопочные формы
    #32521051
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, я поняла в чем дело. Просто я ввожу в форме например:02/04/2004, а у нас в таблице такой формат даты:02/04/04; поэтому он и не понимает. Как здесь быть, ведь пользователь будет вводить дату полностью (02/04/2004) и поэтому он не получит никакой информации.
Что делать? Как поменять формат даты?
...
Рейтинг: 0 / 0
кнопочные формы
    #32521087
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поле имеет формат Date, то оно поймет переменную памяти типа Date как бы она ни была введена. Другое дело, что у Вас в таблице может быть введено не то столетие.

Сделайте настроку

SET CENTURY ON

и посмотрите через команду BROWSE содержимое Вашей таблицы. Скорее всего, дата 02/04/04 окажется датой 02/04/1904.

Дело в том, что по умолчанию в версиях до VFP5 включительно, если столетие при вводе даты не указывалось явно, то оно устанавливалось как 1900+введенное число. В таблицах дата хранится с указанием столетия.

Начиная с версии VFP6 цифру столетия по умолчанию можно было уже настривать.

Вариантов у Вас 2:

1) Привести все даты в базе данных в "нормальный" вид, явно указав столетие:

select MyTable
REPLACE [дата] WITH GoMonth([дата],12*100) ;
FOR BETWEEN([дата],1900,1950)

2) Уменьшать введенное значение на 100 лет

ldFromDate = GoMonth(m.ldFromDate,-12*100)

Я бы посоветовал все-таки привести базу данных в нормальное состояние и при вводе дат обязательно делать настройку SET CENTURY ON чтобы пользователи вводили 4 цифры года (ну, или самостоятельно контролировать ввод автоматически поправляя столетия). Контроль ввода можно повесить на RULE соответсвующего поля или записи.
...
Рейтинг: 0 / 0
кнопочные формы
    #32522375
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, подскажи, а где это :

Код: plaintext
1.
2.
select MyTable
REPLACE [дата] WITH GoMonth([дата], 12 * 100 ) ;
FOR BETWEEN([дата], 1900 , 1950 )

или это

Код: plaintext
ldFromDate = GoMonth(m.ldFromDate,- 12 * 100 )
записать?

Я записывала это в предудущий запрос, он у меня выполнялся, но дату не изменял, т.е. по умолчанию все равно стоял 1904 год.
...
Рейтинг: 0 / 0
кнопочные формы
    #32522451
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял, что опыта программирования у Вас вообще нет никакого.

Ладно, напишите условие отбора в SQL-запросе в таком виде:

Код: plaintext
WHERE SubStr(DTOS(a.[дата заседания]), 3 )>=SubStr(DTOS(m.ldFromDate), 3 )


Т.е. везде в запросе строку WHERE замените на эту строку.

Это не очень хорошее решение, но позволяет получить то, что Вам нужно.

Обрати внимание, что функция именно DTOS() (на конце латинская S). Не надо путать ее с DTOC() (на конце C) иначе будет совершенно разный результат.

Что собственно я предлагал сделать. Я предлагал сделать одну из следующих операций:

1) Провести разовую операцию приведения дат в базе данных в "нормальное" состояние.

Это можно сделать написав отдельную процедурку или напрямую в командном окне

2) Исходя из предположения, что все даты имеют 19 столетие, а вводимая пользователем дата 20 столетие вычесть из даты введенной пользователем 100 лет.

Эту операцию следует производить сразу после того, как значение переменной ldFromDate уже окончательно сформировано, но запрос еще не начал выполняться.
...
Рейтинг: 0 / 0
кнопочные формы
    #32522553
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты прав, я очень плохо разбираюсь в этой программе. Я студентка и я сейчас на практике. Мне дали разработать программный продукт в базе данных и лучше всего в foxpro, хотя мы проходили эту программу мимолетом, т.е. почти совершенно не программируя в ней. Извини, что тебя так сильно загружаю. Если честно, мне очень стыдно! Но ты такой умный и понимающий человек.
СПАСИБО.

А мне так и писать, как ты подсказал: WHERE SubStr(DTOS(a.[дата заседания]),3)>=SubStr(DTOS(m.ldFromDate),3)

Честно говоря, я не понимаю, что это за 3)
Объясни, пожалуйста. А программа не понимает эту строку и пишет "неизвестная команда"
...
Рейтинг: 0 / 0
кнопочные формы
    #32522616
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DTOS(m.ldFromDate) - это функция преобразования даты в символьную строку в таком формате:

"20041231"

SubStr() - это функция выделения фрагмента строки. Второй параметр - это начиная с какого символа надо начать выделение, а третий параметр - сколько символов надо взять. Если третий параметр опущен, то берется до конца строки. Т.е. я отсекаю от строки цифру столетия и получается строка вида:

"041231"

Возможно, в VFP5 требуется более строгий синтаксис. Т.е. обязательное указание 3 параметра. Тогда напиши так:

Код: plaintext
WHERE SubStr(DTOS(a.[дата заседания]), 3 , 6 )>=SubStr(DTOS(m.ldFromDate), 3 , 6 )

или так

Код: plaintext
WHERE RIGHT(DTOS(a.[дата заседания]), 6 )>=RIGHT(DTOS(m.ldFromDate), 6 )

RIGHT() - это выделение из строки указанного количества символов с правого края. Поскольку речь идет о дате, то надо взять 6 символов

Правда, это сработает, если нет дат типа 01.01.1998, поскольку в противном случае нарушится условие сравнения:

"980101">="040101"

Т.е. в выборку будут всегда попадать записи с датой до 01.01.00
...
Рейтинг: 0 / 0
кнопочные формы
    #32522886
nadin1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОГРОМНОЕ СПАСИБО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
У меня все получилось.
Ухожу домой с практики счастливая! До завтра!
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / кнопочные формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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