логика торговой точки? - PullRequest
1 голос
/ 11 июля 2011

мои таблицы ...

create table sale
(
idsale int primary key identity,
idclient int,
user1 varchar(50),
fecha datetime
)

create table listofsale
(
idsale int,
idproduct int,
amount int,
priceunit float,
subtotal
)

когда продажа будет завершена, я собираюсь вставить все, что я имею в виду, я собираюсь вставить информацию

table sale

и listofsale тогда я делаю вставку, но как я могу получить тот же idsale для списка?Еще одна идея, которая у меня возникла, это то, что мой idsale был varchar (10), и я делаю случайные буквы и цифры в c #, и я собираюсь поместить их в текстовое поле, чтобы я мог сохранить их одновременно

или в какой другой форме я могу это сделать?Каков наилучший способ сделать это?

- добавлено {У меня всегда была кнопка "вставить" продажу и получить идентификатор, и после этого вы можете добавить список ... но язнаю, что это неправильная форма .. иногда у вас есть продажи без списка (если вы не добавили ни одного продукта, закройте приложение и откройте его снова)}

Ответы [ 4 ]

4 голосов
/ 11 июля 2011

У вас есть несколько вариантов. (подробнее здесь: http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/)

  1. использовать SCOPE_IDENTITY (), которая возвращает последнее значение идентификатора, созданное в текущем сеансе, и также ограничивается текущей областью действия. Это позволяет обойти проблемы с @@ IDENTITY.

  2. Пусть оператор INSERT предоставит вам вставленный идентификатор через предложение OUTPUT (http://msdn.microsoft.com/en-us/library/ms177564.aspx)

  3. Вместо использования Int в качестве ключа используйте уникальный идентификатор (GUID). Преимущество : Вы можете создать клиентскую часть id и отправить ее на сервер. Даунсайд : это будет адом для ваших индексов.

Если бы это зависело от меня, и я хотел на 100% быть уверенным в значении идентификатора, который я получал, тогда я использовал бы вариант № 2 выше.

1 голос
/ 11 декабря 2011

Не думаю, что вы должны создавать первичные ключи (например, idsale) как varchar, потому что это замедляет поиск и извлечение данных. Попробуйте сделать idsale как автонумерацию, и после вставки данных в таблицу продаж получите идентификатор последнего добавленного значения идентификатора и используйте его для вставки в listofsale.

Когда я работал в своей торговой точке ( TradeMeters ), я разработал таблицу следующим образом:

SaleItems
{
    transaction_id int,
    product_id int,
    quantity float,
    unit_price float,
    discount float
}

Примечание: промежуточный итог не требуется, поскольку вы можете рассчитать промежуточный итог из суммы и цены.

Subtotal = priceunit x amount
1 голос
/ 11 июля 2011

Мне трудно понять, в чем проблема. Читая, мне кажется, что у вас не обязательно возникают проблемы при создании идентификаторов продаж, а скорее, при ведении одного списка продаж для клиента по сеансам / компьютерам / экземплярам / и т.д.?

Предположения: 1) что конкретный клиент может иметь только один список продаж одновременно, и 2) что ваш столбец "idclient" является идентификатором клиента, которому принадлежит этот список продаж.

Решение: Вместо того, чтобы искать продажу, ищите idclient в таблице продажи соответствующего клиента. Если это ничего не дает, создайте новую продажу для этого клиента, а если оно вернется с продажей, используйте этот Saleid. Делайте это всякий раз, когда вам нужен этот Saleid.

Лучшее решение: Вышеупомянутое решение позволяет вам иметь только одну продажу и, следовательно, список продаж для каждого клиента. Если вам нужно любое количество прошлых, завершенных продаж, но только один текущий, открытый, сделайте следующее:

Добавление логического столбца "isSaleCompleted" к продаже таблицы. Установите значение true только тогда, когда продажа будет завершена. Затем в том же поиске продаж клиента, что и выше, также проверьте, что isSaleCompleted имеет значение false.

Итак, хранимая процедура поиска продажи клиента будет выглядеть так:

CREATE Procedure ClientSaleSearch
(
    @clientid int
)
SELECT saleid
From Sale
WHERE id=@userid AND isSaleCompleted = '0'
1 голос
/ 11 июля 2011

Когда вы делаете ВСТАВИТЬ В ПРОДАЖУ .... Переменная SQL @@ IDENTITY будет содержать последнее сгенерированное значение idsale . Вы можете использовать это значение для вставки желаемой idsale в вашу таблицу listofsale .

Если вам нужна дополнительная информация, вы можете найти ее здесь http://msdn.microsoft.com/en-us/library/ms187342.aspx

...