Prilikom izrade upita, u jeziku 1c moguće je dobiti rezultat izvršavanja upita pomoću naredbe: "Postavi<ИмяВременнойТаблицы>“, Gdje<ИмяВременнойТаблицы>- naziv "privremene tabele", koji je svojstvo objekta "Upit" i objekat je tipa TemporaryTableManager, koji opisuje prostor imena privremenih tabela i odgovoran je za njihovo kreiranje i uništavanje u bazi podataka. Ovaj mehanizam se koristi za dobijanje posrednih podataka upita za dalju upotrebu u drugim upitima, što ih čini pogodnijim za njihovo otklanjanje grešaka, optimizaciju koda i povećanje čitljivosti upita.

Recimo da imate upit sa nekoliko privremenih tabela i morate da otklonite greške u sadržaju svake od njih. Obično se takvi zadaci rješavaju pomoću konzole za upite, ali ako to nije moguće (na primjer, liste vrijednosti, tabele itd. se prosljeđuju upitu), koristite metodu u nastavku.

Dodamo sljedeću funkciju našem modulu (funkcija servera, ako je ovo upravljana aplikacija):

Funkcija VT podaci (Upit, VT ime) Podaci tabele = Novi upit; DataTables. Text = "Odaberi * | Iz " + NameVT+ " |" ; ReturnTableData. Izvrši ( ) . Unload() ; EndFunction

Nazovimo ga nakon teksta zahtjeva, na primjer:

Zahtjev = Novi zahtjev; Zahtjev. Tekst = "SELECT |TZItotal.Name |PLACE Final |FROM |&TZItotal AS TZItotal |; |////////////////////////////// /////////////////////////////////// |SELECT |* |PLACE No. ////////////////////////////////////// // |SELECT |* |From |Final AS Ukupno |. LEFT JOIN Nom AS Nom |.; Zahtjev. TemporaryTableManager = novi TemporaryTableManager; Zahtjev. izvršiti ( ) ; Tabela = DataVT(Upit, "Konačno" ) ;

Sada varijabla Tablica sadrži privremenu tabelu Total, koja se može vidjeti u otklanjanju grešaka ili ispisati u dokument proračunske tablice.

Životni vijek

Kada se upit izvrši, platforma uništava sve privremene tabele koje su kreirane kao dio njegovog izvršavanja. Odnosno, životni vijek privremenih tablica kreiranih u okviru jednog zahtjeva s platforme 1C:Enterprise počinje od trenutka kreiranja tablice u zahtjevu i završava kada se izvrši.

U ovom slučaju, moguće je programski uništiti privremenu tablicu izvršavanjem instrukcije "DESTROY" u jednom od paketa upita<ИмяВременнойТаблицы>". Zatim platforma izvršava SQL naredbu "TRUNCATE" da uništi privremenu tablicu.

Kada koristite privremeni upravitelj tablica, ako tabele nisu eksplicitno uništene od strane programera (izjava upita "DESTROY", resetiranje privremenog upravitelja tablice na "Nedefinirano" ili korištenje metode "Close()"), tada ih platforma uništava samostalno nakon što je kontekst uništen u kojem su nastali. Drugim riječima, objekt će biti uništen kada se završi procedura ili funkcija u kojoj je kreiran.

Performance Impact

Korištenje privremenih tablica može značajno smanjiti opterećenje na SQL serveru ponovnim korištenjem prethodno generiranog uzorka iz tablice u drugim upitima. Naravno, kreiranje i pohranjivanje privremenih tabela zahtijeva dodatne resurse, ali u poređenju sa rasipanjem resursa na ponovljene upite prema tabelama, ova opcija je optimalnija.

Kreiranje privremenih tablica na temelju tablice vrijednosti može imati negativan utjecaj na performanse, jer prijenos tablice vrijednosti i popunjavanje privremene tablice na SQL serveru na osnovu nje može potrajati dugo i stvoriti dodatno opterećenje na sistemu. Ovu funkciju trebate koristiti samo ako budući upiti intenzivno koriste podatke iz tablice vrijednosti. Inače, optimalniji korak bi bio da se ova tablica programski obradi nakon izvršenja upita baze podataka. Tačan odgovor ovisi o konkretnom problemu.

Zaključak

Podrška za privremene tabele platforme 1C:Enterprise omogućava vam da pišete optimalnije upite bazi podataka, a sam tekst upita je takođe pojednostavljen i čitljiviji.

Najvažniji argument u korist upotrebe privremenih tabela je da njihova upotreba omogućava SQL serveru da izgradi optimalnije planove upita.

Zahtjevi dizajnirani su za izdvajanje i obradu informacija iz baze podataka kako bi ih pružili korisniku u potrebnom obliku. Obrada ovdje znači grupisanje polja, sortiranje redova, izračunavanje ukupnih vrijednosti, itd. Ne možete mijenjati podatke pomoću upita u 1C!

Zahtjev se izvršava prema datim uputama − tekst zahtjeva. Tekst zahtjeva je sastavljen u skladu sa sintaksom i pravilima jezik upita. Jezik upita 1C:Enterprise 8 baziran je na standardu SQL, ali ima neke razlike i proširenja.

Šema rada sa zahtjevom

Opća shema rada sa zahtjevom sastoji se od nekoliko uzastopnih faza:

  1. Kreiranje objekta Request i postavljanje teksta zahtjeva;
  2. Postavljanje parametara zahtjeva;
  3. Izvršavanje zahtjeva i dobivanje rezultata;
  4. Zaobilaženje rezultata zahtjeva i obrada primljenih podataka.

1. Objekt Zahtjev ima imovinu Tekst, kojoj trebate dodijeliti tekst zahtjeva.

// Opcija 1
Zahtjev = Novi zahtjev;
Zahtjev . Tekst =
„IZABIR
| Kursevi valuta. Period,
| Kursevi valuta. Valuta,
| Currency rates.Rate
|OD

|WHERE
;

// Opcija 2
Zahtjev = Novi zahtjev("IZABIR
| Kursevi valuta. Period,
| Kursevi valuta. Valuta,
| Currency rates.Rate
|OD
| Registar informacija. Kursevi kao kursevi valuta
|WHERE
| Tečaji valuta. Valuta = &Valuta");

2. Postavljanje vrijednosti parametara vrši se metodom SetParameter(< Имя>, < Значение>) . Parametri u tekstu zahtjeva su označeni simbolom “ & " i obično se koriste u uvjetima odabira (WHERE odjeljak) i u parametrima virtualne tablice.

Zahtjev);

3. Nakon dodjeljivanja teksta i postavljanja parametara, zahtjev se mora izvršiti i dobiti rezultat izvršenja. Izvršenje se izvodi metodom Execute() koja vraća objekat Rezultat upita. Iz rezultata upita možete:

  • dobiti izbor koristeći metodu Select (< ТипОбхода>, < Группировки>, < ГруппировкиДляЗначенийГруппировок>) ;
  • prenesite vrijednosti u tablicu vrijednosti ili stablo vrijednosti pomoću metode Upload (< ТипОбхода>) .

// Primite uzorak

Uzorak = Rezultat upita. Izaberi();

// Dobiti tablicu vrijednosti
RequestResult = Zahtjev. Pokreni();
Table = Rezultat upita. Istovariti();

4. Možete zaobići odabir rezultata upita koristeći petlju:

ćao Sample.Next() petlja
Izvještaj (Izbor. Kurs);
EndCycle;

Kompletan primjer rada sa zahtjevom može izgledati ovako:

// Faza 1. Kreiranje zahtjeva i postavljanje teksta zahtjeva
Zahtjev = Novi zahtjev;
Zahtjev . Tekst =
„IZABIR
| Kursevi valuta. Period,
| Kursevi valuta. Valuta,
| Currency rates.Rate
|OD
| Registar informacija. Kursevi kao kursevi valuta
|WHERE
| Tečaji valuta. Valuta = &Valuta";

// Faza 2. Postavljanje parametara
Zahtjev . SetParameter("Valuta" , Odabrana valuta);

// Faza 3. Izvršavanje upita i dobivanje uzorka
RequestResult = Zahtjev. Pokreni();
Uzorak = Rezultat upita. Izaberi();

// Prelazak selekcije
ćao Sample.Next() petlja
Izvještaj (Izbor. Kurs);
EndCycle;

Sastav teksta zahtjeva

Tekst zahtjeva sastoji se od nekoliko dijelova:

  1. Zahtjev za opis— lista polja i izvora podataka koji se mogu odabrati;
  2. Spajanje upita— izrazi “UJEDINITE” i “UJEDINITE SVE”;
  3. Organiziranje rezultata— izraz “ORDER BY...”;
  4. Auto-order— izraz “AUTO NARUČIVANJE”;
  5. Opis rezultata- izraz “REZULTATI ... DO...”.

Samo prvi dio je obavezan.

Privremene tabele i grupni upiti

1C jezik upita podržava upotrebu privremeni stolovi— tabele dobijene kao rezultat izvršavanja upita i pohranjene na privremenoj osnovi.

Često možete naići na situaciju u kojoj morate koristiti ne tablice baze podataka kao izvor upita, već rezultat izvršavanja drugog upita. Ovaj problem se može riješiti korištenjem ugniježđenih upita ili privremeni stolovi. Upotreba privremenih tabela omogućava vam da pojednostavite tekst složenog upita tako što ćete ga podijeliti na njegove sastavne dijelove, a također, u nekim slučajevima, ubrzati izvršenje upita i smanjiti broj zaključavanja. Za rad sa privremenim tabelama koristite objekat TimeTable Manager. Privremena tabela se kreira pomoću ključne riječi PLACE iza koje slijedi naziv privremene tablice.

ManagerVT = New TemporaryTablesManager;
Zahtjev = Novi zahtjev;
Zahtjev . ManagerTemporaryTables = ManagerVT;

Zahtjev . Tekst =
„IZABIR
| Currencies.Code,
| Currencies.Name
|Mesto u valutama
|OD
| Directory.Currencies AS Valute";

RequestResult = Zahtjev. Izvrši();

Da biste koristili privremenu tabelu VTVcurrency u drugim upitima, morate ovim upitima dodijeliti uobičajeni privremeni upravitelj tablice—VT Manager.

Batch zahtjev je zahtjev koji sadrži nekoliko zahtjeva odvojenih znakom “;”. Prilikom izvršavanja skupnog upita, svi upiti uključeni u njega se izvršavaju sekvencijalno, a rezultati svih privremenih tabela dostupni su svim narednim upitima. Eksplicitno dodjeljivanje privremenog upravitelja tablice grupnim upitima nije potrebno. Ako nije dodijeljen privremeni upravitelj tablice, tada će sve privremene tablice biti izbrisane odmah nakon što se upit izvrši.

Za grupne upite dostupna je metoda ExecuteBatch(), koja izvršava sve upite i vraća niz rezultata. Privremene tabele u grupnom upitu će biti predstavljene tabelom sa jednim redom i jednom kolonom „Broj“, koja pohranjuje broj zapisa. Za otklanjanje grešaka u paketnim zahtjevima možete koristiti metodu Izvrši seriju SA MEĐUNARODNIM PODATKAMA() : Vraća stvarni sadržaj privremenih tabela, a ne broj zapisa.

// Primjer rada sa batch zahtjevom
Zahtjev = Novi zahtjev;
Zahtjev . Tekst =
„IZABIR
| Currencies.Name
|OD
| Directory.Currenci AS Valute
|;
|ODABIR
| Nomenklatura.Naziv
|OD
| Imenik Nomenklatura AS.;

BatchResult = Zahtjev. ExecuteBatch();

TZCurrencies =Paketni rezultat[ 0 ]. Unload();
TZNomenklatura = Rezultat paketa[ 1 ]. Unload();

// Primjer korištenja privremenih tablica u paketnom zahtjevu
Zahtjev = Novi zahtjev;
Zahtjev . Tekst =
„IZABIR
| Proizvodi Link KAKO PROIZVODITI
|PLACE WTT Products
|OD
| Imenik.Nomenklatura AS Proizvodi
|WHERE
| Proizvodi.Proizvođač = &Proizvođač
|;
|ODABIR
| VTTProducts.Product,
| Stručna škola Količina,
| stručna škola.Cijena,
| Stručna škola. Link AS Document Receipts
|OD
| VT proizvodi AS VT proizvodi
| LIJEVI PRIKLJUČAK Dokument o prijemu robe i usluga
| Softver VTProducts.Product = PTU.Nomenclature"
;

Zahtjev . SetParameter( "Proizvođač", Proizvođač);

RequestResult = Zahtjev. Pokreni();
Uzorak = Rezultat upita. Izaberi();

ćao Sample.Next() petlja

EndCycle;

Virtuelni stolovi

Virtuelni stolovi- to su tabele koje nisu pohranjene u bazi podataka, već ih generira platforma. U svojoj srži, ovo su ugniježđeni upiti prema jednoj ili više fizičkih tablica koje izvršava platforma. Virtuelne tabele primaju informacije samo iz registara i uglavnom su namenjene za rešavanje visoko specijalizovanih problema.

Postoje sljedeće virtualne tabele (mogući parametri su navedeni u zagradama):

  • Za registre informacija:
    • SliceFirst(<Период>, <Условие>) — najraniji zapisi za navedeni datum;
    • SliceLast(<Период>, <Условие>) — najnoviji podaci za navedeni datum;
  • Za registre akumulacije:
    • ostaci(<Период>, <Условие>) — stanja na navedeni datum;
    • Revolucije(<НачалоПериода>, <КонецПериода>, <Периодичность>, <Условие>) - Period transakcije;
    • ostaci i obrt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <Условие>) — stanja i promet za period;
  • Za računovodstvene registre:
    • ostaci(<Период>, <УсловиеСчета>, <Субконто>, <Условие>) — stanja na navedeni datum po kontu, dimenzijama i podračunima;
    • Revolucije(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчета>, <Субконто>, <Условие>, <УсловиеКорСчета>, <КорСубконто>) — promet za period u kontekstu računa, mjerenja, ispr. računi, subconto, kor. subconto;
    • ostaci i obrt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <МетодДополненияПериодов>, <УсловиеСчета>, <Субконто>, <Условие>) — stanja i promet u kontekstu računa, mjerenja i podračuna;
    • prometDtKt(<НачалоПериода>, <КонецПериода>, <Периодичность>, <УсловиеСчетаДт>, <СубконтоДт>, <УсловиеСчетаКт>, <СубконтоКт>, <Условие>) — promet za period po kontu Dt, računu Kt, Subconto Dt, Subconto Kt;
    • Pokreti Subconto(<НачалоПериода>, <КонецПериода>, <Условие>, <Порядок>, <Первые>) — pokreti zajedno sa podkonto vrijednostima;
  • Za računske registre:
    • baza(<ИзмеренияОсновногоРегистра>, <ИзмеренияБазовогоРегистра>, <Разрезы>, <Условие>) — osnovni podaci registra obračuna;
    • DataGraphics(<Условие>)—grafski podaci;
    • Stvarni period akcije(<Условие>) je stvarni period važenja.

Kada radite sa virtuelnim tabelama, trebalo bi da primenite selekcije u parametrima virtuelnih tabela, a ne u uslovu WHERE. Vrijeme izvršenja upita uvelike ovisi o tome.

Konstruktor upita

Da bi se ubrzao unos teksta upita, platforma ima posebne alate: Konstruktor upita I Konstruktor upita s obradom rezultata. Da pozovete konstruktore, potrebno je da kliknete desnim tasterom miša i izaberete potrebnu stavku:

Konstruktori se takođe mogu pozvati iz glavnog menija Tekst.

Koristeći graditelj upita, programer može interaktivno konstruirati tekst upita. Da biste to učinili, odaberite potrebne tabele i polja pomoću miša, uspostavite odnose, grupisanje, zbrojeve itd. Ovaj pristup štedi vrijeme i eliminiše moguće greške. Kao rezultat svog rada, konstruktor upita generiše tekst upita.

Konstruktor upita sa obradom rezultata, pored generisanja teksta upita, kreira gotov fragment koda za primanje i obradu podataka.

RequestSchema objekat

Platforma vam omogućava da programski kreirate i uredite tekst zahtjeva pomoću objekta Request Schema. Objekt ima jedno svojstvo Grupa zahtjeva, u kojem objekt pohranjuje svojstva svih upita koji se trenutno uređuju. Objekt RequestSchema podržava sljedeće metode:

  • SetQueryText(< Текст>) — popunjava svojstvo Query Packet na osnovu poslatog teksta zahteva;
  • GetQueryText() - vraća tekst zahtjeva generiran na osnovu svojstva Paket zahtjeva;
  • FindParameters() - vraća parametre zahtjeva.

Pogledajmo primjer rada s RequestSchema objektom. Za programski generiranje teksta zahtjeva

SORT BY
Currencies.Code

Kod ugrađenog jezika može izgledati ovako:

RequestScheme = Nova shema zahtjeva;
Paket 1 = Shema zahtjeva. RequestBatch[ 0 ];
Operator1 = Paket1. Operatori[ 0 ];
// dodavanje izvora
Tabela registra = Operator1. Izvori. Dodati( "Directory.Currencies", "Valute" );
// dodavanje polja
FieldLink = Operator1. SelectableFields. Add("Currenci.Link" , 0 );
FieldCode = Operator1. SelectableFields. Dodaj("Currenci.Code", 1);
// specificiranje alijasa polja
Paket 1 . Kolone[ 0 ]. Alias ​​= "Valuta" ;
Paket 1 . Kolone[ 1 ]. Alias ​​= "Šifra" ;
// dodavanje uslova
Operator1 . Odabir. Dodati( "NE brisanje zastavice");
// dodaj poredak
Paket 1 . Red. Dodaj (kod polja);
RequestText = Shema zahtjeva. GetQueryText();

Zdravo svima! Ili bolje rečeno, onima koji i dalje ponekad pogledaju ovaj blog :)

Nakon dosta dugog odsustva zbog punog radnog vremena, konačno sam odlučila da napišem još jedan post.

Nedavno sam saznao da neki ljudi ne znaju da platforma 1C 8.3 ima ugrađen alat za otklanjanje grešaka u privremenim tabelama. Pojavio se relativno nedavno, u jednom od izdanja 1C 8.3.8 - "Da dobijem podatke"() primijenjeno na Privremenom upravitelju tablica.

U međuvremenu, ovaj alat uvelike olakšava mogućnost proučavanja problema, na primjer, prilikom analize tipičnih mehanizama.

Sve je prilično jednostavno.

1. Nabavite privremene tabele upita

Kada koristimo otklanjanje grešaka, prvo izračunamo listu privremenih tabela, Query.TemporaryTableManager.Tables. Na ovaj način možemo dobiti listu tabela generiranih upitom koji se izvršava:

2. Nabavite privremenu tablicu za otklanjanje grešaka

Zatim pristupamo privremenoj tabeli koja nam je potrebna za otklanjanje grešaka dodavanjem Get(<Индекс таблицы>)

3. Podatke primamo direktno

Korišćenje metode GetData() omogućava vam da dobijete kolekciju rezultata upita direktno za izabranu privremenu tabelu.

U slučaju direktnog otklanjanja grešaka u tabeli sa indeksom 0 (kao što znate, indeksi i numerisanje u 1C počinju od nule), podaci se dobijaju izračunavanjem sledeće linije:

Query.TemporaryTableManager.Tables.Get(0).GetData().Unload()

Otklanjanje grešaka na ovaj način trajat će manje vremena nego korištenjem različitih "štaka" 😀

To je sve, sretan razvoj događaja i srećni praznici!

PS. A za one koji podržavaju obračun plaća u preduzeću (ne samo programere), podsjećam da je za ovu temu izdvojen poseban resurs Pro-Zup.info.

Ako imate pitanja na ovu temu, zainteresirani ste za proširenje mogućnosti standardnog programa ili imate prijedloge za rješavanje problema, dobrodošli na resurs https://pro-zup.info/

Mehanizam upita, koji se pojavio u verziji 7 programa 1C, postajao je sve rašireniji i stalno rastao u popularnosti s izdavanjem prvih verzija platforme 8. Pojava upravljanih obrazaca i sistema za sastav podataka značajno je povećala opseg ovog alata. Međutim, mnogim programerima početnicima je prilično teško to savladati.

Korištenje objekta koji se zove "Privremeni upravitelj tablica" omogućava vam da:

  • Značajno pojednostaviti tekst zahtjeva;
  • Rastavite ga na jednostavnije blokove;
  • Povećajte njegovu čitljivost i strukturu.

Nekoliko riječi o tome kako funkcionira

U principu, rad privremenog upravitelja stola može se podijeliti u četiri faze korištenja:

  1. Kreiranje menadžera;
  2. Ispunjavanje;
  3. Čitanje podataka iz tablica;
  4. Uništavanje menadžera i čišćenje stolova.

Razgovarajmo o svakoj fazi detaljnije.

Kreiranje privremenog upravitelja tablica

Da biste definisali ovaj objekat, potrebno je da izvršite kod prikazan na slici 1

Ovdje treba napomenuti da je definicija privremenog upravitelja tablice data prije Execute() operatora, u suprotnom je izvršenje koda zagarantovano prekinuto greškom, čiji je informativni prozor prikazan na slici 2.

Fig.2

Popunjavanje menadžera

Na istoj slici 1 nalazi se linija koja prenosi selekciju u privremenu tabelu. Počinje operatorom “Place”. Odredište je naziv odredišne ​​tablice.

Koristeći “Query Builder”, ovaj red se može kreirati na kartici “Advanced” Slika 3.

Fig.3

Da biste to uradili potrebno vam je:

  1. Postavite prekidač “Vrsta upita” na poziciju “Kreiraj privremenu tabelu”;
  2. Odredite naziv prijemnika.

Ako koristite program za otklanjanje grešaka da provjerite sekvencu popunjavanja menadžera, otkrit ćete da će se podaci pojaviti u njemu tek nakon što se izvrši metoda zahtjeva Execute().

Možete odrediti koliko je pun menadžer koristeći operator Quantity(). Primjer linije: MVT.Tables.Quantity().

Čitanje tabela menadžera

Sljedeći korak je čitanje podataka iz postojećih tabela u drugom upitu. Ovdje postoji jedan problem: novi upit koji se kreira ne zna za postojanje popunjene tabele, tako da se neće pojaviti u prozoru „Baza podataka“ konzole.

Mora se registrovati i kreirati ručno.

Da biste to učinili, na kartici "Tabele i polja" (slika 4) morate izvršiti određeni slijed radnji:

Fig.4

  1. U meniju prozora „Tabele“ ove kartice kliknite na dugme „Kreiraj privremeni opis tabele“;
  2. U prozoru koji se otvori morate navesti naziv polja i njegov opis (tip polja), kako je navedeno u postojećoj tabeli;
  3. Potrebna polja ili funkcije s njima moraju se premjestiti u treći prozor kartice.

Tokom čitavog vremena izvršavanja, privremene tabele se pohranjuju u RAM računara korisnika kada radi u fajl modu ili začepljuju memoriju servera u režimu klijent-server dok funkcija ili procedura koja je pozvala menadžera ne bude potpuno završena. Velike količine podataka mogu značajno smanjiti performanse čak i najslabijeg hardvera.

Uklanjanje stolova

Općenito, iskusni stručnjaci, kako ne bi previše začepili memoriju, preporučuju brisanje privremenih tablica odmah nakon njihove upotrebe, ako ih nigdje drugdje neće pozvati.

Uklanjanje tabela iz upravitelja može se obaviti na dva glavna načina:

  • Navođenjem ključne riječi Destroy direktno u tekstu zahtjeva;
  • Korišćenje metode Close() primenjeno direktno na menadžera.

U drugom slučaju, sve tabele kreirane različitim upitima biće nasilno uništene.

Upotreba prve opcije za brisanje podataka može se eksplicitno specificirati pisanjem reda kao što je “Destroy TableName” u tekstu upita, ili korištenjem kartice “Advanced” (slika 2) prozora “Query Designer”.

Prebacivanjem prekidača u položaj “Destruction” i navođenjem imena objekta koji treba obrisati, ovu radnju možete dovršiti bez ikakvih problema.

Transfer (TK) na zahtjev

Jedna od najčešćih upotreba ovog menadžera je prosljeđivanje tablice vrijednosti kao jednog od izvora podataka upitu. Kao što znate, direktna upotreba ove kolekcije u zahtjevu u 1C nije predviđena.

Da biste to učinili, tekst zahtjeva mora sadržavati red kao što je “Select * Place MVT from &Tz As Tab”. Pronošenjem postojeće tablice vrijednosti kao parametra “TZ” zahtjevu, dobićemo objekat pogodan za dalju obradu u drugim zahtjevima.

Jedini uvjet koji sprječava prosljeđivanje TK-a kao parametra su implicitno deklarirani tipovi njegovih stupaca. Odnosno, kada kreirate TK stupce, trebate popuniti drugi parametar linijom poput “New TypeDescription(“”)).

Postoje situacije kada je potrebno kombinirati nekoliko upita u jednom upitu, a spajanje tablica ne može pomoći u tome. Najlakši način da to pokažete je primjerom.

Pretpostavimo da su u našem sistemu činjenice o kupovini i prodaji robe evidentirane dokumentima Prihodi i Rashodi, respektivno. Druga strana može biti ili kupac ili dobavljač. Dug se može prebiti isporukom robe:

Da biste izračunali ukupan dug druge ugovorne strane, potrebno je da saberete zbir svih troškova za ovu drugu stranu i oduzmete zbir svih primanja od iste druge ugovorne strane.

Request.Text =
"
//izračunajte iznos koji smo isporučili izvođačima
|ODABIR
| Expense.Counterparty,
|OD
| Document.Expense AS Troškovi
|GROUP BY
| Expense.Counterparty
|. KOMBINIRAJ SVE
//izračunati iznos ugovornih strana
//isporučila nam robu
|ODABIR
| Parish.
//uzmite iznos sa negativnim predznakom,
//da je kada se kombinuje odbijen od iznosa rashoda
| SUM(-Priznanica.Iznos)
|OD
| Dokument Arrival AS Arrival
|GROUP BY
| Arrival.Counterparty";

U prvom zahtjevu izračunavamo iznos troškova za svaku drugu stranu, u drugom - iznos za koji nam je svaka druga strana isporučila robu. Iznos u drugom zahtjevu uzima se sa predznakom minus, tako da se, kada se rezultujuća tabela skupi, oduzima od iznosa pošiljke ovoj suprotnoj strani. Kao rezultat, dobijamo tabelu poput:

Nije baš ono što smo hteli, ali je blizu. Da bi se postigao traženi rezultat, ostaje samo da se grupiše po ugovornoj strani. Da biste to učinili, upit se mora postaviti u privremenu tabelu (o radu s privremenim tabelama govori se u zatvoreni dio kursa ) i odaberite i grupirajte polja iz njega:

Zahtjev = Novi zahtjev;
Request.Text =
„IZABIR
| Expense.Counterparty,
| AMOUNT(Iznos.Iznos) AS Dug
|Postavite VT_Incoming Expense
|OD
| Document.Expense AS Troškovi
|GROUP BY
| Expense.Counterparty
|. KOMBINIRAJ SVE
|ODABIR
| Parish.
| SUM(-Priznanica.Iznos)
|OD
| Dokument Arrival AS Arrival
|GROUP BY
| Parish.Counterparty
|;
|////////////////////////////////////////////////////////////////////////////////
|ODABIR
| VT_Dolazni trošak.
| SUM(VT_IncomeExpenditure.Dug) AS Dug
|OD
| VT_IncomingConsumption AS VT_IncomingConsumption
|GROUP BY
| VT_Dolazni trošak.

Zahtjevi za spajanje upita

Kada se spajaju dva upita, broj polja mora biti isti, ako nekom od upita nedostaju polja, onda se moraju dodati kao konstante. Pogledajmo gornji primjer, neka troškovni dokument ima i polje popusta koje smanjuje iznos duga druge ugovorne strane, ali u dokumentu o prijemu nema popusta. Kako biti u ovom slučaju? dakle:

Zahtjev = Novi zahtjev;
Request.Text =
„IZABIR
| Expense.Counterparty,

|OD
| Document.Expense AS Troškovi
|GROUP BY
| Expense.Counterparty
|. KOMBINIRAJ SVE
|ODABIR
| Parish.
| SUM(-Priznanica.Iznos),
//dodavanje popusta nultom polju
| 0
|OD
| Dokument Arrival AS Arrival
|GROUP BY
| Arrival.Counterparty";

Ostaje samo da se oduzme popust i grupa.

Redosled je takođe važan. Polja će biti spojena tačno onim redom kojim su navedena u SELECT sekcijama oba upita. U odnosu na prethodni primjer, zamijenimo polja popusta i iznosa u uzorku računa:

Zahtjev = Novi zahtjev;
Request.Text =
„IZABIR
| Expense.Counterparty,
| AMOUNT(Iznos.Iznos) AS Dug,
| AMOUNT(Expense.Discount) AS Popust
|OD
| Document.Expense AS Troškovi
|GROUP BY
| Expense.Counterparty
|. KOMBINIRAJ SVE
|ODABIR
| Parish.
//zamijeni mjesta
| 0,
| SUM(-Priznanica.Iznos)
|OD
| Dokument Arrival AS Arrival
|GROUP BY
| Arrival.Counterparty";


Zatvori