Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Помогите реализовать перенос данных между таблицами. (число прочтений - 1984 )
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Помогите реализовать перенос данных между таблицами.
14. Октября 2008 :: 07:37
Печать  
Задал вопрос на sql.ru, но там что то никто не хочет помочь. Попытаю счастья у вас, тем паче уже не раз выручали. Вот вопрос: http://sql.ru/forum/actualthread.aspx?tid=604322.

Общий смысл задачи вот в чем: есть 1С БД, есть POS-терминалы. таблица А - кассы, таблица Б - номенклатура (условно, потому как не только номенклатура). В таблицу Б пишет 1С, новые или измененные элементы стоят с признаком new. т.е. изменили товарную позицию - ее надо выгрузить на все касса (таблица А). Для этого надо подготовить таблицу В куда прописать для какой кассы и какой товар. Думется мне нужен курсор, но сними никогда не работал. Да и не уверен что он подойдет, так как надо сделать SELECT к 2-м несвязанным таблицам и произвести запись в третью. Может есть какие идеи?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите реализовать перенос данных между таблицами.
Ответ #1 - 14. Октября 2008 :: 07:52
Печать  
Непойму зачем здесь курсор?

Код
Выбрать все
Begin tran

insertr into В (id, data) (Select a.id, б.id + ';'+б.name from a, б where б.new = 1)

update б Set new = 0

commit
 



В общем случае так, могу гдето с синтаксисом наврать и с конвертацией типов данных нужно уточнить
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите реализовать перенос данных между таблицами.
Ответ #2 - 14. Октября 2008 :: 08:16
Печать  
только на update наложить более строгое условие
Код
Выбрать все
update б Set new = 0 where new = 1
 

  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Помогите реализовать перенос данных между таблицами.
Ответ #3 - 14. Октября 2008 :: 08:26
Печать  
Как все просто  Ужас.

Спасибо большое.

Но вот наводящий вопрос: пока хранимая процедура будет писать в таблицу В, 1С может записать новый элемент в таблицу Б с признаком new=1. Что произойдет? Останется ли это элемент с признаком new=1 для следующей обработки или будет просто установлен признак new=0?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите реализовать перенос данных между таблицами.
Ответ #4 - 14. Октября 2008 :: 08:39
Печать  
zenik писал(а) 14. Октября 2008 :: 08:26:
Как все просто  Ужас.

Спасибо большое.

Но вот наводящий вопрос: пока хранимая процедура будет писать в таблицу В, 1С может записать новый элемент в таблицу Б с признаком new=1. Что произойдет? Останется ли это элемент с признаком new=1 для следующей обработки или будет просто установлен признак new=0?

Возможны  варианты :
1  нужен блокирующий объект  
2 вариант
Код
Выбрать все
Begin tran
update б Set new = 2 where new = 1
insert into В (id, data) (Select a.id, б.id + ';'+б.name from a, б where б.new = 2)
update б Set new = 0 where new = 2
commit
 


3 вариант  ( мне нравиться больше всего ) добавить в таблицу б
время установки в 1 ( время серверное )
и тогда сначала находим текущ время и добавляем условие
что время меньше текушего в select и в update.

  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Помогите реализовать перенос данных между таблицами.
Ответ #5 - 14. Октября 2008 :: 08:49
Печать  
zenik писал(а) 14. Октября 2008 :: 08:26:
Как все просто  Ужас.

Спасибо большое.

Но вот наводящий вопрос: пока хранимая процедура будет писать в таблицу В, 1С может записать новый элемент в таблицу Б с признаком new=1. Что произойдет? Останется ли это элемент с признаком new=1 для следующей обработки или будет просто установлен признак new=0?


Вообще так вот по идее эта проблема должна устранятся:

Код
Выбрать все
Begin tran

insertr into В (id, data) (Select a.id, б.id + ';'+б.name from a, б (TABLOCKX HOLDLOCK) where б.new = 1)

update б Set new = 0 where new = 1

commit 

  
Наверх
ICQ  
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Помогите реализовать перенос данных между таблицами.
Ответ #6 - 14. Октября 2008 :: 09:01
Печать  
А мне больше понравился вариант 2. Возни меньше. Таблиц Б много. А второй потребует только увеличения размера поля new с bit на что нить побольше.

Еще раз всем спасибо.
  
Наверх
 
IP записан
 
zenik
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 109
Зарегистрирован: 09. Октября 2007
Re: Помогите реализовать перенос данных между таблицами.
Ответ #7 - 14. Октября 2008 :: 09:04
Печать  
2 Nick

Не с блокировками пока связываться не буду. Это надо понимать их смысл, что бы потом отлавливать баги. Вариант с заменой значения от Z1 мне по душе. Визуально можно отследить, что происходит.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать