Napredni način vnašanja kod
Napredni način vnašanja kod
Posebne primere vnosov kod rešujemo s posebno stored proceduro, ki pretvori vnos (običajno skenirano vrednost) v podatke, ki jih za svoje delo potrebuje PANTHEON. Na ta način lahko rešujemo sledeče primere:
- EAN/UCC 128 kode
- Kode s produktno varianto
- netipične kode ali
- druge kombinacije
Stored procedura se izvaja v vsakem primeru, če le ta obstaja na strežniku . Če procedura na strežniku ne obstaja, PANTHEON funkcionira normalno. Parametri za proceduro so fiksni. Paziti je potrebo, da procedura vrača recordset z vsaj sledečimi polji:
- ISOK: ki je lahko T/F in pove ali je operacija uspela
- ERRMSG: je uporabniško sporočilo ob napaki
- IDENT: koda identa
- KOLICINA: količina
- SERIALNO: serijska številka
Lahko pa poleg teh polj vrne še vse ostala PANTHEON polja (razen uporabniških), ki se nahajajo v tabeli PROMETPOZ.
 |
Če uporabljate ta način vnosa identov preko stored procedure, potem v tabeli, v katero se vpisujejo pozicije, tipka ENTER ne preskakuje na naslednje polje. Funkcionalnost kurzorskih tipk in TAB je nespremenjena. |
 |
Program vedno preveri po vrnitvi iz te procedure, ali je šifra identa, ki ga je procedura vrnila, pravilna (ali je vpisana v šifrant identov). Enako so veljavne tudi kontrole za serijsko številko. |
 |
set nocount on je obvezen ukaz, saj mora procedura vračati vedno le en recordset.
|
 |
Niz, ki je predan v polju ERRMSG se vedno izpiše, ne glede na to, ali je ISOK = 'T' ali 'F'.
Tako lahko to možnost uporabimo za sporočanje določenega opozorila. |
 |
Če uporabimo ta način iskanja (vpisovanja) kod, potem
NE DELUJE in ga je potrebno vključiti (sprogramirati ročno) v proceduro!
|
Primer skenirane kode, ki vsebuje identifikator, šifro, količino in serijsko številko
Imamo kodo sledeče oblike (npr. živilski izdelek):
01EEEEEEEEEEEEEEKKKKKDDDDDDD
kjer je
- 01 - identifikator, da gre za tako sestavljen ident
- EEEEEEEEEEEEEE - 14 mestna EAN koda izdelka
- KKKKK - 5 mestna količina v gramih (IDENT je normiran v KG)
- DDDDDDD - datum poteka uporabnosti identa
Če ident nima na začetku identifikatorja 01, potem je ident običajen in ga prenesemo v PANTHEON. Stored procedura, ki jo moramo napisati za ta primer je sledeča:
create procedure [dbo].[dl_HE_MSIdentSetText]
@cKljuc Char(13), -- ključ, na katerem dokumentu je bil sprožen vnos kode
@nPoz SmallInt, -- pozicija, na katerem je bil sprožen vnos kode (ni nujno!!)
@cSubjekt Char(30), -- Kupec ali dobavitelj dokumenta
@cText VarChar(512) -- Vnešena vrednost
as
set nocount on
if Left(@cText,2) = '01' -- je to sestavljena koda?
select 'T' as acISOK, '' as acERRMSG, SubString(@cText,3,14) as acIDENT,
(cast(SubString(@cText,18,5) as money) / 1000) as anQty,
SubString(@cText,24,10) as acSERIALNO
else -- ne, potem vrni poskenirano kot ident
select 'T' as acISOK, '' as acERRMSG, @cText as acIDENT,0 as anQty,'' as acSERIALNO
Primer skenirane kode, ki vsebuje produktno varianto
Imamo kodo sledeče oblike (npr. čevlje):
EEEEEEEEEEEEEEBBBBVVV
kjer je
- EEEEEEEEEEEEEE - 14 mestna EAN koda izdelka
- BBBB - 4 mestna koda barve
- VVV - 3 mestna koda velikosti
Identi so mešani, tako da lahko poskeniramo katerikoli ident. Iz šifre vemo, ali gre za ident s produktno varianto ali ne. Stored procedura, ki jo moramo napisati za ta primer je sledeča:
create procedure [dbo].[dl_HE_MSIdentSetText]
@cKljuc Char(11), -- ključ, na katerem dokumentu je bil sprožen vnos kode
@nPoz SmallInt, -- pozicija, na katerem je bil sprožen vnos kode (ni nujno!!)
@cSubjekt Char(30), -- Kupec ali dobavitelj dokumenta
@cText VarChar(512) -- Vnešena vrednost
as
set nocount on
declare
@cIdent char(16),
@cTipSerijske char(1)
set @cIdent = Left(@cText,14)
set @cTipSerijske = null
select @cTipSerijske = SERIALNO
from IDENT
where IDENT = @cIdent
if @cTipSerijske is null
select 'F' as ISOK, 'Ni identa' as ERRMSG, '' as IDENT,0 as KOLICINA,'' as SERIALNO
else
if @cTipSerijske = 'P' then
select 'T' as ISOK, '' as ERRMSG, @cIdent as IDENT,0 as KOLICINA,Right(@cText,7) as SERIALNO
else
select 'T' as ISOK, '' as ERRMSG, @cText as IDENT,0 as KOLICINA,'' as SERIALNO