Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/23: Рейтинг темы: голосов - 23, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
1

Вычисляемые поля

24.11.2009, 22:58. Показов 4290. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В БД использую вычисляемое поле. Есть дата поступления, срок службы и дата списания (вычисляемое поле). Подскажите, каким типом в таблице объявить поле "срок службы", если он исчисляется только месяцами.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2009, 22:58
Ответы с готовыми решениями:

Вычисляемые поля
Добрый день! Подскажите как добавить вычисляемое поле в датасет динамически, как статически...

Вычисляемые поля
Доброе время суток) У меня есть форма "Сотрудник", на которой находится DataSource1 и Table1. Так...

Вычисляемые поля
Здравствуйте. Помогите необходимо в DBGridе значения вычисляемых полей двух и более записей вносить...

Вычисляемые поля
Необходимо в таблице "Отделы" создать поле "Балансовая стоимость" где будет подсчитываться...

19
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
24.11.2009, 22:58 2
Цитата Сообщение от CrazyWelder Посмотреть сообщение
В БД использую вычисляемое поле. Есть дата поступления, срок службы и дата списания (вычисляемое поле). Подскажите, каким типом в таблице объявить поле "срок службы", если он исчисляется только месяцами.
Integer или smallint
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
25.11.2009, 08:25  [ТС] 3
А каким образом его можно перевести в дату, а именно в месяцы?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
25.11.2009, 08:27 4
Цитата Сообщение от CrazyWelder Посмотреть сообщение
А каким образом его можно перевести в дату, а именно в месяцы?
Уточните что вы имеете ввиду, т.к. тип дата подразумевает в себе 3 компоненты - день, месяц и год. Просто месяц в дату перевести невозможно.
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
25.11.2009, 08:37  [ТС] 5
Есть дата поступления (день, месяц, год). Есть срок службы Integer (как Вы сказали) будет исчисляться в месяцах. И вычисляемое поле - день, месяц, год - равно дата поступления + срок службы (в месяцах).
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
25.11.2009, 08:45 6
Цитата Сообщение от CrazyWelder Посмотреть сообщение
В БД использую вычисляемое поле. Есть дата поступления, срок службы и дата списания (вычисляемое поле). Подскажите, каким типом в таблице объявить поле "срок службы", если он исчисляется только месяцами.
Цитата Сообщение от CrazyWelder Посмотреть сообщение
А каким образом его можно перевести в дату, а именно в месяцы?
Посмотрев на предыдущее сообщение думаю понял что вы имели ввиду
дата поступления - тип Дата
срок службы - тип Int
дата списания (вычисляемое поле) - тип Дата, способ вычисления: дата поступления + срок службы

Для того чтоб, дата поступления + срок службы давало правильную дату надо использовать функции добавление месяца к дате
Например в SQL Server добавление месяца делается так:
T-SQL
1
DATEADD(MM, срок службы, дата поступления)
Для других БД синтаксис отличается, то идея - та же
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
25.11.2009, 09:57  [ТС] 7
Но в этом запросе результат ведь заносится в "дату поступления"? А мне нужно в другое поле.

Добавлено через 27 минут
А насколько правильным будет вот этот код?
Delphi
1
2
3
4
5
6
7
8
9
10
11
var Year, Month, Day: Word;
begin
DecodeDate(Date, Year, Month, Day);
if TableSpeOdeSrok_Sluzhbi.Value=3 then
Month:=3;
if TableSpeOdeSrok_Sluzhbi.Value=12 then
Month:=12;
if TableSpeOdeSrok_Sluzhbi.Value=6 then
Month:=6;
TableSpeOdeSrok_Zameni.Value:=TableSpeOdeData_Vidachi.Value+Month;
end;
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
25.11.2009, 18:13 8
Вот как таблица в MS SQL должна выглядеть:

T-SQL
1
2
3
4
5
6
CREATE TABLE dbo.MyTable
    (
    DataPostuplenija date NULL,
    SrokSlujby smallint NULL,
    DataSpisanija  AS DATEADD(MM, SrokSlujby, DataPostuplenija)
    )  ON [PRIMARY]
Добавляем
T-SQL
1
2
3
4
5
6
7
8
-- одну строку 
INSERT INTO MyTable
(DataPostuplenija, SrokSlujby)
VALUES('2009-01-01', 14)
-- другую
INSERT INTO MyTable
(DataPostuplenija, SrokSlujby)
VALUES('2009-01-01', 36)
делаем селект

T-SQL
1
SELECT * FROM MyTable
Вот результат

SQL
1
2
3
4
5
6
DataPostuplenija SrokSlujby DataSpisanija
---------------- ---------- -------------
2009-01-01       14         2010-03-01
2009-01-01       36         2012-01-01
 
(2 ROW(s) affected)
Как видим поле DataSpisanija вычислилась само и правильно, и ее тип - Дата

примечание - у меня даты в формате MM-DD-YYYY
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
26.11.2009, 21:58  [ТС] 9
Ну вот и получилось. Все работает только с фиксированным количеством месяцев. Хотя для других значений месяцев додумать программку просто.
Delphi
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
var Year, Month, Day: Word;
T, D:TDateTime;
Y, M:Word;
begin
Y:=0;
M:=0;
if ((DBEdit4.Text='') or (DBEdit5.Text='') or (DBEdit6.Text='')) then
MessageDlg('Вы не заполнили все поля', mtWarning,[mbOK],0)
else
  begin
    TableSpeOde.FieldByName('Data_Vidachi').AsDateTime:=DateTimePicker1.DateTime;
    T:=TableSpeOdeData_Vidachi.AsDateTime;
    DecodeDate(T, Year, Month, Day);
    if TableSpeOdeSrok_Sluzhbi.Value=3 then
      M:=3;
    if TableSpeOdeSrok_Sluzhbi.Value=12 then
      Y:=1;
    if TableSpeOdeSrok_Sluzhbi.Value=6 then
      M:=6;
    if TableSpeOdeSrok_Sluzhbi.Value=24 then
      Y:=2;
    if TableSpeOdeSrok_Sluzhbi.Value=30 then
      begin
        M:=6;
        Y:=2;
      end;
    Month:=M+Month;
    Year:=Y+Year;
    if Month>12 then
      begin
        Y:=1;
        Month:=Month-12;
        Year:=Y+Year;
      end;
    D:=EncodeDate(Year,Month,Day);
    TableSpeOdeSrok_Zameni.Value:=D;
    TableSpeOde.Append;;
    GroupBox1.Visible:=False;
  end;
end;
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
26.11.2009, 23:00 10
Я не понял, что вы это хотели в Дельфи сделать...
Тогда это делается в одну строчку с помощью функции IncMonth():

Delphi
1
TableSpeOdeSrok_Zameni.Value := IncMonth(TableSpeOdeData_Vidachi.AsDateTime, TableSpeOdeSrok_Sluzhbi.Value);
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
27.11.2009, 12:51  [ТС] 11
Но эта процедура чет не работает. Говорит что не может объединить Word и Integer. Может везде указать Value?
0
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
27.11.2009, 18:14  [ТС] 12
Большое спасибо, все работает. А еще подскажите, мне нужно на компоненте DBNavigator после нажатия кнопки внести изменения вставить эту же штуку. Как узнать, какая кнопка нажата на DBNavigator?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
27.11.2009, 20:42 13
Цитата Сообщение от CrazyWelder Посмотреть сообщение
Большое спасибо, все работает. А еще подскажите, мне нужно на компоненте DBNavigator после нажатия кнопки внести изменения вставить эту же штуку. Как узнать, какая кнопка нажата на DBNavigator?
На самом деле это вычисление вставлять надо на OnCalculate для TTable или TQuery
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
28.11.2009, 19:31  [ТС] 14
но я не делаю вычисляемое поле, така как потом эти данные мне нужны в таблице для последующей обработки.
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
29.11.2009, 02:28 15
Цитата Сообщение от CrazyWelder Посмотреть сообщение
Большое спасибо, все работает. А еще подскажите, мне нужно на компоненте DBNavigator после нажатия кнопки внести изменения вставить эту же штуку. Как узнать, какая кнопка нажата на DBNavigator?
OnNavigate - проверяете, если значение поля не соответствует тому что ложно было быть - перезаписываете
Цитата Сообщение от CrazyWelder Посмотреть сообщение
но я не делаю вычисляемое поле, така как потом эти данные мне нужны в таблице для последующей обработки.
Но самое правильное, ставить на событие BeforePost - прямо перед записью проверяем и подправляем значение поля.
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
29.11.2009, 08:08  [ТС] 16
Это событие происходит после вставки записи, если я не ошибаюсь. А не вставится ли новая запись вычисленного поля? И после вычисления нужно будет указать опять вставку.
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
29.11.2009, 16:25 17
Цитата Сообщение от CrazyWelder Посмотреть сообщение
Это событие происходит после вставки записи, если я не ошибаюсь. А не вставится ли новая запись вычисленного поля? И после вычисления нужно будет указать опять вставку.
Событие BeforePost происходит непосредственно перед записью в таблицу.
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
30.11.2009, 20:25  [ТС] 18
Т. е. заносим в таблицу запись и метод Post вызывать не нужно?
0
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
30.11.2009, 21:19 19
Цитата Сообщение от CrazyWelder Посмотреть сообщение
Т. е. заносим в таблицу запись и метод Post вызывать не нужно?
Метод BeforePost происходит в момент когда в программе выполняется
Table.Post()
но непосредствено перед физической записью в таблицу. Т.е. в методе BeforePost Post делать не просто не надо, а нельзя - а то получиться вечный цикл.
1
0 / 0 / 0
Регистрация: 08.10.2009
Сообщений: 38
01.12.2009, 10:59  [ТС] 20
Вот это я и имел ввиду. Произойдет переполнение стека.
0
01.12.2009, 10:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2009, 10:59
Помогаю со студенческими работами здесь

Вычисляемые поля
Мне необходимо осуществить подсчет баллов студента,смотря на процент его успеваемости,посещаемости...

Вычисляемые поля
Добрый день. у меня имеется в Postgresql таблица следующей структуры ID NAME KOLVO FK...

Вычисляемые поля
Здравствуйте, не получается подсчитать кол-во спортсменов по каждому виду спорта в определённом...

Вычисляемые поля в Table
Добрый день. У меня вопрос. Как сделать вычисляемое поле через компонент Table1. В первом столбце...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru