lai iegūtu personalizētu skatu.
lai iegūtu personalizētu skatu.
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?
Atrisināts! Doties uz risinājumu
Paliek nepamatotā SQL pieprasījuma problēma, kas ievērojami palēnina darbu.
Salīdzinājumam:
Testa nolūkos augstāk minēto SQL izmēģinājām palaist vienu pašu - vienmēr 3-4s.
Jautājums par SQL pieprasījumu būs jāpapēta. Pāradresēju jautājumu izstrādei.
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.
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.
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.
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.
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.
Pamatojumu jāraksta tagā
<qryPamat><PAMAT>komentārs, pamatojums, bla bla</PAMAT></qryPamat>
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>
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āmSporta iela 11, Rīga, LV-1013
Visma birojs: +371 67116211
Horizon atbalsts: +371 67116299
E-pasts: visma@visma.lv