powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вычисляемые поля в DataTable
20 сообщений из 20, страница 1 из 1
Вычисляемые поля в DataTable
    #32117500
Даутов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Реализация вычисляемых полей в DataTable - малофункциональна. В свойстве Expression в вычисляемом выражении можно использовать лишь поля текущей таблицы и несколько функций (среди функций нет даже функции текущей даты).
Для сравнения :
в Delphi (продукт намного более старый) у объекта TTable есть событие OnCalculate, в котором можно реализовать вычисления, используя всю мощь языка разработки.

Как в ADO.Net и VS.Net можно реализовать такое простое вычисляемое поле в DataTable, как возраст человека = DateTime.ToDay - [Дата рождения] ?
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #32117514
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у datatable есть такое событие RowChanging, по которому можно подключать всю мощь .Net
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #32119331
Даутов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кузя,
можно немного поподробней о RowChanging и вычисляемых полях
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вычисляемые поля в DataTable
    #32603858
Фотография Gens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДаутовКузя,
можно немного поподробней о RowChanging и вычисляемых полях
Да, микрософт говорит - все просто, а на самом деле datatable, как и все микрософтовское надо делать руцями.
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #32603956
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДаутовРеализация вычисляемых полей в DataTable - малофункциональна. В свойстве Expression в вычисляемом выражении можно использовать лишь поля текущей таблицы и несколько функций (среди функций нет даже функции текущей даты).
Для сравнения :
в Delphi (продукт намного более старый) у объекта TTable есть событие OnCalculate, в котором можно реализовать вычисления, используя всю мощь языка разработки.

Правильно сказал Кузя аналогично OnCalculate можно использовать RowChanging, RowChanged - это решение на все случаи жизни.
Не правда то что в вычисляемом выражение можно использовать только поля текущей таблицы. А как же функции Child, Parent, функции агрегирования и механизм DataRelation????
Gens
Да, микрософт говорит - все просто, а на самом деле datatable, как и все микрософтовское надо делать руцями.

А что руками так сложно одну строчку написать для одного expression column


Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вычисляемые поля в DataTable
    #34165506
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут сильно увлекся с этими вычисляемыми полями в одном заказе. Каскадные вычисления в трех таблицах с показом сумм в парентах.
Для количество записей до 10 : 50 : 5 (на стольких тестировал :( ) все было нромально. Теперь
у заказчика это соотношение стало немного больше и пришел кранты проге. Загружается 7 минут.
Попробоваль всякие enablrConstraints, beginInit т.д., толку нет.
Нет ли возможности как нибудь это дело убыстрить?
Вариант загрузить поменьше данных, подзагузка и т.д. не принимается. Это большая переделка и по видимому придется делать если ничего нельзя придумать. :(
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #34171147
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават ЮсифовЯ тут сильно увлекся с этими вычисляемыми полями в одном заказе. Каскадные вычисления в трех таблицах с показом сумм в парентах.
Для количество записей до 10 : 50 : 5 (на стольких тестировал :( ) все было нромально. Теперь
у заказчика это соотношение стало немного больше и пришел кранты проге. Загружается 7 минут.
Попробоваль всякие enablrConstraints, beginInit т.д., толку нет.
Нет ли возможности как нибудь это дело убыстрить?
Вариант загрузить поменьше данных, подзагузка и т.д. не принимается. Это большая переделка и по видимому придется делать если ничего нельзя придумать. :(

Пришлось блин, чтобы интерфейс не менят пойти на такие вещи (отчет в форме ввода :) )
Все теперь за 3 секунды :)


Код: 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.
SELECT     D.ID, Счет_ID, Производитель, Коллекция, Линия, Наименование, Артикль, Модель, Цвет, Стандарт,
           R01, R02, R03, R04, R05, R06, R07, R08, R09, R10, R11, R12, R13, R14, R15, R16,
           Z01, Z02, Z03, Z04, Z05, Z06, Z07, Z08, Z09, Z10, Z11, Z12, Z13, Z14, Z15, Z16,
           P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, P16, Цена, Коэффициент,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16) as Количество,
           P as Поставлено, U as Утеряно, Цена-(Цена/ 100 )*Скидка as Цена_со_скидкой,
           ((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Цена_с_надбавкой,
           ((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка)*[Курс к ВУ]*Коэффициент as Цена_продаж,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16)*Цена as Сумма,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16)*(Цена-(Цена/ 100 )*Скидка) as Сумма_со_скидкой,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16)*((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Сумма_с_надбавкой,
           P*((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Поставлено_на_сумму,
           U*((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Сумма_потерь 

FROM       Детали_счета_ЗТ as D
LEFT JOIN 
(SELECT    Детали_Счета_ID, Sum(Z01) as P01, Sum(Z02) as P02, Sum(Z03) as P03, Sum(Z04) as P04,
           Sum(Z05) as P05, Sum(Z06) as P06, Sum(Z07) as P07, Sum(Z08) as P08, Sum(Z09) as P09, Sum(Z10) as P10,
           Sum(Z11) as P11, Sum(Z12) as P12, Sum(Z13) as P13, Sum(Z14) as P14, Sum(Z15) as P15, Sum(Z16) as P16,
           (Sum(Z01) + Sum(Z02) + Sum(Z03) + Sum(Z04) + Sum(Z05) + Sum(Z06) + Sum(Z07) + Sum(Z08) +
            Sum(Z09) + Sum(Z10) + Sum(Z11) + Sum(Z12) + Sum(Z13) + Sum(Z14) + Sum(Z15) + Sum(Z16)) as P,            
           (Sum(P01) + Sum(P02) + Sum(P03) + Sum(P04) + Sum(P05) + Sum(P06) + Sum(P07) + Sum(P08) +
            Sum(P09) + Sum(P10) + Sum(P11) + Sum(P12) + Sum(P13) + Sum(P14) + Sum(P15) + Sum(P16)) as U  from Поставки_ЗТ
           GROUP BY Детали_Счета_ID) as P            
ON D.ID=P.Детали_Счета_ID
LEFT JOIN
(SELECT ID, Скидка, Надбавка, [Курс к ВУ] from Счет_ЗТ) as S
ON D.Счет_ID=S.ID

---------

SELECT     C.ID, Дата, Номер, Поставщик_ID, Сезон, Скидка, Надбавка, [Период поставки], Валюта, [Курс к ВУ], [Курс ВУ к МВ],
           Сумма, Сумма_со_скидкой, Сумма_с_надбавкой, Поставлено_на_сумму as Поставлена, Сумма_потерь, Оплачена,
           Сумма_с_надбавкой*[Курс к ВУ] as [Сумма в ВУ],
           (Сумма_с_надбавкой*[Курс к ВУ])*[Курс ВУ к МВ] as [Сумма в МВ],
           Поставлено_на_сумму-Оплачена as Задолженность_фактическая,
           Сумма_с_надбавкой-Оплачена as Задолженность_по_документу 
FROM       Счет_ЗТ as C

LEFT JOIN

(SELECT Счет_ID, Sum(Сумма)as Сумма, Sum(Сумма_со_скидкой) as Сумма_со_скидкой,
       Sum(Сумма_с_надбавкой) as Сумма_с_надбавкой, Sum(Поставлено_на_сумму) as Поставлено_на_сумму,
       Sum(Сумма_потерь) as Сумма_потерь
 FROM
(SELECT     D.ID, Счет_ID,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16)*Цена as Сумма,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16)*(Цена-(Цена/ 100 )*Скидка) as Сумма_со_скидкой,
           (Z01+Z02+Z03+Z04+Z05+Z06+Z07+Z08+Z09+Z10+Z11+Z12+Z13+Z14+Z15+Z16)*((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Сумма_с_надбавкой,
           P*((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Поставлено_на_сумму,
           U*((Цена-(Цена/ 100 )*Скидка)/ 100 )*( 100 +Надбавка) as Сумма_потерь 

FROM       Детали_счета_ЗТ as D
LEFT JOIN 
(SELECT    Детали_Счета_ID,
           (Sum(Z01) + Sum(Z02) + Sum(Z03) + Sum(Z04) + Sum(Z05) + Sum(Z06) + Sum(Z07) + Sum(Z08) +
            Sum(Z09) + Sum(Z10) + Sum(Z11) + Sum(Z12) + Sum(Z13) + Sum(Z14) + Sum(Z15) + Sum(Z16)) as P,            
           (Sum(P01) + Sum(P02) + Sum(P03) + Sum(P04) + Sum(P05) + Sum(P06) + Sum(P07) + Sum(P08) +
            Sum(P09) + Sum(P10) + Sum(P11) + Sum(P12) + Sum(P13) + Sum(P14) + Sum(P15) + Sum(P16)) as U  from Поставки_ЗТ
           GROUP BY Детали_Счета_ID) as P            
ON D.ID=P.Детали_Счета_ID
LEFT JOIN
(SELECT ID, Скидка, Надбавка, [Курс к ВУ] from Счет_ЗТ) as S
ON D.Счет_ID=S.ID) as Z

GROUP BY Счет_ID) as I

ON C.ID=I.Счет_ID

LEFT JOIN

(SELECT     Счет_ID, Sum(Сумма) as Оплачена
 FROM       Оплата_ЗТ
 GROUP BY Счет_ID) as O

ON C.ID=O.Счет_ID
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #34172306
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если есть ХП-ишка в СУБД зачем Expression ? :)

----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #34172462
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будешь же при каждом изменении какого-нибудь поля вызывать ХП, тем более, что сами итоговые поля не храняться в БД? Expression очень удобная штука, но как оказалось не надо
использовать Parent, Child и не работать с большими объемами, ограничив форму семантически там, где возможно. А еще лучше по старинке, ввод и отчеты по отдельности. Хотя мне это не нравится, я за то что бы отчеты и форма ввода совместить. А сейчас я просто выкинул, Expression,
при считывании формирую отчет, а при вводе сам корректирую вычисляемы поля. Вобщем, свои Expressions. :)
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #34172587
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно не всегда, например для НДС ехпрессион можно исползывать (field1*0.18) :)


----
www.hramin.jino-net.ru
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вычисляемые поля в DataTable
    #35135995
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот проблема,использую столбец с выражением ,в выражении пишу "child.name"
имееться две таблицы,они связаны. хочу в родительскую таблицу добавить столбец из дочерней.
для этого делаю столбец с выражением "child.name" и получаю ошибку
Код: plaintext
Cannot interpret token 'child' at position  1 .
,как это понимать ?

слово parent тоже не работает.при указании "parent(relname).id" -взять значение своего столбца из себя же,говорит не вижу отношения с именем relname.но в коллекции relations у dataset это отношение имееться.

как так ?
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136010
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если пишу в выражении sum(child.id) ,то мне выводит значение id из дочерней таблицы и все ок.
это как так то :(
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136021
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторA column in a child table may be referenced in an expression by prepending the column name with Child. However, because child relationships may return multiple rows, you must include the reference to the child column in an aggregate function. For example, Sum(Child.Price) would return the sum of the column named Price in the child table.

это ,что получаеться нельзя реализовать,то что я задумал?
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136040
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
         +-> child1
         |
parent -+-> child2
         |
         +-> child3
 [code=plaintext]
ну и какой из?  
_________________ "Helo, word!" - 17 errors 56 warnings Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136111
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понимаю,что за child[1..3] ?
у меня один родитель,другая дочерняя. child это ссылка на дочернюю таблицу.
чутьчуть поясните откуда такое дерево береться?
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136116
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа у меня связь 1 к 1 логически.программано я нигде это не уточнял.
то есть 1 запись в родителе = 1 записи в дочерке.
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136149
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я создал теперь связь иначе. поменял в создании связи столбцы . то есть столбец из род таблы сделал дочерним. и в выражении использую parent слово и получаю то что мне надо. это так задумывалось чтоли? то есть я типа определил связь 1 к 1 таким образом?
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136209
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiKя создал теперь связь иначе. поменял в создании связи столбцы . то есть столбец из род таблы сделал дочерним. и в выражении использую parent слово и получаю то что мне надо. это так задумывалось чтоли? то есть я типа определил связь 1 к 1 таким образом?
что не понятно? у родителя может быть много детей. формально имеем отношение 1:n, если ты точно знаешь, что практически у тебя всегда 1:1, пиши в выражении например агрегат min, или max
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35136827
AlexeiK(guest)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
chpasha AlexeiKя создал теперь связь иначе. поменял в создании связи столбцы . то есть столбец из род таблы сделал дочерним. и в выражении использую parent слово и получаю то что мне надо. это так задумывалось чтоли? то есть я типа определил связь 1 к 1 таким образом?
что не понятно? у родителя может быть много детей. формально имеем отношение 1:n, если ты точно знаешь, что практически у тебя всегда 1:1, пиши в выражении например агрегат min, или max

Так не ясно одно: связь формализуеться до какого то типа 1ко1,1коМногим ? или это принято за начальное условие,что все связи типа 1 ко многим?

я сделал иначе.
так как у меня связь 1 к 1.мне надо в левой таблице видеть поле из правой таблицы,без всяких ухищрений min,max(child.columnname),я просто в relations.add() поменял концы у связи.и использую Parent(columnname) и все работает. это не принципиально я понимаю. просто как одно из решений.
...
Рейтинг: 0 / 0
Вычисляемые поля в DataTable
    #35141303
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно ли в столбцах в Expressions выражениях,использовать какие-то свои функции?
я пробовал и он выдает что функция не определена.интересно где она должна быть определена.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вычисляемые поля в DataTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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