• Ласкаво просимо на Спільнота для обміну досвідом між користувачами програм УкрБланк, УкрСклад, УкрЗарплата.
 

Наценка товаров скриптом

Автор Digital, Грудень 16, 2008, 22:44:54

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Digital

Перечитав много тем по поводу наценок и перенаценок на розничный товар, а также возможности програмы пришол к выводу что для меня один вариант - написать скрипт.
В скриптах SQL не очень, хотя когода то програмил на делфи базы.
Так вот, сама задача - на разные ценовые групы нужна своя наценка (от 0 и до 5у.е. нацениваем 20%, от 5у.е до 10у.е нацениваем 16% ну и т.д.). Вместе с этим хочу сам перещитывать курс - долар на гривну.
Может я чего то недосмотрел, но гибкости наценок я не нашол такой как мне надо, да и с курсом долара сбиваются наценки вбитые в ручную.
Вот и хочу вашей помощи в таком деле

UPDATE
  tovar_name
SET
if cena <= 5 then
   begin
     cena_r = cena * 1,2,   {это моя первая наценка 20% на групу от 0 до 5 у.е.}
   end.
else
         if cena > 5 and < 10 then
           begin
             cena_r = cena * 1,18,   {это моя вторая наценка 18% на групу от 5 до 10 у.е.}
           end.
end.

cena_out_curr_id = 1
WHERE
  cena_out_curr_id = 0


Очень грубо набросал на языке паскаль в готовый скрипт, так как не знаю SQL
Так же добавить умножение на курс чтобы была гривна, там где и наценка умножается (не писал потому что и так код громоздкий слабо читабельный)
Если в скрипте это не возможно может как нибудь сам в делфи сварганю если подскажете куда подключатся.
Огромное спасибо.

Digital

Если в скриптом не получается тогда как сделать чтобы при именении курса долара прямопропорционально изменялись наценки на товар забитые вручную?

admin

Ну раз уж пошла такая жара давайте покажу как делать наценку с условиями в одном скрипте.

0. ВАЖНО Сделайте резерв базы перед началом экспериментов.

1. Создаем пустышку процедуры:

CREATE PROCEDURE usr_tovar_nacenka
AS
BEGIN
END;


2. Далее на примере ваших условий модифицируем процедуру:

ALTER PROCEDURE usr_tovar_nacenka
AS
DECLARE VARIABLE v_tovar_id INTEGER;
DECLARE VARIABLE v_cena DOUBLE PRECISION;
DECLARE VARIABLE v_cena_r DOUBLE PRECISION;
DECLARE VARIABLE v_cena_o DOUBLE PRECISION;
DECLARE VARIABLE v_cena_1 DOUBLE PRECISION;
DECLARE VARIABLE v_cena_2 DOUBLE PRECISION;

BEGIN
  FOR
    SELECT
      num,
      cena,
      cena_r,
      cena_o,
      cena_1,
      cena_2
    FROM
      tovar_name
    WHERE
      visible = 1
    INTO
      :v_tovar_id,
      :v_cena,
      :v_cena_r,
      :v_cena_o,
      :v_cena_1,
      :v_cena_2
  DO
  BEGIN
    -- до этого момента не трогаем, только тут делаем условия по наценке
    -- скрипт при условии валюты приходной и расходной одинаковой, для неодинаковых надо делать еще и пересчет по курсу
    IF (:v_cena <= 5) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.2 WHERE num = :v_tovar_id AND cena_curr_id = cena_out_curr_id;  -- наценка 20% на розницу от 0 до 5
    END
    ELSE
    IF (:v_cena > 5 AND :v_cena <= 10) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.18 WHERE num = :v_tovar_id  AND cena_curr_id = cena_out_curr_id;  -- наценка 18% на розницу на групу от 5 до 10
    END
  END
END;


3. Запускать процедуру надо так:

EXECUTE PROCEDURE usr_tovar_nacenka

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

Digital

Скрипт не работал, после некоторых модификаций начал по идеи считать
В коде было вот такое UPDATE tovar_name SET cena_r = cena * 1.2 WHERE num = :v_tovar_id AND cena_curr_id = cena_out_curr_id;
Сделал вот так
UPDATE tovar_name SET cena_r = cena * 1.2  WHERE num = num AND cena_curr_id = cena_out_curr_id;

Не шла переменная v_tovar_id, зачем она вызывалась я так и не понял :( Ну и ещё поубирал двоеточия.
Вот что вышло -

ALTER PROCEDURE usr_tovar_nacenka
AS
DECLARE VARIABLE v_tovar_id INTEGER;
DECLARE VARIABLE v_cena DOUBLE PRECISION;
DECLARE VARIABLE v_cena_r DOUBLE PRECISION;
DECLARE VARIABLE v_cena_o DOUBLE PRECISION;
DECLARE VARIABLE v_cena_1 DOUBLE PRECISION;
DECLARE VARIABLE v_cena_2 DOUBLE PRECISION;

BEGIN
  FOR
    SELECT
      num,
      cena,
      cena_r,
      cena_o,
      cena_1,
      cena_2
    FROM
      tovar_name
    WHERE
      visible = 1
    INTO
      v_tovar_id,
      v_cena,
      v_cena_r,
      v_cena_o,
      v_cena_1,
      v_cena_2
  DO
  BEGIN
    IF (v_cena <= 5) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.2  WHERE num = num AND cena_curr_id = cena_out_curr_id;
    END
    ELSE
    IF (v_cena > 5 AND v_cena <= 10) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.18 WHERE num = num AND cena_curr_id = cena_out_curr_id;
    END
END
END;


В процесе работы возникли такие вопросы:
Перевел базу в долар, розницу и закупку. До этого была в гривнах. В справочнике начало все отображатся в доларах.
Установил основную валюту долар, чтобы в нем шол перещёт, но в справочниках отобразилась гривна. И ни при каких обстоятельствах, при основной валюте долар, не отображает долар, отображает гривну, только цены в доларах.
Что не так? Или я что то не понял.
З.Ы. С кодом я ещё поработаю. Результат выложу.
Огромнейшее спасибо за помощь.

Digital

Вот мой оконечный вариант
ALTER PROCEDURE usr_tovar_nacenka
AS
DECLARE VARIABLE v_tovar_id INTEGER;
DECLARE VARIABLE v_cena DOUBLE PRECISION;
DECLARE VARIABLE v_cena_r DOUBLE PRECISION;
DECLARE VARIABLE v_cena_o DOUBLE PRECISION;
DECLARE VARIABLE v_cena_1 DOUBLE PRECISION;
DECLARE VARIABLE v_cena_2 DOUBLE PRECISION;

BEGIN
  FOR
    SELECT
      num,
      cena,
      cena_r,
      cena_o,
      cena_1,
      cena_2
    FROM
      tovar_name
    WHERE
      visible = 1
    INTO
      v_tovar_id,
      v_cena,
      v_cena_r,
      v_cena_o,
      v_cena_1,
      v_cena_2
  DO
  BEGIN
    IF (v_cena <= 5) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.4  WHERE num = num AND cena_curr_id = cena_out_curr_id;
    END
    ELSE
    IF (v_cena > 5 AND v_cena <= 10) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.3 WHERE num = num AND cena_curr_id = cena_out_curr_id;
    END
         ELSE
         IF (v_cena > 10 AND v_cena <= 20) THEN
          BEGIN
            UPDATE tovar_name SET cena_r = cena * 1.2 WHERE num = num AND cena_curr_id = cena_out_curr_id;
          END
               ELSE
                 IF (v_cena > 20 AND v_cena <= 30) THEN
                  BEGIN
                    UPDATE tovar_name SET cena_r = cena * 1.15 WHERE num = num AND cena_curr_id = cena_out_curr_id;
                  END

  END
END;


Почему то во всей базе ставится наценка 1,3 без разницы какая сума закупки.
Меняю цифру 1.3 на любую дргугую снова пересчитывает базу минуя все остальные условия  ??? ???
Я чёт потерялся.

admin

Цитата: Digital від Грудень 18, 2008, 21:54:28
Почему то во всей базе ставится наценка 1,3 без разницы какая сума закупки.

Потому как изначально я писал скрипт верно, надо
num = :v_tovar_id
а не
num = num

Вместо :v_tovar_id подставляется номер товарав выбранный в верхнем SELECT, а в вашем случае num = num равнозначно 1=1, условие всегда выполняется.

Digital

Изначально ваш скрипт выдал ошибку в оглавлении переменных  DECLARE VARIABLE v_tovar_id INTEGER; Убрал двоеточие, оглавление переменных начало работать.
Далее в INTO
      v_tovar_id,
      v_cena,
      v_cena_r,
      v_cena_o,
      v_cena_1,
      v_cena_2
  DO

убрал двоеточия, так как выдавало ошибку.

Сделал num=num только потому что num = : v_tovar_id выдавал ошибку
ЦитатаSQL Parse Error:

Parameter name expected
При установке num = v_tovar_id выдает такую ошибку
ЦитатаDynamic SQL Error
SQL error code = -206
Column unknown
V_TOVAR_ID
At line 34, column 73
А что делать дальше я не знаю   :-\ Вариантов у меня больше нет что то пробывать.

admin

Да, двоеточие не проходит, попробуем поправить. А пока создайте файл с названием 999, скопируйте его в папку /db/patch/ , с содержимым вроде этого, через строку просто добавьте COMMIT

ALTER PROCEDURE usr_tovar_nacenka
AS
DECLARE VARIABLE v_tovar_id INTEGER;
DECLARE VARIABLE v_cena DOUBLE PRECISION;
DECLARE VARIABLE v_cena_r DOUBLE PRECISION;
DECLARE VARIABLE v_cena_o DOUBLE PRECISION;
DECLARE VARIABLE v_cena_1 DOUBLE PRECISION;
DECLARE VARIABLE v_cena_2 DOUBLE PRECISION;

BEGIN
  FOR
    SELECT
      num,
      cena,
      cena_r,
      cena_o,
      cena_1,
      cena_2
    FROM
      tovar_name
    WHERE
      visible = 1
    INTO
      :v_tovar_id,
      :v_cena,
      :v_cena_r,
      :v_cena_o,
      :v_cena_1,
      :v_cena_2
  DO
  BEGIN
    -- до этого момента не трогаем, только тут делаем условия по наценке
    -- скрипт при условии валюты приходной и расходной одинаковой, для неодинаковых надо делать еще и пересчет по курсу
    IF (:v_cena <= 5) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.2 WHERE num = :v_tovar_id AND cena_curr_id = cena_out_curr_id;  -- наценка 20% на розницу от 0 до 5
    END
    ELSE
    IF (:v_cena > 5 AND :v_cena <= 10) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.18 WHERE num = :v_tovar_id  AND cena_curr_id = cena_out_curr_id;  -- наценка 18% на розницу на групу от 5 до 10
    END
  END
END;

COMMIT


А уже EXECUTE PROCEDURE usr_tovar_nacenka выполняйте из SQL менеджера.

s.print.kr

Добрый день, Дмитрий
Вы вот писали:
Тему можно развивать, можно научить скрипт и наценивать с валютой и автоматически подтягивать текущий курс и даже делать автоматическую наценку нового товара, т.е. вы будете добавлять новый товар в программу, а скрипт будет вызываться триггером и товар автоматически нацениватся по условию.
Перепробовав все варианты :): двоеточия ,num=num, создание файлов, но скрипт так и не работает ??? :-[, цена не меняется, а очень бы хотелось

admin

Цитата: s.print.kr від Квітень 07, 2009, 21:27:32
Добрый день, Дмитрий
Вы вот писали:
Тему можно развивать, можно научить скрипт и наценивать с валютой и автоматически подтягивать текущий курс и даже делать автоматическую наценку нового товара, т.е. вы будете добавлять новый товар в программу, а скрипт будет вызываться триггером и товар автоматически нацениватся по условию.
Перепробовав все варианты :): двоеточия ,num=num, создание файлов, но скрипт так и не работает ??? :-[, цена не меняется, а очень бы хотелось

С файлом не должно быть проблем, приведите текстовку файла скрипта, вы делали триггер или просто процедуру?

SerJio

Здравствуйте, очень нравится ваша программа, очень нужен скрипт, но к сожалению мои познания в программировании - близки к "0". Ребята, подскажите пожалуйста ответы на пару вопросов:
1. Как пользоваться скриптами и куда их вносить???
2. Скрипт необходимо вносить постоянно или достаточно ввести один раз, чтобы он работал все время?
2. У меня тоже проблема с наценками на товары. Необходимо установить разную наценку на разные группы товаров, и не только розничные цены, но и скидки. Я этого сделать не могу, и вручную приходится вбивать цены на все товары - это очень неудобно. Кроме того, при пересчете розничных цен на цены со скидками в расходных накладных, у меня пересчитываются все цены по складу, введенные вручную.
   Пожалуйста, подскажите мне какой скрипт необходимо вводить? Распишите, пожалуйста "чайнику" подробнее все пошагово. Буду ОЧЕНЬ благодарен. Без этого вся работа на смарку.
   Заранее благодарен.  :)

admin

1. Скрипты вводятся через меню Опции : SQL менеджер, только процедуры пока не получается там сохранить их можно добавить через файл как было описано выше.
2. Смотря какой скрипт если сделать тригером то не надо будет выполнять процедуру либо другой скрипт по наценке при каждом вводе товара, а если одноразовая наценка надо будет выполнять тогда когда захотите.
3. Как наценивать без процедуры было несколько раз описано на форуме, пользуйтесь поиском, например тут http://www.softbalance.com.ua/forum/index.php?topic=23.msg1273#msg1273

s.print.kr

Дмитрий, пробовал как процедуру так и через файл. И там и там ситуация такая:
ввожу значение соответствующему  значению  (v_cena <= 5) при условии
UPDATE tovar_name SET cena_r = cena * 1.5  WHERE num = num AND cena_curr_id = cena_out_curr_id; (почему num=num?, потому что відает ошибку)
Пересчитывает ВЕСЬ товар на +50%, хотя есть товар, который не соответствует условию (v_cena <= 5)
Ввожу новую входящую цену, НО уже в этом диапазоне (v_cena > 5 AND v_cena <= 10)
при условии UPDATE tovar_name SET cena_r = cena * 1.35 WHERE num = num AND cena_curr_id = cena_out_curr_id;
Так опять пересчитывает ВЕСЬ ТОВАР,но уже на +35%.
Как все-таки заставить скрипт работать по определеннім условиям? А то уже голова пухнет.
Дмитрий, на  Вас вся надежда. Спасибо

admin

Цитата: s.print.kr від Квітень 18, 2009, 22:47:24
Дмитрий, пробовал как процедуру так и через файл. И там и там ситуация такая:
ввожу значение соответствующему  значению  (v_cena <= 5) при условии
UPDATE tovar_name SET cena_r = cena * 1.5  WHERE num = num AND cena_curr_id = cena_out_curr_id; (почему num=num?, потому что відает ошибку)

Тут же я писал, что пункт 2 выполняется так и он нормально работает, а далее через скрипт:

Цитата: Дмитрий Котельников від Грудень 24, 2008, 14:44:37
Да, двоеточие не проходит, попробуем поправить. А пока создайте файл с названием 999, скопируйте его в папку /db/patch/ , с содержимым вроде этого, через строку просто добавьте COMMIT

ALTER PROCEDURE usr_tovar_nacenka
AS
DECLARE VARIABLE v_tovar_id INTEGER;
DECLARE VARIABLE v_cena DOUBLE PRECISION;
DECLARE VARIABLE v_cena_r DOUBLE PRECISION;
DECLARE VARIABLE v_cena_o DOUBLE PRECISION;
DECLARE VARIABLE v_cena_1 DOUBLE PRECISION;
DECLARE VARIABLE v_cena_2 DOUBLE PRECISION;

BEGIN
  FOR
    SELECT
      num,
      cena,
      cena_r,
      cena_o,
      cena_1,
      cena_2
    FROM
      tovar_name
    WHERE
      visible = 1
    INTO
      :v_tovar_id,
      :v_cena,
      :v_cena_r,
      :v_cena_o,
      :v_cena_1,
      :v_cena_2
  DO
  BEGIN
    -- до этого момента не трогаем, только тут делаем условия по наценке
    -- скрипт при условии валюты приходной и расходной одинаковой, для неодинаковых надо делать еще и пересчет по курсу
    IF (:v_cena <= 5) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.2 WHERE num = :v_tovar_id AND cena_curr_id = cena_out_curr_id;  -- наценка 20% на розницу от 0 до 5
    END
    ELSE
    IF (:v_cena > 5 AND :v_cena <= 10) THEN
    BEGIN
      UPDATE tovar_name SET cena_r = cena * 1.18 WHERE num = :v_tovar_id  AND cena_curr_id = cena_out_curr_id;  -- наценка 18% на розницу на групу от 5 до 10
    END
  END
END;

COMMIT


А уже EXECUTE PROCEDURE usr_tovar_nacenka выполняйте из SQL менеджера.


Цитата: s.print.kr від Квітень 18, 2009, 22:47:24
Ввожу новую входящую цену, НО уже в этом диапазоне (v_cena > 5 AND v_cena <= 10)
при условии UPDATE tovar_name SET cena_r = cena * 1.35 WHERE num = num AND cena_curr_id = cena_out_curr_id;
Так опять пересчитывает ВЕСЬ ТОВАР,но уже на +35%.
Как все-таки заставить скрипт работать по определеннім условиям? А то уже голова пухнет.
Дмитрий, на  Вас вся надежда. Спасибо

Также я не писал выполнять UPDATE отдельно, читайте по-пунктно, вначале создается процедура, потом обновляете ее как хотите там пример с объяснениями, а потом из скрипта запускаете эту процедуру. Смотрите внимательно на авторов сообщений.

admin

#14
Повторил с полной корректировкой:

0. ВАЖНО Сделайте резерв базы перед началом экспериментов.

1. Создаем пустышку процедуры в SQL менеджере:

CREATE PROCEDURE usr_tovar_nacenka
AS
BEGIN
END;


2. Далее на примере ваших условий модифицируем процедуру. Создайте файл с названием 999, скопируйте его в папку /db/patch/ , с содержимым вроде этого, через строку просто добавьте COMMIT

ALTER PROCEDURE usr_tovar_nacenka
AS
DECLARE VARIABLE v_tovar_id INTEGER;
DECLARE VARIABLE v_cena DOUBLE PRECISION;
DECLARE VARIABLE v_cena_r DOUBLE PRECISION;
DECLARE VARIABLE v_cena_o DOUBLE PRECISION;
DECLARE VARIABLE v_cena_1 DOUBLE PRECISION;
DECLARE VARIABLE v_cena_2 DOUBLE PRECISION;
BEGIN
 FOR
   SELECT
     num,
     cena,
     cena_r,
     cena_o,
     cena_1,
     cena_2
   FROM
     tovar_name
   WHERE
     visible = 1
   INTO
     :v_tovar_id,
     :v_cena,
     :v_cena_r,
     :v_cena_o,
     :v_cena_1,
     :v_cena_2
 DO
 BEGIN
   -- до этого момента не трогаем, только тут делаем условия по наценке
   -- скрипт при условии валюты приходной и расходной одинаковой, для неодинаковых надо делать еще и пересчет по курсу
   IF (:v_cena <= 5) THEN
   BEGIN
     UPDATE tovar_name SET cena_r = cena * 1.2 WHERE num = :v_tovar_id AND cena_curr_id = cena_out_curr_id;  -- наценка 20% на розницу от 0 до 5
   END
   ELSE
   IF (:v_cena > 5 AND :v_cena <= 10) THEN
   BEGIN
     UPDATE tovar_name SET cena_r = cena * 1.18 WHERE num = :v_tovar_id  AND cena_curr_id = cena_out_curr_id;  -- наценка 18% на розницу на групу от 5 до 10
   END
    -- конец вашего скрипта
 END
END;

COMMIT


3. Запускать процедуру надо в SQL менеджере так :

EXECUTE PROCEDURE usr_tovar_nacenka