Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получение последны измененные данные / 25 сообщений из 26, страница 1 из 2
24.05.2014, 10:41:29
    #38650850
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Всем привет! Дайте мне идея!
Есть таблица учет товара. В нем:
Код: html
1.
data, time, amount_kredit, sum_kredit, amount_debet, sum_debet, total_amount, total_sum



здесь кредит расход и дебет приход.

Таким образом: Как можно следит за остатками?

Заранее Всем спасибо!
...
Рейтинг: 0 / 0
24.05.2014, 10:43:37
    #38650852
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Я написал вот такой триггер:

Код: sql
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.
CREATE OR ALTER TRIGGER TOTAL_BI0 FOR TOTAL
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable max_total_amount integer;
declare variable max_total_sum integer;
begin
  if (not (new.amountk is null)) then
  begin
   max_total_amount = (select max(total_amount) from total);
   max_total_sum = (select max(total_sum) from total);

   if (max_total_amount is null) then
   begin
     new.total_amount = - (new.amountk);
     new.total_sum = - (new.sumk);
   end
   else
   begin
     new.total_amount = max_total_amount - new.amountk;
     new.total_sum = max_total_sum - new.sumk;
   end
  end

  if (not (new.amountd is null)) then
  begin
   max_total_amount = (select max(total_amount) from total);
   max_total_sum = (select max(total_sum) from total);

   if (max_total_amount is null) then
   begin
     new.total_amount = new.amountd;
     new.total_sum = new.sumd;
   end
   else
   begin
     new.total_amount = max_total_amount + new.amountd;
     new.total_sum = max_total_sum + new.sumd;
   end
  end
end
^


SET TERM ; ^



Мне кажется это не вариант!
...
Рейтинг: 0 / 0
24.05.2014, 11:01:46
    #38650856
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Alimkulovздесь кредит расход и дебет приход.
Дизайнеру базы руки оторвать по самую задницу.

AlimkulovКак можно следит за остатками?
Код: sql
1.
SUM(sum_debet)-SUM(sum_kredit)


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 11:12:00
    #38650857
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry SibiryakovДизайнеру базы руки оторвать по самую задницу.


Что вы имеете в виду?
...
Рейтинг: 0 / 0
24.05.2014, 11:19:52
    #38650859
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovDimitry SibiryakovДизайнеру базы руки оторвать по самую задницу.
Что вы имеете в виду?
Что они (руки) у него (дизайнера базы) из этой самой задницы и растут.

Насколько я понимаю, именно ты спроектировал это убожество. Можешь обосновать выбор такой
странной структуры таблицы? Ты, кстати, даже не сказал что это за таблица.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 11:32:26
    #38650861
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry SibiryakovAlimkulovпропущено...

Что вы имеете в виду?
Что они (руки) у него (дизайнера базы) из этой самой задницы и растут.

Насколько я понимаю, именно ты спроектировал это убожество. Можешь обосновать выбор такой
странной структуры таблицы? Ты, кстати, даже не сказал что это за таблица.


Теперь не Вы, а Ты! Следи за словом! Ну если не так проектировал, это не значить что 'Что они (руки) у него (дизайнера базы) из этой самой задницы и растут.'

Ты родился со знанием проектирования что ли. Нет ты родился не зная ничего! Да ты сейчась хорошо проектируеш. Но с начало тебе тоже было трудно с проектированием. Получается твая голова из той места, который ты вызазыл! понятно тебе!

Насчет таблица, эта таблица движения товаров в firebrid.
...
Рейтинг: 0 / 0
24.05.2014, 11:53:47
    #38650867
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovНасчет таблица, эта таблица движения товаров в firebrid.
И в каком бизнес-процессе ты нашёл, что товар движется в обеих направлениях одновременно?

В чём глубинный смысл хранения даты и времени в отдельных полях?

Зачем нарушать вторую НФ хранением полной суммы?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 11:58:40
    #38650869
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry Sibiryakov,

Как будет вообще правилно? Ты можеш дать вариант?
...
Рейтинг: 0 / 0
24.05.2014, 12:11:02
    #38650877
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovТы можеш дать вариант?
Сначала ответь на вопросы выше. Кто ж знает что у тебя там за ТЗ и что за БП...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 12:13:27
    #38650878
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovDimitry Sibiryakov,

Как будет вообще правилно? Ты можеш дать вариант?
Пристрелить,не выживет.
...
Рейтинг: 0 / 0
24.05.2014, 13:02:04
    #38650892
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry Sibiryakov,
БД в firebrid.
Есть таблица товаров:
Код: sql
1.
2.
3.
4.
5.
6.
7.
 CREATE TABLE SYS101 (
    ID                      integer,            -- id товара
    ISFOLDER            varchar(1),       -- статус, группа или нет
    FOLDERID            integer,            -- id группа
    NAME                 varchar(50),      -- наименование
    SYS114              integer,             -- id ед.изм.
 );



Приход товара осуществляется с помощью документа приходного акта, a расход с помощью документа расходного акта. Это всем понятно.
Существует таблица докуметов:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE DOC100 (
    ID                 ID_INTEGER,    -- ID докумета
    NUMBERDOC    VARCHAR10,   -- Номер документа
    DATADOC       DATE,            -- Дата документа
    SYS113          integer,          --ID поставщик 
    SYS116          integer,          --ID договор
    SYS118          integer,          --ID склад
    DATEINVOICE  DATE,             --Дата инвойса
    DESCRIPTION  VARCHAR50,     --Комментарий
    NUM_INVOICE  VARCHAR10,     --номер инвойса
    SUMMA          NUMERIC(15,2)  --сумма документа
);



И есть таблица остатка товаров

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE TOTAL (
    ID                       INTEGER,              
    IDDOC                 INTEGER,          -- id документа
    IDGOODS             INTEGER,          -- id товара
     _DATE                DATE,              -- дата проводки
    AMOUNTK            NUMBER(10,2),   -- кол-во кредит
    SUMK                  NUMBER(10,2),   -- сумма кредит
    AMOUNTD            NUMBER(10,2),   -- кол-во дебет
    SUMD                  NUMBER(10,2),   -- сумма дебед
    TOTAL_AMOUNT   NUMBER(10,2),    -- всего количество
    TOTAL_SUM         NUMBER(10,2)    -- всего сумма
);



Вот такая схема.
...
Рейтинг: 0 / 0
24.05.2014, 13:30:20
    #38650895
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovВот такая схема.
Теперь повторяю вопросы медленно:
1) Один и тот же товар ДЕЙСТВИТЕЛЬНО по одному и тому же документу может как
поступить на склад так и уйти с него? Т.е. в таблице TOTAL поля AMOUNTD и AMOUNTK могут
быть не нулевыми одновременно?
2) В чём причина нарушения второй НФ в виде хранения TOTAL_AMOUNT?
3) В чём проблема "следить за остатками" с помощью запроса, приведённого в первом же ответе?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 13:47:50
    #38650902
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry SibiryakovAlimkulovВот такая схема.
Теперь повторяю вопросы медленно:
1) Один и тот же товар ДЕЙСТВИТЕЛЬНО по одному и тому же документу может как
поступить на склад так и уйти с него? Т.е. в таблице TOTAL поля AMOUNTD и AMOUNTK могут
быть не нулевыми одновременно?
2) В чём причина нарушения второй НФ в виде хранения TOTAL_AMOUNT?
3) В чём проблема "следить за остатками" с помощью запроса, приведённого в первом же ответе?


По приходному акту записывается на AMOUNTD (Дебет), а по расходному записывается на AMOUNTK (Кредит)

TOTAL_AMOUNT = Предедуший остаток +/- AMOUNT(D/K) (Дебет или кредит).
Найти Предедуший остаток.
...
Рейтинг: 0 / 0
24.05.2014, 13:49:21
    #38650903
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Alimkulov,

Что означает твой НФ?
...
Рейтинг: 0 / 0
24.05.2014, 13:49:58
    #38650905
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry Sibiryakov,

Что означает твой НФ?
...
Рейтинг: 0 / 0
24.05.2014, 14:04:01
    #38650910
VerLeon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
В таблице документов как минимум не хватает признака что это - приход или расход. Возможно это определяется по внешним ссылкам, но зачем?
Таблица остатков в таком виде дублирует таблицу документов, да еще и плохо дублирует - в таком виде она вообще не нужна
...
Рейтинг: 0 / 0
24.05.2014, 14:06:41
    #38650911
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovTOTAL_AMOUNT = Предедуший остаток +/- AMOUNT(D/K) (Дебет или кредит).
Не надо так делать. Выкинь это поле вообще. Поля AMOUNTD и AMOUNTK объедини в одно, где
храни положительное количество для поступлений товара и отрицательное - для отгрузки.

AlimkulovЧто означает твой НФ?
На лекциях о проектировании БД вам не рассказывали о Нормальных Формах?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 14:13:08
    #38650914
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
VerLeonТаблица остатков в таком виде дублирует таблицу документов
Ага, я тоже сначала думал, что TOTAL это у него таблица остатков, но, судя по ссылке на
документ, это всё же спецификация накладной.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 14:37:52
    #38650921
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry SibiryakovVerLeonТаблица остатков в таком виде дублирует таблицу документов
Ага, я тоже сначала думал, что TOTAL это у него таблица остатков, но, судя по ссылке на
документ, это всё же спецификация накладной.


Не так, спецификация накладной у меня храняется в отделном таблице, которого я не указывал тебе.

Dimitry SibiryakovНе надо так делать. Выкинь это поле вообще. Поля AMOUNTD и AMOUNTK объедини в одно, где
храни положительное количество для поступлений товара и отрицательное - для отгрузки.


С этим я согласен. Теперь как найти сальдо на конец периода?
...
Рейтинг: 0 / 0
24.05.2014, 14:51:19
    #38650929
VerLeon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Dimitry SibiryakovVerLeonТаблица остатков в таком виде дублирует таблицу документов
Ага, я тоже сначала думал, что TOTAL это у него таблица остатков, но, судя по ссылке на
документ, это всё же спецификация накладной.


Да, что-то невнимательно посмотрел, думал что заголовок и спецификация объединены в одну таблицу DOC100. А так да - TOTAL - это спецификация с кучей избыточных полей.
Тогда ты во всем прав:
1. TOTAL - это спецификация документа. Убрать оттуда дебит-кредит, оставить количество и сумму. нарастающие итоги - и подавно убить. Да и переобзвать в что-то похожее на истинное предназначение таблицы.
2. В DOC100 желательно добавить признак вида документа. Хотя если база небольшая, то можно и без этого, но я бы в любом случае это сделал (пусть и в нарушение 1 НФ)
3. Если нужна таблица остатков - сделать другую таблицу. Дата - товар - остаток (количество и если реально нужно - сумма).
Таблица ведется на триггерах, меняется при проведении документа. Но надо еще подумать - нужна ли она вообще.

Как бэ общие принципы для любой системы учета товародвижения :)
...
Рейтинг: 0 / 0
24.05.2014, 14:55:28
    #38650932
VerLeon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Alimkulov, Пляши от логики всегда. Что ты хочешь получить от таблицы остатков? Количество (и возможно сумму) остатка конкретного товара на дату? Тогда она должна быть дата-товар-остаток (количество и сумма, если надо). Общую сумму товара на складе - тода дата-сумма (количество уже не интересно)
...
Рейтинг: 0 / 0
24.05.2014, 15:17:15
    #38650943
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovТеперь как найти сальдо на конец периода?
SQL запросом SELECT с использованием агрегатной функции SUM() и условием выборки всех
движений, предшествующих концу периода.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.05.2014, 17:53:44
    #38650983
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
[quot Dimitry Sibiryakov]
AlimkulovTOTAL_AMOUNT = Предедуший остаток +/- AMOUNT(D/K) (Дебет или кредит).
Не надо так делать. Выкинь это поле вообще. Поля AMOUNTD и AMOUNTK объедини в одно, где
храни положительное количество для поступлений товара и отрицательное - для отгрузки.

Думал что, буду использовать этого таблицу на документе акт внутренные перемещения.
Тогда например со склада №1 на склад №2 перемещаем товар в количестве 10 шт.

проводко

AMOUNTD (склад №2) = 10;
AMOUNTK (склад №1) = -10;

Вот почему я розделил на 2 части.
...
Рейтинг: 0 / 0
24.05.2014, 17:57:43
    #38650985
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
Alimkulov,

а если количество складов возрастёт до 50?
...
Рейтинг: 0 / 0
24.05.2014, 18:20:49
    #38650996
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение последны измененные данные
AlimkulovДумал что, буду использовать этого таблицу на документе акт внутренные
перемещения.
Не сможешь. Для этого в ней нет идентификации склада.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получение последны измененные данные / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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