Форум OlegON > Ресурсы OlegON > Вопросы сервера > База штрихкодов

База штрихкодов: пожелания, предложения, замечания : База штрихкодов

21.11.2024 23:13


31.03.2017 15:32
Цитата:
baggio 1111111111111 шк...
нужно как то бороться с левыми ШК...
сразу и предлагай :)

сообщение konst видел, завтра с утра буду разбирать и править.
31.03.2017 17:33
ну есть же алгоритм ЕАН13... может по нему и проверять раз в день?
31.03.2017 17:38
Там уже не только EAN, есть вообще нецифровые... Решил не удалять, хз что это.
31.03.2017 20:10
как пример (код для 1С 77, функция возвращает текстовую информацию - либо "Ошибка" ...", либо тип ШК - "EAN-8","EAN-13","UPS-A" или "ITF-14"):


Код:
//*******************************************
Функция ПроверитьEanНаЗапрешенныеСимволы(парEAN = "")
	тЗапрещенныеДляEanСимволы = "'~`@""""№#$;%:^&?*()-_+=|\/	{[]},. <>QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";
	ЕстьЗапрещенныеСимволы = 0;
	Для НомСимвола = 1 По СтрДлина(парEAN) Цикл
		текСимвол = Сред(парEAN,НомСимвола,1);
		Если Найти(тЗапрещенныеДляEanСимволы, текСимвол) > 0 Тогда
			ЕстьЗапрещенныеСимволы = 1;
			Прервать; 
		КонецЕсли;
	КонецЦикла;	
	Возврат ЕстьЗапрещенныеСимволы;
КонецФункции	

//==========================================
Функция ПроверкаВалидностиШК(парКод)
	
	ТекКод = СокрЛП(парКод);
	ДлинаТекКод = СтрДлина(ТекКод);
	
	Если ДлинаТекКод = 0 Тогда
		Возврат "Ошибка! Пустой штрих-код!";
	ИначеЕсли (Найти("8,12,13,14", СокрЛП(ДлинаТекКод)) = 0) или (ДлинаТекКод < 8) Тогда
		Возврат "Ошибка! " + Лев(ТекКод,50);
	ИначеЕсли ПроверитьEanНаЗапрешенныеСимволы(ВРЕГ(ТекКод)) = 1 Тогда
		Возврат "Ошибка! Некорректный штрихкод!";
	ИначеЕсли Лев(ТекКод,3) = "000" Тогда	
		Возврат "Ошибка! Некорректный штрихкод!";
	КонецЕсли;
	
	Сум1=0;
	Сум2=0;
	ТипКода = "ITF-14EAN-13UPS-A                   EAN-8 ";
	ПолныйШтрихКод = ДополнитьСтроку(ТекКод,14);
	Сдвиг = 14 - ДлинаТекКод;
	
	Для чет = 1 по 13 Цикл
		нечет = чет + 1;
		Сум1 = Сум1 + Число(Сред(ПолныйШтрихКод,чет,1));
		Сум2 = ?(нечет = 14, Сум2, Сум2+Число(Сред(ПолныйШтрихКод,нечет,1)));
		чет = чет + 1;
	КонецЦикла;
	
	Сум3 = Сум1*3 + Сум2;
	КР = ?(Цел(Сум3/10)*10 + 10 - Сум3 = 10, 0, Цел(Сум3/10)*10 + 10 - Сум3);
	Если КР <> Число(Прав(ПолныйШтрихКод,1)) Тогда
		Возврат "Ошибка! Неверный штрих-код: " + ТекКод + " (КР <> "+КР+")";
	КонецЕсли;
	
	Возврат СокрЛП(Сред(ТипКода, Сдвиг*6 + 1,6));
	
КонецФункции
Так же можно отсекать ШК, начинающиеся на цифру "2", т.к. это - однозначно внутренние ШК и они лишены уникальности.
31.03.2017 20:12
Проверять ШК на валидность - наверное правильно на входе, при попытке записи в базу, и если ШК не валиден - то возвращать ошибку и не записывать такой ШК в базу
Уже имеющиеся невалидные ШК - можно прогнать через подобный алгоритм и вычистить базу от них
31.03.2017 20:16
Цитата:
volk13 ТипКода = "ITF-14EAN-13UPS-A EAN-8 ";
тут сайт "проглотил" пробелы, поэтому, чтобы код корректно работал - необходимо, чтобы между UPS-A и EAN-8 - было ровно 19 пробелов!
31.03.2017 20:36
Цитата:
volk13 тут сайт "проглотил" пробелы, поэтому, чтобы код корректно работал - необходимо, чтобы между UPS-A и EAN-8 - было ровно 19 пробелов!
Что бы этого не было - пользуйтесь тегами , а не [quit][/quit]
01.04.2017 02:40
Цитата:
KirillHome Что бы этого не было - пользуйтесь тегами , а не [quit][/quit]
попробуем:
Код:
//*******************************************
Функция ПроверитьEanНаЗапрешенныеСимволы(парEAN = "")
	тЗапрещенныеДляEanСимволы = "'~`@""""№#$;%:^&?*()-_+=|\/	{[]},. <>QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";
	ЕстьЗапрещенныеСимволы = 0;
	Для НомСимвола = 1 По СтрДлина(парEAN) Цикл
		текСимвол = Сред(парEAN,НомСимвола,1);
		Если Найти(тЗапрещенныеДляEanСимволы, текСимвол) > 0 Тогда
			ЕстьЗапрещенныеСимволы = 1;
			Прервать; 
		КонецЕсли;
	КонецЦикла;	
	Возврат ЕстьЗапрещенныеСимволы;
КонецФункции	

//==========================================
Функция ПроверкаВалидностиШК(парКод)
	
	ТекКод = СокрЛП(парКод);
	ДлинаТекКод = СтрДлина(ТекКод);
	
	Если ДлинаТекКод = 0 Тогда
		Возврат "Ошибка! Пустой штрих-код!";
	ИначеЕсли (Найти("8,12,13,14", СокрЛП(ДлинаТекКод)) = 0) или (ДлинаТекКод < 8) Тогда
		Возврат "Ошибка! " + Лев(ТекКод,50);
	ИначеЕсли ПроверитьEanНаЗапрешенныеСимволы(ВРЕГ(ТекКод)) = 1 Тогда
		Возврат "Ошибка! Некорректный штрихкод!";
	ИначеЕсли Лев(ТекКод,3) = "000" Тогда	
		Возврат "Ошибка! Некорректный штрихкод!";
	КонецЕсли;
	
	Сум1=0;
	Сум2=0;
	ТипКода = "ITF-14EAN-13UPS-A                   EAN-8 ";
	ПолныйШтрихКод = ДополнитьСтроку(ТекКод,14);
	Сдвиг = 14 - ДлинаТекКод;
	
	Для чет = 1 по 13 Цикл
		нечет = чет + 1;
		Сум1 = Сум1 + Число(Сред(ПолныйШтрихКод,чет,1));
		Сум2 = ?(нечет = 14, Сум2, Сум2+Число(Сред(ПолныйШтрихКод,нечет,1)));
		чет = чет + 1;
	КонецЦикла;
	
	Сум3 = Сум1*3 + Сум2;
	КР = ?(Цел(Сум3/10)*10 + 10 - Сум3 = 10, 0, Цел(Сум3/10)*10 + 10 - Сум3);
	Если КР <> Число(Прав(ПолныйШтрихКод,1)) Тогда
		Возврат "Ошибка! Неверный штрих-код: " + ТекКод + " (КР <> "+КР+")";
	КонецЕсли;
	
	Возврат СокрЛП(Сред(ТипКода, Сдвиг*6 + 1,6));
	
КонецФункции
01.04.2017 09:37
Я пока не могу придумать исключающий фильтр, точнее, он может занять очень много моего времени и времени на обработку. Пусть все сваливается, по идее не должны запрашивать невалидный штрихкод и не должны вносить его в базу, зато я могу не узнать о появлении кода нового типа, пока кто-то не напишет, а писать народ не любит. Так что чистить базу я пока не буду, у меня на внесение кодов ресурсов не хватает. Еще раз подчеркну, в базе не только EAN13.
01.04.2017 14:22
Цитата:
OlegON Еще раз подчеркну, в базе не только EAN13
Я в свою очередь также кочу подчеркнуть, что в торговле не используются коды других типов, кроме ITF-14, EAN-13, UPS-A, EAN-8.
Пример проверки валидности данных кодов я привёл выше (там не только EAN13).
Другие коды, кроме этих - для торговли неинтересны, в плане запроса и получения по ним информации из он-лайн базы
Я никогда не настаиваю, а лишь предлагаю идеи и пытаюсь донести реальное положение дел, а решать естественно автору/хозяину ресурса, так что свою миссию я выполнил.
;)
Часовой пояс GMT +3, время: 23:13.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.