- Tabela obsługuje ruch w obie strony — kolumna
TYProzdziela wiadomości wychodzące od przychodzących. - Status w kolumnie
ACHma cztery stany, w tym osobny dla wiadomości oczekującej na ponowną próbę. - Kolumny
SMS_IDiSMS_KIEDYprzechowują dane od operatora — podstawa przy reklamacji niedostarczonej wiadomości. - Para
POWIAZANIE_TYPiPOWIAZANIE_REFNOwiąże wiadomość z obiektem, którego dotyczy.
Do czego służy tabela [dbo].[_sms]
SMS ma w logistyce zastosowanie, którego nie zastąpi poczta elektroniczna: dociera do kierowcy stojącego przy bramie i do magazyniera bez służbowej skrzynki. Powiadomienie o przydzielonym oknie czasowym, kod potwierdzający wjazd, monit o gotowości towaru — wszystkie one trafiają do tabeli [dbo].[_sms].
Rejestr obejmuje ruch dwukierunkowy. Wiadomości wychodzące zapisywane są przed wysłaniem i aktualizowane po odpowiedzi operatora. Przychodzące — po odebraniu, co pozwala zbudować prostą komunikację zwrotną: kierowca odpowiada na powiadomienie, a system wiąże jego odpowiedź z awizacją dzięki kolumnom powiązania.
Praktycznie najważniejsze są trzy kolumny opisujące niepowodzenia. LICZBA_BLEDOW zlicza nieudane próby, OSTATNI_BLAD przechowuje treść komunikatu od operatora, a OSTATNI_BLAD_KIEDY moment jego wystąpienia. Razem odpowiadają na pytanie, czy problem dotyczy jednego numeru, czy całej usługi — a to zupełnie różne sytuacje.
Identyfikator nadany przez operatora jest jedynym punktem odniesienia przy reklamacji wiadomości, która nie dotarła do odbiorcy.
Budowa tabeli — wykaz kolumn
Osiemnaście kolumn opisuje treść wiadomości, jej strony, stan wysyłki oraz powiązanie z obiektem w systemie.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
| Treść i strony | |||
WIADOMOSC | varchar(1530) tekst do 1530 znaków | tak | Treść sms-a, maksymalna długość 1530 bez znaków specjalnych, ze specjalnymi 670 |
NUMER_DO | varchar(20) tekst do 20 znaków | tak | Odbiorca sms-a |
NUMER_OD | varchar(20) tekst do 20 znaków | nie | Nadawca sms-a |
TYP | varchar(20) tekst do 20 znaków | tak | Typ sms-a, WYCH - wychodzący, PRZYCH - przychodzący |
| Stan wysyłki | |||
ACH | varchar(1) tekst do 1 znaków | tak | Oznaczenie rekordu, 1 - sms do wysłania, 2 - sms wysłany, 3 - sms do wysłania błędny, 6 - sms odebrany, X - sms usunięty |
LICZBA_BLEDOW | int liczba całkowita | tak | Liczba nieudanych prób wysłania sms-a |
OSTATNI_BLAD | varchar(1000) tekst do 1000 znaków | nie | Ostatni błąd podczas wysyłania sms-a |
OSTATNI_BLAD_KIEDY | datetime data i godzina | nie | Data ostatniego błędu wysyłania sms-a |
SMS_ID | varchar(100) tekst do 100 znaków | nie | Identyfikator sms-a podawany przez dostawcę usługi |
SMS_KIEDY | datetime data i godzina | nie | Data wysłania lub odebrania sms-a podawana przez dostawcę usługi |
| Powiązania i metryka | |||
ID_SMS | int liczba całkowita | tak | Identyfikator wiersza tabeli |
REFNO | bigint liczba całkowita 64-bitowa | tak | Systemowy numer referencyjny |
POWIAZANIE_TYP | varchar(20) tekst do 20 znaków | nie | Typ obiektu powiązanego |
POWIAZANIE_REFNO | bigint liczba całkowita 64-bitowa | nie | Systemowy numer referencyjny obiektu powiązanego |
PRX | varchar(5) tekst do 5 znaków | nie | Kod pozwalający podzielić zapisywane rekordy na poszczególne źródła |
ROLASYS | varchar(3) tekst do 3 znaków | nie | Kod roli systemowej |
KIEDY | datetime data i godzina | tak | Data i godzina dopisania rekordu |
LOGIN | varchar(50) tekst do 50 znaków | tak | Nazwa użytkownika dodającego rekord |
Kolumna WIADOMOSC mieści 1530 znaków, co odpowiada dziesięciu wiadomościom standardowym. Użycie polskich znaków diakrytycznych skraca ten limit mniej więcej o połowę, bo wymusza inne kodowanie — a każda rozpoczęta wiadomość jest osobno rozliczana przez operatora.
Indeksy i wydajność zapytań
Tabela ma zdefiniowany wyłącznie klucz główny, co przy rosnącym wolumenie wysyłek staje się ograniczeniem.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
PK__sms | ID_SMS | klucz główny |
Usługa wysyłająca pyta cyklicznie o wiadomości oczekujące, czyli filtruje po kolumnie ACH. Bez indeksu na tej kolumnie każde takie zapytanie oznacza przejrzenie całej tabeli. Przy kilkuset wiadomościach nie ma to znaczenia; przy kilkuset tysiącach warto rozważyć indeks na parze ACH i KIEDY.
Co wpływa na koszt i skuteczność wysyłki
SMS jest rozliczany za każdą rozpoczętą wiadomość, a jego skuteczność zależy od kilku rzeczy, które łatwo przeoczyć przy konfiguracji.
- Polskie znaki podwajają koszt. Wiadomość ze znakami diakrytycznymi mieści 70 znaków zamiast 160, więc dłuższy tekst rozbija się na więcej części.
- Nadawca alfanumeryczny wymaga zgłoszenia. Nazwa firmy zamiast numeru buduje zaufanie, ale wymaga rejestracji u operatora i wyklucza odpowiedź zwrotną.
- Format numeru ma znaczenie. Numery bez prefiksu kierunkowego bywają odrzucane; warto ujednolicić je już w kartotece.
- Ponawianie ma granicę. Wiadomość odrzucona z powodu błędnego numeru nie zostanie nadana za setnym razem — licznik prób powinien mieć próg.
- Pora wysyłki wpływa na odbiór. Powiadomienie o oknie czasowym wysłane o czwartej rano zostanie zignorowane albo źle przyjęte.
Pierwszy punkt bywa źródłem nieprzyjemnych niespodzianek przy rozliczeniu. Powiadomienie o długości 150 znaków wygląda na pojedynczą wiadomość, ale jeśli zawiera polskie znaki, zostanie rozbite na trzy części — i tak też rozliczone. Przy kilku tysiącach wysyłek miesięcznie różnica przestaje być drobiazgiem, dlatego szablony powiadomień warto sprawdzić pod tym kątem przed uruchomieniem.
Jak korzystać z tabeli w praktyce
Przy korzystaniu z wysyłki SMS obowiązują następujące zasady:
- Ujednolicaj format numerów w kartotece, z prefiksem kierunkowym — to najczęstsza przyczyna odrzuceń po stronie operatora.
- Sprawdź długość szablonu z uwzględnieniem polskich znaków; te skracają limit pojedynczej wiadomości ze 160 do 70 znaków.
- Ustaw próg dla kolumny
LICZBA_BLEDOW, po którym system przestaje ponawiać — błędny numer nie stanie się poprawny. - Zachowuj identyfikator z kolumny
SMS_ID; przy reklamacji u operatora jest jedynym punktem odniesienia. - Wypełniaj kolumny powiązania, aby dało się ustalić, którego zlecenia albo awizacji dotyczyła wiadomość.
- Rozważ indeks na parze
ACHiKIEDY, gdy liczba wiadomości przekroczy kilkadziesiąt tysięcy.
Zestawienie skuteczności wysyłki z ostatniego tygodnia w podziale na dni, wraz z najczęstszym komunikatem błędu:
SELECT CAST(KIEDY AS date) AS DZIEN,
COUNT(*) AS WSZYSTKICH,
SUM(CASE WHEN ACH = '2' THEN 1 ELSE 0 END) AS WYSLANYCH,
SUM(CASE WHEN LICZBA_BLEDOW > 0 THEN 1 ELSE 0 END) AS Z_BLEDAMI,
MAX(LEFT(OSTATNI_BLAD, 80)) AS PRZYKLADOWY_BLAD
FROM dbo._sms
WHERE TYP = 'WYCH'
AND KIEDY >= DATEADD(DAY, -7, GETDATE())
GROUP BY CAST(KIEDY AS date)
ORDER BY DZIEN DESC;
Nagły wzrost kolumny z błędami w jednym dniu wskazuje zwykle na problem po stronie usługi, a nie na serię błędnych numerów w kartotece.
Wysyłka SMS jest tanim sposobem skrócenia kolejki przy bramie i ograniczenia telefonów do dyspozytora — pod warunkiem że wiadomości faktycznie docierają. Rejestr daje wszystko, czego trzeba, żeby to sprawdzić; wystarczy raz na tydzień do niego zajrzeć.
Powiązane tabele i dokumentacja
Wysyłka SMS uzupełnia pozostałe kanały powiadamiania opisane w dokumentacji: