Numeracja dokumentów: Różnice pomiędzy wersjami

Z Motława
(Utworzył nową stronę „'''Numerowanie w Motławie można podzielić na trzy obszary:''' * '''NUMDOK''' - stary, dotyczący wyłącznie dokumenty oparte na tabelach `opng` i `zmng`; * '''NUMD…”)
 
Linia 89: Linia 89:
 
===SQL_GetParams ===
 
===SQL_GetParams ===
 
SQL-ka dla pobierania danych koniecznych do pobrania licznika i wypełnienia maski.
 
SQL-ka dla pobierania danych koniecznych do pobrania licznika i wypełnienia maski.
Przykładowa sql-ka dla definicji “opng.nrdokfin”:
+
 
SELECT
+
'''Przykładowa sql-ka dla definicji “opng.nrdokfin”:'''
n.nrdokfin AS _Number,
+
 
n.Rodzaj, 0 AS PodRodzaj,  
+
  SELECT
IF(n.ZMagazynu != 0, n.ZMagazynu, n.DoMagazynu) AS _Res1,
+
  n.nrdokfin AS _Number,
n.DoMagazynu AS _Res2,
+
  n.Rodzaj, 0 AS PodRodzaj,  
'' AS _ResGUID,
+
  IF(n.ZMagazynu != 0, n.ZMagazynu, n.DoMagazynu) AS _Res1,
YEAR(n.DataWystaw) AS _NumYear,
+
  n.DoMagazynu AS _Res2,
MONTH(n.DataWystaw) AS _NumMonth,
+
  '' AS _ResGUID,
DAY(n.DataWystaw) AS _NumDay,
+
  YEAR(n.DataWystaw) AS _NumYear,
n.RodzajDowodu AS _RodzajDowodu,
+
  MONTH(n.DataWystaw) AS _NumMonth,
n.RV_ID AS _Rv_id,
+
  DAY(n.DataWystaw) AS _NumDay,
n.UGrpGUID AS _UGrpGUID,
+
  n.RodzajDowodu AS _RodzajDowodu,
IFNULL(m1.symbol, '') AS _MGS,
+
  n.RV_ID AS _Rv_id,
IFNULL(m2.symbol, '') AS _MDS
+
  n.UGrpGUID AS _UGrpGUID,
FROM `#TABLENAME#` n
+
  IFNULL(m1.symbol, '') AS _MGS,
LEFT JOIN `Magazyny` m1_0 ON m1_0.IdnMagazynu = IF(n.ZMagazynu != 0, n.ZMagazynu, n.DoMagazynu)
+
  IFNULL(m2.symbol, '') AS _MDS
LEFT JOIN `Magazyny` m1 ON m1.IdnMagazynu = m1_0.grupa
+
  FROM `#TABLENAME#` n
LEFT JOIN `Magazyny` m2_0 ON m2_0.IdnMagazynu = n.DoMagazynu
+
  LEFT JOIN `Magazyny` m1_0 ON m1_0.IdnMagazynu = IF(n.ZMagazynu != 0, n.ZMagazynu, n.DoMagazynu)
LEFT JOIN `Magazyny` m2 ON m2.IdnMagazynu = m2_0.grupa
+
  LEFT JOIN `Magazyny` m1 ON m1.IdnMagazynu = m1_0.grupa
WHERE
+
  LEFT JOIN `Magazyny` m2_0 ON m2_0.IdnMagazynu = n.DoMagazynu
GUID = '#ID#'
+
  LEFT JOIN `Magazyny` m2 ON m2.IdnMagazynu = m2_0.grupa
INTO  
+
  WHERE
@erp_obj_counters._Number,
+
  GUID = '#ID#'
@erp_obj_counters._Rodzaj,  
+
  INTO  
@erp_obj_counters._PodRodzaj,  
+
  @erp_obj_counters._Number,
@erp_obj_counters._Res1,
+
  @erp_obj_counters._Rodzaj,  
@erp_obj_counters._Res2,
+
  @erp_obj_counters._PodRodzaj,  
@erp_obj_counters._ResGUID,
+
  @erp_obj_counters._Res1,
@erp_obj_counters._NumYear,
+
  @erp_obj_counters._Res2,
@erp_obj_counters._NumMonth,
+
  @erp_obj_counters._ResGUID,
@erp_obj_counters._NumDay,
+
  @erp_obj_counters._NumYear,
@erp_obj_counters._RodzajDowodu,
+
  @erp_obj_counters._NumMonth,
@erp_obj_counters._Rv_id,
+
  @erp_obj_counters._NumDay,
@erp_obj_counters._UGrpGUID,
+
  @erp_obj_counters._RodzajDowodu,
@erp_obj_counters._MGS,
+
  @erp_obj_counters._Rv_id,
@erp_obj_counters._MDS
+
  @erp_obj_counters._UGrpGUID,
;
+
  @erp_obj_counters._MGS,
 +
  @erp_obj_counters._MDS
 +
  ;
  
 
System automatycznie wykonuje to zapytanie aby otrzymać szereg zmiennych koniecznych do pobrania kolejnego numeru (dane do grupowania) oraz aby wypełnić maskę numeru.
 
System automatycznie wykonuje to zapytanie aby otrzymać szereg zmiennych koniecznych do pobrania kolejnego numeru (dane do grupowania) oraz aby wypełnić maskę numeru.
 +
 +
 
'''UWAGA'''  
 
'''UWAGA'''  
  
 
''W tabeli `erp_obj_counters_masks` również istnieje pole SQL_GetParams i jesli jest niepuste to jego zawartość jest wykonywana dla danego numeratora.''
 
''W tabeli `erp_obj_counters_masks` również istnieje pole SQL_GetParams i jesli jest niepuste to jego zawartość jest wykonywana dla danego numeratora.''
  
SQL_UpdateNum  
+
===SQL_UpdateNum===
 +
 
 +
 
 
Tę sql-ke system również wykonuje automatycznie.
 
Tę sql-ke system również wykonuje automatycznie.
 
Ustawia ona pole w określonej tabeli. Parametry #TABLENAME#,#NUMBER# są wypałniane są również automatycznie ze zmiennych i z ustawień.
 
Ustawia ona pole w określonej tabeli. Parametry #TABLENAME#,#NUMBER# są wypałniane są również automatycznie ze zmiennych i z ustawień.
PRZYKŁAD
+
'''PRZYKŁAD'''
UPDATE `#TABLENAME#`  
+
  UPDATE `#TABLENAME#`  
SET
+
  SET
NrDokFin = '#NUMBER#'
+
  NrDokFin = '#NUMBER#'
WHERE
+
  WHERE
GUID = '#ID#'
+
  GUID = '#ID#'
AND (NrDokFin = '' OR #ALWAYS#)
+
  AND (NrDokFin = '' OR #ALWAYS#)
;
+
  ;
 
UWAGA w tabeli `erp_obj_counters_masks` również istnieje pole SQL_UpdateNum i jesli jest niepuste to jego zawartość jest wykonywana dla danego numeratora.
 
UWAGA w tabeli `erp_obj_counters_masks` również istnieje pole SQL_UpdateNum i jesli jest niepuste to jego zawartość jest wykonywana dla danego numeratora.

Wersja z 10:58, 11 lut 2015

Numerowanie w Motławie można podzielić na trzy obszary:

  • NUMDOK - stary, dotyczący wyłącznie dokumenty oparte na tabelach `opng` i `zmng`;
  • NUMDOK/COUNTER - przejściowy, oparty na nowym numeratorze `erp_obj_counters` oraz
  • COUNTER - zupełnie nowy oparty na systemie uniwersalnego numerowania.


OBSZARY NUMERACJI

NUMDOK

System numerujący dokumenty oparte na tabelach `opng` i `zmng`.

Licznikiem są

  • dla numerów głównych (nrdokfin, nrdokmag, etc) tabela `numdok`
  • dla numerów wewnętrznych (nrwewn) tabela `numwewn`.

Maska obu numeratorów oraz dodatkowe ustawienia znajdują się w tabeli `operdoc`.

UWAGA

Tabela `operdoc` pozwala ustawiać parametry z dokładnością do rodzaju dokumentu czyli nie uwzględnia podrodzaju.


NUMDOK/COUNTER

Ten system korzysta z nowych numeratorów jakim są `erp_obj_counters`, ale pozostałe ustawienia nadal są trzymane w tabeli `operdoc`. Niektóre algorytmy "pobierają" numer dla zdarzeń CRM inne tworzą numer z dokładnościa do miesiąca - nowy nuumerator `erp_obj_counters` ma większe możliwości grupowania numerów i dlatego jest używany (patrz liczniki w COUNTER).

Licznikiem jest tabela `erp_obj_counters` Maska numeratorów oraz dodatkowe ustawienia znajdują się w tabeli `operdoc`.


COUNTER

Całkiem nowy system numerowania.

Licznikiem jest tabela `erp_obj_counters` Maski oraz dodatkowe ustawienia znajdują się w tabeli `erp_obj_counters_masks` która nazywamy numeratorami. Każdy rekord to inny numerator który zawiera wszystkie konieczne ustawienia dotyczące numeracji. Nie ma zatem potrzeby wykorzystywania tabeli `operdoc` która dodatkowo ograniczała numerację tylko do dokumentów.

Nowe liczniki mogą grupować numery wg:

  • zasobu 1 (np. magazyn)
  • zasobu 2 (ustawialne)
  • zasobu znakowego (np. RV_ID)
  • roku
  • miesiąca
  • dnia (rok, miesiąc, dzień - podawany jest do procedury ale w automacie podawane jest konkretne pole daty)

Tabela numeratorów czyli ustawień `erp_obj_counters_masks`jest uniwersalna i pozwala zdefiniować dowolny numerator dla dowolnego pola z dowolnej tabeli. Nie ma tu ograniczenia do dwóch pól i dwóch tabel.

Numeratory dzielimy wg.:

  • typu numeretora (string - pozwala zdefiniować dowolną liczbę numertorów (np. nrdokfin, nrdokmag, etc)
  • rodzaju i
  • podrodzaju

Każdy numerator może być "przekierowany" na inny typ/rodzaj/podrodzaj np. numerator magazynowy dla faktury zakupu może być "przekierowany" na analogiczny numerator o rodzaju WZ.

Ponadto w każdym numeratorze możemy:

  • ustawić maskę,
  • ustalić jak numerator będzie grupować numery (zasoby, rok, miesiąc, dzień)
  • ustalić zachowanie algorytmów przy przepisywaniu numerów do końcowych pól w tabelach.
  • ustalić czy numer (określone pole numeru) może być:
    • edytowane - EditedNum
    • można manualnie pobrać kolejny numer - ManualNum
    • program sam ma pobrać kolejny numer przy zapisie (gdy pole puste) - AutoNum czy automatyczna numeracja
  • pola SQL_GetParams (SQL dla pobierania danych) oraz SQL_UpdateNum mają nieco szersze znaczenie - patrz ustawienia SQL_GetParams w DEFINICJA numeratorów.


DEFINICJA numeratorów

Każdy numerator określamy jako trójke atrybutów: typ, rodzaj i podrodzaj. Typ numeratora jest zdefiniowany w tabeli `erp_obj_counters_def` i nazywany jest definicja danego numeratora. Innymi słowy numeratory definiujemy w `erp_obj_counters_def` natomiast w `erp_obj_counters_masks` gromadzimy wszystkie możliwe wystąpienia rodzajowe danego numeratora (rodzaj, podrodzaj).

Co oprócz samej nazwy zawiera definicja numeratora?

Zawiera konieczne do automatycznego przetwarzania ustawienia:

  • TableName - nazwa tabeli w której znajduje się pole numeru
  • SQL_GetParams - SQL dla pobierania danych koniecznych do pobrania licznika i wypełnienia maski.
  • SQL_UpdateNum - SQL dla wstawienie numeru do tabeli z pola TableName
  • Disabled - określa czy definicja jest jeszcze używana.

SQL_GetParams

SQL-ka dla pobierania danych koniecznych do pobrania licznika i wypełnienia maski.

Przykładowa sql-ka dla definicji “opng.nrdokfin”:

 SELECT
 n.nrdokfin AS _Number,
 n.Rodzaj, 0 AS PodRodzaj, 
 IF(n.ZMagazynu != 0, n.ZMagazynu, n.DoMagazynu) AS _Res1,
 n.DoMagazynu AS _Res2,
  AS _ResGUID,
 YEAR(n.DataWystaw) AS _NumYear,
 MONTH(n.DataWystaw) AS _NumMonth,
 DAY(n.DataWystaw) AS _NumDay,
 n.RodzajDowodu AS _RodzajDowodu,
 n.RV_ID AS _Rv_id,
 n.UGrpGUID AS _UGrpGUID,
 IFNULL(m1.symbol, ) AS _MGS,
 IFNULL(m2.symbol, ) AS _MDS
 FROM `#TABLENAME#` n
 LEFT JOIN `Magazyny` m1_0 ON m1_0.IdnMagazynu = IF(n.ZMagazynu != 0, n.ZMagazynu, n.DoMagazynu)
 LEFT JOIN `Magazyny` m1 ON m1.IdnMagazynu = m1_0.grupa
 LEFT JOIN `Magazyny` m2_0 ON m2_0.IdnMagazynu = n.DoMagazynu
 LEFT JOIN `Magazyny` m2 ON m2.IdnMagazynu = m2_0.grupa
 WHERE
 GUID = '#ID#'
 INTO 
 @erp_obj_counters._Number,
 @erp_obj_counters._Rodzaj, 
 @erp_obj_counters._PodRodzaj, 
 @erp_obj_counters._Res1,
 @erp_obj_counters._Res2,
 @erp_obj_counters._ResGUID,
 @erp_obj_counters._NumYear,
 @erp_obj_counters._NumMonth,
 @erp_obj_counters._NumDay,
 @erp_obj_counters._RodzajDowodu,
 @erp_obj_counters._Rv_id,
 @erp_obj_counters._UGrpGUID,
 @erp_obj_counters._MGS,
 @erp_obj_counters._MDS
 ;

System automatycznie wykonuje to zapytanie aby otrzymać szereg zmiennych koniecznych do pobrania kolejnego numeru (dane do grupowania) oraz aby wypełnić maskę numeru.


UWAGA

W tabeli `erp_obj_counters_masks` również istnieje pole SQL_GetParams i jesli jest niepuste to jego zawartość jest wykonywana dla danego numeratora.

SQL_UpdateNum

Tę sql-ke system również wykonuje automatycznie. Ustawia ona pole w określonej tabeli. Parametry #TABLENAME#,#NUMBER# są wypałniane są również automatycznie ze zmiennych i z ustawień. PRZYKŁAD

 UPDATE `#TABLENAME#` 
 SET
 NrDokFin = '#NUMBER#'
 WHERE
 GUID = '#ID#'
 AND (NrDokFin =  OR #ALWAYS#)
 ;

UWAGA w tabeli `erp_obj_counters_masks` również istnieje pole SQL_UpdateNum i jesli jest niepuste to jego zawartość jest wykonywana dla danego numeratora.