Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2014, 17:01
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию Расчет заработной платы

Доброго времени суток! Помогите, пожалуйста, написать функцию для расчета заработной платы.
Имеем две таблицы в бд: продавцов и список товаров. Каждая продажа записывается на конкретного продавца.
При расчете з/п используется ставка 1500грн + премия.
Премия считается по кол-ву продаж и не может быть больше 50% от ставки. Например, 1000 продаж - 50%, 500 - 25%, 100 - 5% и т.д.
Плюс удержания из з/п: ЕСВ=ЗП*3,6% и НДФЛ=ЗП*15%
Помогите, пожалуйста. Абсолютно не понимаю как это можно реализовать.
Ответить с цитированием
  #2  
Старый 02.06.2014, 17:53
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

зависит от используемой СУБД. вообще можно одним запросом решить задачу через select case, к примеру.
и вообще это ущемление прав какое-то
Цитата:
не может быть больше 50% от ставки
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 02.06.2014 в 17:55.
Ответить с цитированием
  #3  
Старый 03.06.2014, 13:04
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
зависит от используемой СУБД. вообще можно одним запросом решить задачу через select case, к примеру.
Я использую MS Access. Т.е. мне не нужно создавать дополнительные таблицы и расписывать там премии, и все такое? Я просто вообще не знакома с запросами и не представляю как можно это реализовать

Цитата:
Сообщение от NumLock
и вообще это ущемление прав какое-то
Ну уж какое условие дали
Ответить с цитированием
  #4  
Старый 03.06.2014, 16:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от poison-bla
...Имеем две таблицы в бд: продавцов и список товаров. Каждая продажа записывается на конкретного продавца...
Не могли бы вы расписать механизм учёта продаж, в смысле - или для каждого продавца ведётся общий счётчик или учитывается кто сколько продал конкретных позиций из списка товаров
Цитата:
Иванова 500
...
Сидорова Товар1 200 Товар2 300
Ответить с цитированием
  #5  
Старый 03.06.2014, 16:12
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Не могли бы вы расписать механизм учёта продаж, в смысле - или для каждого продавца ведётся общий счётчик или учитывается кто сколько продал конкретных позиций из списка товаров
Пока определенного механизма нет. Планирую сделать так: 3 таблицы
1. Продавцы. Поля: id_продавца, ФИО
2. Товары. Поля: id_товара, наименование, кол-во, цена
3. Продажи. Поля: id_продажи, id_товара, кол-во, цена, сумма, id_продавца

Ну и соответственно поставить связи id_продавца и id_товара из первых двух таблиц к третьей.
Ответить с цитированием
  #6  
Старый 04.06.2014, 10:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

В Продажи надо бы еще добавить дату, без которой не выбрать данные за месяц. И при такой формуле расчета, вам не нужна таблица Товары.
Для Акцеса вот такой заросец выходит:
Код:
SELECT Продавцы.ФИО, Count(Продажи.[Дата]) AS Продаж, 
             1500+1500*Switch(Продаж>=1000,0.5, 
                                              Продаж Between 999 And 500, 0.25,
                                              Продаж Between 499 And 100, 0.05,
                                              Продаж Between 99 And 0, 0) AS ЗП, 
             [ЗП]-[ЗП]/100*3.6-[ЗП]/100*15 AS Итого
FROM (Продавцы INNER JOIN Продажи ON Продавцы.Код = Продажи.КодПродавца) INNER JOIN Товары ON Продажи.КодТовара = Товары.Код
WHERE (((Month([Дата]))=6))
GROUP BY Продавцы.ФИО;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
poison-bla (08.06.2014)
  #7  
Старый 08.06.2014, 13:44
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
В Продажи надо бы еще добавить дату, без которой не выбрать данные за месяц. И при такой формуле расчета, вам не нужна таблица Товары.
Для Акцеса вот такой заросец выходит:
Код:
SELECT Продавцы.ФИО, Count(Продажи.[Дата]) AS Продаж, 
             1500+1500*Switch(Продаж>=1000,0.5, 
                                              Продаж Between 999 And 500, 0.25,
                                              Продаж Between 499 And 100, 0.05,
                                              Продаж Between 99 And 0, 0) AS ЗП, 
             [ЗП]-[ЗП]/100*3.6-[ЗП]/100*15 AS Итого
FROM (Продавцы INNER JOIN Продажи ON Продавцы.Код = Продажи.КодПродавца) INNER JOIN Товары ON Продажи.КодТовара = Товары.Код
WHERE (((Month([Дата]))=6))
GROUP BY Продавцы.ФИО;
А какие компоненты должны быть в таком случае на форме и куда именно вписывать этот запрос?
Ответить с цитированием
  #8  
Старый 08.06.2014, 16:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от poison-bla
А какие компоненты должны быть в таком случае на форме и куда именно вписывать этот запрос?
Например компоненты ADOConnection (для подключения к движку базы данных), ADOQuery (для вписывания текста запроса и получения по нему данных), DataSource (для связывания с элементами отображения данных) и DBGrid (для отображения данных).
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
poison-bla (08.06.2014)
  #9  
Старый 08.06.2014, 19:13
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Спасибо за помощь, запрос работает. Только вот не совсем так как мне нужно. За продажу он считает 1 запись в таблице.
Например: Петров за один раз продал 5 холодильников, и ему зачлось это за одну продажу, а должно было за 5.
Как это исправить?
И еще, вот эта строка указывает месяц? WHERE (((Month([date]))=6))
А возможно ли сделать так, чтобы пользователь сам выбирал за какой месяц ему нужны сведения?
Ответить с цитированием
  #10  
Старый 08.06.2014, 19:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от poison-bla
И еще, вот эта строка указывает месяц? WHERE (((Month([date]))=6))
А возможно ли сделать так, чтобы пользователь сам выбирал за какой месяц ему нужны сведения?
Просто подставляй в тексте запроса вместо 6 нужный месяц.
Или же используя параметры - в тексте запроса пишешь так:
Код:
WHERE (((Month([date]))=:param1))
А в исходнике пишешь так:
Код:
  ADOQuery1.Parameters.ParamByName('param1').Value := XXX; // XXX здесь номер месяца который выбрал пользователь
Ответить с цитированием
  #11  
Старый 09.06.2014, 15:17
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Пишу вот так на кнопке:
Код:
begin
Form1.ADOQuery1.Parameters.ParamByName('param1').Value:=Edit1.Text;
end;
Перед или после этой строки надо что-нибудь еще писать? Все запускается, ошибки не выскакивают, но и не работает ничего)
Ответить с цитированием
  #12  
Старый 10.06.2014, 11:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от poison-bla
Пишу вот так на кнопке:
Код:
begin
Form1.ADOQuery1.Parameters.ParamByName('param1').Value:=Edit1.Text;
end;
Перед или после этой строки надо что-нибудь еще писать? Все запускается, ошибки не выскакивают, но и не работает ничего)
Параметры применяются в момент выполнения запроса, после выполнения запроса изменение параметров уже ничего не даст.
Т.е. нужно делать как-то так:
Код:
begin
  Form1.ADOQuery1.Close; // Закрываем выборку если она уже была открыта
  Form1.ADOQuery1.Parameters.ParamByName('param1').Value := Edit1.Text; // Устанавливаем новый параметр
  Form1.ADOQuery1.Open; // Выполняем запрос с новым параметром
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
poison-bla (10.06.2014)
  #13  
Старый 11.06.2014, 13:13
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

А подскажите, пожалуйста, как переписать этот запрос на кнопку?
Код:
SELECT Продавцы.ФИО, Count(Продажи.[Дата]) AS Продаж, 
             1500+1500*Switch(Продаж>=1000,0.5, 
                                              Продаж Between 999 And 500, 0.25,
                                              Продаж Between 499 And 100, 0.05,
                                              Продаж Between 99 And 0, 0) AS ЗП, 
             [ЗП]-[ЗП]/100*3.6-[ЗП]/100*15 AS Итого
FROM (Продавцы INNER JOIN Продажи ON Продавцы.Код = Продажи.КодПродавца) INNER JOIN Товары ON Продажи.КодТовара = Товары.Код
WHERE (((Month([Дата]))=6))
GROUP BY Продавцы.ФИО;
[/quote]
Ответить с цитированием
  #14  
Старый 11.06.2014, 14:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от poison-bla
А подскажите, пожалуйста, как переписать этот запрос на кнопку?
Что значит "переписать этот запрос на кнопку"? Кнопки SQL-запросы не поддерживают.
Сначала нужно текст этого запроса поместить в какой-нибудь ADOQuery (через свойство SQL) и потом его открыть (методом Open).
Ответить с цитированием
  #15  
Старый 11.06.2014, 14:58
poison-bla poison-bla вне форума
Прохожий
 
Регистрация: 17.05.2013
Сообщения: 28
Версия Delphi: Delphi 7, XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Что значит "переписать этот запрос на кнопку"? Кнопки SQL-запросы не поддерживают.
Сначала нужно текст этого запроса поместить в какой-нибудь ADOQuery (через свойство SQL) и потом его открыть (методом Open).
Ну пишут же как то через ADOQuery.SQL.Add('')
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter