Autor Wątek: Automatyczna realizacja ZK na dokument końcowy - wyrażenie regularne (Regex)  (Przeczytany 6713 razy)

Tomek

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 322
<ze zgłoszenia mailowego>
Mamy problem z ustawieniem wyrażenia regularnego, aby poprawnie mapować rodzaj dokumentu końcowego w Subiekt GT. Jak powinno wyglądać poprawne wyrażenie dla przykładowych uwag:

Nazwa klienta
Numer telefonu klienta
Id Transakcji
Numer zamówienia
#FS
Cokolwiek

Tomek

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 322
W takim układzie proponowałbym użycie wyrażenia (?<=#).*?(?=\r|\n|\r\n|$), a następnie mapowanie nie po #FS, a samym FS, ale sytuacja wygląda w mojej ocenie na dość ryzykowną. Już wyjaśniam.

Aby ustalić na jaki dokument zrealizować ZK musimy przeprowadzić porównanie zawartości uwag z zadanym wzorcem. W Uwagach zazwyczaj znajduje się bardzo wiele elementów i porównywanie całych uwag z wzorcem byłoby niemożliwe, a na pewno wysoce utrudnione. ProstaPaczka wymaga, aby przekazać jej sam ciąg znaków informujących o tym jaki dokument końcowy nas interesuje. Do tego służą wyrażenia regularne (Regex).

Wyrażenie regularne są niczym innym jak opisem ciągu znaków i jest to dość trudne zagadnienie. Najłatwiej posłużyć się przykładem:

Jeśli w Uwagach dokumentu Subiekta GT mamy:

Cytuj
Nazwa klienta
Numer telefonu klienta
Id Transakcji
Numer zamówienia
#FS
Cokolwiek

to wyrażenie regularne:

(?<=#).*?(?=\r|\n|\r\n|$)

zwróci nam wartość:

Cytuj
FS

Tą wartość można mapować na dokument sprzedaży. Co takiego opisało to wyrażenie regularne? "Weź dowolnie długi ciąg znaków spomiędzy znaku # i końca linii".

A teraz dlaczego uważam, że nie jest to bezpieczne podejście? Jeśli w Państwa uwagach nigdy nie pojawi się inny #, to może to zadziałać, ale jak kiedyś klient będzie miał # w nazwie albo # pojawi się w numerze zamówienia, wyrażenie regularne zwróci błędną wartość.

Sugerowałbym przebudowanie swoich uwag w taki sposób, aby wyrażenie regularne zawsze zwróciło prawidłowy ciąg znaków. Moim zdaniem najlepszym wyjściem będzie następująca konstrukcja uwag:

Cytuj
Nazwa klienta
Numer telefonu klienta
Id Transakcji
Numer zamówienia
Dokument końcowy: FS
Cokolwiek

oraz następująca konstrukcja wyrażenia regularnego:

(?<=Dokument końcowy: ).*?(?=\r|\n|\r\n|$)
Takie wyrażenie również zwróci nam FS i właśnie FS (czy PAi, WZ itd.) należy mapować na dokument końcowy.

Podsumowując:

Jeśli mogą Państwo zmienić uwagi w taki sposób, aby zamienić " #FS" na "Dokument końcowy: FS", sugeruję zastosowanie wyrażenia (?<=Dokument końcowy: ).*?(?=\r|\n|\r\n|$), jeśli jednak nie ma takiej możliwości, proszę ustawić (?<=#).*?(?=\r|\n|\r\n|$). W obu przypadkach mapujemy "FS", a nie "#FS".
« Ostatnia zmiana: Październik 13, 2021, 02:36:05 pm wysłana przez Tomek »

Tomek

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 322
W przypadku, gdy w uwagach mamy oznaczenie FS, PA lub faktura, paragon i znajduje się ono na początku pola, stosujemy wyrażenie wybierające odpowiednią liczbę znaków od początku pola:
Cytuj
(?<=^).{7,7}
dla pararon / faktura (oba ciągi składają się z siedmiu znaków)
lub
Cytuj
(?<=^).{2,2}
dla PA / FS (oba ciągi składają się z dwóch znaków)