maartinjsh
CONTRIBUTOR ***

PVZ ievade izmantojot REST

autors maartinjsh

Turpinot par pavadzīmju izveidošanu.

 

1. Rest pieprasījumā norādot 

<PAMAT>komentārs, pamatojums, bla bla</PAMAT>

saturs netiek ierakstīts PVZ pamatojuma laukā. 
Horizonā veidotām PVZ, pieprasot tās caur rest, šajā "PAMAT" laukā ir pamatojums, kas  redzams arī Horizon interfeisā.

 

2. Ja PVZ rindiņām norādam "FCENA", tad sagaidāmā darbība būtu tikai ierakstīt šo cenu PVZ rindiņai, cenas nepārlasot.
Cena tiek ierakstīta pareizi, bet fonā vienalga notiek atlaižu pārlasīšana, katrai rindiņai izpildot šādu "piecstāvīgu" sql pieprasījumu, kura rezultāti nav vajadzīgi, jo netiks izmantoti.

declare @p1 int
set @p1=56
exec sp_prepare @p1 output,N'@P1 datetime,@P2 datetime',N'SELECT M.PK_PIESKM, (CASE WHEN M.PK_DOKT IS NULL THEN ''Visi'' ELSE ''Tips'' END) AS DOK_DAL, T.KODS AS T_KODS, T.NOSAUK AS T_NOSAUK, (CASE WHEN M.PK_NOMGR IS NULL THEN (CASE WHEN M.PK_NOMPGR IS NULL THEN (CASE WHEN M.PK_NOM IS NULL THEN ''Visas'' ELSE ''Nomenklatūra'' END) ELSE ''Papildgrupa'' END) ELSE ''Grupa'' END) AS NOM_DAL, (CASE WHEN M.PK_NOMGR IS NULL THEN (CASE WHEN M.PK_NOMPGR IS NULL THEN N.KODS ELSE NPGR.KODS END) ELSE NGR.KODS END) AS N_KODS, (CASE WHEN M.PK_NOMGR IS NULL THEN (CASE WHEN M.PK_NOMPGR IS NULL THEN N.NOSAUK ELSE NPGR.NOSAUK END) ELSE NGR.NOSAUK END) AS N_NOSAUK, (CASE WHEN M.PK_KLGR IS NULL THEN (CASE WHEN M.PK_GRUPA IS NULL THEN (CASE WHEN M.PK_KLIENTS IS NULL THEN ''Visi''  ELSE ''Klients'' END) ELSE ''Grupa'' END) ELSE ''Papildgrupa'' END) AS KL_DAL, (CASE WHEN M.PK_KLGR IS NULL THEN (CASE WHEN M.PK_GRUPA IS NULL THEN KL.KODS ELSE DGR.KODS END) ELSE KGR.KODS END) AS K_KODS, (CASE WHEN M.PK_KLGR IS NULL THEN (CASE WHEN M.PK_GRUPA IS NULL THEN KL.NOSAUK ELSE DGR.NOSAUK END) ELSE KGR.NOSAUK END) AS K_NOSAUK, M.SVARS, M.COUNTER, R.SAK_DAT, R.BEIG_DAT, R.LIKME FROM NPIESKM M LEFT OUTER JOIN (SELECT SDOKTIP.PK_DOKT,SDOKTIPSHARED.PK_DOKTSH,SDOKTIPSHARED.KODS,SDOKTIPSHARED.NOSAUK FROM SDOKTIP,SDOKTIPSHARED WHERE SDOKTIP.PK_DOKTSH = SDOKTIPSHARED.PK_DOKTSH) T ON M.PK_DOKT = T.PK_DOKT LEFT OUTER JOIN NNOMGR NGR ON M.PK_NOMGR = NGR.PK_NOMGR LEFT OUTER JOIN NNOMPGR NPGR ON M.PK_NOMPGR = NPGR.PK_NOMPGR LEFT OUTER JOIN NNOM N ON M.PK_NOM = N.PK_NOM LEFT OUTER JOIN DKLGR KGR ON M.PK_KLGR = KGR.PK_KLGR LEFT OUTER JOIN DGRUPAS DGR ON M.PK_GRUPA = DGR.PK_GRUPA LEFT OUTER JOIN DKLIENTS KL ON M.PK_KLIENTS = KL.PK_KLIENTS 
INNER JOIN (SELECT * FROM NPIESKR WHERE SAK_DAT <= @P1 AND BEIG_DAT >= @P2) R ON M.PK_PIESKM = R.PK_PIESKM 
WHERE  (M.PK_DOKT IS NULL OR M.PK_DOKT = 55)  AND ((M.PK_NOMGR IS NULL AND M.PK_NOM IS NULL AND M.PK_NOMPGR IS NULL) OR M.PK_NOMGR IN (SELECT NGL.PK_NOMGR FROM NNOMGLIM NGL, NNOM N WHERE NGL.PK_CHILD=N.PK_NOMGR AND N.PK_NOM = 1234) OR M.PK_NOMPGR IN (SELECT PG.PK_NOMPGR FROM NNOMPGR PG, NNOMSAGR PS WHERE PS.PK_NOM = 1234 AND PS.PK_NOMPGR = PG.PK_NOMPGR) OR M.PK_NOM = 1234) AND ((M.PK_KLGR IS NULL AND M.PK_KLIENTS IS NULL AND M.PK_GRUPA IS NULL ) OR M.PK_KLGR IN (SELECT G.PK_KLGR FROM DKLGR G, DKLSAGR S WHERE S.PK_KLIENTS = 987 AND S.PK_KLGR = G.PK_KLGR) OR (M.PK_GRUPA IN (SELECT GRK.PK_GRUPA FROM DKLIENTS GRK WHERE GRK.PK_KLIENTS = 987 ) AND NOT (M.PK_GRUPA IS NULL)) OR M.PK_KLIENTS = 987) ORDER BY M.SVARS
',1
select @p1
exec sp_execute 56,'2018-11-07 00:00:00','2018-11-07 00:00:00'

Ja PVZ ir dažas rindiņas, to varētu pieciest, bet ja to ir vairāk, ātrums ir neapmierinošs.
Kas jādara, lai šo pārlasīšanu atslēgtu?

 

9 ATBILDES 9
maartinjsh
CONTRIBUTOR ***

autors maartinjsh

Paliek nepamatotā SQL pieprasījuma problēma, kas ievērojami palēnina darbu.

Salīdzinājumam:

  • izveidot PVZ bez rindām aizņem <1s.
  • izveidot PVZ ar 1 rindu ~4-5s
  • izveidot PVZ ar 3 rindām ~11-13s

Testa nolūkos augstāk minēto SQL izmēģinājām palaist vienu pašu - vienmēr 3-4s.

Anonymous
Neattiecas

autors Anonymous

Jautājums par SQL pieprasījumu būs jāpapēta. Pāradresēju jautājumu izstrādei.

maartinjsh
CONTRIBUTOR ***

autors maartinjsh

SQL pieprasījumu minimāli var uzlabot, testējot iegūstam vairs tikai 2-3s, nevis 3-5s 🙂

 

1. Izņemt ārā daļas, kas atkārtosies katram šādam pieprasījumam un pieprasīt tikai vienreiz.

SELECT SDOKTIP.PK_DOKT,SDOKTIPSHAREDT.PK_DOKTSH,SDOKTIPSHAREDT.KODS,SDOKTIPSHAREDT.NOSAUK INTO #DOKTIP FROM SDOKTIP, SDOKTIPSHAREDT
	WHERE SDOKTIP.PK_DOKTSH = SDOKTIPSHAREDT.PK_DOKTSH
SELECT G.PK_KLGR INTO #G FROM DKLGR G, KLSAGR S WHERE S.PK_KLIENTS = 987 AND S.PK_KLGR = G.PK_KLGR
SELECT GRK.PK_GRUPA INTO #GRK FROM DKLIENTS GRK WHERE GRK.PK_KLIENTS = 987 

2. Pārbaudīt pret NULL NPIESKM vērtības

 

Uzlabotais varētu šadi izskatīties

SELECT M.PK_PIESKM, 
(CASE WHEN M.PK_DOKT IS NULL THEN 'Visi' ELSE 'Tips' END) AS DOK_DAL,
 T.KODS AS T_KODS,
 T.NOSAUK AS T_NOSAUK,
 (CASE WHEN M.PK_NOMGR IS NULL THEN (CASE WHEN M.PK_NOMPGR IS NULL THEN (CASE WHEN M.PK_NOM IS NULL THEN 'Visas' ELSE 'Nomenklatūra' END) ELSE 'Papildgrupa' END) ELSE 'Grupa' END) AS NOM_DAL, 
 (CASE WHEN M.PK_NOMGR IS NULL THEN (CASE WHEN M.PK_NOMPGR IS NULL THEN N.KODS ELSE NPGR.KODS END) ELSE NGR.KODS END) AS N_KODS,
 (CASE WHEN M.PK_NOMGR IS NULL THEN (CASE WHEN M.PK_NOMPGR IS NULL THEN N.NOSAUK ELSE NPGR.NOSAUK END) ELSE NGR.NOSAUK END) AS N_NOSAUK,
 (CASE WHEN M.PK_KLGR IS NULL THEN (CASE WHEN M.PK_GRUPA IS NULL THEN (CASE WHEN M.PK_KLIENTS IS NULL THEN 'Visi'  ELSE 'Klients' END) ELSE 'Grupa' END) ELSE 'Papildgrupa' END) AS KL_DAL,
 (CASE WHEN M.PK_KLGR IS NULL THEN (CASE WHEN M.PK_GRUPA IS NULL THEN KL.KODS ELSE DGR.KODS END) ELSE KGR.KODS END) AS K_KODS,
 (CASE WHEN M.PK_KLGR IS NULL THEN (CASE WHEN M.PK_GRUPA IS NULL THEN KL.NOSAUK ELSE DGR.NOSAUK END) ELSE KGR.NOSAUK END) AS K_NOSAUK,
 M.SVARS, 
 M.COUNTER, 
 R.SAK_DAT, 
 R.BEIG_DAT, 
 R.LIKME 
 FROM NPIESKM M 
 LEFT OUTER JOIN #DOKTIP T ON M.PK_DOKT = T.PK_DOKT 
 LEFT OUTER JOIN NNOMGR NGR ON M.PK_NOMGR = NGR.PK_NOMGR 
 LEFT OUTER JOIN NNOMPGR NPGR ON M.PK_NOMPGR = NPGR.PK_NOMPGR 
 LEFT OUTER JOIN NNOM N ON M.PK_NOM = N.PK_NOM 
 LEFT OUTER JOIN DKLGR  KGR ON M.PK_KLGR = KGR.PK_KLGR 
 LEFT OUTER JOIN DGRUPAS DGR ON M.PK_GRUPA = DGR.PK_GRUPA 
 LEFT OUTER JOIN DKLIENTS KL ON M.PK_KLIENTS = KL.PK_KLIENTS 
 INNER JOIN NPIESKR R ON M.PK_PIESKM = R.PK_PIESKM AND R.SAK_DAT <= '2018-11-07 00:00:00' AND R.BEIG_DAT >= '2018-11-07 00:00:00'
 WHERE  (M.PK_DOKT IS NULL OR M.PK_DOKT = 55)  
AND (
	(M.PK_NOMGR IS NULL AND M.PK_NOM IS NULL AND M.PK_NOMPGR IS NULL) OR
	(M.PK_NOMGR IN (SELECT NGL.PK_NOMGR FROM NNOMGLIM NGL, NNOM N WHERE NGL.PK_CHILD=N.PK_NOMGR AND N.PK_NOM = 1234) and m.pk_nomgr is not null) OR
	(M.PK_NOMPGR IN (SELECT PG.PK_NOMPGR FROM NNOMPGR PG, NNOMSAGR PS WHERE PS.PK_NOM = 1234 AND PS.PK_NOMPGR = PG.PK_NOMPGR) and m.PK_NOMPGR is not null) OR
	M.PK_NOM = 1234
	) 
AND (
	(M.PK_KLGR IS NULL AND M.PK_KLIENTS IS NULL AND M.PK_GRUPA IS NULL ) OR 
	(M.PK_KLGR IN (select * from #G) AND M.PK_KLGR is not null) OR 
	(M.PK_GRUPA IN (select * from #GRK) AND M.PK_GRUPA IS NOT NULL) OR 
	M.PK_KLIENTS = 987
	) 
ORDER BY M.SVARS

Ar to gribēju tikai ilustrēt, ka noteikti ir iespējas šo visu vēl vairāk paātrināt, lai vienas rindiņas ievade neaizņemtu vairāk par sekundes daļām.

maartinjsh
CONTRIBUTOR ***

autors maartinjsh

525. versijā ir būtiski SQL uzlabojumi, bet joprojām trūkst iespēja atlaižu pārbaudi atslēgt pilnībā.

 

Vēlreiz atgādinu motivāciju - ja rindiņai norāda (<tblRindas><row><FCENA>), tās vērtība tiek ierakstīta pavadzīmē. 
Katras rindiņas ievadei notiek cenu pārbaude, kas aprēķina klienta gala cenu.

Bet tikai tad, ja `FCENA` cenu nenorāda, tiek piemērota aprēķinātā. Tātad, ja `FCENA` ir norādīta, aprēķināšana ir lieka darbības, kas patērē laiku.

 

Ja tomēr kļūdos, un atsevišķos gadījumos aprēķins ir nepieciešams pat ar definētu `FCENA`, tad aicinu pievienot jaunu `<tblRindas><row>` parametru/pazīmi, kas norādītu, ka aprēķins rindiņai nav jāizpilda.

Anonymous
Neattiecas

autors Anonymous

Es saprotu šo piedāvājumu, tomēr tuvākajā laikā to realizēt nevarēsim. Cenas/Summas aprēķins var tikt izsaukts ar dažādu norādītu informāciju no dažādām programmas vietām, tāpēc tas ir izveidots universiāls un tā optimizēšana tā, lai neko nesabojātu, ir sarežģīts uzdevums.

 

Ja atlaižu matrica ir ļoti liela, var paeksperimentēt, kā uzlabot tās aprēķinu. Viena iespēja (ja biznesa prasības to atļauj) ir aprakstot atlaidi neizmantot atlases parametru <Visi dokumentu tipi> un no REST iesūtītajām pavadzīmēm izmantot specifisku dokumenta tipu, kuram nav aprakstīta neviena atlaide.

maartinjsh
CONTRIBUTOR ***

autors maartinjsh (Atjaunots ‎17-12-2018 14:04 autors maartinjsh )

Nepiedāvāju mainīt pašu aprēķinu, tikai izveidot iespēju to neizsaukt, ja tā tiek norādīts. Kas noteikti ir triviāls uzdevums.

 

Piedāvātais dokumentu tipa ierobežojums, diemžēl, nepalīdzēs un tikai sarežģītu administrēšanu un/vai lietotāju ikdienu.

Accepted solution
Mija Zaļūksne
VISMA

autors Mija Zaļūksne

Labvakar, @maartinjsh!

 

Atbilde no izstrādes: "rūpīgi izvērtējot šo priekšlikumu, diemžēl nav plāns veikt izmaiņas šajā vietā. Tomēr paldies, ka dalāties idejās un problēmās, lai varam domāt par to, kā produktu padarīt lietotājam pievilcīgāku!"

 

Priecīgus un skaistus svētkus vēlot,

Mija Z.

Nauris_arise_lv
PARTNER

autors Nauris_arise_lv

Pamatojumu jāraksta tagā

<qryPamat><PAMAT>komentārs, pamatojums, bla bla</PAMAT></qryPamat>
maartinjsh
CONTRIBUTOR ***

autors maartinjsh

Paldies! Aizmirsu pieminēt, ka šādi arī bijām mēģinājuši. Izrādās mums bija kļūda <row> vietā <rows>

 

Šādi strādā.

<qryPamat>
    <row>
        <PAMAT>komentārs</PAMAT>
    </row>
</qryPamat>

Saņem jaunumus par šo ziņu savā e-pastā!

Pieseko šai ziņai klikšķinot uz trim punktiem augšējā labajā šī raksta stūrī un izvēlies Abonēt. Tu vari izvēleties par kādu saturu saņem ziņas e-pastā!

Sīkāk par abonēšanas iespējām