Для того чтобы организовать торговлю в Интернет-магазине компании потребуется наличие всего одного Менеджера, контролирующего процесс автоматической работы магазина как из офиса компании, так и из любого места в Сети.
Каталог прайсов интернет магазинов - разместите свой прайс бесплатно
  Главная  |    О компании  |    Новости  |    Статьи  |    Форум  |    Клиенты  |    Обратная связь  |    Карта сайта
Добро пожаловать, Гость. Для того, чтобы отвечать на сообщения и создавать новые темы, Вам необходимо зарегистрироваться, если Вы уже зарегистрированы, то войдите используя Ваши E-Mail и Пароль.
Запомнить
Пароль
   
Форум
 Программа iNETsHOP » Работа с программой
        Импорт товаров из yml для маркета Яндекса
Первая страница 1 2 » Последняя страница
Импорт товаров из yml для маркета Яндекса

05.05.2016 23:39

foxit


Пользователь iNETsHOP

Количество сообщений   5
Зарегистрирован:   04-05-2016, 02:27:16
Перенос каталога товаров с сайта в программу
Если в интернет-магазине есть выгрузка товаров в формате Яндекс-маркет, можно перенести сразу всю структуру категорий, товары и характеристики в базу данных программы из него?
Пользователь оффлайн Распечатать
 

06.05.2016 11:01

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Импорт товаров из файла YML
Как вариант можем предложить SQL-скрипт для импорта стандартного файла YML (стандартной структуры) которая соответствует спецификации Яндекс-Маркет. Этот скрипт импортирует структуру категорий, товары, характеристики. Так как файлы такого формата часто создаются с ошибками: неверно формируется название товара или вообще может отсутствовать и его нужно создавать из типа товара, бренда и артикула, так же может быть неверное оформление структуры категорий и даже не соответствие правилам создания XML. Перед импортом обратитесь в службу поддержки и пришлите файл который необходимо импортировать, мы проверим его соответствие формату Яндекс-Маркет и при необходимости переделаем скрипт импорта для вас.

Код

declare @xml xml
declare @idoc int
declare @FileName varchar(2000);
SET @FileName = 'C:\TEXP\price_yml.xml';

DECLARE
@SQL nvarchar(4000),
@SQL_Params nvarchar(4000);

--SET @SQL = 'SELECT @xml = CONVERT(xml, BulkColumn, 2) FROM OPENROWSET (BULK N''' + @FileName + ''', SINGLE_CLOB) [rowsetresults]';
SET @SQL = 'DECLARE @text varchar(MAX);';
SET @SQL = @SQL + ' SELECT @text = a FROM OPENROWSET (BULK N''' + @FileName + ''', SINGLE_CLOB) as result(a);'
SET @SQL = @SQL + ' SELECT @text = LTRIM(@text);';
--SET @SQL = @SQL + ' SELECT @text = RIGHT(@text, LEN(@text) - CHARINDEX(''<?xml'', @text) + 1);';
SET @SQL = @SQL + ' IF CHARINDEX(''<?xml'', @text)<>1 SELECT @text = RIGHT(@text, LEN(@text) - CHARINDEX(''<?xml'', @text) + 1);';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''\"'', ''"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''cp1251'', ''WINDOWS-1251'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''encoding="utf8"'', ''encoding="utf-8"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''encoding=''''utf8'''''', ''encoding=''''utf-8'''''');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''parentID'', ''parentId'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''&#34;'', ''"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(7), '' '');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(31), '' '');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(1), '' '');';
SET @SQL = @SQL + ' IF CHARINDEX(''<company><![CDATA['', @text)=0 SELECT @text = REPLACE(REPLACE(@text, ''<company>'', ''<company><![CDATA[''), ''</company>'', '']]></company>'');'
SET @SQL = @SQL + ' SELECT @xml = CONVERT(xml, @text, 2);';

SET @SQL_Params = N'@xml xml output';

execute sp_executesql @stmt = @SQL, @params = @SQL_Params,
@xml = @xml output;

--SET @xml = REPLACE(CAST(@xml as varchar(MAX)), 'encoding=''cp1251''', 'encoding="WINDOWS-1251"');

EXEC sp_xml_preparedocument @idoc OUTPUT, @xml

DECLARE @TBL_GROUPS TABLE (GR_ID int, GR_PARENT_ID int, GR_NAME varchar(MAX), GR_FULL_NAME varchar(MAX));
DECLARE @TBL_GROUPS_FULL TABLE (GR_ID int, GR_FULL_NAME varchar(MAX));

INSERT INTO @TBL_GROUPS (GR_ID, GR_PARENT_ID, GR_NAME)
SELECT distinct gr.*
FROM OPENXML (@idoc, N'/yml_catalog/shop/categories/category')
WITH (
categoryID int '@id',
parentId int '@parentId',
name nvarchar(600) 'text()'
) gr
WHERE not categoryID is null and not name is null;

update @TBL_GROUPS
set GR_PARENT_ID = null
where not GR_PARENT_ID in (select GR_ID from @TBL_GROUPS)
or GR_ID = GR_PARENT_ID;

WITH tree (data, id, level, pathstr)
AS (
SELECT GR_NAME, GR_ID, 0, CAST('' AS VARCHAR(MAX))
FROM @TBL_GROUPS
WHERE GR_PARENT_ID IS NULL

UNION ALL

SELECT GR_NAME, GR_ID, t.level + 1,
case when t.level = 0 then t.data + t.pathstr +' > '+ V.GR_NAME
else t.pathstr +' > '+ V.GR_NAME
end
FROM @TBL_GROUPS V
INNER JOIN tree t
ON (IsNull(t.id, 0) = IsNull(V.GR_PARENT_ID, 0))/* and t.level < 20*/)
INSERT INTO @TBL_GROUPS_FULL (GR_ID, GR_FULL_NAME)
SELECT /*SPACE(level*5) + data as data, */id, /*level, */case when IsNull(pathstr, '') = '' then data else pathstr end
FROM tree
ORDER BY case when IsNull(pathstr, '') = '' then data else pathstr end, id;

DECLARE @GR_ID int, @iGR_PARENT_ID int, @GR_NAME varchar(400);
DECLARE cGroups CURSOR LOCAL FOR
select GR_ID, GR_PARENT_ID, GR_NAME from @TBL_GROUPS
;
SET IDENTITY_INSERT TBL_GROUPS ON;
OPEN cGroups;
FETCH NEXT FROM cGroups INTO @GR_ID, @iGR_PARENT_ID, @GR_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF NOT EXISTS (SELECT 1 FROM TBL_GROUPS WHERE GR_ID=@GR_ID)
BEGIN
INSERT INTO TBL_GROUPS (GR_ID, GR_PARENT_ID, GR_NAME) VALUES (@GR_ID, @iGR_PARENT_ID, @GR_NAME);
END;
FETCH NEXT FROM cGroups INTO @GR_ID, @iGR_PARENT_ID, @GR_NAME;
END;
SET IDENTITY_INSERT TBL_GROUPS OFF;
CLOSE cGroups;
DEALLOCATE cGroups;

DECLARE @GT_ID int, @B_ID int;
DECLARE @G_ID varchar(400), @G_NAME varchar(400), @G_URL varchar(400), @G_GR_ID int, @B_NAME varchar(400), @G_IMAGE_URL varchar(400), @G_DESC_FULL varchar(max), @G_MODEL varchar(100), @G_SID varchar(100), @GT_NAME varchar(100);
DECLARE cGoods CURSOR LOCAL FOR
SELECT
G_ID,
LTRIM(RTRIM(ISNULL(G_NAME, ''))),
LTRIM(RTRIM(ISNULL(G_URL, ''))),
G_GR_ID,
LTRIM(RTRIM(ISNULL(B_NAME, ''))),
LTRIM(RTRIM(ISNULL(G_IMAGE_URL, ''))),
G_DESC_FULL,
LTRIM(RTRIM(ISNULL(G_MODEL, ''))),
LTRIM(RTRIM(ISNULL(G_SID, ''))),
LTRIM(RTRIM(ISNULL(GT_NAME, '')))

FROM OPENXML (@idoc, N'/yml_catalog/shop/offers/offer')
WITH (
G_ID varchar(400) '@id',
G_NAME varchar(400) 'name/text()',
G_URL varchar(400) 'url/text()',
G_GR_ID int 'categoryId/text()',
B_NAME varchar(400) 'vendor/text()',
G_IMAGE_URL varchar(400) 'picture/text()',
G_DESC_FULL text 'description/text()',
G_MODEL varchar(100) 'model/text()',
G_SID varchar(100) 'vendorCode/text()',
GT_NAME varchar(100) 'typePrefix/text()'
) g
inner join @TBL_GROUPS_FULL gr on g.G_GR_ID = gr.GR_ID
where LTRIM(RTRIM(IsNull(G_NAME, ''))) <> ''
;
SET IDENTITY_INSERT TBL_GOODS ON;
OPEN cGoods;
FETCH NEXT FROM cGoods INTO @G_ID, @G_NAME, @G_URL, @G_GR_ID, @B_NAME, @G_IMAGE_URL, @G_DESC_FULL, @G_MODEL, @G_SID, @GT_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF NOT EXISTS (SELECT 1 FROM TBL_GOODS WHERE G_ID = @G_ID)
BEGIN
SET @GT_ID = Null;
IF @GT_NAME <> ''
BEGIN
SET @GT_ID = (SELECT GT_ID FROM TBL_GOODS_TYPES WHERE GT_NAME = @GT_NAME);
IF @GT_ID IS NULL
BEGIN
INSERT TBL_GOODS_TYPES (GT_NAME) VALUES (@GT_NAME);
SET @GT_ID = (SELECT GT_ID FROM TBL_GOODS_TYPES WHERE GT_NAME = @GT_NAME);
END;
END;

SET @B_ID = Null;
IF @B_NAME <> ''
BEGIN
SET @B_ID = (SELECT B_ID FROM TBL_BRANDS WHERE B_NAME = @B_NAME);
IF @B_ID IS NULL
BEGIN
INSERT TBL_BRANDS (B_NAME) VALUES (@B_NAME);
SET @B_ID = (SELECT B_ID FROM TBL_BRANDS WHERE B_NAME = @B_NAME);
END;
END;

INSERT INTO TBL_GOODS (G_ID, G_GR_ID, G_NAME, G_MODEL, G_B_ID, G_GT_ID, G_SID) VALUES (@G_ID, @G_GR_ID, @G_NAME, @G_MODEL, @B_ID, @GT_ID, @G_SID);
END;
FETCH NEXT FROM cGoods INTO @G_ID, @G_NAME, @G_URL, @G_GR_ID, @B_NAME, @G_IMAGE_URL, @G_DESC_FULL, @G_MODEL, @G_SID, @GT_NAME;
END;
SET IDENTITY_INSERT TBL_GOODS OFF;
CLOSE cGoods;
DEALLOCATE cGoods;

DECLARE @P_ID int, @PG_ID int;
DECLARE @P_NAME varchar(400), @PG_NAME varchar(400), @GP_VALUE varchar(max);
DECLARE cProps CURSOR LOCAL FOR
select
LTRIM(RTRIM(ISNULL(p.G_ID, ''))),
LTRIM(RTRIM(ISNULL(p.P_NAME, ''))),
LTRIM(RTRIM(ISNULL(p.PG_NAME, ''))),
LTRIM(RTRIM(ISNULL(p.GP_VALUE, ''))),
gr.GR_FULL_NAME
FROM OPENXML (@idoc, N'/yml_catalog/shop/offers/offer/param')
WITH (
G_ID varchar(400) '../@id',
P_NAME varchar(400) '@name',
PG_NAME varchar(400) '@group',
GP_VALUE varchar(8000) 'text()'
) p, TBL_GOODS g, TBL_GROUPS gr
WHERE p.G_ID = g.G_ID and g.G_GR_ID = gr.GR_ID
;
OPEN cProps;
FETCH NEXT FROM cProps INTO @G_ID, @P_NAME, @PG_NAME, @GP_VALUE, @GR_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF @P_NAME <> ''
BEGIN
SET @PG_ID = Null;
IF @PG_NAME <> ''
BEGIN
SET @PG_ID = (SELECT PG_ID FROM TBL_PROPS_GROUPS WHERE PG_NAME = @PG_NAME);
IF @PG_ID IS NULL
BEGIN
INSERT TBL_PROPS_GROUPS (PG_NAME) VALUES (@PG_NAME);
SET @PG_ID = (SELECT PG_ID FROM TBL_PROPS_GROUPS WHERE PG_NAME = @PG_NAME);
END;
END;

SET @P_ID = (SELECT P_ID FROM TBL_PROPS WHERE P_NAME = @P_NAME AND P_DESC = @GR_NAME AND ISNULL(P_PG_ID, -1) = ISNULL(@PG_ID, -1));
IF @P_ID IS NULL
BEGIN
INSERT TBL_PROPS (P_NAME, P_DESC, P_PG_ID) VALUES (@P_NAME, @GR_NAME, @PG_ID);
SET @P_ID = (SELECT P_ID FROM TBL_PROPS WHERE P_NAME = @P_NAME AND P_DESC = @GR_NAME AND ISNULL(P_PG_ID, -1) = ISNULL(@PG_ID, -1));
END;
IF NOT EXISTS(SELECT 1 FROM TBL_GOODS_PROPS WHERE GP_G_ID = @G_ID AND GP_P_ID = @P_ID)
BEGIN
INSERT INTO TBL_GOODS_PROPS (GP_G_ID, GP_P_ID, GP_VALUE) VALUES (@G_ID, @P_ID, @GP_VALUE);
END;
END;
FETCH NEXT FROM cProps INTO @G_ID, @P_NAME, @PG_NAME, @GP_VALUE, @GR_NAME;
END;
CLOSE cProps;
DEALLOCATE cProps;
Пользователь оффлайн Распечатать
 

03.11.2016 21:08

kamar87


Посетитель

Количество сообщений   4
Зарегистрирован:   02-11-2016, 09:01:05
Как сделать чтобы в наименование товара в начале добавлялось значение из <typePrefix></typePrefix>?

Так получится нормальное название товара, пример <typePrefix>Мультистайлер</typePrefix><vendor>Rowenta</vendor><model>CF4112F0</model> - Мультистайлер Rowenta CF4112F0

Сейчас так <vendor>Rowenta</vendor><model>CF4112F0</model> - Rowenta CF4112F0
Пользователь оффлайн Распечатать
 

03.11.2016 21:41

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Импорт каталога из файла (XML)YML
Тип товара из тега typePrefix импортируется в отдельный справочник типов товаров и хранится отдельно, для возможного последующего использования (например экспорта в YML). Чтобы добавить его в начало наименования товара можете воспользоваться следующим скриптом:
Код

declare @xml xml
declare @idoc int
declare @FileName varchar(2000);
SET @FileName = 'C:\TEXP\price_yml.xml';

DECLARE
@SQL nvarchar(4000),
@SQL_Params nvarchar(4000);

--SET @SQL = 'SELECT @xml = CONVERT(xml, BulkColumn, 2) FROM OPENROWSET (BULK N''' + @FileName + ''', SINGLE_CLOB) [rowsetresults]';
SET @SQL = 'DECLARE @text varchar(MAX);';
SET @SQL = @SQL + ' SELECT @text = a FROM OPENROWSET (BULK N''' + @FileName + ''', SINGLE_CLOB) as result(a);'
SET @SQL = @SQL + ' SELECT @text = LTRIM(@text);';
--SET @SQL = @SQL + ' SELECT @text = RIGHT(@text, LEN(@text) - CHARINDEX(''<?xml'', @text) + 1);';
SET @SQL = @SQL + ' IF CHARINDEX(''<?xml'', @text)<>1 SELECT @text = RIGHT(@text, LEN(@text) - CHARINDEX(''<?xml'', @text) + 1);';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''\"'', ''"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''cp1251'', ''WINDOWS-1251'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''encoding="utf8"'', ''encoding="utf-8"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''encoding=''''utf8'''''', ''encoding=''''utf-8'''''');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''parentID'', ''parentId'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''"'', ''"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(7), '' '');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(31), '' '');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(1), '' '');';
SET @SQL = @SQL + ' IF CHARINDEX(''<company><![CDATA['', @text)=0 SELECT @text = REPLACE(REPLACE(@text, ''<company>'', ''<company><![CDATA[''), ''</company>'', '']]></company>'');'
SET @SQL = @SQL + ' SELECT @xml = CONVERT(xml, @text, 2);';

SET @SQL_Params = N'@xml xml output';

execute sp_executesql @stmt = @SQL, @params = @SQL_Params,
@xml = @xml output;

--SET @xml = REPLACE(CAST(@xml as varchar(MAX)), 'encoding=''cp1251''', 'encoding="WINDOWS-1251"');

EXEC sp_xml_preparedocument @idoc OUTPUT, @xml

DECLARE @TBL_GROUPS TABLE (GR_ID int, GR_PARENT_ID int, GR_NAME varchar(MAX), GR_FULL_NAME varchar(MAX));
DECLARE @TBL_GROUPS_FULL TABLE (GR_ID int, GR_FULL_NAME varchar(MAX));

INSERT INTO @TBL_GROUPS (GR_ID, GR_PARENT_ID, GR_NAME)
SELECT distinct gr.*
FROM OPENXML (@idoc, N'/yml_catalog/shop/categories/category')
WITH (
categoryID int '@id',
parentId int '@parentId',
name nvarchar(600) 'text()'
) gr
WHERE not categoryID is null and not name is null;

update @TBL_GROUPS
set GR_PARENT_ID = null
where not GR_PARENT_ID in (select GR_ID from @TBL_GROUPS)
or GR_ID = GR_PARENT_ID;

WITH tree (data, id, level, pathstr)
AS (
SELECT GR_NAME, GR_ID, 0, CAST('' AS VARCHAR(MAX))
FROM @TBL_GROUPS
WHERE GR_PARENT_ID IS NULL

UNION ALL

SELECT GR_NAME, GR_ID, t.level + 1,
case when t.level = 0 then t.data + t.pathstr +' > '+ V.GR_NAME
else t.pathstr +' > '+ V.GR_NAME
end
FROM @TBL_GROUPS V
INNER JOIN tree t
ON (IsNull(t.id, 0) = IsNull(V.GR_PARENT_ID, 0))/* and t.level < 20*/)
INSERT INTO @TBL_GROUPS_FULL (GR_ID, GR_FULL_NAME)
SELECT /*SPACE(level*5) + data as data, */id, /*level, */case when IsNull(pathstr, '') = '' then data else pathstr end
FROM tree
ORDER BY case when IsNull(pathstr, '') = '' then data else pathstr end, id;

DECLARE @GR_ID int, @iGR_PARENT_ID int, @GR_NAME varchar(400);
DECLARE cGroups CURSOR LOCAL FOR
select GR_ID, GR_PARENT_ID, GR_NAME from @TBL_GROUPS
;
SET IDENTITY_INSERT TBL_GROUPS ON;
OPEN cGroups;
FETCH NEXT FROM cGroups INTO @GR_ID, @iGR_PARENT_ID, @GR_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF NOT EXISTS (SELECT 1 FROM TBL_GROUPS WHERE GR_ID=@GR_ID)
BEGIN
INSERT INTO TBL_GROUPS (GR_ID, GR_PARENT_ID, GR_NAME) VALUES (@GR_ID, @iGR_PARENT_ID, @GR_NAME);
END;
FETCH NEXT FROM cGroups INTO @GR_ID, @iGR_PARENT_ID, @GR_NAME;
END;
SET IDENTITY_INSERT TBL_GROUPS OFF;
CLOSE cGroups;
DEALLOCATE cGroups;

DECLARE @GT_ID int, @B_ID int;
DECLARE @G_ID varchar(400), @G_NAME varchar(400), @G_URL varchar(400), @G_GR_ID int, @B_NAME varchar(400), @G_IMAGE_URL varchar(400), @G_DESC_FULL varchar(max), @G_MODEL varchar(100), @G_SID varchar(100), @GT_NAME varchar(100);
DECLARE cGoods CURSOR LOCAL FOR
SELECT
G_ID,
LTRIM(RTRIM(ISNULL(G_NAME, ''))),
LTRIM(RTRIM(ISNULL(G_URL, ''))),
G_GR_ID,
LTRIM(RTRIM(ISNULL(B_NAME, ''))),
LTRIM(RTRIM(ISNULL(G_IMAGE_URL, ''))),
G_DESC_FULL,
LTRIM(RTRIM(ISNULL(G_MODEL, ''))),
LTRIM(RTRIM(ISNULL(G_SID, ''))),
LTRIM(RTRIM(ISNULL(GT_NAME, '')))

FROM OPENXML (@idoc, N'/yml_catalog/shop/offers/offer')
WITH (
G_ID varchar(400) '@id',
G_NAME varchar(400) 'name/text()',
G_URL varchar(400) 'url/text()',
G_GR_ID int 'categoryId/text()',
B_NAME varchar(400) 'vendor/text()',
G_IMAGE_URL varchar(400) 'picture/text()',
G_DESC_FULL text 'description/text()',
G_MODEL varchar(100) 'model/text()',
G_SID varchar(100) 'vendorCode/text()',
GT_NAME varchar(100) 'typePrefix/text()'
) g
inner join @TBL_GROUPS_FULL gr on g.G_GR_ID = gr.GR_ID
where LTRIM(RTRIM(IsNull(G_NAME, ''))) <> ''
;
SET IDENTITY_INSERT TBL_GOODS ON;
OPEN cGoods;
FETCH NEXT FROM cGoods INTO @G_ID, @G_NAME, @G_URL, @G_GR_ID, @B_NAME, @G_IMAGE_URL, @G_DESC_FULL, @G_MODEL, @G_SID, @GT_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF NOT EXISTS (SELECT 1 FROM TBL_GOODS WHERE G_ID = @G_ID)
BEGIN
SET @GT_ID = Null;
IF @GT_NAME <> ''
BEGIN
SET @G_NAME = @GT_NAME + ' ' + @G_NAME
SET @GT_ID = (SELECT GT_ID FROM TBL_GOODS_TYPES WHERE GT_NAME = @GT_NAME);
IF @GT_ID IS NULL
BEGIN
INSERT TBL_GOODS_TYPES (GT_NAME) VALUES (@GT_NAME);
SET @GT_ID = (SELECT GT_ID FROM TBL_GOODS_TYPES WHERE GT_NAME = @GT_NAME);
END;
END;

SET @B_ID = Null;
IF @B_NAME <> ''
BEGIN
SET @B_ID = (SELECT B_ID FROM TBL_BRANDS WHERE B_NAME = @B_NAME);
IF @B_ID IS NULL
BEGIN
INSERT TBL_BRANDS (B_NAME) VALUES (@B_NAME);
SET @B_ID = (SELECT B_ID FROM TBL_BRANDS WHERE B_NAME = @B_NAME);
END;
END;

INSERT INTO TBL_GOODS (G_ID, G_GR_ID, G_NAME, G_MODEL, G_B_ID, G_GT_ID, G_SID) VALUES (@G_ID, @G_GR_ID, @G_NAME, @G_MODEL, @B_ID, @GT_ID, @G_SID);
END;
FETCH NEXT FROM cGoods INTO @G_ID, @G_NAME, @G_URL, @G_GR_ID, @B_NAME, @G_IMAGE_URL, @G_DESC_FULL, @G_MODEL, @G_SID, @GT_NAME;
END;
SET IDENTITY_INSERT TBL_GOODS OFF;
CLOSE cGoods;
DEALLOCATE cGoods;

DECLARE @P_ID int, @PG_ID int;
DECLARE @P_NAME varchar(400), @PG_NAME varchar(400), @GP_VALUE varchar(max);
DECLARE cProps CURSOR LOCAL FOR
select
LTRIM(RTRIM(ISNULL(p.G_ID, ''))),
LTRIM(RTRIM(ISNULL(p.P_NAME, ''))),
LTRIM(RTRIM(ISNULL(p.PG_NAME, ''))),
LTRIM(RTRIM(ISNULL(p.GP_VALUE, ''))),
gr.GR_FULL_NAME
FROM OPENXML (@idoc, N'/yml_catalog/shop/offers/offer/param')
WITH (
G_ID varchar(400) '../@id',
P_NAME varchar(400) '@name',
PG_NAME varchar(400) '@group',
GP_VALUE varchar(8000) 'text()'
) p, TBL_GOODS g, TBL_GROUPS gr
WHERE p.G_ID = g.G_ID and g.G_GR_ID = gr.GR_ID
;
OPEN cProps;
FETCH NEXT FROM cProps INTO @G_ID, @P_NAME, @PG_NAME, @GP_VALUE, @GR_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF @P_NAME <> ''
BEGIN
SET @PG_ID = Null;
IF @PG_NAME <> ''
BEGIN
SET @PG_ID = (SELECT PG_ID FROM TBL_PROPS_GROUPS WHERE PG_NAME = @PG_NAME);
IF @PG_ID IS NULL
BEGIN
INSERT TBL_PROPS_GROUPS (PG_NAME) VALUES (@PG_NAME);
SET @PG_ID = (SELECT PG_ID FROM TBL_PROPS_GROUPS WHERE PG_NAME = @PG_NAME);
END;
END;

SET @P_ID = (SELECT P_ID FROM TBL_PROPS WHERE P_NAME = @P_NAME AND P_DESC = @GR_NAME AND ISNULL(P_PG_ID, -1) = ISNULL(@PG_ID, -1));
IF @P_ID IS NULL
BEGIN
INSERT TBL_PROPS (P_NAME, P_DESC, P_PG_ID) VALUES (@P_NAME, @GR_NAME, @PG_ID);
SET @P_ID = (SELECT P_ID FROM TBL_PROPS WHERE P_NAME = @P_NAME AND P_DESC = @GR_NAME AND ISNULL(P_PG_ID, -1) = ISNULL(@PG_ID, -1));
END;
IF NOT EXISTS(SELECT 1 FROM TBL_GOODS_PROPS WHERE GP_G_ID = @G_ID AND GP_P_ID = @P_ID)
BEGIN
INSERT INTO TBL_GOODS_PROPS (GP_G_ID, GP_P_ID, GP_VALUE) VALUES (@G_ID, @P_ID, @GP_VALUE);
END;
END;
FETCH NEXT FROM cProps INTO @G_ID, @P_NAME, @PG_NAME, @GP_VALUE, @GR_NAME;
END;
CLOSE cProps;
DEALLOCATE cProps;

Не забудьте, что пусть и имя файла C:\TEXP\price_yml.xml вам нужно заменить на свое.
Пользователь оффлайн Распечатать
 

10.11.2016 22:54

kamar87


Посетитель

Количество сообщений   4
Зарегистрирован:   02-11-2016, 09:01:05
А как это можно сделать в этом файле импорта? http://inetshop.in.ua/index.php?showfile=1&fid=165&p=downloads&area=1&categ=11
Пользователь оффлайн Распечатать
 

11.11.2016 00:35

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Цитата
Написал: kamar87
А как это можно сделать в этом файле импорта?

Уточните ваш вопрос. Что именно сделать и зачем?
Пользователь оффлайн Распечатать
 

11.11.2016 07:26

kamar87


Посетитель

Количество сообщений   4
Зарегистрирован:   02-11-2016, 09:01:05
Сделать схему импорта на подобии этой, чтобы наименование при импорте бралось из <typePrefix>+<vendor>+<model>
Пользователь оффлайн Распечатать
 

11.11.2016 09:28

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Импорт прайс-листа YML
Цитата
Написал: support
Цитата
Написал: kamar87
А как это можно сделать в этом файле импорта?

Уточните ваш вопрос. Что именно сделать и зачем?


Чтобы таким же образом импортировать прайс-листы YML такой же структуры, необходимо такие же изменения провести в скрипте парсинга XML. Это не относится к ветке импорта каталога, для обсуждения импорта прайс-листов XML в формате Яндекс на форуме есть отдельная тема.

Пользователь оффлайн Распечатать
 

11.01.2017 23:12

San


Посетитель

Количество сообщений   11
Зарегистрирован:   01-01-2017, 17:00:49
Импорт товаров из файла YML
Цитата
Написал: support
Как вариант можем предложить SQL-скрипт для импорта стандартного файла YML (стандартной структуры) которая соответствует спецификации Яндекс-Маркет. Этот скрипт импортирует структуру категорий, товары, характеристики. Так как файлы такого формата часто создаются с ошибками: неверно формируется название товара или вообще может отсутствовать и его нужно создавать из типа товара, бренда и артикула, так же может быть неверное оформление структуры категорий и даже не соответствие правилам создания XML. Перед импортом обратитесь в службу поддержки и пришлите файл который необходимо импортировать, мы проверим его соответствие формату Яндекс-Маркет и при необходимости переделаем скрипт импорта для вас.

Код

declare @xml xml
declare @idoc int
declare @FileName varchar(2000);
SET @FileName = 'C:\TEXP\price_yml.xml';

DECLARE
@SQL nvarchar(4000),
@SQL_Params nvarchar(4000);

--SET @SQL = 'SELECT @xml = CONVERT(xml, BulkColumn, 2) FROM OPENROWSET (BULK N''' + @FileName + ''', SINGLE_CLOB) [rowsetresults]';
SET @SQL = 'DECLARE @text varchar(MAX);';
SET @SQL = @SQL + ' SELECT @text = a FROM OPENROWSET (BULK N''' + @FileName + ''', SINGLE_CLOB) as result(a);'
SET @SQL = @SQL + ' SELECT @text = LTRIM(@text);';
--SET @SQL = @SQL + ' SELECT @text = RIGHT(@text, LEN(@text) - CHARINDEX(''<?xml'', @text) + 1);';
SET @SQL = @SQL + ' IF CHARINDEX(''<?xml'', @text)<>1 SELECT @text = RIGHT(@text, LEN(@text) - CHARINDEX(''<?xml'', @text) + 1);';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''\"'', ''"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''cp1251'', ''WINDOWS-1251'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''encoding="utf8"'', ''encoding="utf-8"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''encoding=''''utf8'''''', ''encoding=''''utf-8'''''');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''parentID'', ''parentId'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, ''&#34;'', ''"'');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(7), '' '');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(31), '' '');';
SET @SQL = @SQL + ' SELECT @text = REPLACE(@text, CHAR(1), '' '');';
SET @SQL = @SQL + ' IF CHARINDEX(''<company><![CDATA['', @text)=0 SELECT @text = REPLACE(REPLACE(@text, ''<company>'', ''<company><![CDATA[''), ''</company>'', '']]></company>'');'
SET @SQL = @SQL + ' SELECT @xml = CONVERT(xml, @text, 2);';

SET @SQL_Params = N'@xml xml output';

execute sp_executesql @stmt = @SQL, @params = @SQL_Params,
@xml = @xml output;

--SET @xml = REPLACE(CAST(@xml as varchar(MAX)), 'encoding=''cp1251''', 'encoding="WINDOWS-1251"');

EXEC sp_xml_preparedocument @idoc OUTPUT, @xml

DECLARE @TBL_GROUPS TABLE (GR_ID int, GR_PARENT_ID int, GR_NAME varchar(MAX), GR_FULL_NAME varchar(MAX));
DECLARE @TBL_GROUPS_FULL TABLE (GR_ID int, GR_FULL_NAME varchar(MAX));

INSERT INTO @TBL_GROUPS (GR_ID, GR_PARENT_ID, GR_NAME)
SELECT distinct gr.*
FROM OPENXML (@idoc, N'/yml_catalog/shop/categories/category')
WITH (
categoryID int '@id',
parentId int '@parentId',
name nvarchar(600) 'text()'
) gr
WHERE not categoryID is null and not name is null;

update @TBL_GROUPS
set GR_PARENT_ID = null
where not GR_PARENT_ID in (select GR_ID from @TBL_GROUPS)
or GR_ID = GR_PARENT_ID;

WITH tree (data, id, level, pathstr)
AS (
SELECT GR_NAME, GR_ID, 0, CAST('' AS VARCHAR(MAX))
FROM @TBL_GROUPS
WHERE GR_PARENT_ID IS NULL

UNION ALL

SELECT GR_NAME, GR_ID, t.level + 1,
case when t.level = 0 then t.data + t.pathstr +' > '+ V.GR_NAME
else t.pathstr +' > '+ V.GR_NAME
end
FROM @TBL_GROUPS V
INNER JOIN tree t
ON (IsNull(t.id, 0) = IsNull(V.GR_PARENT_ID, 0))/* and t.level < 20*/)
INSERT INTO @TBL_GROUPS_FULL (GR_ID, GR_FULL_NAME)
SELECT /*SPACE(level*5) + data as data, */id, /*level, */case when IsNull(pathstr, '') = '' then data else pathstr end
FROM tree
ORDER BY case when IsNull(pathstr, '') = '' then data else pathstr end, id;

DECLARE @GR_ID int, @iGR_PARENT_ID int, @GR_NAME varchar(400);
DECLARE cGroups CURSOR LOCAL FOR
select GR_ID, GR_PARENT_ID, GR_NAME from @TBL_GROUPS
;
SET IDENTITY_INSERT TBL_GROUPS ON;
OPEN cGroups;
FETCH NEXT FROM cGroups INTO @GR_ID, @iGR_PARENT_ID, @GR_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF NOT EXISTS (SELECT 1 FROM TBL_GROUPS WHERE GR_ID=@GR_ID)
BEGIN
INSERT INTO TBL_GROUPS (GR_ID, GR_PARENT_ID, GR_NAME) VALUES (@GR_ID, @iGR_PARENT_ID, @GR_NAME);
END;
FETCH NEXT FROM cGroups INTO @GR_ID, @iGR_PARENT_ID, @GR_NAME;
END;
SET IDENTITY_INSERT TBL_GROUPS OFF;
CLOSE cGroups;
DEALLOCATE cGroups;

DECLARE @GT_ID int, @B_ID int;
DECLARE @G_ID varchar(400), @G_NAME varchar(400), @G_URL varchar(400), @G_GR_ID int, @B_NAME varchar(400), @G_IMAGE_URL varchar(400), @G_DESC_FULL varchar(max), @G_MODEL varchar(100), @G_SID varchar(100), @GT_NAME varchar(100);
DECLARE cGoods CURSOR LOCAL FOR
SELECT
G_ID,
LTRIM(RTRIM(ISNULL(G_NAME, ''))),
LTRIM(RTRIM(ISNULL(G_URL, ''))),
G_GR_ID,
LTRIM(RTRIM(ISNULL(B_NAME, ''))),
LTRIM(RTRIM(ISNULL(G_IMAGE_URL, ''))),
G_DESC_FULL,
LTRIM(RTRIM(ISNULL(G_MODEL, ''))),
LTRIM(RTRIM(ISNULL(G_SID, ''))),
LTRIM(RTRIM(ISNULL(GT_NAME, '')))

FROM OPENXML (@idoc, N'/yml_catalog/shop/offers/offer')
WITH (
G_ID varchar(400) '@id',
G_NAME varchar(400) 'name/text()',
G_URL varchar(400) 'url/text()',
G_GR_ID int 'categoryId/text()',
B_NAME varchar(400) 'vendor/text()',
G_IMAGE_URL varchar(400) 'picture/text()',
G_DESC_FULL text 'description/text()',
G_MODEL varchar(100) 'model/text()',
G_SID varchar(100) 'vendorCode/text()',
GT_NAME varchar(100) 'typePrefix/text()'
) g
inner join @TBL_GROUPS_FULL gr on g.G_GR_ID = gr.GR_ID
where LTRIM(RTRIM(IsNull(G_NAME, ''))) <> ''
;
SET IDENTITY_INSERT TBL_GOODS ON;
OPEN cGoods;
FETCH NEXT FROM cGoods INTO @G_ID, @G_NAME, @G_URL, @G_GR_ID, @B_NAME, @G_IMAGE_URL, @G_DESC_FULL, @G_MODEL, @G_SID, @GT_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF NOT EXISTS (SELECT 1 FROM TBL_GOODS WHERE G_ID = @G_ID)
BEGIN
SET @GT_ID = Null;
IF @GT_NAME <> ''
BEGIN
SET @GT_ID = (SELECT GT_ID FROM TBL_GOODS_TYPES WHERE GT_NAME = @GT_NAME);
IF @GT_ID IS NULL
BEGIN
INSERT TBL_GOODS_TYPES (GT_NAME) VALUES (@GT_NAME);
SET @GT_ID = (SELECT GT_ID FROM TBL_GOODS_TYPES WHERE GT_NAME = @GT_NAME);
END;
END;

SET @B_ID = Null;
IF @B_NAME <> ''
BEGIN
SET @B_ID = (SELECT B_ID FROM TBL_BRANDS WHERE B_NAME = @B_NAME);
IF @B_ID IS NULL
BEGIN
INSERT TBL_BRANDS (B_NAME) VALUES (@B_NAME);
SET @B_ID = (SELECT B_ID FROM TBL_BRANDS WHERE B_NAME = @B_NAME);
END;
END;

INSERT INTO TBL_GOODS (G_ID, G_GR_ID, G_NAME, G_MODEL, G_B_ID, G_GT_ID, G_SID) VALUES (@G_ID, @G_GR_ID, @G_NAME, @G_MODEL, @B_ID, @GT_ID, @G_SID);
END;
FETCH NEXT FROM cGoods INTO @G_ID, @G_NAME, @G_URL, @G_GR_ID, @B_NAME, @G_IMAGE_URL, @G_DESC_FULL, @G_MODEL, @G_SID, @GT_NAME;
END;
SET IDENTITY_INSERT TBL_GOODS OFF;
CLOSE cGoods;
DEALLOCATE cGoods;

DECLARE @P_ID int, @PG_ID int;
DECLARE @P_NAME varchar(400), @PG_NAME varchar(400), @GP_VALUE varchar(max);
DECLARE cProps CURSOR LOCAL FOR
select
LTRIM(RTRIM(ISNULL(p.G_ID, ''))),
LTRIM(RTRIM(ISNULL(p.P_NAME, ''))),
LTRIM(RTRIM(ISNULL(p.PG_NAME, ''))),
LTRIM(RTRIM(ISNULL(p.GP_VALUE, ''))),
gr.GR_FULL_NAME
FROM OPENXML (@idoc, N'/yml_catalog/shop/offers/offer/param')
WITH (
G_ID varchar(400) '../@id',
P_NAME varchar(400) '@name',
PG_NAME varchar(400) '@group',
GP_VALUE varchar(8000) 'text()'
) p, TBL_GOODS g, TBL_GROUPS gr
WHERE p.G_ID = g.G_ID and g.G_GR_ID = gr.GR_ID
;
OPEN cProps;
FETCH NEXT FROM cProps INTO @G_ID, @P_NAME, @PG_NAME, @GP_VALUE, @GR_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF @P_NAME <> ''
BEGIN
SET @PG_ID = Null;
IF @PG_NAME <> ''
BEGIN
SET @PG_ID = (SELECT PG_ID FROM TBL_PROPS_GROUPS WHERE PG_NAME = @PG_NAME);
IF @PG_ID IS NULL
BEGIN
INSERT TBL_PROPS_GROUPS (PG_NAME) VALUES (@PG_NAME);
SET @PG_ID = (SELECT PG_ID FROM TBL_PROPS_GROUPS WHERE PG_NAME = @PG_NAME);
END;
END;

SET @P_ID = (SELECT P_ID FROM TBL_PROPS WHERE P_NAME = @P_NAME AND P_DESC = @GR_NAME AND ISNULL(P_PG_ID, -1) = ISNULL(@PG_ID, -1));
IF @P_ID IS NULL
BEGIN
INSERT TBL_PROPS (P_NAME, P_DESC, P_PG_ID) VALUES (@P_NAME, @GR_NAME, @PG_ID);
SET @P_ID = (SELECT P_ID FROM TBL_PROPS WHERE P_NAME = @P_NAME AND P_DESC = @GR_NAME AND ISNULL(P_PG_ID, -1) = ISNULL(@PG_ID, -1));
END;
IF NOT EXISTS(SELECT 1 FROM TBL_GOODS_PROPS WHERE GP_G_ID = @G_ID AND GP_P_ID = @P_ID)
BEGIN
INSERT INTO TBL_GOODS_PROPS (GP_G_ID, GP_P_ID, GP_VALUE) VALUES (@G_ID, @P_ID, @GP_VALUE);
END;
END;
FETCH NEXT FROM cProps INTO @G_ID, @P_NAME, @PG_NAME, @GP_VALUE, @GR_NAME;
END;
CLOSE cProps;
DEALLOCATE cProps;


Этот скрипт нужно вставить в схему импорта "SQL- скрипт перед записью?
Пользователь оффлайн Распечатать
 

12.01.2017 00:14

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Импорт товаров из файла YML
Цитата
Написал: San
Этот скрипт нужно вставить в схему импорта "SQL- скрипт перед записью?

Данный SQL-запрос не предназначен для работы в схемах импорта. Его нужно запускать из оболочки управления MS SQL Server (например Microsoft SQL Server Management Studio) или создать в программе на его основе пользовательский SQL-запрос, который в последствии можно вызывать в программе.
Пользователь оффлайн Распечатать
 

14.01.2017 19:21

San


Посетитель

Количество сообщений   11
Зарегистрирован:   01-01-2017, 17:00:49
Импорт товаров из файла YML
Цитата
Написал: support
Цитата
Написал: San
Этот скрипт нужно вставить в схему импорта "SQL- скрипт перед записью?

Данный SQL-запрос не предназначен для работы в схемах импорта. Его нужно запускать из оболочки управления MS SQL Server (например Microsoft SQL Server Management Studio) или создать в программе на его основе пользовательский SQL-запрос, который в последствии можно вызывать в программе.


Я выбираю базу данных инетшоп и создаю запрос, в который вставляю скрипт - правильно?. Как действовать дальше?
Пользователь оффлайн Распечатать
 

14.01.2017 19:30

San


Посетитель

Количество сообщений   11
Зарегистрирован:   01-01-2017, 17:00:49
Пример1
Пример

Пользователь оффлайн Распечатать
 

15.01.2017 02:28

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Запуск SQL-скрипта
Вы все правильно сделали. Но вам еще нужно изменить путь к файлу XML с товарами в строке
Цитата

SET @FileName = 'C:\TEXP\price_yml.xml';


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

Для выполнения подобных SQL-запросов которые используют команду OPENROWSET требуется полномочия пользователя ADMINISTER BULK OPERATIONS в системе управления базами данных (СУБД) MS SQL Server (если вы используете для подключения к базе данных программы ту же учетную запись Windows, под которой устанавливали СУБД, то она должна иметь по умолчанию полномочия SYSADMIN).

Так же стоит отметить, что файлы YML могут отличаться по наполнению, например название товара может быть не в теге name, а в vendor + model или vendor + vendorCode и для таких случаев требуется небольшая модификация данного запроса.
Пользователь оффлайн Распечатать
 

15.01.2017 15:37

San


Посетитель

Количество сообщений   11
Зарегистрирован:   01-01-2017, 17:00:49
Запуск SQL-скрипта
Цитата
Написал: support
Вы все правильно сделали. Но вам еще нужно изменить путь к файлу XML с товарами в строке
Цитата

SET @FileName = 'C:\TEXP\price_yml.xml';


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

Для выполнения подобных SQL-запросов которые используют команду OPENROWSET требуется полномочия пользователя ADMINISTER BULK OPERATIONS в системе управления базами данных (СУБД) MS SQL Server (если вы используете для подключения к базе данных программы ту же учетную запись Windows, под которой устанавливали СУБД, то она должна иметь по умолчанию полномочия SYSADMIN).
Как быть если мой исходный файл в формате: "http://..." ?
Так же стоит отметить, что файлы YML могут отличаться по наполнению, например название товара может быть не в теге name, а в vendor + model или vendor + vendorCode и для таких случаев требуется небольшая модификация данного запроса.

Как быть если мой исходный файл в формате: "http://..." ?
Пользователь оффлайн Распечатать
 

15.01.2017 21:39

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
Запуск SQL-скрипта
Цитата
Написал: San
Как быть если мой исходный файл в формате: "http://..." ?

Уточните пожалуйста формат. Данный скрипт предназначен только для формата XML и структуры каталога Яндекс-Маркет.

Если вы имеете в виду, что у вас путь к файлу является URL, то вам необходимо скачать данный файл на локальный диск, т.к. SQL-скрипт импорта не запрограммирован на скачивание файлов по ссылкам.
Пользователь оффлайн Распечатать
 

Распечатать  |  Следующая тема  |  Предыдущая тема
Перейти
Первая страница 1 2 » Последняя страница  

Статистика форума
Тем: 506, Сообщений: 3222, Пользователей: 2255
Приветствуем новичка по имени Gotit
Ближайшие дни рождения
Сегодня именинников нет


iNETsHOP - программа для формирования каталога товаров интернет-магазина и обработки прайсов Copyright 2007-2015 "Программа iNETsHOP - работа с прайс-листами поставщиков для интернет магазинов ®" iNETsHOP - обработка, объединение, анализ прайсов поставщиков и конкурентов