[FB] StringReplace w SQL

0

Witam

Mam sobie tabeleczke, w której siedzi m.in. numer NIP, ale że w interfejsie nie było maskedit'a, to użytkownicy wpisywali ten NIP tak jak sobie Jaś wojnę wyobrażał, no i jest różnie XXX-XX-XX-XXX, lub XXX-XXX-XX-XX, lub XXXXXXXXXX, lub jeszcze inne kombinacje. No i teraz chce zrobić zabezpieczenie przed wprowadzeniem tego samego numer NIP drugi raz do bazy. Jak porównam to co user wpisze z tym co jest w bazie, to będzie tylko częściowo OK bo
'123-456-78-90' <> '123-45-67-890'
więc pomyślałem, że najlepiej wyciąć kreski i porównywać "czysty" NIP. W Delphi to będzie StringReplace, ale jak zrobić selekcika ?

SELECT ID FROM
TABELKA
WHERE <I TUTAJ WŁAŚNIE JAKIŚ SQL-OWY STRINGREPLACE>(NIP) = :NIP

Kombinowanie z SUBSTRING jest raczej bez sesnsu.
Ktoś ma jakieś pomysły ?</i>

Oprócz oczywiście stworzenia własnego UDF'a

0

A jaki dokladnie 'sql'?

0
johny_bravo napisał(a)

A jaki dokladnie 'sql'?

Kurcze, sorry zapomniałem : )
Firebird 1.5

0

A nie myślaleś o tym, aby odpalić raz procke (kod w Delphi), która przeleci wszystkie rekordy (select id, NIP from tabelka), sprawdzi czy NIP jest spaprany (już w Delphi, więc hulaj dusza) i ewentualnie go poprawi (update rekordu)?

0
SiNuS napisał(a)

A nie myślaleś o tym, aby odpalić raz procke (kod w Delphi), która przeleci wszystkie rekordy (select id, NIP from tabelka), sprawdzi czy NIP jest spaprany (już w Delphi, więc hulaj dusza) i ewentualnie go poprawi (update rekordu)?

Na ten moment bardziej mi chodziło o sprawdzanie przed dodaniem nowego rekordu, czy taki NIP już nie istnieje (z wycięciem kresek). A rozwiązanie z iteracją po całej (no prawie całej) tabeli pewnie będzie mało wydajne do takich celów. Ale zrobię testy to zobaczę. Jakby była funkcja w SQL'u to by było szybsze zapewne. Może napisać stored prockę ...
Wiadomo że iterację można przerwać po pierwszym znalezieniu NIP'a, oraz można wykluczyć rekordy z pustym NIP'em - więc to trochę przyśpieszy. Wartało by też było sprawdzić czy jest indeksik po tym NIP'ie.

Ale z kolei jak gość wpisze 111-222-33-44, ja sprawdzę w bazie i okaże się że jest już NIP 111-22-23-344, no i teraz mu dam komunikat że taki NIP już jest, to on sobie wpisze w filtrze 111-222-33-44 żeby ten rekord znaleźć i zonk, bo takiego nie ma ; ) więc telefon/mail do autora : ( Dlatego może trzeba do tematu podejść jakoś inaczej.

Co do poprawy całej tabeli to sam nie wiem. Nie chciałbym ingerować co tam użytkownik wstawił. Zresztą w Polsce tak naprawde liczą się tylko cyferki, jak są dane kreski to już inna historia, widziałem kilka sposobów. W każdym razie w innych krajach, są jeszcze inne zapisy, więc procka poprawiająca musiała by być dosyć bystra, a i tak pewnie znalazł by się user który powie, że on chce mieć tak jak wpisuje a nie inaczej : ) bo coś tam coś tam.

0
  1. ustawiasz mu na stałe maskę przy wpisywaniu nipu i każdy nip wygląda tak samo
  2. zapisujesz zawsze bez kresek a kreski dodajesz przy pokazywaniu
  3. zapisujesz tak jak user wpisał i bez kresek - szukasz zawsze po tym bez kresek a ten z kreskami tylko do pokazywania
0

Hallo!

Czy NIP jest jakos oficjanlie zdefiniowany? Na przyklad przez jakas norme albo ustawe albo jeszcze cos innego?

<font size="3">Jezeli tak</span>, to uzytkownik twojego programu powinien byc do tego zmuszony aby wpisywal NIP tak jak to okreslaja przepisy.

<font size="3">Jezeli nie</span> (w co osobiscie nie wierze), to musisz akceptowac NIP tak jak go wprowadzil uzytkownik. To znaczy z kreskami, spacjami itd.

Mysle, ze wszystko inne to tylko zbedna zaglowanie danymi, ktore komplikuje zycie i moze prowadzic do bledow.

Pozdrawiam
Markus</span>

0

Jest zdefiniowany jesli chodzi o cyfry (np. pierwsze trzy to kod urzedu skarbowego, ostatnia to suma kontrolna). Ale nie definuje sie jak sie go podaje, o ile wiem.

Jezeli nie (w co osobiscie nie wierze), to musisz akceptowac NIP tak jak go wprowadzil uzytkownik. To znaczy z kreskami, spacjami itd.

Bezsens - nic nie musi. Chyba nie wiesz co znaczy pozwolic uzytkownikom na wolna amerykanke przy wprowadzaniu danych...

0

Hallo!

johny_bravo napisał(a)

Jest zdefiniowany jesli chodzi o cyfry (np. pierwsze trzy to kod urzedu skarbowego, ostatnia to suma kontrolna). Ale nie definuje sie jak sie go podaje, o ile wiem.

Wiec dlaczego ich sie nie stosuje przy wprowadzaniu NIP? Po co te reguly zmieniac?

johny_bravo napisał(a)

Bezsens - nic nie musi. Chyba nie wiesz co znaczy pozwolic uzytkownikom na wolna amerykanke przy wprowadzaniu danych...

Jezeli uwaznie przeczytasz moj post, to zauwazysz ze napiselem:

Jezeli nie (w co osobiscie nie wierze), to musisz akceptowac NIP tak jak go wprowadzil uzytkownik. To znaczy z kreskami, spacjami itd.

Innymi slowy do NIP nie stosuja sie zadne reguly. A jezeli nie, to dozwolone sa wszystlie mozliwe konstrukcje NIP-u (ta z kwiatkiem na koncu - tez ;-) ).

Na przyklad nazwisko:
Budowa i skladnia nazwiska nigdzie nie jest zdefiniowana (poza tym ze pisze sie je z duzej litery).
Wszystkie mi znane programy akceptuja kazde wprowadzone nazwisko.
Gdzie tu jest "wolna amerykanka"?

Pozdrawiam
Markus

0

NIP sklada sie z cyfr. Ni mniej ni wiecej. Zezwalanie na wpisywanie dowolnych innych znakow gdzie sie zywnie podoba to prosba o klopoty. Tego samego typu jazda bez trzymanki to zezwalanie na wpisywanie imienia i nazwiska w dowolnej kolejnosci jako jednego tekstu, kiedy bedzie wiadomo, ze potrzebne bedzie wyszukiwanie po jednym i po drugim. A przeciez nie ma ustalonej urzedowo kolejnosci...

Twojego posta dokladnie przeczytalem i nie wiem gdzie tam haczyk, bo dalej nie rozumiem wnioskowania ;) To autor decyduje jaki bedzie format danych jezeli nie ma go narzuconego odgornie (prawo, klient, itp). A jezeli klient sobie zazyczy dowolny format to ja nie bralbym odpowiedzialnosci za sprzatanie bazy po tym ;)

PS. Co do stosowania sie do odgornych zarzadzen, to w Polsce jest ustalony jeden format daty (rrrr-mm-dd o ile pamietam) a widac jak sie wszyscy do niego stosuja...

0
Misiekd napisał(a)
  1. ustawiasz mu na stałe maskę przy wpisywaniu nipu i każdy nip wygląda tak samo
  2. zapisujesz zawsze bez kresek a kreski dodajesz przy pokazywaniu
  3. zapisujesz tak jak user wpisał i bez kresek - szukasz zawsze po tym bez kresek a ten z kreskami tylko do pokazywania

Zgadza się i to jest solidny projekt pod ten fragment aplikacji (co prawda nie uwzględnia tego że czasem są NIP'y w innym formacie bo pochodzą z poza kraju ale to już szczegół). W każdym razie ja stety/niestety w etapie projektowania nie uczestniczyłem, tylko dostałem aplikację w której (jak pisałem w 1 poście) użytkownicy wprowadzają sobie te NIP'y tak jak sobie Jaś wojnę wyobrażał.

johny_bravo napisał(a)

... A jezeli klient sobie zazyczy dowolny format to ja nie bralbym odpowiedzialnosci za sprzatanie bazy po tym ;)

I tak też chyba będę zmuszony zrobić. Będę sprawdzał czy jest taki NIP w bazie jak gość wpisał i już - taka kontrola zawsze lepsza niż brak kontroli : )

Dzięki wszystkim o pomoc.

0
b0bik napisał(a)
Misiekd napisał(a)
  1. ustawiasz mu na stałe maskę przy wpisywaniu nipu i każdy nip wygląda tak samo
  2. zapisujesz zawsze bez kresek a kreski dodajesz przy pokazywaniu
  3. zapisujesz tak jak user wpisał i bez kresek - szukasz zawsze po tym bez kresek a ten z kreskami tylko do pokazywania

Zgadza się i to jest solidny projekt pod ten fragment aplikacji (co prawda nie uwzględnia tego że czasem są NIP'y w innym formacie bo pochodzą z poza kraju ale to już szczegół). W każdym razie ja stety/niestety w etapie projektowania nie uczestniczyłem, tylko dostałem aplikację w której (jak pisałem w 1 poście) użytkownicy wprowadzają sobie te NIP'y tak jak sobie Jaś wojnę wyobrażał.
ale co za problem dodać dodatkowe pole do bazy, uzupełnić je bez kresek i np. trigerem uzupełniać przy zmianie/dodawaniu nowych rekordów. W FB masz 2 UDFy w standardzie - tam masz strpos i substr więc wyciągnięcie NIPu bez kresek nie będzie problemem

0
Misiekd napisał(a)

ale co za problem dodać dodatkowe pole do bazy, uzupełnić je bez kresek i np. trigerem uzupełniać przy zmianie/dodawaniu nowych rekordów. W FB masz 2 UDFy w standardzie - tam masz strpos i substr więc wyciągnięcie NIPu bez kresek nie będzie problemem

O to ciekawy pomysł. Dodatkowo trzeba by jeszcze na starcie odpalić prockę, ktora przepisze wszystkie NIP'y do tej nowej kolumny. Nawet ten problem z szukaniem co pisałem wyżej by się rozwiązał, bo bym szukał po tej nowej kolumnie więc jak gośc wpise 1234567890 to mu się znajdą i 123-45-67-890 i 123-456-78-90. A jak wpisze z kreskami to zrobie StringReplace przed wyszukiwaniem. Jedyny minus jest taki że się troszkę bazka powiększy, będzie troszki redundancji. Ale idea bardzo ciekawa - być może pójdzie do realizacji. Dzięki.

0

Jedyny minus jest taki że się troszkę bazka powiększy, będzie troszki redundancji.

Jak sie ma gotowa baze i aplikacje i nie bardzo pasuje ja ruszac to czasem jest lepsze wyjscie niz spedzic tydzien na wymyslaniu procedury, ktora to wszystko posprzata.
Ale skoro sa takie funkcje, jak pisze Misiekd(bo ja nie znam FB), to czemu nie podmienic kreskowych NIPow na bezkreskowe? A w aplikacji wyswietlac kreski jak Pan Bog przykazal?

0
johny_bravo napisał(a)

Ale skoro sa takie funkcje, jak pisze Misiekd(bo ja nie znam FB), to czemu nie podmienic kreskowych NIPow na bezkreskowe? A w aplikacji wyswietlac kreski jak Pan Bog przykazal?

  1. Bo są NIP'y nie tylko z Polski.
  2. Bo można się spodziewać, że mi zaraz user zarzuci, że on nie chce mieć tak kresesk XXX-XX-XX-XXX tylko tak XX-XX-XXX-XXX : ).
0

No tak, fucktycznie.

Chociaz w paru programach do ksiegowosci (Navision i Subiekt zdaje sie) rozwiazali to tak, ze pole na NIP bylo w pelni 'spolszczone' a osobne bylo dla kontrahentow zagranicznych - ale nie pamietam jak sie to zwalo. Tak zle i tak niedobrze...

  1. Zawsze mozna w ustawieniach pozwolic na ustawienie formatu wyswietlania NIPu, chyba, ze to wiecej roboty.
0
Misiekd napisał(a)

W FB masz 2 UDFy w standardzie - tam masz strpos i substr więc wyciągnięcie NIPu bez kresek nie będzie problemem

A ten strpos to jest w FB 1.5 ? Przeglądałem fbudf i ib_udf i nie widze.

0

Nawet z kreskami typko w Polsce jest troche zamiesznaia, ponieważ zwyczajowo stosuje się 2 "formaty kresek":

XXX-XXX-XX-XX: osoby fizyczne
XX-XXX-XXX-XX: osoby prawne

Taki zapis jest stosowany przez urzędy skarbowe, natomiast prawnie nie jest wymagane podawanie kresek np. ZUS zawsze żąda bez kresek. Przynajmniej jak czytałem ustawy o podatku dochodowym i VAT to nie rzuciło mi się w oczy, by tam cos na temat kresek było.

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