MySql zwiększanie numeracji w procedurze

0

Witam,
Mam problem z zwiększaniem numeracji za każdym nowym wywołaniem o 1. Poniżej kod podpowie ktoś co jest źle ?



DECLARE V_MNU VARCHAR(7) DEFAULT RIGHT(
CONCAT
(
'00000', IFNULL
(
(
SELECT MAX(CAST(SUBSTRING(SUBSTRING(NUMER, LOCATE('/', NUMER) + 1, 99999), 0, LOCATE('/', NUMER) + 1) AS INT)) + 1
FROM TABELA_TEST WHERE NUMER LIKE
CONCAT ( 'G/[0-9][0-9][0-9][0-9][0-9]/' , v_MIESIAC , '/' , v_ROK)
), 1
)
), 5);

SET v_NUMER = CONCAT('G/', v_MNU, '/', v_MIESIAC, '/', v_ROK);

Numeracja ma mieć format: G/00001/11/21, gdy uruchamiam powyższy kod ponownie to powinno numer zwiększać o 1, lecz za każdym razem jest ten sam numer czyli G/00001/11/21, a powinno być G/00002/11/21 itd.

Pomoże ktoś ?

0

Używam tego kodu w MSSQL tylko przy parametrach mam @ zamiast v_ i działa bez problemu. W MySql powyższy kod nie działa, tzn. nie zwiększa numeru o 1.

Co jest nie tak ?

1

A spróbuj użyć zgodnie z MySQLem konstrukcji REGEX zamiast LIKE?

0

Jak zmieniam LIKE na REGEXP to jest błąd MySqlConnector.MySqlException: 'Truncated incorrect INTEGER value: '''

0

Nie wie nikt co jest przyczyną, że za każdym kolejnym razem nie zwiększa się numeracja ?? W MSSQL działa bez problemu.

2

Jakiego dokładnie silnika używasz zamiast tego MSSQL?
Próbowałeś debugować i zrobić choćby zapytanie select z tym potrzebnym wierszem?
Może zamiast bawić się w regexy to po prostu użyj procent lub podkreślenie. Np.

Where numer like 'G/_____/11/27'
0

Chcę to na MariaDB wykonać

2

z podkreśleniem nie wstawia się w ogóle nowy rekord do bazy

No ale ten select wewnętrzny wykonany sam działa i zwraca właściwy numer?

0

Zmieniłem kod na poniższy, ale też nie działa przyrost numeracji:

BEGIN
      DECLARE v_NUMER varchar(14);
      DECLARE v_MIESIAC CHAR(2);
      DECLARE v_ROK CHAR(2);
      DECLARE v_MNU VARCHAR(5);
      
      START TRANSACTION;

      SET v_ROK = RIGHT(YEAR(NOW(3)), 2);
      SET v_MIESIAC = RIGHT(CONCAT('00', MONTH(NOW(3))), 2);
      SET v_MNU = RIGHT(CONCAT('000', IFNULL((SELECT MAX(CAST(SUBSTRING(SUBSTRING(NUMER, LOCATE('/', NUMER) + 1, 99999), 0, LOCATE('/', NUMER) + 1) AS INT)) + 1
              FROM TABELA_TEST WHERE NUMER LIKE CONCAT('G/[0-9][0-9][0-9][0-9][0-9]/', v_MIESIAC, v_ROK)), 1)), 5);

      SET v_NUMER = CONCAT('G/', v_MNU, v_MIESIAC, '/', v_ROK);

      COMMIT;
END
1

Staraj się odpowiadać w postach jeśli jest to odnośnie tematu.
Jak wewnętrzny select zwarac null to całość nie będzie działać i tyle.
Rozbij problem na mniejsze. Najpierw sprawdź czybmasz właściwą liczbę z tego selecta.
Mi na DB fidle zwraca poprawnie wiersze jeśli użyje % lub podkreślenia. To teraz trzeba by sprawdzić te substringi.
Gotowca nie dam. Sprawdzaj krok po kroku. Pamiętaj LIKE w T-sql inaczej działa niż LIKE w MariaDB i nie ma co komplikować tutaj IMHO sprawdzaniem czy to liczba skoro to musi być liczba jak rozumiem.

0

Jak napiszę:

SELECT MAX(NUMER) FROM TABELA_TEST WHERE NUMER LIKE CONCAT('G/___/11/21')

to działa prawidłowo, zwraca ostatni numer

Moim zdaniem w warunku jest błąd

0

Poniższy kod zwraca wszystkie - pełne numery z tabeli:

SELECT SUBSTRING(NUMER, LOCATE('/', NUMER) + 1, 99999) FROM TABELA_TEST WHERE NUMER LIKE ('G/___/11/21')
0

Kod poniższy zwraca pięć rekordów (tyle rekordów jest w tabeli) z wartością "1"

SELECT CAST(SUBSTRING(SUBSTRING(NUMER, LOCATE('/', NUMER) + 1, 99999), 0, LOCATE('/', NUMER) + 1) AS INT) + 1 FROM TABELA_TEST WHERE NUMER LIKE ('G/___/11/21')

Dodatkowo jest pięć komunikatów WARNING #1292 Truncated incorrect INTEGER value: "

0
SELECT MAX(CAST(SUBSTRING(SUBSTRING(NUMER, LOCATE('/', NUMER) + 1, 99999), 0, LOCATE('/', NUMER) + 1) AS INT)) + 1 FROM TABELA_TEST WHERE NUMER LIKE ('G/___/11/21')

Zwraca wartość "1" - taki jest ostatni numer "G/001/11/21'

1

No to jeśli już wewnętrzny select zwraca prawidłowo wartość to pozostaje sprawdzić co idzie do warunku.
Miesiąc np. masz na pewno w formie 01? Czemu np. dajesz do now() 3? Po co Ci mikrosekundy jak wyciągasz numer miesiąca.
Krok po kroku i zacznie działać.

0

Miesiąc jest prawidłowo zwracany. Podejrzewam 'G/[0-9][0-9][0-9]/' tu jest zwracany NULL, ale po zmianie na 'G/___/' nie zapisuje się nowy rekord w bazie

0

Poprzednio pisałeś, że numer prawidłowo jest zwaracany z podzapytania:

Zwraca wartość "1" - taki jest ostatni numer "G/001/11/21'

No to jeśli przy sztywnych warunkach jest ok, to spróbuj szukać po po kolei co powoduje błąd. Jak nie masz np. Unique to zasymuluj sobie dodanie rekordu ze sztywnym warunkiem a potem selectuj to co idzie do warunku i zobacz co się pokazuje.

0
CONCAT ( 'G/[0-9][0-9][0-9][0-9][0-9]/' , v_MIESIAC , '/' , v_ROK)

Łączenie działa nieprawidłowo w MySql. Jak jest na sztywno:

WHERE NUMER LIKE CONCAT('G/_____/11/21')

działa poprawnie, zaś jak zmienię to na:

WHERE NUMER LIKE CONCAT('G/_____/11/21', v_MIESIAC, '/', v_ROK)

to jest NULL. Zmiana na:

WHERE NUMER LIKE CONCAT('G/_____/11/21', '11', '/', '21')

to jest także NULL

Jak można w MySql zastąpić CONCAT ???

0
WHERE NUMER LIKE CONCAT('G/___/','11','21')

zwraca prawidłowo wartość 1

Testy zrobione na samym SELECT. Nie zapisuje się nowy rekord w bazie przy wykonaniu procedury, gdzie w kodzie jest następująca zmiana:

WHERE NUMER LIKE CONCAT('G/_____/','11','/','21')

Ja się już poddaję, cały dzień poświęciłem i nic z tego

0

W kilku wierszach tu dodajesz datę na sztywno a potem jeszcze zmienne.
Np. tu:

 CONCAT('G/_____/11/21', v_MIESIAC, '/', v_ROK)

Powinno działać: https://www.db-fiddle.com/f/8VGcMKLAvQo8khiEqrdjY8/0

Popatrz po prostu selectem co Ci wychodzi z samego złączenia stringów jak w moim przykładzie.

0

z takiego prostego SELECT wychodzi mi cały numer w postaci G/00001/11/21

SELECT NUMER FORM TABELA_TEST WHERE NUMER LIKE CONCAT('G/_____/', '11, '/', '21')

Wyczyściłem tabelę z danych, następnie uruchomiłem procedurę, dodało jak wyżej rekord z numerem, zaś kolejne uruchomienie nie dodaje już kolejnego rekordu :(
Poniżej kod:

WHERE NUMER LIKE CONCAT('G/_____/', v_MIESIAC, '/', v_ROK)

zaś kod:

WHERE NUMER LIKE CONCAT('G/[_][_][_][_][_]/', v_MIESIAC, '/', v_ROK)

dodaje kolejny rekord, lecz z tym samym numerem

0

Bo jak wstawisz te podkreślenia w nawiasy kwadratowe to zapewne dostajesz 0 wierszy czyli null, castujesz go na inta czyli zero. Potem do zera dodajesz jeden i tak w kółko.
Co niby miałoby robić to [_]? Podkreślenie w LIKE oznacza dowolny znak. Trzy podkreślania to trzy dowolne znaki po sobie. Jak wpiszesz to z nawiasami to jakbyś oczekiwał tych nawiasów, a pomiędzy nimi dowolnego znaku. LIKE w T-SQL przyjmuje również za parametr wyrażenie regularne czyli np. [0-9] co oznacza że szukane będą cyfry z zakresu od zera do dziewięć. W MaySql jest od tego REGEXP a LIKE operuje na % i _ ( w skrócie, najlepiej zobacz dokumentację obu).
Wklej obecnie całą procedurę jaką stworzyłeś.

1

Nie możesz sobie po prostu trzymać numeru dokumentu w jakiejś tabeli która jest rozbita na kolumna per składnik, potem robisz na niej updejta na polu które Cię interesuje i na koniec CONCAT?

Ostatni numer dokumentu trzymasz np. tak:
separator | first_part | second_part | third_part | fourt_part
---------------- | -------------------
/ | G | 00001 | 11 | 21

Potem w swojej metodzie pobierasz te dane, zwiększasz wartość drugiej kolumny, robisz konkatenację tego z separatorem i dodajesz do dokumentu? Na koniec aktualizujesz ten wiersz o podbity licznik.

-- EDYTKA --

W ogóle to ja tam widzę dwie zbędne kolumny tj. 11 i 21. Rozumiem, że pierwsza to miesiąc a druga rok? Jeżeli tak, to przecież można to osiągnąć wywołaniem jakiejś wbudowanej funkcji w bazie i tak na prawdę potrzebujesz trzech kolumn: /, G, 00001

1 użytkowników online, w tym zalogowanych: 0, gości: 1