powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Расчеты в форме
7 сообщений из 7, страница 1 из 1
Расчеты в форме
    #33146740
Sergey_Volga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Подскажите, пожалуйста, есть такая проблемка:
Есть форма с 2 textbox-ами которые связанны с двума полями datatime таблицы. Нужно выделить даты (ttod) и из одной даты отнять другую дату и результат поместить в третий textbox на форме и в третье поле таблицы (чтобы и пользователь видел и в поле таблицы при записи упал результат) и если результат равен нулю сделать подстановку на единицу. Все это делается на восьмерке.
Заранее спасибо!!!
...
Рейтинг: 0 / 0
Расчеты в форме
    #33146771
Кэт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, забыла переключить раскладку
Полностью дублирую топик

Вот программка с использованием функции Владимира Борисовича Максимова
Запусти, поразбирайся...
Если ты это имел ввиду,
но тебе скажут, что хранить в таблице 3 поле,
расчетное от первых 2-нт смысла-противоречит законам нормализации

PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN


**************************************************

DEFINE CLASS form1 AS form


Top = 0
Left = 0
Height = 164
Width = 375
DoCreate = .T.
Caption = "Form1"
Name = "Form1"


ADD OBJECT text1 AS textbox WITH ;
ControlSource = "date1", ;
Height = 25, ;
Left = 24, ;
Top = 12, ;
Width = 181, ;
Name = "Text1"


ADD OBJECT text2 AS textbox WITH ;
ControlSource = "date2", ;
Height = 25, ;
Left = 24, ;
Top = 60, ;
Width = 181, ;
Name = "Text2"


ADD OBJECT text3 AS textbox WITH ;
ControlSource = "date3", ;
Height = 25, ;
Left = 24, ;
Top = 108, ;
Width = 181, ;
Name = "Text3"


ADD OBJECT cmd1 AS commandbutton WITH ;
Top = 12, ;
Left = 228, ;
Height = 121, ;
Width = 121, ;
Caption = "Расчитать", ;
Name = "cmd1"


PROCEDURE datediff
**http://www.foxclub.ru/ph/read.php?f=5&i=66840&t=66840&v=f
*Владимир Максимов.
* Определение разницы между двумя датами
* Значение возвращается как символьна строка вида "1год 2мес 3дня"
* Если в результирующей строке одно из чисел равно 0,
* то это число не отображается, например "1год 1день"
* Параметры tnYear,tnMonth, tnDay - передаются по ссылке, если необходимо получить числовые значения
***********************************
* Пример вызова
* LOCAL lnYear,lnMonth,lnDay
*?DateDiff({01.01.2000},{01.12.2003},@lnYear,@lnMonth,@lnDay)
*?lnYear,lnMonth,lnDay
* Если числа не нужны, то
* ?DateDiff({01.01.2000},{01.12.2003})
* возвратит 3 года 11 месяцев
***********************************

*FUNCTION DateDiff
LPARAMETERS tdDateFirst, tdDateSecond, tnYear, tnMonth, tnDay

* Проверка допустимости переданных параметров
* и формирование допустимых значений
LOCAL ldDateMin, ldDateMax

* Сначала tdDateFirst
DO CASE
CASE TYPE('m.tdDateFirst')='T'
m.ldDateMin=TTOD(m.tdDateFirst)
CASE TYPE('m.tdDateFirst')<>'D'
m.ldDateMin={}
OTHERWISE
m.ldDateMin=m.tdDateFirst
ENDCASE

* Теперь tdDateSecond
DO CASE
CASE TYPE('m.tdDateSecond')='T'
m.ldDateMax=TTOD(m.tdDateSecond)
CASE TYPE('m.tdDateSecond')<>'D'
m.ldDateMax={}
OTHERWISE
m.ldDateMax=m.tdDateSecond
ENDCASE

* Если не задано одно из значений, то предполагаю, что
* не должно быть вообще сравнения. Прерываю функцию.
IF EMPTY(m.ldDateMin) OR EMPTY(m.ldDateMax)
RETURN ''
ENDIF

* значение m.ldDateMin должно быть меньше m.ldDateMax
* Если это не так, то меняю их местами
LOCAL lnSign
lnSign=1
IF m.ldDateMin>m.ldDateMax
lnSign=-1
LOCAL ldDateTMP
ldDateTMP=m.ldDateMin
ldDateMin=m.ldDateMax
ldDateMax=m.ldDateTMP
RELEASE ldDateTMP
ENDIF

*!!!!!!!МОЕ ДОПОЛНЕНИЕ
*если даты равны, то возвращаем 1 день
IF m.ldDateMin=m.ldDateMax
RETURN '1 день'
ENDIF

* Собственно расчет
LOCAL lnYear, lnMonth, lnDay
lnYear=YEAR(m.ldDateMax)-YEAR(m.ldDateMin)
lnMonth=MONTH(m.ldDateMax)-MONTH(m.ldDateMin)
IF DAY(m.ldDateMax)<DAY(m.ldDateMin)
lnMonth=m.lnMonth-1
ENDIF
IF m.lnMonth<0
lnYear=m.lnYear-1
lnMonth=m.lnMonth+12
ENDIF

lnDay=m.ldDateMax-GoMonth(m.ldDateMin,12*m.lnYear+m.lnMonth)

* Корректировка количества дней на разницу дней в месяцах
* когда количество дней в месяце начальной даты больше, чем
* количество дней в месяце предшествующем конечной дате
IF DAY(m.ldDateMin)>DAY(m.ldDateMax) AND m.lnYear+m.lnMonth>0
LOCAL lnDayMonthMin, lnDayMonthMax
lnDayMonthMin=DAY(GoMonth(m.ldDateMin,1)-DAY(GoMonth(m.ldDateMin,1)))
lnDayMonthMax=DAY(m.ldDateMax-DAY(m.ldDateMax))
IF m.lnDayMonthMax>lnDayMonthMin
IF DAY(m.ldDateMin)>m.lnDayMonthMax
lnDay=m.lnDay+lnDayMonthMin-DAY(m.ldDateMin)
ELSE
lnDay=m.lnDay+m.lnDayMonthMin-m.lnDayMonthMax
ENDIF
ENDIF
ENDIF




* Формирование выходной строки
LOCAL lcValue, lcReturnValue
lcReturnValue=''&& Возвращаемое значение

* По годам
* Количество лет не может превышать 4-х значного числа
IF m.lnYear>0
lcValue=STR(m.lnYear,4)
lcReturnValue=m.lcReturnValue+LTRIM(m.lcValue)
DO CASE
CASE RIGHT(m.lcValue,1)='1' AND SubStr(m.lcValue,3,1)<>'1'
lcReturnValue=m.lcReturnValue+' год'
CASE InList(RIGHT(m.lcValue,1),'2','3','4') AND SubStr(m.lcValue,3,1)<>'1'
lcReturnValue=m.lcReturnValue+' года'
OTHERWISE
lcReturnValue=m.lcReturnValue+' лет'
ENDCASE
ENDIF

* По месяцам
* Количество месяцев не может превышать 12
IF m.lnMonth>0
lcReturnValue=m.lcReturnValue+' '+LTRIM(STR(m.lnMonth))+' мес'
ENDIF

* По дням
* Количество дней не может превышать 2-х значного числа (31)
IF m.lnDay>0
lcValue=STR(m.lnDay,2)
lcReturnValue=m.lcReturnValue+' '+LTRIM(m.lcValue)
DO CASE
CASE RIGHT(m.lcValue,1)='1' AND SubStr(m.lcValue,1,1)<>'1'
lcReturnValue=m.lcReturnValue+' день'
CASE InList(RIGHT(m.lcValue,1),'2','3','4') AND SubStr(m.lcValue,1,1)<>'1'
lcReturnValue=m.lcReturnValue+' дня'
OTHERWISE
lcReturnValue=m.lcReturnValue+' дней'
ENDCASE
ENDIF

* Записываю значение параметров переданных по ссылке
tnYear=m.lnSign*m.lnYear
tnMonth=m.lnSign*m.lnMonth
tnDay=m.lnSign*m.lnDay

RETURN LTRIM(m.lcReturnValue)
ENDPROC


PROCEDURE Load
CREATE CURSOR curDate (date1 T,date2 T,date3 T null)
INSERT INTO curDate values(DATETIME(),DATETIME()-200000,.Null.)
INSERT INTO curDate values(DATETIME(),DATETIME()-300000,.Null.)
ENDPROC


PROCEDURE cmd1.Click
thisform.text3.Value=thisform.datediff(thisform.text1.Value,thisform.text2.Value)
ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************
...
Рейтинг: 0 / 0
Расчеты в форме
    #33146827
Sergey_Volga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прошения. Я наверное не так описал ситуацию. Разница дат возвращается числовая и мне надо это число (или подстановку числа на единицу если разница равна нулю) запихнуть в форму и таблицу. Но где создать переменную в форме, выполнить расчет, и результат поместить в форму. Где в форме (textbox-e) создать переменную(название метода, свойства), выполнить расчеты, создать функции и процедуры? Где все это можно сделать?
Спасибо за помощь!!!
...
Рейтинг: 0 / 0
Расчеты в форме
    #33146851
Aries
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ты в коде, который тебе Кэт написала пробовал разобраться?

Истина где-то там...
...
Рейтинг: 0 / 0
Расчеты в форме
    #33146872
Кэт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И впрям бы поразбирался
вот запусти такую программу на выполнение и поразбирайся
это простейший алгоритм
если хочешь делать "как положено",
то поищи по форуму в ключевыми
словаими GETFLDSTATE TableUpdate ВладимирМ :-)))))

А так за тебя код никто не напишет
И еще раз говорю-нет смысла хранить результат в поле таблицы,
если ты можешь получить из 2 имеющихся

Счастливо

PUBLIC oform1

oform1=NEWOBJECT("form1")
oform1.Show
RETURN

DEFINE CLASS form1 AS form
DoCreate = .T.
Caption = "Form1"
Name = "Form1"


ADD OBJECT text1 AS textbox WITH ;
ControlSource = "date1", ;
Height = 23, ;
Left = 84, ;
Top = 24, ;
Width = 144, ;
Name = "Text1"


ADD OBJECT text2 AS textbox WITH ;
ControlSource = "date2", ;
Height = 23, ;
Left = 84, ;
Top = 72, ;
Width = 144, ;
Name = "Text2"


ADD OBJECT text3 AS textbox WITH ;
ControlSource = "curdate.result", ;
Height = 23, ;
Left = 84, ;
Top = 120, ;
Width = 144, ;
Name = "Text3"


ADD OBJECT command2 AS commandbutton WITH ;
Top = 204, ;
Left = 14, ;
Height = 27, ;
Width = 192, ;
Caption = "сохранить и показать ", ;
Name = "Command2"


ADD OBJECT command4 AS commandbutton WITH ;
Top = 204, ;
Left = 216, ;
Height = 27, ;
Width = 156, ;
Caption = "отмена сохранения", ;
Name = "Command4"


ADD OBJECT command1 AS commandbutton WITH ;
Top = 36, ;
Left = 252, ;
Height = 27, ;
Width = 84, ;
Caption = "Расчитать", ;
Name = "Command1"


PROCEDURE myresult
*процедура, выполняющая расчет
IF thisform.text1.Value=thisform.text2.Value
thisform.text3.Value=1
ELSE
thisform.text3.Value=thisform.text2.Value-thisform.text1.Value
ENDIF
thisform.Refresh
ENDPROC


PROCEDURE Load
*это как будто твоя таблица
CREATE CURSOR curDate (date1 T,date2 T,Result i null)
INSERT INTO curDate values(DATETIME(),DATETIME()+200000,.Null.)
*устанавливаем табличную буферизацию
*подробности почитай с поиском по CURSORSETPROP
CURSORSETPROP("Buffering",5,'curDate')
ENDPROC


PROCEDURE command2.Click
*созранение изменений
TABLEUPDATE(.t.,.t.,'curdate')
BROWSE
ENDPROC


PROCEDURE command4.Click
*отмена сохранения
TABLEREVERT(.T.,'curdate')
BROWSE
ENDPROC


PROCEDURE command1.Click
thisform.MyResult()
ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************
...
Рейтинг: 0 / 0
Расчеты в форме
    #33146877
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_VolgaПрошу прошения. Я наверное не так описал ситуацию. Разница дат возвращается числовая и мне надо это число (или подстановку числа на единицу если разница равна нулю) запихнуть в форму и таблицу. Но где создать переменную в форме, выполнить расчет, и результат поместить в форму. Где в форме (textbox-e) создать переменную(название метода, свойства), выполнить расчеты, создать функции и процедуры? Где все это можно сделать?
Если я правильно понял, ты хочешь научиться работать с методами (PROCEDURE) в формах???
Главное меню\Form\New metod далее задать имя метода и оно появиться у тебя в Properties\Methods где увидишь это имя. А в нем создашь код типа:
Код: plaintext
THIS.TxtBox3.Value = THIS.TxtBox1.Value - THIS.TxtBox2.Value
* Конечно здесь понимается, что THIS.TxtBox1.Value поле типа даты, ан-но THIS.TxtBox2.Value.

Ну и примерно будет код:

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
PUBLIC oform1
oform1=NEWOBJECT("fd111")
oform1.Show
RETURN

DEFINE CLASS fd111 AS form
	DoCreate = .T.
	Caption = "Form1"
	old_date = {}
	Name = "Form1"

	ADD OBJECT txtbox2 AS textbox WITH ;
		Alignment =  3 , ;
		Value = {}, ;
		Format = "", ;
		Height =  23 , ;
		InputMask = "", ;
		Left =  60 , ;
		TabIndex =  2 , ;
		Top =  96 , ;
		Width =  100 , ;
		Name = "TxtBox2"

	ADD OBJECT txtbox3 AS textbox WITH ;
		Alignment =  3 , ;
		Value =  0 , ;
		Format = "", ;
		Height =  23 , ;
		InputMask = "", ;
		Left =  60 , ;
		TabIndex =  3 , ;
		Top =  144 , ;
		Width =  100 , ;
		Name = "TxtBox3"

	ADD OBJECT txtbox1 AS textbox WITH ;
		Alignment =  3 , ;
		Value = {}, ;
		Format = "", ;
		Height =  23 , ;
		InputMask = "", ;
		Left =  60 , ;
		TabIndex =  1 , ;
		Top =  48 , ;
		Width =  100 , ;
		Name = "TxtBox1"

	PROCEDURE rasch_dat	&& Вот здесь производишь расчет
		THIS.TxtBox3.Value = THIS.TxtBox1.Value - THIS.TxtBox2.Value
	ENDPROC

	PROCEDURE Init && В качестве начала я показал присвоения
		THIS.TxtBox1.Value = DATE()
		THIS.TxtBox2.Value = DATE()- 2 
		THIS.Rasch_dat()
	ENDPROC

	PROCEDURE txtbox2.Valid
		IF THIS.Value <> THISFORM.Old_date
		  THISFORM.Old_date = THIS.Value
		  THISFORM.Rasch_dat()
		ENDIF
	ENDPROC

	PROCEDURE txtbox2.GotFocus
		THISFORM.Old_date = THIS.Value
	ENDPROC

	PROCEDURE txtbox1.Valid
		IF THIS.Value <> THISFORM.Old_date
		  THISFORM.Old_date = THIS.Value
		  THISFORM.Rasch_dat()
		ENDIF
	ENDPROC

	PROCEDURE txtbox1.GotFocus
		THISFORM.Old_date = THIS.Value
	ENDPROC

ENDDEFINE
...
Рейтинг: 0 / 0
Расчеты в форме
    #33149072
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Sergey_Volga!

Напиши ХП (т.е. процедуру в контейнере базы данных), которая возьмёт значения этих 2-х полей, посчитает результат и сделает REPLACE 3-го поля. потом пропиши вызов этой ХП из условий проверки поля (Field Validation Rule) для 1-го и 2-го полей.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Расчеты в форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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