Truke të vogla për kërkesa të mëdha. Renditja e rezultateve të pyetjeve Operatori në Hierarki

23.06.2023

Kërkesat janë krijuar për të nxjerrë dhe përpunuar informacion nga baza e të dhënave për t'ia ofruar përdoruesit në formën e kërkuar. Përpunimi këtu nënkupton grupimin e fushave, renditjen e rreshtave, llogaritjen e totaleve, etj. Ju nuk mund t'i ndryshoni të dhënat duke përdorur pyetje në 1C!

Kërkesa ekzekutohet sipas udhëzimeve të dhëna − teksti i kërkesës. Teksti i kërkesës përpilohet në përputhje me sintaksën dhe rregullat gjuha e pyetjes. Gjuha e pyetjeve 1C:Enterprise 8 bazohet në standard SQL, por ka disa dallime dhe zgjerime.

Skema e punës me një kërkesë

Skema e përgjithshme e punës me një kërkesë përbëhet nga disa faza të njëpasnjëshme:

  1. Krijimi i një objekti Kërkesë dhe vendosja e tekstit të kërkesës;
  2. Vendosja e parametrave të kërkesës;
  3. Ekzekutimi i një kërkese dhe marrja e rezultatit;
  4. Anashkalimi i rezultatit të kërkesës dhe përpunimi i të dhënave të marra.

1. Objekti Kërkesë ka pronën Teksti, të cilit duhet t'i caktoni tekstin e kërkesës.

// Opsioni 1
Kërkesë = Kërkesë e re;
Kërkesë . Teksti =
"ZGJIDH
| Normat e monedhës. Periudha,
| Normat e valutës.Valuta,
| Normat e valutës.Norma
|NGA

| KU
;

// Opsioni 2
Kërkesë = Kërkesë e re("ZGJIDH
| Normat e monedhës. Periudha,
| Normat e valutës.Valuta,
| Normat e valutës.Norma
|NGA
| Regjistri i informacionit.Transmet e valutave AS normat e valutave
| KU
| Normat e valutave. Valuta = &Valuta");

2. Vendosja e vlerave të parametrave kryhet duke përdorur metodën SetParameter (< Имя>, < Значение>) . Parametrat në tekstin e kërkesës tregohen me simbolin " & " dhe zakonisht përdoren në kushtet e përzgjedhjes (seksioni WHERE) dhe në parametrat e tabelës virtuale.

Kërkesë);

3. Pas caktimit të tekstit dhe vendosjes së parametrave, kërkesa duhet të ekzekutohet dhe të merret rezultati i ekzekutimit. Ekzekutimi kryhet me metodën Execute(), e cila kthen një objekt Rezultati i pyetjes. Nga rezultati i pyetjes mund të:

  • merrni një përzgjedhje duke përdorur metodën Select (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • ngarkoni vlerat në një tabelë vlerash ose pemë vlerash duke përdorur metodën e ngarkimit (< ТипОбхода>) .

// Merrni një mostër

Mostra = Rezultati i pyetjes. Zgjidhni();

// Marrja e një tabele vlerash
RequestResult = Kërkesë. Run();
Tabela = Rezultati i pyetjes. Shkarko();

4. Mund të anashkaloni përzgjedhjen e rezultatit të pyetjes duke përdorur një lak:

Mirupafshim Sample.Next() Loop
Raporti(Përzgjedhja.Kursi);
Cikli i Fundit;

Një shembull i plotë i punës me një kërkesë mund të duket si ky:

// Faza 1. Krijimi i një kërkese dhe vendosja e tekstit të kërkesës
Kërkesë = Kërkesë e re;
Kërkesë . Teksti =
"ZGJIDH
| Normat e monedhës. Periudha,
| Normat e valutës.Valuta,
| Normat e valutës.Norma
|NGA
| Regjistri i informacionit.Transmet e valutave AS normat e valutave
| KU
| Normat e valutave. Valuta = &Valuta";

// Faza 2. Vendosja e parametrave
Kërkesë . SetParameter ("Parametra" , Valuta e zgjedhur);

// Faza 3. Ekzekutimi i pyetjes dhe marrja e mostrës
RequestResult = Kërkesë. Run();
Mostra = Rezultati i pyetjes. Zgjidhni();

// Kalimi i përzgjedhjes
Mirupafshim Sample.Next() Loop
Raporti(Përzgjedhja.Kursi);
Cikli i Fundit;

Përbërja e tekstit të kërkesës

Teksti i kërkesës përbëhet nga disa seksione:

  1. Përshkrimi i kërkesës— lista e fushave të përzgjedhura dhe burimeve të të dhënave;
  2. Bashkimi i pyetjeve— shprehjet “BASHKONI” dhe “BASHKONI TË GJITHA”;
  3. Organizimi i rezultateve- shprehja “URDHIM NGA...”;
  4. Porosit automatik— shprehja “POROSIT AUTO”;
  5. Përshkrimi i rezultateve- shprehja "REZULTATET ... NGA ...".

Vetëm pjesa e parë është e detyrueshme.

Tabelat e përkohshme dhe pyetjet e grupeve

Gjuha e pyetjes 1C e mbështet përdorimin tavolina të përkohshme— tabelat e marra si rezultat i një pyetjeje dhe të ruajtura në baza të përkohshme.

Shpesh mund të hasni në një situatë ku duhet të përdorni jo tabelat e bazës së të dhënave si burim të një pyetjeje, por rezultatin e ekzekutimit të një pyetjeje tjetër. Ky problem mund të zgjidhet duke përdorur pyetje të ndërthurura ose tavolina të përkohshme. Përdorimi i tabelave të përkohshme ju lejon të thjeshtoni tekstin e një pyetje komplekse duke e ndarë atë në pjesët përbërëse të tij, dhe gjithashtu, në disa raste, të shpejtoni ekzekutimin e pyetjes dhe të zvogëloni numrin e bllokimeve. Për të punuar me tabela të përkohshme, përdorni objektin Menaxheri i tabelave kohore. Një tabelë e përkohshme krijohet duke përdorur fjalë kyçe PLACE pasuar nga emri i tabelës së përkohshme.

ManagerVT = Menaxheri i ri i përkohshëm i tabelave;
Kërkesë = Kërkesë e re;
Kërkesë . ManagerTemporaryTables = ManagerVT;

Kërkesë . Teksti =
"ZGJIDH
| Monedhat.Kodi,
| Monedhat.Emri
|Vendi në monedha
|NGA
| Drejtoria.Maledhat AS Monedhat";

RequestResult = Kërkesë. Ekzekutoni();

Për të përdorur tabelën e përkohshme të monedhës VTV në pyetje të tjera, duhet të caktoni një menaxher të përbashkët të përkohshëm të tabelës për këto pyetje - Menaxheri VT.

Kërkesa për grupeështë një kërkesë që përmban disa kërkesa të ndara me karakterin “;”. Kur ekzekutoni një pyetje grupi, të gjitha pyetjet e përfshira në të ekzekutohen në mënyrë sekuenciale dhe rezultatet e të gjitha tabelave të përkohshme janë të disponueshme për të gjitha pyetjet pasuese. Caktimi i qartë i një menaxheri të përkohshëm të tabelës për pyetjet e grupit nuk është i nevojshëm. Nëse nuk caktohet një menaxher i përkohshëm i tabelës, atëherë të gjitha tabelat e përkohshme do të fshihen menjëherë pasi pyetja të ekzekutohet.

Për pyetjet e grupit, metoda ExecuteBatch() është e disponueshme, e cila ekzekuton të gjitha pyetjet dhe kthen një grup rezultatesh. Tabelat e përkohshme në një pyetje grupi do të përfaqësohen nga një tabelë me një rresht dhe një kolonë "Count", e cila ruan numrin e regjistrimeve. Për të korrigjuar kërkesat e grupit, mund të përdorni metodën Ekzekutoni Batch ME TË DHËNA TË NDËRMJETËM() : Ai kthen përmbajtjen aktuale të tabelave të përkohshme, jo numrin e regjistrimeve.

// Shembull i punës me një kërkesë grupi
Kërkesë = Kërkesë e re;
Kërkesë . Teksti =
"ZGJIDH
| Monedhat.Emri
|NGA
| Drejtoria.Maledhat AS Monedhat
|;
|ZGJIDH
| Nomenklatura.Emri
|NGA
| Drejtoria. Nomenklatura AS Nomenklatura";

Rezultati i grupit = Kërkesë. ExecuteBatch();

Monedhat TZ =Rezultati i paketës[ 0]. Shkarko ();
TZNomenklatura = Rezultati i paketës[ 1 ]. Shkarko ();

// Një shembull i përdorimit të tabelave të përkohshme në një kërkesë grupi
Kërkesë = Kërkesë e re;
Kërkesë . Teksti =
"ZGJIDH
| Produktet Lidhja SI TE Produkti
|VENDI VTProdukte
|NGA
| Drejtoria.Nomenklatura HOW Products
| KU
| Produktet.Manufacturer = &Manufacturer
|;
|ZGJIDH
| VTTProducts.Produkt,
| Shkolla profesionale Sasia,
| Shkolla profesionale.Çmimi,
| Shkolla profesionale.Lidhja AS DocumentPranimet
|NGA
| Produktet VT Produktet AS VT
| Dokumenti i LIDHJES LEFTE Marrja e Mallrave dhe Sherbimeve Mallrat AS PTU
| Softueri VTProducts.Product = PTU.Nomenklature"
;

Kërkesë . SetParameter ( "Prodhuesi", Prodhuesi);

RequestResult = Kërkesë. Run();
Mostra = Rezultati i pyetjes. Zgjidhni();

Mirupafshim Sample.Next() Loop

Cikli i Fundit;

Tabelat virtuale

Tabelat virtuale- këto janë tabela që nuk ruhen në bazën e të dhënave, por gjenerohen nga platforma. Në thelbin e tyre, këto janë pyetje të mbivendosura kundër një ose më shumë tabelave fizike të ekzekutuara nga platforma. Tabelat virtuale marrin informacion vetëm nga regjistrat dhe kryesisht janë të destinuara për zgjidhjen e problemeve shumë të specializuara.

Ekzistojnë tabelat virtuale të mëposhtme (parametrat e mundshëm tregohen në kllapa):

  • Për informacion, regjistra:
    • SliceFirst(<Период>, <Условие>) — regjistrimet më të hershme për datën e caktuar;
    • SliceLast(<Период>, <Условие>) — të dhënat më të fundit për datën e caktuar;
  • Për regjistrat e akumulimit:
    • Mbetjet (<Период>, <Условие>) — gjendjet në datën e specifikuar;
    • Revolucionet (<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - Transaksionet e periudhës;
    • Mbetet dhe qarkullimi (<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — bilancet dhe qarkullimi për periudhën;
  • Për regjistrat kontabël:
    • Mbetjet (<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — gjendjet në datën e specifikuar sipas llogarisë, dimensioneve dhe nënllogarive;
    • Revolucionet (<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — qarkullim për periudhën në kontekstin e llogarive, matjeve, korr. llogaritë, nënkonto, kor. subconto;
    • Mbetet dhe qarkullimi (<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — bilancet dhe qarkullimi në kontekstin e llogarive, matjeve dhe nënllogarive;
    • QarkullimiDtKt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — qarkullimi për periudhën sipas llogarisë Dt, llogarisë Kt, Subconto Dt, Subconto Kt;
    • LëvizjetNënkonto(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — lëvizjet së bashku me vlerat nënkonto;
  • Për regjistrat e llogaritjes:
    • bazë(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) — të dhënat bazë të regjistrit llogaritës;
    • Grafika e të Dhënave (<Условие>)-të dhënat e grafikut;
    • Periudha aktuale e veprimit (<Условие>) është periudha aktuale e vlefshmërisë.

Kur punoni me tabela virtuale, duhet të aplikoni zgjedhje në parametrat e tabelave virtuale, dhe jo në kushtin WHERE. Koha e ekzekutimit të pyetjes varet shumë nga kjo.

Konstruktori i pyetjeve

Për të shpejtuar futjen e teksteve të pyetjeve, platforma ka mjete speciale: Konstruktori i pyetjeve Dhe Konstruktor i pyetjeve me përpunim të rezultateve. Për të thirrur konstruktorët, duhet të klikoni me të djathtën dhe të zgjidhni artikullin e kërkuar:

Konstruktorët mund të thirren gjithashtu nga menyja kryesore Teksti.

Duke përdorur ndërtuesin e pyetjeve, programuesi mund të ndërtojë në mënyrë interaktive tekstin e pyetjes. Për ta bërë këtë, zgjidhni tabelat dhe fushat e nevojshme me miun, krijoni marrëdhënie, grupime, totale, etj. Kjo qasje ju lejon të kurseni kohë dhe të hiqni qafe gabimet e mundshme. Si rezultat i punës së tij, konstruktori i pyetjes gjeneron tekstin e pyetjes.

Konstruktori i pyetësorit me përpunimin e rezultateve, përveç gjenerimit të tekstit të pyetjes, krijon një fragment kodi të gatshëm për marrjen dhe përpunimin e të dhënave.

RequestSchema objekt

Platforma ju lejon të krijoni dhe modifikoni në mënyrë programore tekstin e kërkesës duke përdorur objektin Skema e kërkesës. Një objekt ka një veti të vetme Grupi i Kërkesave, në të cilin objekti ruan vetitë e të gjitha pyetjeve që janë duke u redaktuar aktualisht. Objekti RequestSchema mbështet metodat e mëposhtme:

  • SetQueryText(< Текст>) — plotëson vetinë Query Packet bazuar në tekstin e kërkesës së paraqitur;
  • GetQueryText() - kthen tekstin e kërkesës të krijuar bazuar në vetinë Request Package;
  • FindParameters() - kthen parametrat e kërkesës.

Le të shohim një shembull të punës me objektin RequestSchema. Për të gjeneruar në mënyrë programore tekstin e kërkesës

NDAJ SIPAS
Monedhat.Kodi

Kodi i gjuhës së integruar mund të duket kështu:

RequestScheme = RequestScheme;
Paketa 1 = RequestScheme. RequestBatch[ 0 ];
Operatori 1 = Paketa1. Operatorët[ 0];
// shtimi i burimit
Tabela e Regjistrimit = Operatori1. Burimet. Shto( "Drejtoria. Monedhat", "Manedhat" );
// shtimi i fushave
Lidhja në terren = Operatori 1. Fushat e zgjedhura. Add("Currencies.Link" , 0 );
Kodi i Fushës = Operatori 1. Fushat e zgjedhura. Add("Currencies.Code", 1);
// duke specifikuar pseudonimet e fushës
Paketa 1 . Kolonat[ 0]. Alias ​​= "Valuta";
Paketa 1 . Kolonat[1]. Alias ​​= "Kodi";
// duke shtuar një kusht
Operatori 1 . Përzgjedhja. Shto( "JO Fshirja e flamurit");
// shtoni renditjen
Paketa 1 . Rendit. Shto (FieldCode);
RequestText = RequestScheme. GetQueryText();

Për të gjeneruar dhe ekzekutuar pyetje në tabelat e bazës së të dhënave në platformën 1C, përdoret një objekt i veçantë i gjuhës programuese. Kërkesë. Ky objekt krijohet duke thirrur konstruktin Kërkesë e re. Kërkesa është e përshtatshme për t'u përdorur kur ju duhet të merrni një mostër komplekse të dhënash, të grupuara dhe të renditura sipas nevojës. Një shembull klasik i përdorimit të një pyetësori është marrja e një përmbledhjeje të gjendjes së regjistrit të akumulimit në një moment të caktuar kohor. Gjithashtu, mekanizmi i pyetjeve e bën të lehtë marrjen e informacionit në periudha të ndryshme kohore.

Organi i kërkesës është udhëzimi sipas të cilit duhet të ekzekutohet kërkesa. Organi i kërkesës përshkruan:

  • tabelat bazë informacioni, të përdorura si burime të të dhënave të pyetjeve;
  • fushat e tabelës që duhet të përpunohen në pyetje;
  • rregullat e grupimit;
  • rezultatet e renditjes;
  • etj.
Udhëzimi është përpiluar në një gjuhë të veçantë - gjuha e pyetjes dhe përbëhet nga pjesë të veçanta - seksione, fjali, fjalë kyçe, funksione, operatorë aritmetikë dhe logjikë, komente, konstante dhe parametra.

Gjuha e pyetjeve e platformës 1C është shumë e ngjashme me sintaksën e gjuhëve të tjera SQL, por ka dallime. Përparësitë kryesore të gjuhës së integruar të pyetjeve janë: mosreferencimi i fushave, prania e tabelave virtuale, punë e përshtatshme me rezultate, fusha të pashtypura në pyetje.

  • vlerat enum;
  • të dhëna të paracaktuara:
  • libra referencë;
  • planet për llojet e karakteristikave;
  • skemat e llogarive;
  • planet për llojet e llogaritjeve;
  • lidhje boshe;
  • vlerat e pikave të rrugës së procesit të biznesit.
Gjithashtu, teksti i kërkesës mund të përmbajë vlerat e numërimeve të sistemit që mund t'u caktohen fushave në tabelat e bazës së të dhënave: Lloji i lëvizjes së akumulimit, lloji i llogarisë dhe lloji i lëvizjes së kontabilitetit. Kërkon qasje në të dhënat e paracaktuara të konfigurimit dhe vlerat e numërimit të sistemit duke përdorur një lloj funksioni literal KUPTIMI. Kjo fjalë për fjalë ju lejon të përmirësoni lexueshmërinë e pyetjes dhe të zvogëloni numrin e parametrave të pyetjes.

Shembull i përdorimit të një literal KUPTIMI:
WHERE City = VALUE (Direktori. Qytetet. Moskë)
WHERE City = VALUE (Directory.Cities.EmptyLink)
WHEREProductType = VALUE(Enumeration.ProductTypes.Service)
WHEREMovementType = VALUE(MovementTypeAccumulation.Incoming)
WHERE RoutePoint = VALUE(BusinessProcess.BusinessProcess1.RoutePoint.Action1

2) Duke përdorur udhëzimet AUTO POROSI Pyetja mund të marrë shumë kohë për t'u përfunduar, kështu që nëse renditja nuk kërkohet, atëherë është më mirë të mos e përdorni fare. Në shumicën e rasteve, është më mirë të përdorni renditjen e udhëzimeve NDAJ SIPAS.

Porositja automatike funksionon sipas parimeve të mëposhtme:

  • Nëse klauzola ORDER BY është specifikuar në kërkesë, atëherë çdo lidhje me tabelën e gjetur në këtë klauzolë do të zëvendësohet nga fushat me të cilat tabela është renditur si parazgjedhje (për librat e referencës ky është kodi ose emri, për dokumentet - data e dokumentit). Nëse fusha që do të renditet i referohet një drejtorie hierarkike, atëherë do të aplikohet renditja hierarkike sipas kësaj drejtorie.
  • Nëse kërkesa nuk përmban klauzolën ORDER BY, por ka një klauzolë TOTAL, atëherë rezultati i pyetjes do të renditet sipas fushave të pranishme në klauzolën TOTAL pas fjalës kyçe BY, në të njëjtën sekuencë dhe, nëse totalet janë llogaritur nga fushat e referencës, pastaj nga fushat e renditjes si parazgjedhje të tabelave që u referuan.
  • Nëse pyetja nuk përmban klauzolat ORDER BY dhe TOTAL, por ka një klauzolë GROUP BY, atëherë rezultati i pyetjes do të renditet sipas fushave të pranishme në klauzolë në të njëjtën sekuencë dhe, nëse grupimi është kryer sipas fushave të referencës. , pastaj sipas parazgjedhjes së renditjes së tabelave të fushave që u referuan.
  • Nëse pyetja nuk përmban klauzola ORDER BY, TOTAL ose GROUP BY, rezultati do të renditet sipas fushave të renditjes së paracaktuar për tabelat nga të cilat janë zgjedhur të dhënat, sipas renditjes që shfaqen në pyetje.

Nëse pyetja përmban një klauzolë TOTAL, çdo nivel total renditet veçmas.

3) Për të shmangur përsëritjen e një pyetjeje në bazën e të dhënave kur shfaqni rezultatin e pyetjes tek përdoruesi (për shembull, ndërtimi i një pyetjeje ose shfaqja e rezultatit të pyetjes duke përdorur dokumenti i tabelës) është e dobishme të përdorni udhëzimet LIDHJE HYRJE, e cila ju lejon të merrni një paraqitje të një vlere referimi.

Është gjithashtu e mundur të përdoren udhëzimet PERFORMANCA- projektuar për të marrë një paraqitje të vargut të një vlere të një lloji arbitrar. Dallimi midis këtyre udhëzimeve është se në rastin e parë, nëse udhëzimet kalojnë një lidhje, rezultati do të jetë një varg, ndërsa në raste të tjera, rezultati do të jetë vlera e parametrit të kaluar. Në rastin e dytë, rezultati i udhëzimit do të jetë gjithmonë një varg!

4) Nëse kërkesa ka një fushë me një lloj të përbërë, atëherë për fusha të tilla bëhet e nevojshme të konvertohen vlerat e fushës në disa një lloj të caktuar duke përdorur udhëzime EXPRESS, i cili do t'ju lejojë të hiqni tabelat e panevojshme nga bashkimi i majtë me një fushë të një lloji kompleks të të dhënave dhe të përshpejtoni ekzekutimin e pyetjes.

Shembull:
Ekziston një regjistër për grumbullimin e mallrave të mbetura, në të cilin fusha e Regjistrimit ka një tip të përbërë. Në kërkesë zgjidhen Data dhe Numri i Dokumentit të Pranimit të Mallrave, ndërsa gjatë aksesit në detajet e dokumentit përmes fushës së Regjistruesit nuk ndodhin shumë lidhje të majta të tabelës së regjistrit të grumbullimit me tabelat e dokumenteve të regjistruesit.

ZGJIDHNI
EXPRESS(Mallrat e mbetura. Dokumenti i Regjistruesit AS. Pranimi i Mallrave).Numri AS Numri i Faturës,
EXPRESS(Mallrat e mbetura. Dokumenti i Regjistruesit AS. Pranimi i Mallrave).Data SI Data e pranimit
NGA
Regjistri i akumulimeve.Mallrat e mbetura AS Mallrat e mbetura

Nëse një lloj cast nuk konsiderohet i realizueshëm, atëherë rezultati i hedhjes së tipit do të jetë NULL.

5) Mos harroni për udhëzimet LEJOHET, që do të thotë se pyetja do të zgjedhë vetëm regjistrimet për të cilat përdoruesi aktual ka të drejta. Nëse kjo fjalë nuk është e specifikuar, atëherë nëse kërkesa zgjedh regjistrime për të cilat përdoruesi nuk ka të drejta, kërkesa do të përpunohet me një gabim.

6) Nëse pyetja përdor një bashkim, dhe disa pjesë të bashkimit përmbajnë tabela të mbivendosura (një dokument me një pjesë tabelare), dhe disa jo, bëhet e nevojshme të plotësohet lista e përzgjedhjes me fusha - tabela të mbivendosura boshe. Kjo bëhet duke përdorur një fjalë kyçe E Zbrazur, pas së cilës në kllapa tregohen pseudonimet e fushave që do të përbëjnë tabelën e mbivendosur.

Shembull:
// Zgjidhni fushat Numri dhe Përbërja
// nga tabela virtuale Dokumenti.Shpenzimet
ZGJIDH Lidhjen.Numrin, TABELA E zbrazët.(Nr., Artikulli, Sasia) AS Përbërja
NGA Dokumenti.Fatura e shpenzimeve
KOMBINON GJITHÇKA
ZGJIDH Lidhjen.Numrin, Përmbajtjen.(Numri i linjës, Produkti, Sasia)
NGA Dokumenti.Dokumenti i faturës.Fatura.Përbërja.*
7) Për të parandaluar shfaqjen e linjave të kopjuara në rezultatin e pyetjes, duhet të përdorni udhëzimin TË NDRYSHME, sepse është më vizuale dhe e kuptueshme, dhe udhëzimet GRUP NGA përdoret për grupimin duke përdorur funksionet agregate. Ksati, kur përdorni funksionet agregate, një sugjerim GRUP NGA mund të mos specifikohet fare, por të gjitha rezultatet e pyetjes do të grupohen në një rresht të vetëm.

Shembull:
// Është e nevojshme të zbulohet se cilat palë në përgjithësi
// mallrat u dërguan për periudhën.
Zgjidhni Të ndryshme
Dokument.Faturë.Kundërpalë

8) Udhëzime GRUP NGA ju lejon të aksesoni fushat e nivelit të lartë, pa grupuar rezultatet sipas këtyre fushave, nëse funksionet agregate aplikohen në fushat e një tabele të ndërthurur. Megjithëse ndihma 1C thotë se kur gruponi rezultatet e pyetjes, funksionet e përgjithshme duhet të specifikohen në listën e fushave të përzgjedhjes, dhe përveç funksioneve të përgjithshme në listën e fushave të përzgjedhjes, lejohet të tregohen vetëm fushat me të cilat kryhet grupimi. .

Shembull:
ZGJIDHNI
Pranimi i Mallrave dhe Shërbimeve Mallrat (SHUMË (Sasia), Nomenklatura),
Pranimi i Mallrave dhe Shërbimeve. Link,
Pranimi i Mallrave dhe Shërbimeve
NGA
Dokument Pranimi i Mallrave dhe Shërbimeve SI Marrja e Mallrave dhe Shërbimeve
GRUP NGA
Pranimi i Mallrave dhe Shërbimeve Mallrat (Nomenklatura)

9) Udhëzime ISNULL synohet të zëvendësojë vlerën NULL me një vlerë tjetër, por mos harroni se parametri i dytë do të konvertohet në llojin e të parit nëse lloji i parametrit të parë është një varg ose një numër.

10) Kur hyni në tabelën kryesore, mund të qaseni me kusht në të dhënat në tabelën vartëse. Kjo veçori quhet çreferencimi i fushave të një tabele vartëse.

Shembull (kërkoni për dokumente që përmbajnë një produkt specifik në seksionin tabelor):
ZGJIDHNI
Hyrja.Lidhja
NGA
Dokumenti.Pranimi Ku Hyrja.Produktet.Nomenklatura = &Nomenklatura.

Avantazhi i kësaj pyetjeje mbi një pyetje në tabelën vartëse Receipt.Goods është se nëse ka dublikatë në dokumente, rezultati i pyetjes do të kthejë vetëm dokumente unike pa përdorur fjalën kyçe TË NDRYSHME.

11) Opsion interesant operatori - ky është një kontroll për përfshirjen e një grupi të porositur në një grup grupesh të tilla (Fusha1, Fusha2, ..., FushaN) IN (Fusha1, Fusha2, ..., FushaN).

Shembull:
ZGJIDHNI
Kundërpalët.Lidhje
KU
(Counterparties.Link, Products.Link) B
(SELECT Shitje.Klient, Shitje.Produkt
NGA Regjistri Akumulimi.Shitjet AS Shitje)
NGA
Drejtoria. Kundërpalët,
Drejtoria.Produktet

12) Kur është e mundur, përdorni tabelat virtuale kërkesat. Kur krijon një pyetje, sistemi ofron një numër tabelash virtuale si burime të dhënash - këto janë tabela që janë gjithashtu rezultat i një pyetjeje që sistemi gjeneron në kohën kur ekzekutohet seksioni përkatës i kodit.

Zhvilluesi mund të marrë në mënyrë të pavarur të njëjtat të dhëna që sistemi i ofron atij si tabela virtuale, por algoritmi për marrjen e këtyre të dhënave nuk do të optimizohet sepse:

  • Të gjitha tabelat virtuale janë të parametrizuara, pra zhvilluesit i jepet mundësia të vendosë disa parametra që sistemi do të përdorë kur gjeneron një kërkesë për të krijuar një tabelë virtuale. Në varësi të parametrave të tabelës virtuale të specifikuara nga zhvilluesi, sistemi mund të gjenerojë pyetje të NDRYSHME për të marrë të njëjtën tabelë virtuale dhe ato do të optimizohen për sa i përket parametrave të kaluar.
  • Nuk është gjithmonë e mundur që një zhvillues të ketë akses në të dhënat në të cilat sistemi ka qasje.
13) Në mënyrën e funksionimit klient-server, funksioni SUBSTRING() zbatohet duke përdorur funksionin SUBSTRING() të deklaratës përkatëse SQL të kaluar në serverin e bazës së të dhënave Të dhënat SQL Serveri, i cili llogarit llojin e rezultatit të funksionit SUBSTRING() duke përdorur rregulla komplekse në varësi të llojit dhe vlerave të parametrave të tij, si dhe në varësi të kontekstit në të cilin përdoret. Në shumicën e rasteve, këto rregulla nuk kanë efekt në ekzekutimin e pyetjes, por ka raste kur gjatësia maksimale e vargut të rezultatit e llogaritur nga SQL Server. Është e rëndësishme të kihet parasysh se në disa kontekste kur përdoret funksioni SUBSTRING(), gjatësia maksimale e rezultatit të tij mund të jetë e barabartë me gjatësinë maksimale të një vargu me gjatësi të kufizuar, i cili në SQL Server është 4000 karaktere. Kjo mund të shkaktojë dështimin e papritur të pyetjes:
Ofruesi Microsoft OLE DB për SQL Server: Paralajmërim: Përpunuesi i pyetjeve nuk mund të prodhonte një plan pyetjesh nga optimizuesi sepse gjatësia totale e të gjitha kolonave në klauzolën GROUP BY ose ORDER BY tejkalon 8000 byte.
HRESULT=80040E14, SQLSTATE=42000, vendas=8618
Për të shmangur këtë gabim, nuk rekomandohet përdorimi i funksionit SUBSTRING() për të kthyer vargjet me gjatësi të pakufizuar në vargje me gjatësi të kufizuar. Në vend të kësaj, është më mirë të përdorni operatorin cast EXPRESS().

14) Përdoreni me kujdes OSE në konstruksionin WHERE, pasi përdorimi i një kushti OR mund të "peshojë" ndjeshëm pyetjen. Problemi mund të zgjidhet duke përdorur modelin UNITE EVERYTHING.

Shembull:
ZGJIDHNI

NGA

KU
_Demo Contractors.Link = &Link1

KOMBINON GJITHÇKA

ZGJIDHNI
_Demo Contractors.NameFull
NGA
Directory._Demo Counterparties SI TË _Demo Counterparties
KU
_Demo Contractors.Link = &Link2

15) Gjendja JO NË në konstruksionin WHERE rrit kohën e ekzekutimit të pyetjes, pasi është një lloj NOT (OR1 OR2 ... ORn), kështu që për tabela të mëdha përpiquni të përdorni një JOIN LEFT me kushtin IS NULL.

Shembull:
ZGJIDHNI
_Demo Contractors.Link
NGA
Directory._Demo Counterparties SI TË _Demo Counterparties
Dokumenti i LIDHJES LEFT._Urdher demo i bleresit SI TE _Urdherit demonstrues te bleresit
Software _Demo Counterparties.Lidhja = _Urdhri Demo i Blerësit.Kundërpalët
KU
_Urdhri demonstrues i blerësit. Kundërpala ËSHTË NULL

15) Kur përdorni Tavolina të përkohshme Duhet të indeksoni gjendjen dhe të bashkoni fushat në këto tabela, POR, kur përdorni indekset, pyetja mund të jetë edhe më e ngadaltë. Prandaj, është e nevojshme të analizohet çdo pyetje me dhe pa indeks, të matet shpejtësia e ekzekutimit të pyetjes dhe të merret një vendim përfundimtar.
Nëse vendosni të dhëna në një tabelë të përkohshme që fillimisht është indeksuar nga disa fusha, atëherë tabela e përkohshme nuk do të ketë më një indeks në këto fusha.

16) Nëse nuk e përdorni Menaxher i përkohshëm i tryezës, atëherë nuk ka nevojë të fshihet në mënyrë eksplicite tabela e përkohshme, ajo do të fshihet pasi të përfundojë pyetja e grupit, përndryshe duhet ta fshini tabelën e përkohshme në njërën nga mënyrat e mëposhtme: duke përdorur komandën DESTROY në kërkesë, duke thirrur TemporaryTableManager. Metoda Close().

Ka shumë tekst në krahasim me publikimin e mëparshëm, por nuk është aspak ndryshe.

1. Forma e plotë e përdorimit të operatorit B.

Përveç formularit të specifikuar në publikimin e mëparshëm:

Fusha Në (&Valuelist),

Gjithashtu në pyetjet e gjuhës 1C, lejohen format e mëposhtme të përdorimit të këtij operatori:

1.Fushë B (&Rreth)

2.Fushë Në (&Vlera1,....&VleraN),

3.Fusha B (Zgjidh…..) ose për fusha të shumta:

(Fusha 1, Fusha 2) B (Zgjidh T.Fusha5, T.Fusha6 nga Tabela T), ku T është një tabelë (fizike, virtuale ose e përkohshme)

4.Fusha V (Tabela e vlerave) ose për fusha të shumta:

(Fusha 1, Fusha 2) Në (&Tabela e Vlerave)

Opsioni i regjistrimit nr. 3 quhet nënpyetje.

Opsioni nr. 4 ka një veçori: numri i fushave në tabelën e vlerave duhet të përputhet saktësisht me numrin e fushave ndaj të cilave kryhet kontrolli. Për më tepër, duhet të merret parasysh se kur krahasojmë disa fusha, kushti do të marrë vlerën e vërtetë vetëm nëse ka një përputhje në të gjitha fushat në të njëjtën kohë.

2. Operator në Hierarki.

Ky operator mund të përdoret vetëm për drejtoritë hierarkike (dhe objekte të tjera hierarkike, për shembull, Grafiku i llogarive, Grafiku i llojeve karakteristike). Në thelb, ky operator është shumë i ngjashëm me operatorin B, por ka një kuptim krejtësisht të ndryshëm: operatori kontrollon që elementi i drejtorisë i përket grupit të specifikuar (ose grupeve të vendosura në grupin e specifikuar).

Shembull përdorimi: në një pyetje zgjedhim të gjithë elementët e drejtorisë së nomenklaturës që ndodhen në grupin e produkteve "Mobilje" (për thjeshtësi, elementi i drejtorisë "Nomenklatura" Furniture është i paracaktuar).

Query.Text = "SELECT Nomenklature.Link FROM Directory.Nomenklature AS Nomenklature

Kërkesë . SetParameter(" Group1", Drejtoritë. Nomenklatura. Mobiljet);

Shënim 1: nëse specifikoni një element bosh si argument të operatorit Në Hierarki, të gjithë elementët e drejtorisë do të zgjidhen (d.m.th. operatori në Hierarki do të kthejë vlerën True për çdo element të drejtorisë, pasi elementët dhe grupet e niveli i lartë kanë një vlerë boshe të atributit Prind), për shembull: Kërkesë . SetParameter(" Group1", Drejtoritë. Nomenklatura. EmptyLink());

Shënim 2: Operatori In Hierarchy është shumë i fuqishëm dhe ju lejon të kontrolloni anëtarësimin në grup për elementë të drejtorisë të një niveli të pakufishëm foleje brenda një pyetjeje (që nuk mund të bëhet në mënyra të tjera), por shpejtësia e këtij operatori nuk është shumë e lartë, gjë që është veçanërisht e dukshme. në drejtoritë e mëdha.

3. Përdorimi i konstruktorit të pyetjeve.

Midis programuesve 1C, shpesh lindin mosmarrëveshje rreth përdorimit të një konstruktori të pyetjeve ose refuzimit të përdorimit të një konstruktori dhe shkrimit të një pyetjeje me dorë. Sidoqoftë, sipas shumicës së programuesve, është e nevojshme të përdoret konstruktori, por ndonjëherë pas kësaj kërkesa e marrë "përfundon me dorë". Për të thirrur projektuesin e pyetjeve në çdo modul, duhet të klikoni në butonin e djathtë të miut dhe të zgjidhni ose "Query Builder" ose "Query Builder me përpunimin e rezultateve" nga menyja rënëse.

Përfitimet kryesore të përdorimit të ndërtuesit të pyetjeve:

1. Dukshmëria e të gjitha objekteve të disponueshme të konfigurimit për ndërtimin e një pyetësori (si dhe të gjitha tabelat e përkohshme të pyetjeve, etj.).

2. Tregim i saktë i emrave dhe detajeve të fushave (pasi ato nuk janë shtypur me dorë, por janë zgjedhur nga një listë).

3. Shfaqja e thjeshtuar e marrëdhënieve ndërmjet objekteve të kërkesës dhe gjendjes.

4. Punë relativisht e izoluar në secilën pjesë të kërkesës (çdo kërkesë në një kërkesë grupi ose një kërkesë e veçantë kur kombinohen kërkesat).

5. Të dhëna absolutisht të besueshme për tabelat virtuale “ekzistuese” në këtë konfigurim.

4. Puna me datat në pyetje (data, pika në kohë, kufiri)

Në mjetet e zhvillimit 1C, duke filluar nga versioni 8.0, lloji i të dhënave Date është bërë një përbërje e datës dhe orës. Dhe gjithçka do të ishte mirë, por ka edhe disa veçori këtu.

1 Problem. Koha për krijimin e dokumenteve mund të përcaktohet vetëm në sekondën më të afërt, domethënë nëse ekzekutojmë kodin e mëposhtëm dy herë me një pauzë të shkurtër:

Doc

Doc

Doc = Dokumentet. Duke ardhur. KrijoDokument(); Doc. Data = Data e tanishme(); Doc.Write();

Doc = Dokumentet. Konsumi. KrijoDokument(); Doc. Data = Data e tanishme(); Doc.Write();

Dhe pastaj ekzekutoni pyetjen e mëposhtme:

KOMBINON GJITHÇKA

RENDOSJA SIPAS datës

Ne marrim një rezultat të çuditshëm:

Dokumentet nuk janë as të organizuar sipas radhës në të cilën janë krijuar! Nëse zëvendësojmë atributin e dokumentit Data me atributin Momenti i kohës në kërkesë, do të marrim një rezultat më të mirë:

Brenda 1 sekondës, fillimisht vijnë dokumentet "Incoming" të kësaj sekonde, dhe më pas dokumentet "Output" të kësaj sekonde, dhe numrat e dokumenteve janë rreptësisht në rend rritës (në rastin tonë, për shkak të numërimit automatik të dokumenteve, kjo do të thotë në rendin e krijimit). Mbetet të zgjidhet një problem i vogël - të organizohen dokumentet brenda një sekonde në rendin real të krijimit të tyre dhe jo vetëm për secilin lloj dokumenti - nëse nuk do të kishte detyrë për ta zgjidhur këtë problem paraprakisht - në parim nuk është i zgjidhshëm.

Shënim: Një TimePoint përmban një datë, orë dhe një referencë për një objekt të bazës së të dhënave. Dhe sepse lidhja përmban një kod të llojit të objektit dhe një numër unik objekti - më pas renditja brenda një sekonde sipas Instant of Time do të prodhojë grupe të llojeve të ndryshme të objekteve brenda grupeve të renditura, por jo të "përziera" me njëri-tjetrin, si rezultat.

Si ta zgjidhni këtë problem:

Opsioni 1: nëse vetë numrat e dokumenteve nuk janë të rëndësishëm, mund të krijoni një numërues dokumenti dhe më pas numri i dokumentit do të korrespondojë me numrin e tij serial kur të krijohet. Kjo zgjidhje është shumë e keqe për shkak të refuzimit të numërimit të vazhdueshëm të dokumenteve.

Opsioni 2: futni një fushë identifikimi shtesë dhe, përpara se të ruani një dokument me një vlerë boshe për këtë fushë, merrni vlerën e kësaj fushe për këtë dokument nga çdo burim i pavarur nga sesioni, i cili mund të jetë një regjistrim i veçantë Regjistri jo periodik Informacioni dhe vlera e shkruar në një tekst të jashtëm ose skedar tjetër ose në një shërbim komercial të shkruar posaçërisht për këtë qëllim, etj. dhe shkruani vlerën që rezulton në këtë fushë dhe rrisni vlerën e ruajtur me një.

2 Problem. Zgjedhja e kohës për të ekzekutuar një kërkesë për marrjen e bilanceve. Kur ekzekutoni shumë pyetje, duhet të specifikoni fundin e periudhës së kampionimit (d.m.th., momentin në të cilin merren bilancet). Do të duket mjaft e saktë të thuhet kjo:

Kërkesë . SetParameter ( " Fundi i Periudhës " , Fund Muaji(Data Aktuale()));

Por në fakt, kërkesa për marrjen e bilanceve do të ekzekutohet që në fillim të datës së specifikuar (që është data + ora). Duke pasur parasysh se fundi i muajit (Data(2012, 10, 29)) = 10/31/0012 23:59:59

Na rezulton se kemi humbur xhiro të formuara nga lëvizjet (dokumentet) për sekondën e fundit të periudhës dhe balancat do të marrim një sekondë para fundit të muajit dhe jo në fund të muajit! Kjo veçori veçanërisht shpesh çon në një gabim në marrjen e bilanceve kur importoni bilancet fillestare (kur një numër i madh dokumentesh mund të përshtaten në sekondën e fundit) dhe në organizatat që punojnë në modalitetin 7*24.

Si ta zgjidhni këtë problem:

Opsioni 1: shtoni 1 sekondë në fund të periudhës:

Kërkesë . SetParameter ( " Fundi i Periudhës " , Fund Muaji(Data Aktuale())+1);

Opsioni 2: përdorni një objekt Border të krijuar posaçërisht për këtë qëllim:

PeriodBorder = Kufiri i ri(Muaji i Fundit(Data Aktuale())+ 1, Lloji i Kufirit. Duke përjashtuar);

Kërkesë . SetParameter ("Fundi i periudhës", Kufiri i periudhës);

shënim : nëse në një pyetje është e nevojshme të zgjidhni sipas pozicionit të një dokumenti në boshtin kohor, atëherë opsioni i dytë është më i qartë, për shembull:

PeriodBoundary = Kufiri i ri (Document.TimePoint,BoundaryView.Excluding);

ose nëse lëvizjet dhe ky dokument duhet të bien:

PeriodBoundary = Kufiri i ri (Document.TimePoint,BorderView.Including);

Shënim 2: Siç vërehet me të drejtë në komente, ka edhe një plus tjetër për të punuar me llojin e të dhënave Border - nuk duhet të mendoni se çfarë po zgjidhni balancat ose revolucionet dhe nuk ka nevojë të kaloni në një pyetje komplekse në të cilën të dyja balancojnë dhe rrotullimet janë zgjedhur 2 parametra që përshkruajnë momentin në të cilin është bërë përzgjedhja (njëri për rrotullimet, i dyti për mbetjet).

5. Marrja e mostrave sipas grupimeve, rezultateve.

Përveç përzgjedhjes së zakonshme të rezultateve të pyetjeve për drejtoritë hierarkike, ekziston mundësia e përzgjedhjes hierarkike të rezultateve, që do të thotë: le që direktoria jonë e nomenklaturës të ketë përmbajtjen e mëposhtme të të dhënave:

Mjetet

Skedari

Atëherë pyetja e zakonshme e mostrës duket si:

Mostra = Kërkesë. Run(). Zgjidhni ();

Do të prodhojë një listë të elementeve dhe grupeve, në përgjithësi, në mënyrë të rastësishme (nëse renditja nuk bëhet në kërkesë), por shpesh ju duhet të zgjidhni rezultatin duke marrë parasysh vartësinë hierarkike, atëherë kjo detyrë kryhet me një modifikim të lehtë të kërkesës dhe një kod përzgjedhjeje pak më kompleks:

Kërkesë = Kërkesë e re;

Kërkesë . Text = "SELECT Nomenklature. Lidhja AS Nomenklature FROM Directory. Nomenklature AS Nomenklature

REZULTATET PËR HIERARKINË E Nomenklaturës”;

Mostra = Kërkesë.Run(). Select(BypassQueryResult.ByGroupingSIhierarky, "Nomenklatura");

Raporti("Element=" + Zgjidh Detajet. Nomenklatura);

Cikli i Fundit;

Cikli i Fundit;

Për më tepër, platforma lejon, kur kryen një përzgjedhje, të llogariten totalet në çdo nivel, le të marrim totalet nga drejtoria (dhe jo nga regjistrat e grumbullimit) për thjeshtësi të kërkesës:

Kërkesë = Kërkesë e re;

Kërkesë . Tekst = "ZGJEDHNI SI TË SHITUR.Lidhja AS Artikull, Nomenklatura.Shitet SI I shitur

NGA Drejtoria.Nomenklatura AS Nomenklatura

SHITJA TOTALE (SHITUR)

HIERARKIA e nomenklaturës së softuerit";

Mostra = Kërkesë. Run(). Select(BypassQueryResult.ByGroupingSIhierarky, "Nomenklatura");

Mirupafshim Përzgjedhja. Hapi tjetër ()

Për të raportuar ("Group=" + Zgjedhja. Artikull+ " Shitur=" + Zgjedhja. Shitur);

SelectionDetails = Selection.Select(BypassQueryResult.ByGroupingSIhierarchy, "Nomenklature");

Ndërsa SelectionDetails. Hapi tjetër ()

Për të raportuar ("Item=" + SelectDetails. Item+ " Sold=" + Select Details. Shitur);

Cikli i Fundit;

Cikli i Fundit;

Shënim 1: Ekziston edhe një opsion tjetër, kalimi “By Grouping”, i cili ndryshon nga kalimi hierarkik në atë që elementët e përzgjedhjes me totale hierarkike do të jenë në të si regjistrime të detajuara dhe jo si regjistrime të nyjeve.

Shënim 2: Për të përshkuar një drejtori me një strukturë më komplekse (numri i niveleve>2), mund të përdorni rekursionin, për shembull si ky:

……………………..

Mostra = Kërkesë.Run(). Zgjidh(WalkthroughQueryResult.ByGroupingHIerarchy);
SelectRecursively (Zgjidh);

………….
Fundi i procedurës

Procedura SelectRecursively (Zgjidh)

Ndërsa Select.Next() Loop

Për të raportuar (Shembull. Artikull + "sasi=" + Zgjedhja. Shitur);

// Përpjekje për të marrë të dhënat e fëmijëve

SelectRecursively(Selection.Select(WalkingQueryResult.ByGroupsSIerarchy);
Cikli i Fundit;
Fundi i procedurës

Shënim 3: Një përdorim tjetër i kampionimit hierarkik është ngarkimi i rezultateve të pyetjeve në një objekt të llojit Pema e vlerës, për shembull si ky:

ValueВFormAttributes(Rezultati. Shkarkimi (BypassQueryResult.ByGroupingSIerarchy, "Tree" );

Pemë = Rezultati. Unload(BypassQueryResult.ByGroupingHIerarchy);

6.Tabelat e përkohshme, pyetjet e grupeve.

Një tjetër veçori shumë e fuqishme e gjuhës së pyetjeve 1C është puna me tabela të përkohshme. Në thelb, ne vendosim rezultatin e pyetjes në një tabelë të përkohshme, me të cilën më pas mund të punojmë si me një tabelë të rregullt. Kërkesa në vetvete bëhet një përbërje e disa kërkesave që ekzekutohen në mënyrë strikte në mënyrë strikte; një kërkesë (e fundit) e grupit kryen një rikthim të të dhënave - një kërkesë e tillë e përbërë quhet kërkesë grupi. Çdo tabelë e përkohshme ka emrin e vet, etj. një pyetje grupi mund të krijojë një numër arbitrar tabelash. Jetëgjatësia e një tabele të përkohshme është e kufizuar nga koha e ekzekutimit të pyetjes; sapo pyetja të jetë ekzekutuar, të gjitha tabelat e përkohshme shkatërrohen dhe memoria e zënë nga ruajtja e të dhënave të përkohshme të tabelës lëshohet.

Për të vendosur të dhënat në një tabelë të përkohshme, përdoret operatori PUT, i cili shkruhet në pyetjen midis operatorëve SELECT dhe FROM. Kërkesat brenda një kërkese grupi janë të ndara nga njëra-tjetra nga rreshtat e mëposhtëm:

////////////////////////////////////////////////////////////

Një shembull i një pyetjeje të grupit të vogël që zgjedh dokumentin e fundit të shitjes "Shitjet" (dokumenti ka një pjesë tabelare "Produktet", e cila liston mallrat e shitura) për çdo artikull.

Skema e kërkesës së grupit:

në 1 kërkesë marrim një listë të plotë të artikujve që shiten dhe datën maksimale të shitjes për çdo artikull,

në kërkesën e dytë, për çdo artikull nga kërkesa e parë, zgjedhim një dokument shitje me datë të barabartë me maksimumin për këtë artikull.

SELECT SalesProducts.Nomenklature, MAXIMUM(SalesProductsProducts.Link.Date) AS Data

PUT Datat

NGA Dokumenti.Shitjet.Produktet SI Produktet e shitjes

GRUP NGA Shitjet e produkteve.Nomenklatura

////////////////////////////////////////////////////////////

SELECT Datat.Nomenklature, Dates.Date, MAXIMUM(Implementation.Reference) AS Referenca

NGA Datat AS Data

BASHKIMI I BRENDSHËM Dokumenti.Zbatimi SI Zbatimi

Datat e softuerit.Data = Implementimi.Data

GRUP NGA Zbatimi.Lidhja

Çfarë ju jep përdorimi i kërkesave të grupit: bën të mundur shkrimin e pyetjeve më komplekse dhe në të njëjtën kohë pyetje më të lexueshme, optimizon shpejtësinë e ekzekutimit të pyetjeve, shpesh kjo është mënyra e vetme për të shmangur ekzekutimin e një pyetësori në një lak. Nëse shikoni burimet konfigurime tipike- Të gjitha pyetje komplekse shkruhen ekskluzivisht si ato në grup.

7. Radha e numrave, datat.

Detyrë: gjenerimi i një sekuence numrash nga 0 në 959 në një kërkesë. Kur përdorni një kërkesë grupi, problemi mund të zgjidhet lehtësisht:

SELECT Shifrat.Fusha1 AS Shifra

Numrat e VENDIT

FROM (ZGJEDH 1 AS Fusha 1

KOMBINO ZGJIDHJE 2

KOMBINO ZGJIDHJE 3

KOMBINO ZGJIDHJE 4

KOMBINO ZGJIDHJE 5

KOMBINO ZGJIDHJE 6

KOMBINO ZGJIDHJE 7

KOMBINO ZGJIDHJE 8

KOMBINO ZGJIDHJE 9

KOMBINO ZGJIDHJE 10) SI TË NUMRAT

SELECT (Shifra. Shifra - 1) + (Shifra 1. Shifra - 1)* 10+ (shifra 2. Shifra - 1)* 100 AS Numër

WHERE (Shifra. Shifra - 1) + (Shifra 1. Shifra - 1)* 10+ (shifra 2. Shifra - 1)* 100<= 959

RENDOSJE SIPAS Numrit

Detyrë: gjenerimi i një sekuence datash nga Data1 deri në Data2. Zgjidhja është e ngjashme, mund ta bëni në 3 hapa (i pari dhe i dyti si në shembullin e mësipërm, por rezultati nuk zgjidhet por vendoset në një tabelë të përkohshme) ose në 2 hapa duke ndryshuar pyetjen e dytë të paketës në këtë. :

SELECT ADDKDATE (&Data 1 , DITA , (Shifra. Shifra - 1) + (Shifra 1. Shifra - 1)* 10+ (Shifra 2. Shifra - 1)* 100) AS Data

NGA numrat AS numra, numrat AS numra 1, numrat AS numra 2

KU TË SHTOJMË (&Data 1, DITA, (Shifra. Shifra - 1) + (Shifra 1. Shifra - 1)* 10+ (Shifra 2. Shifra - 1)* 100)

RENDOSJA SIPAS datës

Shënim: Natyrisht, kjo kërkesë do të funksionojë në mënyrë korrekte vetëm nëse nuk ka më shumë se 999 ditë midis datave Date1 dhe Date2.

8. Përdorimi i të dhënave nga tabela e vlerave në një pyetje.

Nëse në seksionin e parë (operator ) ne krahasojmë një grup fushash me të dhënat nga Tabela e Vlerave, ndonjëherë kjo nuk mjafton. Për shembull, grupe të dhënash transmetohen nga një burim i palës së tretë, për shembull: barkodi dhe numri i njësive të shitura. Ju, sigurisht, mund të anashkaloni grupin e vlerave të kaluara në një pyetje duke ekzekutuar një pyetje në çdo përsëritje të lakut, por ky është opsioni më i keq për zgjidhjen e këtij problemi. Do të ishte më e saktë ta bëni këtë:

1. Krijoni një Tabelë të Vlerave të shtypur (d.m.th., e cila ka një lloj të specifikuar për secilën fushë).

2. Plotësoni tabelën e vlerave me të dhënat e marra të shitjeve.

3. Kërkoni për artikujt në kërkesë.

Shembull i kodit për fazat 1 dhe 3:

Krijimi i një tabele vlerash të shtypur:

// Krijoni përshkrues të tipit për tabelën e vlerave

KCHK = Numrat e Kualifikuesve të Rinj (14, 3);

KCHShK = Numrat e Kualifikuesve të Ri (13, 0);

Array = Array i ri;

Array . Add(Type ("Numër" ));

PërshkrimiTypesCHK = Përshkrimi i ri Llojet (Array, CHK);

Array . Qartë();

Array . Shto (Lloji ("Numri"));

PërshkrimiTypesCHSh = Përshkrimi i ri Llojet (Array, KCHShK);

// Krijo një tabelë vlerash

ValueTable = New ValueTable;

// shtoni dy kolona në tabelën e vlerave

Tabela e vlerave. Columns.Add("Barkode" , Lloji Përshkrimi, "Barkodi" , 13); Tabela e vlerave. Kolonat. Add("Sold" , DescriptionTypesCHK, "Sold" , 14);

Kërkoni artikuj në një kërkesë:

Kërkesë = Kërkesë e re;

Request.Text = "ZGJEDH TK.Barkodin, TK.Sasinë

VENDOS TK

NGA &TK AS TK

////////////////////////////////////////////////////////////////////////////////

ZGJIDH TK.Sasia AS Vëllimi i Shitjeve, Nomenklatura.Lidhja AS Link

NGA TK AS TK

BASHKIMI I BRENDSHËM Drejtoria.Nomenklatura AS Nomenklatura

BY TZ.Barcode = Nomenklature.Barcode";

Kërkesë . SetParameter ("TK", Tabela e Vlerave);

Shënim: Për të punuar me Tabelën e Vlerave në një pyetje, gjithmonë duhet të vendosni së pari të dhënat nga Tabela e Vlerave në një Tabelë të Përkohshme dhe vetëm atëherë mund të punoni me këto të dhëna brenda një kërkese grupi.

/
Zbatimi i përpunimit të të dhënave

Renditja e rezultateve të pyetjeve

1.1. Nëse algoritmi për përpunimin e rezultateve të pyetjes varet nga rendi i regjistrimeve në pyetje ose nëse rezultati i përpunimit të pyetjes në një formë ose në një tjetër i paraqitet përdoruesit, atëherë fjalia duhet të përdoret në tekstin e pyetjes. NDAJ SIPAS. Në mungesë të shprehjes NDAJ SIPAS nuk mund të bëhet asnjë supozim për rendin në të cilin do të shfaqen të dhënat në rezultatet e pyetjes.

Shembuj tipikë të problemeve që mund të ndodhin:

  • sekuenca të ndryshme të rreshtave në seksionin tabelor kur plotësohen sipas rezultateve të pyetjes;
  • renditje të ndryshme të prodhimit të të dhënave (rreshta, kolona) në raporte;
  • mbushje të ndryshme të lëvizjeve të dokumentit bazuar në rezultatet e pyetjeve (*).

Rritet gjasat që të ndodhin rezultate të ndryshme gjatë kryerjes së të njëjtave veprime

  • kur transferoni një bazë informacioni në një DBMS tjetër
  • kur ndryshoni versionin e DBMS
  • kur ndryshoni parametrat e DBMS

* Shënim: porositja e rezultateve të pyetjeve që gjenerojnë lëvizje justifikohet vetëm nëse porositja është pjesë e algoritmit për gjenerimin e lëvizjeve (për shembull, fshirja e bilanceve të grupeve të mallrave duke përdorur FIFO). Në raste të tjera, të dhënat nuk duhet të renditen, pasi porositë shtesë do të krijojnë një ngarkesë të tepërt në DBMS.

1.2. Nëse rezultatet e një pyetje duhet t'i shfaqen përdoruesit në një farë mënyre, atëherë

  • është e nevojshme të organizohen rezultatet e pyetjeve të tilla sipas fushave të llojeve primitive;
  • Renditja sipas fushave të llojeve të referencës duhet të zëvendësohet me renditje me paraqitje të vargjeve të këtyre fushave.

Përndryshe, rendi i rreshtave do të duket i rastësishëm (i pashpjegueshëm) për përdoruesit.

Shihni gjithashtu: Renditja e rreshtave të tabelës së vlerave

1.3. Asnjë ofertë NDAJ SIPAS justifikohet vetëm në rastet kur

  • algoritmi për përpunimin e rezultateve të pyetjeve nuk mbështetet në një renditje specifike të regjistrimeve
  • rezultati i përpunimit të kërkesës së ekzekutuar nuk i shfaqet përdoruesit
  • rezultati i pyetjes është padyshim një rekord

Përdorimi i përbashkët me dizajn të ndryshëm

2. Nëse kërkesa përdor konstruksionin TË NDRYSHME, porositja duhet të kryhet vetëm nga fushat e përfshira në përzgjedhje (në seksion ZGJIDHNI).

Kjo kërkesë shoqërohet me veçorinë e mëposhtme të ekzekutimit të pyetjes: fushat e renditjes përfshihen në mënyrë implicite në fushat e përzgjedhjes, të cilat nga ana tjetër mund të çojnë në shfaqjen e disa rreshtave me të njëjtat vlera të fushave të përzgjedhjes si rezultat i pyetjes.

Kufizime në përdorimin e konstruksionit AUTO ORDER

3. Përdorimi i dizajnit E PARA së bashku me strukturën AUTO POROSI e ndaluar.

Në raste të tjera, dizajni AUTO POROSI Gjithashtu nuk rekomandohet të përdoret, pasi zhvilluesi nuk kontrollon se cilat fusha do të përdoren për porositje. Përdorimi i një dizajni të tillë justifikohet vetëm në rastet kur rendi që rezulton i regjistrimeve nuk është i rëndësishëm, por ai duhet të jetë i njëjtë pavarësisht nga DBMS e përdorur.

Vendosa të jap kontributin tim dhe të përshkruaj ato veçori të gjuhës që nuk u diskutuan në artikujt e mësipërm. Artikulli u drejtohet zhvilluesve fillestarë.

1. Dizajni “IZ”.

Për të marrë të dhëna nga baza e të dhënave, nuk është aspak e nevojshme të përdoret ndërtimi "FROM".
Shembull: Ne duhet të zgjedhim të gjitha informacionet për bankat nga drejtoria e bankave.
Kërkesë:

SELECT Directory.Banks.*

Zgjedh të gjitha fushat nga drejtoria e Bankave. Dhe është e ngjashme me kërkesën:

SELECT Bankat.* FROM Directory.Banks AS Banks

2. Renditja e të dhënave sipas fushës së referencës

Kur duhet të organizojmë të dhënat e pyetjeve sipas llojeve primitive: "String", "Number", "Date", etj., atëherë gjithçka zgjidhet duke përdorur konstruktin "ORDER BY" nëse duhet të renditni të dhënat sipas një fushe referimi? Fusha e referencës është një lidhje, një identifikues unik, d.m.th. Përafërsisht, disa grupe arbitrare karakteresh dhe renditje të zakonshme mund të prodhojnë një rezultat që nuk pritet plotësisht. Për të porositur fushat e referencës, përdoret ndërtimi "AUTO ORDER". Për ta bërë këtë, së pari duhet të renditni të dhënat drejtpërdrejt sipas llojit të referencës duke përdorur konstruktin "ORDER BY" dhe më pas konstruktin "AUTO ORDER".

Në këtë rast, për dokumentet, renditja do të bëhet në rendin "Data->Numër", për librat e referencës në "Pamje kryesore". Nëse renditja nuk ndodh sipas fushave të referencës, atëherë përdorimi i konstruksionit "AUTO ORDER" nuk rekomandohet.

Në disa raste, konstrukti "AUTO ORDER" mund të ngadalësojë procesin e përzgjedhjes. Në mënyrë të ngjashme, ju mund të rishkruani pa porositur automatikisht dokumente:

3. Marrja e një paraqitjeje teksti të një lloji referimi. Dizajni "PREZANTIM".

Kur duhet të shfaqni një fushë të një lloji referimi, për shembull, fusha "Banka", e cila është një lidhje me një element të drejtorisë "Bankat", duhet të kuptoni se kur shfaqni këtë fushë, një nënpyetje në " Drejtoria e Bankave" do të ekzekutohet automatikisht për të marrë një pamje të drejtorisë. Kjo do të ngadalësojë prodhimin e të dhënave. Për të shmangur këtë, duhet të përdorni konstruksionin "PREZANTIM" në kërkesë në mënyrë që të merrni menjëherë një paraqitje të objektit dhe më pas ta shfaqni atë për shikim.

Në sistemin e përbërjes së të dhënave, ky mekanizëm përdoret si parazgjedhje, por kur krijoni paraqitje në qeliza, duhet të specifikoni paraqitjen e fushës së referencës dhe, për shembull, të vendosni vetë lidhjen në transkript.

4. Kushti për marrjen e të dhënave sipas një shablloni.

Për shembull, ju duhet të merrni telefona celularë të punonjësve të formularit (8 -123- 456-78-912). Për ta bërë këtë, duhet të vendosni kushtin e mëposhtëm në kërkesë:

SELECT Punonjës.Emri, Punonjës.Telefoni AS Telefon NGA Direktoria.Punonjësit AS Punonjës WHERE Phone LIKE "_-___-___-__-__"

Karakteri "_" është një karakter shërbimi dhe zëvendëson çdo karakter.

5. Përdorimi i njëkohshëm i totaleve dhe grupimeve.


Totalet shpesh përdoren në lidhje me grupimet; në këtë rast, funksionet e përgjithshme mund të mos specifikohen në total.

SELECT Ofrimi i Sherbimeve.Organizimi AS Organizimi, Ofrimi i Sherbimeve.Nomenklatura AS Nomenklature, SUM(Ofrimi i Sherbimeve.Shuma e Dokumentit) AS Shuma e Dokumentit FROM Document.Organizimi i Sherbimeve AS Ofrimi i Sherbimeve GROUP BY Ofrimi i Sherbimeve.Organizimi, Ofrimi of Sherbime.Nomenklature REZULTATET SIPAS PERGJITHSHME, Organizata, Nomen klatura

Në këtë rast, pyetja do të kthehet pothuajse njësoj si pyetja e mëposhtme:

SELECT Ofrimi i Sherbimeve.Organizata AS Organizimi, Ofrimi i Sherbimeve.Nomenklatura AS Nomenklatura, Ofrimi i Sherbimeve.Shuma e Dokumentit AS Shuma e Dokumentit FROM Document.Sigurimi i Sherbimeve AS Ofrimi i Sherbimeve REZULTATET SHUMIA (Shuma e Dokumentit) NGA PERGJITHSHME Nomenklatura

Vetëm pyetja e parë do të rrëzojë të dhënat me të njëjtën nomenklaturë.

6. Dereferencimi i fushave.

Referimi i fushave përmes një pike quhet operacioni i çreferencimit të fushës së referencës. Për shembull Pagesa.Organizata.Njsia Administrative. Në këtë rast, në fushën e referencës “Organizimi” i dokumentit “Pagesa” i referohet një tabelë tjetër “Organizatat”, në të cilën do të merret vlera e atributit “Njësi Administrative”. Është e rëndësishme të kuptohet se kur hyni në fusha përmes një pike, platforma krijon në mënyrë implicite një nënpyetje dhe bashkon këto tabela.

Kërkesë:

Mund të përfaqësohet si:

SELECT Payment.Link, Payment.Organization, Payment.Organization, Organizations. Njësia Administrative FROM Document.Payment AS Pagesa LEFT JOIN Directory.Organizations AS Software Organizations Payment.Organization = Organizations.Link

Kur çreferencohen fushat e referencës të një lloji të përbërë, korniza përpiqet të krijojë bashkime të nënkuptuara me të gjitha tabelat që janë pjesë e llojit të asaj fushe. Në këtë rast pyetja nuk do të jetë optimale.Nëse dihet qartë se për çfarë lloj fushe bëhet fjalë, është e nevojshme të kufizohen këto fusha sipas llojit me një konstrukt. EXPRESS().

Për shembull, ekziston një regjistër akumulimi "Pagesat e pashpërndara", ku disa dokumente mund të veprojnë si regjistrues. Në këtë rast, është e gabuar të merren vlerat e detajeve të regjistruesit në këtë mënyrë:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

ju duhet të kufizoni llojin e fushës së përbërë në logger:

SELECT EXPRESS(Pagesat e pandara. Regjistrohu AS Document.Payment).Data, ..... FROM RegisterAccumulation.Payments Unallocated AS UnallocatedPayments

7. Ndërtimi "KU"

Me një bashkim majtas të dy tabelave, kur vendosni një kusht "KU" në tabelën e djathtë, do të marrim një rezultat të ngjashëm me rezultatin me një bashkim të brendshëm tabelash.

Shembull. Është e nevojshme të zgjidhen të gjithë Klientët nga Direktoria e Klientëve dhe për ata klientë që kanë një dokument pagese me vlerën e atributit "Organization" = &Organization, të shfaqet dokumenti "Pagesa", për ata që nuk kanë, mos e shfaqin atë.

Rezultati i pyetjes do të kthejë rekorde vetëm për ata klientë që kishin pagesë sipas organizatës në parametrin dhe do të filtrojë klientët e tjerë. Prandaj, së pari duhet të merrni të gjitha pagesat për organizatën "kështu dhe të tillë" në një tabelë të përkohshme dhe më pas ta lidhni atë me drejtorinë "Klientë" duke përdorur një bashkim majtas.

SELECT Payment.Link AS Payment, Payment.Aksioner AS Klient PLACE toPages FROM Document.Pagement AS Pagesë KU Pagesa.Dega = &Dega; ///////////////////////////////////////////////////////////////// ////////////////////////// ZGJIDH Klientët.Link AS Klient, ISNULL(tPayment.Payment, "") AS Pagesa NGA Drejtoria .Klientët AS Klientët LËNË LIDHJE TË LËNDËS pagesat AS SOFTWARE për pagesat Clients.Link = toppayments.Client

Ju mund ta shmangni këtë gjendje në një mënyrë tjetër. Është e nevojshme të vendoset një kusht "KU" drejtpërdrejt në marrëdhëniet midis dy tabelave. Shembull:

SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LIDHJA LEFT Document.Payment AS Payment Software (Clients.Link = Payment.Client AND Payment.Client.Emri LIKE "Sugar Packet",ClientsLinkY) Klienti.Link. Lidhje

8. Bashkohet me Tabelat e Nested dhe Virtuale

Pyetjet e mbivendosura shpesh e nevojshme për të marrë të dhëna bazuar në disa kushte. Nëse më pas i përdorni ato në lidhje me tabela të tjera, kjo mund të ngadalësojë në mënyrë kritike ekzekutimin e pyetjes.

Për shembull, ne duhet të marrim shumën e bilancit që nga data aktuale për disa klientë.

SELECT UnallocatedPaymentsRemains.Customer, UnallocatedPaymentsRemains.AmountRemaining FROM (SELECT Clients.Link AS Lidhje FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQueryIN LEFTALOCATLocationsPastimi. yments BY Nested Request.Link = PaymentsBalances të pashpërndara. Klienti

Gjatë ekzekutimit të një pyetjeje të tillë, optimizuesi i DBMS mund të bëjë gabime kur zgjedh një plan, gjë që do të çojë në ekzekutimin jo optimal të pyetjes. Kur bashkoni dy tabela, optimizuesi DBMS zgjedh një algoritëm të bashkimit të tabelave bazuar në numrin e regjistrimeve në të dyja tabelat. Nëse ka një pyetje të mbivendosur, është jashtëzakonisht e vështirë të përcaktohet numri i rekordeve që do të kthejë pyetja e mbivendosur. Prandaj, duhet të përdorni gjithmonë tabela të përkohshme në vend të pyetjeve të mbivendosura. Pra, le ta rishkruajmë kërkesën.

ZGJIDH Klientët.Lidhja AS VENDI Lidhje tKlientët NGA Drejtoria.Klientët AS Klientë WHERE
Klientët.Lidhja B (&Klientët) ; ///////////////////////////////////////////////////////////////// ////////////////////////// SELECT tClients.Link, UnallocatedPaymentsRemains.Amount Remaining, FROM tClients AS tKlientët LËNË SHQIPTAR RegjistrohuAkumulimet.Pagesat e paalokuara,Balancat e klientëve IN (SELECT tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

Në këtë rast, optimizuesi do të jetë në gjendje të përcaktojë se sa rekorde përdor tabela e përkohshme tClients dhe do të jetë në gjendje të zgjedhë algoritmin optimal për bashkimin e tabelave.

Tabelat virtuale , ju lejon të merrni të dhëna praktikisht të gatshme për shumicën e detyrave të aplikuara. Këto tabela nuk janë fizike, por janë të përpiluara nga sistemi në fluturim, d.m.th. Kur merr të dhëna nga tabelat virtuale, sistemi mbledh të dhëna nga tabelat e regjistrit përfundimtar, mbledh, grupon dhe ia lëshon përdoruesit.

Ato. Kur lidheni me një tabelë virtuale, bëhet një lidhje me një nënpyetje. Në këtë rast, optimizuesi DBMS mund të zgjedhë gjithashtu një plan lidhjeje jo optimale. Nëse pyetja nuk gjenerohet mjaft shpejt dhe pyetja përdor bashkime në tabela virtuale, atëherë rekomandohet të zhvendoset qasja në tabelat virtuale në një tabelë të përkohshme dhe më pas të bëhet një bashkim midis dy tabelave të përkohshme. Le të rishkruajmë kërkesën e mëparshme.

ZGJIDHNI Klientët.Lidhni AS VENDIN e Lidhjes tKlientët NGA Drejtoria.Klientët AS Klientë INDEKSI SIPAS Lidhjes WHERE
Klientët.Lidhja B (&Klientët) ; ///////////////////////////////////////////////////////////////// /////////////////////////// ZGJIDHni pagesat e paalokuara.AmountBalance, UnallocatedPayments.Client AS Klient PLACE balancat FROM RegisterAcumulations.Payments Unallocated.Balances(, Klienti B ( ZGJIDHni tClients.Lidhja NGA tClients)) AS balancat e pagesave të pashpërndara; ///////////////////////////////////////////////////////////////// ////////////////////////// ZGJEDHNI tClients.Link, teRemainders.Sasia e mbetur AS Shuma e mbetur NGA tKlientët AS tKlientët LEFT JOIN për të mbeturinat AS mbetjet BY tnkC. = t Mbetjet.Klienti

9.Kontrollimi i rezultatit të kërkesës.

Rezultati i pyetjes mund të jetë bosh; për të kontrolluar vlerat boshe, përdorni konstruktin e mëposhtëm:

ResRequest = Kërkesë.Execute(); Nëse resQuery.Empty() Pastaj Kthehu; fundNëse;

Metoda Bosh () duhet të përdoret para metodave Zgjidhni () ose Shkarko (), pasi marrja e koleksionit kërkon kohë.

Nuk është një zbulim për askënd që është jashtëzakonisht e padëshirueshme të përdoren pyetje në një lak. Kjo mund të ndikojë në mënyrë kritike në kohën e funksionimit të një funksioni të caktuar. Është shumë e dëshirueshme që të merren të gjitha të dhënat në kërkesë dhe më pas të përpunohen të dhënat në një cikli. Por ndonjëherë ka raste kur bëhet e pamundur zhvendosja e kërkesës jashtë ciklit. Në këtë rast, për optimizim, mund të zhvendosni krijimin e pyetjes jashtë ciklit, dhe në ciklin, të zëvendësoni parametrat e nevojshëm dhe të ekzekutoni pyetjen.

Kërkesë = Kërkesë e re; Query.Text = "ZGJIDH | Klientët.Lidhja, | Klientët.Data e lindjes |NGA | Drejtoria.Klientët SI Klientë | KU | Klientët.Lidhja = &Klient"; Për çdo rresht FROM TableClients Loop Query.SetParameter("Klient", Klient); QueryResult = Query.Execute().Select(); Cikli i Fundit;

Kjo do ta shpëtojë sistemin nga kontrollimi i sintaksës së kërkesës në një lak.

11. Ndërtim “HAVING”.

Një dizajn që është mjaft i rrallë në kërkesa. Ju lejon të vendosni kushte për vlerat e funksioneve agregate (SHUMË, MINIMUM, MESATAR, etj.). Për shembull, ju duhet të zgjidhni vetëm ata klientë, shuma e pagesës së të cilëve në shtator ishte më shumë se 13,000 rubla. Nëse përdorni kushtin "WHERE", fillimisht do t'ju duhet të krijoni një tabelë të përkohshme ose një pyetje të ndërthurur, të gruponi regjistrimet atje sipas shumës së pagesës dhe më pas të aplikoni kushtin. Ndërtimi "HAVING" do të ndihmojë në shmangien e kësaj.

SELECT Payment.Customer, AMOUNT(Payment.Amount) AS Amount FROM Document.Payment AS Payment WHERE MUAJ(Data.Payment) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Smount) > 13000

Në konstruktor, për ta bërë këtë, thjesht shkoni te skeda "Kushtet", shtoni një kusht të ri dhe kontrolloni kutinë e kontrollit "Custom". Pastaj thjesht shkruani Shuma (Pagesa.Shuma) > 13000


12. Vlera NULL

Unë nuk do të përshkruaj këtu parimet e logjikës me tre vlera në bazën e të dhënave; ka shumë artikuj për këtë temë. Vetëm shkurtimisht se si I PAVLEFSHËM mund të ndikojë në rezultatin e pyetjes. Vlera NULL nuk është në fakt një vlerë, dhe fakti që vlera është e papërcaktuar është i panjohur. Prandaj, çdo operacion me NULL kthen NULL, qoftë mbledhje, zbritje, pjesëtim apo krahasim. Një vlerë NULL nuk mund të krahasohet me një vlerë NULL sepse ne nuk dimë se çfarë të krahasojmë. Ato. të dyja këto krahasime janë: NULL = NULL, NULL<>NULL nuk është e vërtetë apo e rreme, është e panjohur.

Le të shohim një shembull.

Për ata klientë që nuk kanë pagesa, duhet të afishojmë fushën “Sign” me vlerën “Nuk ka pagesa”. Për më tepër, ne e dimë me siguri që kemi klientë të tillë. Dhe për të pasqyruar thelbin e asaj që shkrova më lart, le ta bëjmë në këtë mënyrë.

ZGJIDH "Nuk ka pagesa" SI Atribut, NULL AS Toppagesat e VENDIT të dokumentit; ///////////////////////////////////////////////////////////////// ///////////////////////// ZGJIDH Klientët.Lidhja AS Klient, Pagesa.Lidhja SI Pagesa VENDOSI tClientPayment NGA Drejtoria.Klientët AS Klientët LËNË Dokumentin e LIDHJES. Pagesa AS Software Payment Clients.Link = Pagesa.Aksionar; ///////////////////////////////////////////////////////////////// ////////////////////////// ZGJIDHni tClientPayment.Client NGA tClientPayment AS tClientPayment BASHKOHU I BRENDSHËM tPagesën SI tTë paguaj NGA tClientPayment.Pagesa = tPagesë.

Kushtojini vëmendje tabelës së dytë të përkohshme tClientPayment. Me bashkimin e majtë zgjedh të gjithë klientët dhe të gjitha pagesat për këta klientë. Për ata klientë që nuk kanë pagesa, fusha “Pagesa” do të jetë NULL. Sipas logjikës, në tabelën e parë të përkohshme “tPayments” caktova 2 fusha, njëra prej tyre NULL, rreshtin e dytë “Nuk ka pagesa”. Në tabelën e tretë, unë lidh tabelat "tClientPayment" dhe "tPayment" duke përdorur fushat "Pagesë" dhe "Dokument" me një bashkim të brendshëm. Dimë që në tabelën e parë fusha “Dokument” është NULL, kurse në tabelën e dytë, ata që nuk kanë pagesa në fushën “Pagesa” janë gjithashtu NULL. Çfarë do të na rikthejë një lidhje e tillë? Por nuk do të kthejë asgjë. Sepse krahasimi NULL = NULL nuk vlerësohet në True.

Në mënyrë që kërkesa të kthejë rezultatin e pritur, le ta rishkruajmë atë:

ZGJEDH "Nuk ka pagesa" SI Atribut, VLERA(Document.Payment.EmptyLink) AS VENDI I dokumentit tePagesat; ///////////////////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink)) SI Pagesa PUT tClientPayment FROM Directory.Klientët SI Klientë Dokumenti LIDHJA E LETË.Pagesa SI Pagesa NGA Klientët.Lidhja = Pagesa.Aksionari; ///////////////////////////////////////////////////////////////// ////////////////////////// ZGJIDHni tClientPayment.Client NGA tClientPayment AS tClientPayment BASHKOHU I BRENDSHËM tPagesën SI tTë paguaj NGA tClientPayment.Pagesa = tPagesë.

Tani, në tabelën e dytë të përkohshme, ne kemi treguar se nëse fusha "Pagesa" është NULL, atëherë kjo fushë = një lidhje boshe me dokumentin e pagesës. Në tabelën e parë ne gjithashtu zëvendësuam NULL me një referencë boshe. Tani lidhja përfshin fusha jo NULL dhe kërkesa do të kthejë rezultatin e pritur.

Të gjitha kërkesat e përfshira në artikull pasqyrojnë situatat që do të doja të merrja në konsideratë dhe asgjë më shumë. RRETH Ato mund të mos jenë delirante ose nënoptimale, gjëja kryesore është që ato pasqyrojnë thelbin e shembullit.

13. Një tipar i padokumentuar i dizajnit "ZGJEDHJA KUR...PËSHTJET...FUND".

Në rastin kur është e nevojshme të përshkruhet ndërtimi "Kushtet" në kërkesë, ne përdorim sintaksën standarde:

SELECT SELECTION WHEN Users.Name = "Vasya Pupkin" THEN "Punonjësi ynë i preferuar" ELSE "Ne nuk e dimë këtë" FUND AS Field1 FROM Directory.Përdoruesit AS Përdorues

Por, çka nëse, për shembull, duhet të marrim emrin e muajit në një kërkesë? Shkrimi i një ndërtimi të madh në një kërkesë është i shëmtuar dhe kërkon shumë kohë, kështu që kjo formë e shkrimit më lart mund të na ndihmojë:

ZGJIDH MUAJIN(US_CalculationConsumption_ScheduleTurnover.CalculationPeriod) WHEN 1 PASTAJ "Janar" WHEN 2 PASTA "shkurt" WHEN 3 PASTAJ "Mars" WHEN 4 PASTAJ "Prill" WHEN 5 PASTAJ "THENJHËN "THENJNH" KUR 8 PASTAJ "Gusht" KUR 9 PASTAJ "Shtator" KUR 10 PASTA "Tetor" KUR 11 PASTAJ "Nëntor" KUR 12 PASTAJ "Dhjetor" PËRFUNDON SI një muaj

Tani dizajni duket më pak i rëndë dhe është i lehtë për t'u kuptuar.

14. Ekzekutimi i pyetjes në grup.


Për të mos shumëzuar kërkesat, mund të krijoni një kërkesë të madhe, ta ndani në paketa dhe të punoni me të.
Për shembull, më duhet të marr fushat e mëposhtme nga drejtoria "Përdoruesit": "Data e lindjes" dhe rolet e disponueshme për çdo përdorues. ngarkoni këtë në pjesë të ndryshme tabelare në formular. Sigurisht, ju mund ta bëni këtë me një kërkesë, atëherë do t'ju duhet të përsërisni regjistrimet ose t'i fshini ato, ose mund ta bëni këtë:

SELECT Users.Link AS Emri i plotë, Përdoruesit.Data e lindjes, Përdoruesit.Roli PUT vtUsers FROM Directory.Users AS Users; ///////////////////////////////////////////////////////////////// ///////////////////////// ZGJIDHni tueUsers.Emri i plotë, tueUsers.Data e lindjes NGA tueUsers AS tueUsers GRUPI SIPAS tueUsers.emri i plotë, tueUsers . Data e lindjes; ///////////////////////////////////////////////////////////////// ///////////////////////// ZGJIDHni wUsers.Emri i plotë, wUsers.Roli FROM përdoruesit AS përdoruesit GRUPI BY Users.Emri i plotë, përdoruesit. Data e Lindja

tPackage = Kërkesë.ExecutePackage();

TP_Data e lindjes = tPaketa.Ngarko();
TP_Rolet = tPaketa.Shkarko();

Siç mund ta shohim, pyetja mund të ekzekutohet në një grup dhe rezultati mund të përpunohet si një grup. Në disa raste është shumë i përshtatshëm.

15. Kushtet në një kërkesë grupi

Për shembull, kemi një kërkesë grupi, ku fillimisht marrim fushat: “Emri, data e lindjes, kodi” nga direktoria “Përdoruesit” dhe duam të marrim regjistrime me kushtet për këto fusha nga direktoria “Individët”.

SELECT Users.Individual.Name AS Emri, Users.Individual.Data e lindjes AS Data e lindjes, Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; ///////////////////////////////////////////////////////////////// ////////////////////////// SELECT Individë Lidhja AS Individual FROM Directory Individët AS Individë

Ju mund të vendosni kushte si kjo:

WHERE Individuals.Code IN (SELECT vtUsers.Code FROM vtUsers) AND Individuals.Name IN (SELECT vtUsers.Code FROM vtUsers) DHE Individuals.BirthDate IN (SELECT vtUsers.DateBirth FROM tv)

Dhe ju mund ta bëni këtë si kjo:

WHERE (Individuals.Code, Individuals.Name, Individuals.Date of Birth) IN (ZGJIDHni tueUsers.Code, tueUsers.Name, tueUsers.Data e lindjes FROM tueUsers)

Për më tepër, është e nevojshme të ruani rendin.

16. Thirrja e ndërtuesit të pyetjeve për "kusht" në një kërkesë grupi

Kur është e nevojshme të vendosni një kusht, si në shembullin e mësipërm, mund të harroni se si thirret kjo apo ajo fushë në tabelën virtuale.
Për shembull, duhet të vendosni një kusht në fushën "Data e lindjes", dhe në tabelën virtuale kjo fushë quhet "Data e lindjes së debitorit", dhe nëse harroni emrin, do të duhet të dilni nga redaktimi i kushtit pa duke ruajtur dhe shikoni emrin e fushës. Për të shmangur këtë, mund të përdorni teknikën e mëposhtme.

Është e nevojshme të vendosni kllapa pas konstruksionit "B" dhe të lini një hapësirë ​​(hapësirë) boshe midis kllapave, zgjidhni këtë hapësirë ​​dhe thirrni konstruktorin e pyetjes. Projektuesi do të ketë akses në të gjitha tabelat e pyetjes së grupit. Teknika funksionon si në tabelat e regjistrave virtualë ashtu edhe në skedën "Kushtet". Në rastin e fundit, duhet të kontrolloni kutinë "P (kusht arbitrar)" dhe të futni modalitetin e redaktimit "F4".

Pyetjet shpesh bëheshin menjëherë dhe ato thjesht shërbejnë për të ilustruar "teknikat" që po shqyrtoja.

Doja të shikoja përdorimin e indekseve në pyetje, por kjo është një temë shumë e gjerë. Do ta vendos në një artikull të veçantë, ose do ta shtoj këtu më vonë.

upd1. Pikat 11,12
upd2. Pikat 13,14,15,16

Librat e përdorur:
Gjuha e pyetjes "1C: Enterprise 8" - E.Yu. Khrustaleva
Zhvillimi profesional në sistemin 1C: Enterprise 8."