Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос на изменение (Access) 
V
    Опции темы
icepro
Дата 25.4.2009, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



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

пр1 2%
пр2 5%
пр3 10%
       1%

а вторая содержит товары цены и производителей

тов1 пр1 100
тов2 пр1 500
тов3 пр2 1000
тов4 пр3 200
тов5        300
тов6        500

подразумевается что в первой таблице для производителей пр1, пр2, пр3 указны проценты на сколько нужно уменьшить цену товаров этих производителей во второй таблице, та строка где нет производителя подразумевает что эта скидка действует для товаров у которых не указан производитель. мои действия: я заношу значения в первую таблицу, и должен во второй таблице уменьшит цену на указанный процент, делаю это например раз в месяц. подскажите как лучше организовать запрос на выполнение этих действий. заранее спасибо!
PM MAIL   Вверх
Gluttton
Дата 26.4.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Можно попробовать подменить обновление созданием новой таблицы и удалением текущей.
При этом к имени создаваемой таблицы можно было бы добавлять суффикс с различной смысловой нагрузкой (например о дате проведения операции).


Это сообщение отредактировал(а) Gluttton - 26.4.2009, 00:40


--------------------
Слава Україні!
PM MAIL   Вверх
Gluttton
Дата 26.4.2009, 00:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Упс... что то не то нажал  smile Будет два сообщения.

Тогда для БД из двух таблиц:

user posted image

user posted image

Со следующими тестовыми данными:

user posted image

user posted image

Можно было бы применить такие запросы:

1. Создающий новую таблицу с информацией о продукции (со структурой, аналогичной таблице с текущими данными).

Код

CREATE TABLE [Продукция_25_04_2009]
(
    [Товар] INT,
    [Цена] MONEY,
    [Производитель] INT
)


2. Заполняющий новую таблицу обновленными данными (для не NULL Производителей).

Код

INSERT INTO Продукция_25_04_2009 ( Товар, Цена, Производитель )
SELECT DISTINCT 
    НП.Товар, 
    НП.Цена-НП.Цена*Скидки.Скидка/100 AS Цена,    
    НП.Производитель
FROM Продукция_01_01_2009 AS НП, Скидки
    WHERE НП.Производитель=Скидки.Производитель;


3. Заполняющий новую таблицу обновленными данными (для NULL Производителей).

Код

INSERT INTO Продукция_25_04_2009 ( Товар, Цена, Производитель )
SELECT DISTINCT 
    НП.Товар, 
    НП.Цена-НП.Цена*Скидки.Скидка/100 AS Цена,    
    НП.Производитель
FROM Продукция_01_01_2009 AS НП, Скидки
    WHERE НП.Производитель IS NULL
    AND Скидки.Производитель IS NULL;


И в результате мы бы получили новую таблицу со следующими данными:

user posted image

smile

P.S.

+ В качестве бонуса получаем самодокументируемый backup smile.
- Если в БД есть связи (а я так догадываюсь они есть) необходимо добавить ещё два запроса на удаление связи со "старой" таблицей и установку с "новой".
- Процесс не до конца автоматизированый, т.к. нужно руками лезть в запрос и менять название "старой" и "новой" таблиц.

Это сообщение отредактировал(а) Gluttton - 26.4.2009, 10:33


--------------------
Слава Україні!
PM MAIL   Вверх
icepro
Дата 26.4.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Супер дружище! Помог очень! Только ты прав, связь есть, и связь с мускулом(( Не подскажешь как поменять связь... или может просто создать еще одни запрос который бы из новой таблицы без связи гнал данные в таблицу со связью??
PM MAIL   Вверх
Gluttton
Дата 26.4.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата

Только ты прав, связь есть, и связь с мускулом((


Чесно говоря, сталкиваться не приходилось.

Вот здесь:

Цитата

- Если в БД есть связи (а я так догадываюсь они есть) необходимо добавить ещё два запроса на удаление связи со "старой" таблицей и установку с "новой".


Я имел в виду наличие в БД внешних ключей. (По логике, для приведенного мною примера Производитель из таблицы Продукция, мог бы быть внешним ключем поля Производитель таблицы Скидки). И тогда после проведения операции псевдо-обновления нужно было бы удалить внешний ключ в "старой" таблице (хотя это и не обязательно если не удалять саму таблицу) и создать внешний ключ в "новой" таблице.

Цитата

Не подскажешь как поменять связь...


Если речь идет о внешних ключах, то подскажу (только детальней опиши БД).

Цитата

или может просто создать еще одни запрос который бы из новой таблицы без связи гнал данные в таблицу со связью


Наличие органичений (внешних ключей, если о них был вопрос) на запрос не влияют. Запрос остается таким каким и был. Внешние ключи обеспечивают ссылочную целосность (тут пару дней назад "красный" топик на эту тему был smile ).

Если данные "перегоняются" MySQL выполнением запроса, то всё, что нужно делать это в том запросе менять (уточнять) имя таблицы с ценами на текущую (т.е. если делать как я говорил и использовать суффиксы). А можно вообще после создания новой таблицы удалить старую, а потом новую переименовать в имя старой, тогда вообще должно быть счастье  smile .

P.S. Жди понедельника - народ подтянеться, может что лучшее подскажут (т.к. приведённый мною способ своеобразный  smile ).

Это сообщение отредактировал(а) Gluttton - 26.4.2009, 14:44


--------------------
Слава Україні!
PM MAIL   Вверх
icepro
Дата 26.4.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



а можно без новой таблицы обойтись? править значения прямо в старой?

и поясни пожалуйста механику запроса, ну тоесть как работает

Код

INSERT INTO Продукция_25_04_2009 ( Товар, Цена, Производитель )
SELECT DISTINCT 
    НП.Товар, 
    НП.Цена-НП.Цена*Скидки.Скидка/100 AS Цена,    
    НП.Производитель
FROM Продукция_01_01_2009 AS НП, Скидки
    WHERE НП.Производитель=Скидки.Производитель;

PM MAIL   Вверх
icepro
Дата 26.4.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



хотя подожди, по поводу запроса я понял, получается так:
стандартная форма запроса на вставку ИНСЕРТ ИНТО таблица (поля) ВЕЛЬЮЗ (значения), но это из мускула а тут по ходу слово ВЕЛЬЮЗ не нада и типа вставляет то что вернул запрос выборки, так?

а по поводу таблиц думаю может действительно делать не ИНСЕРТ в новую а АПДЕЙТ в старую?

Это сообщение отредактировал(а) icepro - 26.4.2009, 17:04
PM MAIL   Вверх
Gluttton
Дата 26.4.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата

а можно без новой таблицы обойтись? править значения прямо в старой?


В общем случае можно, но в данном конкретном случае у меня не получилось. Поэтому я всю эту свистопляску и предложил smile .

Цитата

и поясни пожалуйста механику запроса, ну тоесть как работает


Для начала читаем здесь:
Про INSERT в Access
Если вопросы остануться отвечу smile .

Кстати проблема обновления в существующей таблице (для меня) заключается в невозможности подстановки тела этого оператора SELECT 
Код

SELECT DISTINCT 
    НП.Товар, 
    НП.Цена-НП.Цена*Скидки.Скидка/100 AS Цена,    
    НП.Производитель
FROM Продукция_01_01_2009 AS НП, Скидки
    WHERE НП.Производитель=Скидки.Производитель;

в инструкцию UPDATE

Про UPDATE в Access.



--------------------
Слава Україні!
PM MAIL   Вверх
icepro
Дата 26.4.2009, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



ага, так если не получается с апдетом, то как же я тогда в тсарую таблицу вкину данные из новой, это же тоже апдейт будет... есть мысли?
PM MAIL   Вверх
Gluttton
Дата 26.4.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата

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


Если наименование товара - первичный ключ, то не выйдет, если ключ сурогатный (а оно наверное так и  есть), то можно попробовать. Но тогда необходимо удалить старые данные (что бы таблицу вернуть в корректное состояние), а для того что бы отличать старые данные от новых необходимо ввсести дополнительное поле. Хотя при условии, что отрицательных скидок не бывает, можно удалять старые значения как такие, какие иеют большую цену. Для более конкретного разговора рекомендую выложить структуру БД.


--------------------
Слава Україні!
PM MAIL   Вверх
icepro
Дата 26.4.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



наименование не первичный, первичный ключ ИД, а структура таже что и у тебя...
слушай а в Акцесе есть циклы?
PM MAIL   Вверх
icepro
Дата 26.4.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



слушай а можно хоть макросом как то, только что б не КопироватьОбъект, а то я так понял если использовать эту команду и копировать таблицы то одна заменит другую, а мне так нельзя потому как старая связано с мускулом..
PM MAIL   Вверх
Gluttton
Дата 26.4.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата

наименование не первичный, первичный ключ ИД, а структура таже что и у тебя...
слушай а в Акцесе есть циклы?


Нет (декларативный язык - говоришь не "как делать", а "что сделать").

Цитата

слушай а можно хоть макросом как то, только что б не КопироватьОбъект, а то я так понял если использовать эту команду и копировать таблицы то одна заменит другую, а мне так нельзя потому как старая связано с мускулом..


Можно:
1. Создаем новую временную таблицу.
Код

CREATE TABLE [Temp]
(
    [Товар] INT,
    [Цена] MONEY,
    [Производитель] INT,
    [ИД] AUTOINCREMENT PRIMARY KEY
)


2. Заполняем ее обновленными данными.
Код

INSERT INTO Temp(Товар, Цена, Производитель)
SELECT DISTINCT 
    П.Товар, 
    П.Цена-П.Цена*С.Скидка/100 AS Цена,    
    П.Производитель
FROM Продукция AS П, Скидки AS С
    WHERE П.Производитель=С.Производитель;


и

Код

INSERT INTO Temp(Товар, Цена, Производитель)
SELECT DISTINCT 
    П.Товар, 
    П.Цена-П.Цена*С.Скидка/100 AS Цена,    
    П.Производитель
FROM Продукция AS П, Скидки AS С
    WHERE П.Производитель IS NULL
    AND С.Производитель IS NULL;


3. Удаляем старую таблицу.
Код

DROP TABLE Продукция;


4. Создаем таблицу с именем старой.
Код

CREATE TABLE [Продукция]
(
    [Товар] INT,
    [Цена] MONEY,
    [Производитель] INT,
    [ИД] AUTOINCREMENT PRIMARY KEY
)


5. Копируем в нее временную.
Код

INSERT INTO Продукция(Товар, Цена, Производитель)
SELECT DISTINCT 
    T.Товар, 
    T.Цена,    
    T.Производитель
FROM Temp AS T;


6. Удаляем временную таблицу.
Код

DROP TABLE Temp;


P.S. 
1. Перед удалением старой таблицы (п. 3) и после создания новой (п. 4) необходимо удалять и создавать соответственно ограничения (внешние ключи), если таковые имеються. 
2. Использовать в качестве первичного ключа ID производителя, а в запросе проводить идентификацию по их наименованию - потенциально опасная конструкция, т.к. может получиться (это не запрещено на уровне СУБД), что один и тот же производитель пожет быть внесен в БД несколько раз под разными ID!

Это сообщение отредактировал(а) Gluttton - 26.4.2009, 20:10


--------------------
Слава Україні!
PM MAIL   Вверх
icepro
Дата 26.4.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



тут вылазит проблемка, таблица со связью, если ее удалить то связь к серваку тоже будет потеряна... ща пробую делать через VBA
PM MAIL   Вверх
icepro
Дата 26.4.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



вот оно!!! решение!!!
Код

    Application.DoCmd.RunSQL "DELETE Временная_товары.id, Временная_товары.Товар, Временная_товары.Производитель, Временная_товары.Цена FROM Временная_товары;"
    Application.DoCmd.RunSQL "INSERT INTO Временная_товары ( id, Товар, Производитель, Цена ) SELECT DISTINCT НП.id, НП.Товар, НП.Производитель, НП.Цена-НП.Цена*Производители.Скидка/100 AS Цена FROM Товары AS НП, Производители WHERE НП.Производитель=Производители.Производитель;"
    Application.DoCmd.RunSQL "INSERT INTO Временная_товары ( id, Товар, Производитель, Цена ) SELECT DISTINCT НП.id, НП.Товар, НП.Производитель, НП.Цена-НП.Цена*Производители.Скидка/100 AS Цена FROM Товары AS НП, Производители WHERE НП.Производитель Is Null And Производители.Производитель Is Null;"
    Application.DoCmd.RunSQL "UPDATE Товары, Временная_товары SET Товары.Цена = Временная_товары.Цена WHERE Товары.id = Временная_товары.id;"

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.