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

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

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

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

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

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


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