Имя: Пароль:
1C
1C 7.7
v7: Обработка ошибок при работе с Mysql
,
0 popoff17
 
10.11.13
03:51
Здравствуйте!
Из 1с я загружаю данные на сайт, в бд Mysql, посредством внешней обработки. смысл такой:
я в цикле читаю по очереди всю номенклатуру и на каждой позиции посылаю запрос на внесение.
Есть момент, что данные уже присутствуют, тогда обработка выдаст ошибку и цикл прервется.
вот код внесения в базу:
СтрЗапроса1="insert into `olntp_virtuemart_categories` (`virtuemart_category_id`, `virtuemart_vendor_id`, `published`)VALUES('"+ГруппаКод+"', '1', '1')";
Table=conn.execute(СтрЗапроса1);
если такая запись уже есть в бд, то появляется ошибка о дублировании и цикл обрывается.
Подсажите, как правильно обработать запрос, чтобы при возникновении ошибки цикл не обрывался, а переходил на следующую итеррацию?
1 КонецЦикла
 
10.11.13
04:22
INSERT INTO ХХХ VALUES ('как', 'жить')
ON DUPLICATE KEY UPDATE Key = 'так'
2 КонецЦикла
 
10.11.13
04:22
3 popoff17
 
10.11.13
05:38
хороший пример, спасибо, но тут есть нюанс:
в поле id таблицы mysql (автоинкремент) я вношу код номенклатуры. Соответственно если я буду обрабатывать таким образом - будет рассинхронизация данных.
хотелось бы чтобы выглядело как то так:

Цикл
#получаю номенклатуру, объявляю переменные
СтрЗапроса1="insert into `olntp_virtuemart_categories` (`virtuemart_category_id`, `virtuemart_vendor_id`, `published`)VALUES('"+ГруппаКод+"', '1', '1')";
Table=conn.execute(СтрЗапроса1);

#тут условие: если Table прошло без ошибок - следующая итеррация, если с ошибкой - Сообщить код.
конецЦикла
4 kokamoonga
 
10.11.13
07:16
(0) ловить исключения только.

Если нет необходимости обрабатывать исключение можно использовать синтаксис с IGNORE, тогда MySql втихую проигнорирует эту строку в случае ошибки

Если по исключению нужно производить какие-то манипуляции тогда см. выше.
5 popoff17
 
10.11.13
07:35
(4) а про IGNORE можно подробнее? это как (1) предложил, в запросе пишется?
6 kokamoonga
 
10.11.13
07:40
(5) http://dev.mysql.com/doc/refman/5.6/en/insert.html

официальная документация умеет подробности лучше чем я
7 kokamoonga
 
10.11.13
07:41
INSERT IGNORE INTO <далее везде>
8 КонецЦикла
 
10.11.13
13:29
Типа Попытка - Исключение :)
Можно рано или поздно нарваться на грабли
Лучше подумать...

(3) Какая рассинхронизация?
У тебя если ругается на вставку не уникального ключа - значит его не апдейть :)
В (1) сбивающий с толку пример, смотри статью
9 popoff17
 
10.11.13
20:28
(8) рассинхронизация: вся номенклатура отслеживается же по коду (в 1с) и по ID (в mysql). Чтобы они были одинаковыми и в йс и в бд. Дело то вот в чем:
В бд id имеен тип int, а в 1с код имеет тип string,
т.е. если в 1с 01 и 001 - это разные коды, то в mysql это один и тот же - 1.
соответственно, если я циклом прохожу по всей номенклатуре, ситуация сейчас выглядит так:
01 вносится в бд, следующая итеррация........ встречаем 001, пытаемся внести в бд, получаем ошибку и цикл обрывается.
Вот мне обрыва и надо избежать, а сделать чтобы при ошибке цикл переходил на следующую итеррацию, сообщив о "дубляже", чтобы его в 1с изменить уже и таки импортировать...
Обратного импорта из mysql в 1с нет и не будет, так что тут без комментариев.

за помощь спасибо! Я посмотрю сейчас про IGNORE, но если есть чем дополнить - буду благодарен!
10 Злой Бобр
 
10.11.13
22:33
(0)(9) Фигней занимаетесь. Заведи в 1С реквизит "КодMySQL" к примеру. Настрой при вводе нового увеличивать на 1. Один раз синхронизируй и забудь.
Более того можешь завести константу или в справочник ложить последний код синхронизации. Тогда при следующей синхронизации тупо пишешь коды больше сохраненного. И запросом выбрать только новые удобней, и можно сразу пачкой вводить.
Ну и т.д. Вариантов упорядочить ваш мазохизм куча. Но если так и задумано то sorry.
11 КонецЦикла
 
10.11.13
22:35
(9) Непреодолимое препятствие, конечно :)))
Хорошо что в MySQL не двоичные данные...
12 kokamoonga
 
10.11.13
23:13
(9) вот после такого описания весь предыдущий тред можно смело игнорировать.

у тебя очевидно проблема не с кодом и не с технологией, а с дизайном приложения.

либо слушай (10),  либо обратный вариант синхронизироваться по коду из 1С, то есть доп. колонку в базе MySql. чтобы избежать глупостей с преобразованием типов и прочим.

Я для себя в свое время принял, что наиболее вменяемый способ синхронизации - по артикулу. Это уникальный реквизит и в мускуле и в 1с. Он не зависит от автоинкрементов и прочих особенностей платформ, ибо это строка букв и цифр из реального мира, привязанная к конкретному товару.
13 Злой Бобр
 
11.11.13
02:47
(12) Артикул вовсе не уникален. Как собственно и штрих-код. Так артикулы разных товаров могут совпасть. А на одном штрих-коде может быть один товар но например разного цвета. Так что нестоит так категорично об этом говорить.
14 kokamoonga
 
11.11.13
06:56
(13) я говорю о конкретной реализации -  у себя:)

У нас артикулы уникальны. За счет преффиксов.

Поскольку артикул как реквизит есть в любой или почти в любой конфигурации и также почти в любом движке интернет-магазина это всего лишь означает, что не нужно вводить лишних сущностей.

Я возможно не совсем внятно выразился. Я имел в виду, что не очень удачная идея привязываться к pk из разных баз данных. Это мое субъективное мнение.
Основная теорема систематики: Новые системы плодят новые проблемы.