2015-03-20 14 views
-1

Мне нужно написать хранимую процедуру или funtion для проверки вставки кода EAN13 в SQL Server.SQL Server хранимой процедуры Проверка EAN-кода

Может ли кто-нибудь мне помочь?

+0

Что вы пробовали? Пожалуйста, прочитайте http://stackoverflow.com/help/how-to-ask перед отправкой вопросов – jean

+0

Что вы подразумеваете под * включением *? А также: проверить *** как ***? Поиск по набору допустимых значений? Не совсем понятно .... –

ответ

0

Решено

Я создал функцию для проверки:

 
CREATE FUNCTION [sp_ean](@Ean varchar(max)) RETURNS INT AS 
BEGIN 
    DECLARE @Factor INT 
    DECLARE @Sum INT 
    DECLARE @Len INT 
    DECLARE @CC INT 
    DECLARE @CA INT 
    DECLARE @Result NVARCHAR(MAX) 

    SET @Len = LEN(@Ean) 
    SET @Sum = 0 
    SET @Factor = 3 

    IF @Len = 14 OR @Len = 13 OR @Len = 12 OR @Len = 8 
     BEGIN 
      WHILE @Len > 0 
       BEGIN 
        IF @Len 13 
         BEGIN 
          SET @Sum = @Sum + SUBSTRING(@Ean,@Len,1) * @Factor 
          SET @Factor = 4 - @Factor 
         END 
        SET @Len = @Len - 1 
       END 

      SET @CC = ((1000 - @Sum) % 10) 
      SET @CA = SUBSTRING(@Ean,LEN(@Ean),1) 

      IF @CC = @CA 
       BEGIN 
        SET @Result = 0 
       END 
      ELSE 
       BEGIN 
        SET @Result = 1 
       END 
     END 
    ELSE 
     BEGIN 
      SET @Result = 1 
     END 
    RETURN (@Result) 
    END 

Результат: в истинный или к ложным

Спасибо!

+1

Возможно, вы захотите упомянуть, что EAN13 - очень распространенный код, используемый для идентификации продуктов на счетчиках. –

+0

Что вы подразумеваете под "IF @Len 13" ?? –

+0

Значение "IF @Len = 13" –

0

Возможно, вы найдете что-то подобное, чтобы быть чище. Он обрабатывает вход переменной длины и также имеет то преимущество, что его можно использовать в качестве контрольного ограничения, как указано Joe Celko.

CASE WHEN CAST(SUBSTRING(REVERSE(ean), 1, 1) AS INTEGER) = 
     10 - (
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 2, 1)) AS INT) 
       1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 3, 1)) AS INT) 
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 4, 1)) AS INT) 
       1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 5, 1)) AS INT) 
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 6, 1)) AS INT) 
       1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 7, 1)) AS INT) 
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 8, 1)) AS INT) 
       1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 9, 1)) AS INT) 
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 10, 1)) AS INT) 
       1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 11, 1)) AS INT) 
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 12, 1)) AS INT) 
       1 * CAST(SUBSTRING(REVERSE(ean) + '000000', 13, 1)) AS INT) 
       3 * CAST(SUBSTRING(REVERSE(ean) + '000000', 14, 1)) AS INT) 
      ) % 10 
THEN 1 ELSE 0 END 
Смежные вопросы