Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как прописать цикл Fro Next в функции на MySqL / 8 сообщений из 8, страница 1 из 1
20.09.2019, 12:35
    #39864538
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
Здравия желаю!

Есть у меня функция на VBA, которую я хочу создать в MySQL, но не знаю синтаксиса.
Помогите её переписать, пожалуйста
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
Public Function ean13$(chaine$)

    Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean
    
    If Len(chaine) = 12 Then
        
        For i = 1 To 12
            
            If Asc(Mid(chaine, i, 1)) < 48 Or Asc(Mid(chaine, i, 1)) > 57 Then
                
                i = 0
                Exit For
            
            End If
        
        Next
        
        If i = 13 Then
            
            For i = 2 To 12 Step 2
                
                checksum = checksum + Val(Mid(chaine, i, 1))
            
            Next
            
            checksum = checksum * 3
            
            For i = 1 To 11 Step 2
            
                checksum = checksum + Val(Mid(chaine, i, 1))
            
            Next
            
            chaine = chaine & (10 - checksum Mod 10) Mod 10
            CodeBarre = Left(chaine, 1) & Chr(65 + Val(Mid(chaine, 2, 1)))
            first = Val(Left(chaine, 1))
            
            For i = 3 To 7
                
                tableA = False
                
                Select Case i
                    
                    Case 3
                        
                        Select Case first
                            
                            Case 0 To 3
                                tableA = True
                        
                        End Select
                    
                    Case 4
                        
                        Select Case first
                            
                            Case 0, 4, 7, 8
                                
                                tableA = True
                        
                        End Select
                    
                    Case 5
                        
                        Select Case first
                            
                            Case 0, 1, 4, 5, 9
                                
                                tableA = True
                        
                        End Select
                    
                    Case 6
                        
                        Select Case first
                            
                            Case 0, 2, 5, 6, 7
                                
                                tableA = True
                        
                        End Select
                    
                    Case 7
                        
                        Select Case first
                            
                            Case 0, 3, 6, 8, 9
                                
                                tableA = True
                        
                        End Select
                
                End Select
            
                If tableA Then
                    CodeBarre = CodeBarre & Chr(65 + Val(Mid(chaine, i, 1)))
                Else
                    CodeBarre = CodeBarre & Chr(75 + Val(Mid(chaine, i, 1)))
                End If
                
            Next
            
            CodeBarre = CodeBarre & "*"
            
            For i = 8 To 13
                CodeBarre = CodeBarre & Chr(97 + Val(Mid(chaine, i, 1)))
            Next
            
            CodeBarre = CodeBarre & "+"
            ean13 = CodeBarre
        
        End If
    
    End If
    
End Function
...
Рейтинг: 0 / 0
20.09.2019, 13:37
    #39864595
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
Вот я сам попробовал переписать. Вроде всё верно, но выдаёт ошибку при сохранении
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
CREATE DEFINER = 'mtrx'@'%'
FUNCTION mtrx.ean13 (chaine varchar(13))
RETURNS varchar(255) CHARSET utf8mb4
BEGIN

  DECLARE i smallint(6);
  DECLARE checksum smallint(6);
  DECLARE first smallint(6);
  DECLARE CodeBarre smallint(6);
  DECLARE tableA bit(1);

  IF LENGTH(chaine) = 12 THEN

  цикл:
    WHILE (i < 13) DO

      SELECT
        i;
      SET i = i + 1;

      IF ASCII(MID(chaine, i, 1)) < 48
        OR ASCII(MID(chaine, i, 1)) > 57 THEN

        SET i = 0;
        LEAVE цикл;

      END IF;


    END WHILE;


    IF i = 13 THEN


      WHILE (i < 13) DO

        SELECT
          i;
        SET i = i + 2;

        SET checksum = checksum + Val(MID(chaine, i, 1));

      END WHILE;


      SET checksum = checksum * 3;

      WHILE (i < 12) DO

        SELECT
          i;

        IF i = 0 THEN
          SET i = 1;
        END IF;

        SET i = i + 2;

        SET checksum = checksum + Val(MID(chaine, i, 1));

      END WHILE;


      SET chaine = chaine & (10 - checksum MOD 10) MOD 10;
      SET CodeBarre = LEFT(chaine, 1) & Chr(65 + Val(MID(chaine, 2, 1)));
      SET first = Val(LEFT(chaine, 1));

      WHILE (i < 8) DO

        SELECT
          i;

        IF i = 0 THEN
          SET i = 3;
        END IF;

        SET i = i + 1;

        SET tableA = FALSE;

        CASE i

          WHEN 3 THEN IF FIRST >= 0
                AND first <= 3 THEN
                SET tableA = TRUE;
              END IF;

          WHEN 4 THEN CASE first

                WHEN 0 THEN SET tableA = TRUE;
                WHEN 4 THEN SET tableA = TRUE;
                WHEN 7 THEN SET tableA = TRUE;
                WHEN 8 THEN SET tableA = TRUE;

              END CASE;

          WHEN 5 THEN CASE first

                WHEN 0 THEN SET tableA = TRUE;
                WHEN 1 THEN SET tableA = TRUE;
                WHEN 4 THEN SET tableA = TRUE;
                WHEN 5 THEN SET tableA = TRUE;
                WHEN 9 THEN SET tableA = TRUE;

              END CASE;

          WHEN 6 THEN CASE first

                WHEN 0 THEN SET tableA = TRUE;
                WHEN 2 THEN SET tableA = TRUE;
                WHEN 5 THEN SET tableA = TRUE;
                WHEN 6 THEN SET tableA = TRUE;
                WHEN 7 THEN SET tableA = TRUE;

              END CASE;

          WHEN 7 THEN CASE first

                WHEN 0 THEN SET tableA = TRUE;
                WHEN 3 THEN SET tableA = TRUE;
                WHEN 6 THEN SET tableA = TRUE;
                WHEN 8 THEN SET tableA = TRUE;
                WHEN 9 THEN SET tableA = TRUE;

              END CASE;

        END CASE;

        IF tableA THEN
          SET CodeBarre = CodeBarre & Chr(65 + Val(MID(chaine, i, 1)));
        ELSE
          SET CodeBarre = CodeBarre & Chr(75 + Val(MID(chaine, i, 1)));
        END IF;

      END WHILE;

      SET CodeBarre = CodeBarre & "*";

    цикл:
      WHILE (i < 14) DO

        SELECT
          i;

        IF i = 0 THEN
          SET i = 8;
        END IF;

        SET i = i + 1;

        SET CodeBarre = CodeBarre & Chr(97 + Val(MID(chaine, i, 1)));

      END WHILE;

      SET CodeBarre = CodeBarre & "+";

    END IF;

  END IF;

  RETURN CodeBarre;

END
...
Рейтинг: 0 / 0
20.09.2019, 13:56
    #39864613
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
Формулируйте задачу, а не свою попытку её решать.
Формулируйте, что должна делать функция, а не показывайте её код - никому не интересно стараться понять, что тут накодено (или накожено?).
Укажите, как эта функция будет использоваться, в каком запросе (покажите запрос, представив, что функция уже есть и работает правильно).
...
Рейтинг: 0 / 0
20.09.2019, 14:12
    #39864624
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
Akina, в функцию ean13 передаётся в качестве аргумента 12 цифер трих-кода.
Например: ean13("869120602061")
Результат: "8GTBMKG*acagbd+"
Если полученный текст отформатировать шрифтом Code EAN13, то при печати я буду видеть читаемый сканером штрих-код.

Данный код проверен на VBA. Я не вижу проблем написать такую же функцию на MySql. Проверка синтаксиса не показывает ошибок. Но функция не сохраняется. Выдаёт ошибку: "not allowed to return a result set from a function"
...
Рейтинг: 0 / 0
20.09.2019, 14:18
    #39864635
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
Настаев
Код: sql
1.
2.
SELECT
          i;

что это и зачем это?

В функции нельзя делать голый select, о чем и говорится в сообщении об ошибке.
...
Рейтинг: 0 / 0
20.09.2019, 14:30
    #39864648
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
Так я пытался сделать цикл For Next
...
Рейтинг: 0 / 0
20.09.2019, 14:31
    #39864651
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
подсмотрел отсюда:
Модератор: Ссылка с трояном удалена. Не надо читать левые ресурсы. Читайте официальную документацию.
...
Рейтинг: 0 / 0
20.09.2019, 14:34
    #39864653
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как прописать цикл Fro Next в функции на MySqL
miksoft, Спасибо большое

Я удалил фразы "Select i" и всё работает :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как прописать цикл Fro Next в функции на MySqL / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]