|
|
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Подскажите, пожалуйста, есть такая проблемка: Есть форма с 2 textbox-ами которые связанны с двума полями datatime таблицы. Нужно выделить даты (ttod) и из одной даты отнять другую дату и результат поместить в третий textbox на форме и в третье поле таблицы (чтобы и пользователь видел и в поле таблицы при записи упал результат) и если результат равен нулю сделать подстановку на единицу. Все это делается на восьмерке. Заранее спасибо!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2005, 04:18:17 |
|
||
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, забыла переключить раскладку Полностью дублирую топик Вот программка с использованием функции Владимира Борисовича Максимова Запусти, поразбирайся... Если ты это имел ввиду, но тебе скажут, что хранить в таблице 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 ************************************************** ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2005, 11:12:08 |
|
||
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
Прошу прошения. Я наверное не так описал ситуацию. Разница дат возвращается числовая и мне надо это число (или подстановку числа на единицу если разница равна нулю) запихнуть в форму и таблицу. Но где создать переменную в форме, выполнить расчет, и результат поместить в форму. Где в форме (textbox-e) создать переменную(название метода, свойства), выполнить расчеты, создать функции и процедуры? Где все это можно сделать? Спасибо за помощь!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2005, 13:53:52 |
|
||
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
А ты в коде, который тебе Кэт написала пробовал разобраться? Истина где-то там... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2005, 14:59:12 |
|
||
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
И впрям бы поразбирался вот запусти такую программу на выполнение и поразбирайся это простейший алгоритм если хочешь делать "как положено", то поищи по форуму в ключевыми словаими 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 ************************************************** ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2005, 15:37:01 |
|
||
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
Sergey_VolgaПрошу прошения. Я наверное не так описал ситуацию. Разница дат возвращается числовая и мне надо это число (или подстановку числа на единицу если разница равна нулю) запихнуть в форму и таблицу. Но где создать переменную в форме, выполнить расчет, и результат поместить в форму. Где в форме (textbox-e) создать переменную(название метода, свойства), выполнить расчеты, создать функции и процедуры? Где все это можно сделать? Если я правильно понял, ты хочешь научиться работать с методами (PROCEDURE) в формах??? Главное меню\Form\New metod далее задать имя метода и оно появиться у тебя в Properties\Methods где увидишь это имя. А в нем создашь код типа: Код: plaintext Ну и примерно будет код: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2005, 15:46:55 |
|
||
|
Расчеты в форме
|
|||
|---|---|---|---|
|
#18+
Hi Sergey_Volga! Напиши ХП (т.е. процедуру в контейнере базы данных), которая возьмёт значения этих 2-х полей, посчитает результат и сделает REPLACE 3-го поля. потом пропиши вызов этой ХП из условий проверки поля (Field Validation Rule) для 1-го и 2-го полей. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2005, 01:36:53 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=314&tid=1593933]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
50ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 310ms |

| 0 / 0 |
