Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вычисляемые поля (помогите начинающему) / 6 сообщений из 6, страница 1 из 1
05.10.2003, 15:57
    #32284293
RaVeN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемые поля (помогите начинающему)
Помогите начинающему:
Мне надо сделать базу данных, у которой следующие поля:
Дата, Взнос, Дивиденды, Сумма, Снято, Итого
Причём, сумма и итого вычисляются, и итого пишется в другую таблицу.
Как это можно сделать (база данных парадокс, дельфи 7)?
И можно ли это сделать в SQL?
...
Рейтинг: 0 / 0
05.10.2003, 16:52
    #32284321
RaVeN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемые поля (помогите начинающему)
В смысле, не получается сделать вычисление полей и запись их в таблицу.
Мона сделать, чтобы эти поля вычислялись (вернее, я могу), но не хочется, чтобы каждый раз это считалось, а чтобы это было в базе данных, и только последние данные суммировались, вычитались, итд. Суммирвание можно сделать через sum, но подсчёт дивидендов и вычитание- не получается.
...
Рейтинг: 0 / 0
05.10.2003, 19:01
    #32284356
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемые поля (помогите начинающему)
Это можно и нужно делать на SQL-серверах, Paradox слишком ненадежная система.

База должна состоять, как минимум из двух таблиц.
1. Журнал
Дата
КодКлинта
Деньги
ЭтоДивиденд - логическое поле

2. Клиенты
КодКлинта
АтрибутыКлиента

В поле Деньги дивиденды и Взносы идут со знаком плюс, Снято - с минусом

Я бы, пожалуй добавил еще и третью.

3. Остатки
КодКлиента
Деньги

Первоначальное заполнение этой таблицы:

Код: plaintext
1.
2.
insert into Остатки (КодКлиента, Деньги,ЭтоДивиденд)
select sum(Деньги), false from Журнал
group by  КодКлиента


При выполнении любой взноса-снятия операции изменяются значения в обоих таблицах
Код: plaintext
1.
2.
3.
4.
begin transaction
insert into Журнал (Дата, КодКлиента,Сумма,ЭтоДивиденд) 
values (пДата, пКодКлиента, пСумма, false)
update Остатки set Деньги=Деньги+пСумма
commit transaction

Однако, парадоксовские базы не поддерживают транзакции и этот вариант чреват ошибками. Лучше всего, после ЛЮБОГО сбоя убивать таблицу Отстатки и заполнять ее заново.

Начисление дивидендов тоже особых трудностей не представляет.
В полноценном SQL-сервере это можно было бы сделать обним запросом, но синтаксис SQL для Paradox ограничен

Я не знаю, какой алгоритм применяется у Вас, но если это процент по остатку на счету, то
1. Сканируем базу клиенты.
Для каждого из клиентов выполняем запрос

Код: plaintext
1.
2.
select sum(Деньги)*Процент from Журнал
where  КодКлинта=пКодКлиента
and Дата<=Дата_начисления_дивидендов
И получаем сумму дивидендов.

Эту сумму заносим в таблицы Журнал и Остатки .

Код: plaintext
1.
2.
3.
4.
begin transaction
insert into Журнал (Дата, КодКлиента,Сумма, ЭтоДивиденд) 
values (Дата_начисления_дивидендов, пКодКлиента, пСумма, true))
update Остатки set Деньги=Деньги+пСумма
commit transaction
...
Рейтинг: 0 / 0
05.10.2003, 19:24
    #32284364
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемые поля (помогите начинающему)
На всякий случай. Дивиденды для всех сразу. Вдруг прокатит

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
insert into Журнал (Дата, КодКлиента,Сумма, ЭтоДивиденд) 
select Дата_начисления_дивидендов, КодКлиента,
sum(Сумма), true
from Журнал
group by  КодКлиента
 
update Остатки
set Деньги=Остатки.Деньги+Журнал.Деньги
from Остатки, Журнал
where Остатки.КодКлиента=Журнал.КодКлиента
and ЭтоДивиденд=true
and Дата=Дата_начисления_дивидендов
...
Рейтинг: 0 / 0
05.10.2003, 19:57
    #32284372
RaVeN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемые поля (помогите начинающему)
Cпасибо большое за советы, но:
1.Я не совсем ещё разбираюсь с Парадоксом, поэтому разбираться с SQL-серверами у меня нет сейчас времени.
2. Она у меня состоит из 2-х таблиц:
НомерПрепода (уникальный, автоинкремент)
ИмяПрепода
СуммаНаСчету
Адрес
Телефон
Должность
(всеобщему просмотру доступны лишь первые 3 поля, остальные - в другой таблице, на другой форме, которая открываетя за паролем)
И (вторая):
Индекс(уникальный, автоинкремент, на всякий случай)
НомерПрепода (не уникальный, integer)
Взнос
Дивиденды (начисляются со взноса (как мне сказали) - я так и не понял, почему дивиденды)
Сумма (до того, как сняли)
Снято
Итого. Итого со втрой таблицы помещается в первую (insert я ещё не написал).
Сейчас попробую сделать кое-какие запросы из тех, которые Вы мне предложили.
Спасибо Вам за совет, правда, я сам ещё не до конца с этим разобрался. Сейчас буду разбираться.
Ещё я пытался передать значение номера выбранной клетки в SQL-запрос через
Код: plaintext
indx:=dbgrid1.SelectedField.Index;
, напрямую не получилось тем методом, который был не так давно указан в этой конференции, решил через временную базу данных. Так он говорит, что Таблица или занята, или у меня нет прав доступа. Хотя я делал так, как было сказано в хелпе (эта часть прошла без проблем), но ещё добавил
Код: plaintext
1.
2.
3.
datamodule2.Table1.EmptyTable;
 datamodule2.Table1.Insert;
 datamodule2.Table1.Fields[ 0 ].AsInteger:=indx;
 datamodule2.Table1.Post;

Вот исходник:
Код: 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.
 with datamodule2.Table1 do
  begin
  close;
  databasename:='Buhgalter1';
  tabletype:=ttParadox;
  tablename:='demo.db';
  with fielddefs do
   begin
   with addfielddef do
    begin
     name:='ID';
     datatype:=ftautoinc;
     required:=true;
    end;
   with addfielddef do
    begin
     name:='indx';
     datatype:=ftInteger;
     required:=true;
    end;
   end;
 with indexdefs do
  begin
   with addindexdef do
   begin
    name:='';
    fields:='ID';//ID
    options:=[ixPrimary];
   end;
 end;
 createtable;
 datamodule2.Table1.Open;
 datamodule2.Table1.EmptyTable;
 datamodule2.Table1.Insert;
 datamodule2.Table1.Fields[ 0 ].AsInteger:=indx;
 datamodule2.Table1.Post;

Ещё раз спасибо.
...
Рейтинг: 0 / 0
06.10.2003, 00:21
    #32284401
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемые поля (помогите начинающему)
Ну неправильные таблицы! А по моему мнению, почти все трудности с реализацией идут именно от изначально неправильно спроектированных баз.

Можно примерно так

Таблица1. Преподы
НомерПрепода (автоинкремент)
ИмяПрепода
СуммаНаСчету
Адрес
Телефон
Должность

Первичный индекс по НомерПрепода
===============

Таблица 2. Движение_по_счету
НомерПрепода
Дата
НомерОперации (автоинкремент)
СуммаОперации
ЭтоДивиденд (логический)

Первичный индекс по НомерПрепода, Дата, НомерОперации
Индекс по Дата, НомерПрепода
===============
Связи
Преподы - Движение_по_счету
по полю НомерПрепода один-ко-многим

Если бы это была система реального времени, то можно бы вместо полей Дата и НомерОперации завести поле ДатаВремя.
Какая разница между взносами и снятиями? Да никакой! Только взносы приплюсовываются к остатку, а снятия - вычитаются. Зачем в таком случае заводить поле "Снятие"? Досточно поля " СуммаОперации. И хранить в ней приход со знаком плюс, а расход со знаком минус.

Зачем вводить поле "Дивиденды"? Это тот же приход, только рассчитываемый по данным из таблицы Движение_по_счету. И его тоже надо ввести в поле СуммаОперации.
А признак ЭтоДивидент я ввел исключительно для того, что бы:
Во-первых, если дивиденд рассчитан неправильно, то так его легче найти. А, во-вторых, рано или поздно и бухгалтерии появится светлая мысль - подсчитать сумму дивидендов.
========================
Я Вам настоятельно советую, пока не поздно переделать таблицы. Все резко упростится.
========================
[ quot RaVeN]
Ещё я пытался передать значение номера выбранной клетки в SQL-запрос через
[/quot]
Там были неправильные ответы, если нужно именно по значению из колонки
то правильно - DBGrid1.Columns[1].Field.value;
Но НомерПрепода вообще в гриде лучше не показывать, а получать его так, как указал JibSkeart
DBGrid.DataSource.dataSet.fieldByname('НомерПрепода').AsInteger
========================
Чето я не вьехал, что там они называют "дивиденд". Не могли бы Вы описать это простыми словами.
========================
[ quot RaVeN]
1.Я не совсем ещё разбираюсь с Парадоксом, поэтому разбираться с SQL-серверами у меня нет времени
[/quot]
- А чего ты, соседушка, так медленно дрова пилишь? Ты бы пилу-то наточил-то.
- Некогда, пилить надо
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вычисляемые поля (помогите начинающему) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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