Fysiska datamodeller (intern nivå). Skapa och använda standarder, begränsningar och regler med T-SQL Värdet som motsvarar nyckeln är inte inställt

Vad handlar den här artikeln om

Den här artikeln fortsätter artikelserien "Första stegen i utvecklingen på 1C". Den diskuterar principerna för att arbeta med generiska samlingar. Efter att ha läst artikeln kommer du att veta:

  • Vad är generiska samlingar, när och i vilka fall ska de användas?
  • Vad har alla universella samlingar gemensamt? Vilka tekniker kan användas för att arbeta med dem alla?
  • Vad är en array, hur och när ska den användas? Vilka metoder har han?
  • Varför använda en struktur? Hur skiljer den sig från en array?
  • När ska man använda en värdelista? Hur visar man det på formuläret?
  • Överensstämmelse - vad är det och när ska det användas? Vilka är fördelarna med strukturen?
  • Vad används en värdetabell till? Hur ska man beskriva dess struktur? Hur lägger man till/tar bort rader? Hur får man det till formuläret?
  • Värdeträd - vad används det till? Hur fyller man i och visar formuläret? Hur arbetar man med honom?

Tillämplighet

Artikeln diskuterar 1C:Enterprise 8.3-plattformen i den nuvarande utgåvan.

Hur man arbetar med universella samlingar i 1C

En samling av värden är en sorts behållare som vanligtvis kan innehålla hur många element som helst. Samtidigt finns det ofta inga strikta begränsningar för datatypen.

Du kan lägga till värden till en generisk samling. Alla värden i samlingen kan passeras. Dessa samlingar används främst för någon form av bearbetning i algoritmer. De där. dessa är några dynamiska strukturer som existerar under hela algoritmen.

Det är viktigt att förstå att samlingar inte lagras i databasen (vi pratar inte om datatypen Value Store, som kan lagra nästan vilken datatyp som helst).

Existera olika sorter generiska samlingar: Array, Structure, Mapping, Fixed Array, Value Table, tabelldel etc. Men alla samlingar har liknande beteende.

En samling kan skapas som ett resultat av någon funktion (funktionen returnerar en generisk samling som ett värde).

Tillgängligt ny kollektion manuellt genom att anropa konstruktorn och skapa en instans av klassen.

Till exempel: OurArray = New Array;

Konstruktörer för många generiska samlingar parametriseras.

Så, i konstruktören för du kan ange antalet element i motsvarande dimensioner. De där. du kan omedelbart förklara flerdimensionell .

Motsvarande beskrivning av konstruktorn finns i syntaxhjälpen.

Med hjälp av konstruktorparametrar kan du alltså omedelbart ställa in det önskade beteendet för detta objekt.

Men parametrarna är valfria, utvecklaren kan inte ställa in dem och ytterligare definiera Arrayens beteende som han finner lämpligt.

Nästan vilken generisk samling som helst kan skapas med en konstruktor (med undantag för tabelldelar, som fungerar som konfigurationsobjekt).

För generiska samlingar finns det allmänna begrepp som index och nummer. Varje element i samlingen har ett index. Indexet börjar från noll.

För att komma åt ett element OurArray, du kan använda indexåtkomst, för detta anges indexet inom hakparenteser.

Till exempel, OurArray. Observera att i detta fall returnerar systemet elementet i Arrayen vid index 3, och i ordning är detta det fjärde elementet i Arrayen.

För vissa samlingar finns också konceptet med ett radnummer. Radnumret börjar med ett. Till exempel, för en tabellsektion finns en sådan egenskap som ett radnummer. Det är viktigt att tänka på att om vi känner till radnumret och vill komma åt via index, så ska värdet ett mindre än radnumret användas som index.

Konceptet med ett radnummer finns inte för alla samlingar, utan främst för de som kan visas i användargränssnittet.

För alla samlingar används genomgång av samlingens element. Bypass är möjligt på två sätt: cykla för och cykel för varje.

För de flesta generiska samlingar gäller följande metoder: Räkna, Index, Lägg till, Infoga, Ta bort och Sök.

Count är en funktion som returnerar antalet element i en samling. Den kan användas före slingan För, som visas i figuren.

Indexmetoden finns inte för alla samlingar, utan endast för de vars element kan refereras. Ett exempel är Värdetabell.

Värdetabellär en specifik samling strängar, strängarna kan innehålla olika kolumner med olika typer värden.

Varje rad är en oberoende enhet. Du kan få en länk till det, genom den här raden kan du komma åt värdena för kolumnerna på den här raden.

Indexmetoden låter dig bestämma vilket index som motsvarar en given rad (det vill säga den aktuella positionen för raden i tabellen). Indexvärden börjar på noll.

Metoder för att lägga till nya värden till denna samling finns i nästan alla universell samling. Figuren visar hur man fyller en Array med värden från 0 till 10 på två sätt.

För att lägga till ett element i en Array kan vi använda metoden Lägg till, ange mervärdet inom parentes. I detta fall kommer värdet att läggas till i slutet av listan, dvs. Arrayen kommer ständigt att öka på grund av den sista positionen.

En annan metod som låter dig lägga till värden till en samling är metoden Föra in. Det skiljer sig från metoden Lägg till så att du kan ange var det tillagda elementet ska infogas.

Syntax: Föra in (,)

Den första parametern anger indexet i vilket det nya värdet ska infogas. De där. vi kan till exempel ange att varje värde ska infogas i början av listan (det andra sättet i figuren ovan).

Metoden används för att ta bort element från en samling. Radera. I metoden Delete indikeras det med index vilket element vi ska ta bort.

Syntax: Radera()
Användningsexempel: OurArray.Delete(5);

Det bör noteras att för de samlingar där strängar representerar en oberoende enhet (till exempel för Tabellvärden), kan vi också använda get index-metoden för att ta bort den givna raden senare.

Nästan alla samlingar har en metod för att hitta ett värde - Hitta. Metoden passerar det värde som vi vill hitta. I vissa samlingar kan du lägga vilka begränsningar som helst.

Till exempel i Värdetabell du kan ange de raderna, de kolumner som du vill söka i.

Om värdet hittas returnerar den här metoden indexet eller en specifik sträng. Om inget värde hittas returneras ett värde av typen. Odefinierad. När den tillämpas på en array, returneras Index, eller värdet Odefinierad.

Användningsexempel: OurVariable = OurArray.Find(8);

Generiska samlingar kan saneras mycket snabbt, d.v.s. ta bort absolut alla element. För detta används metoden klar(), som tar bort elementen i en Array, strängar Tabellvärden, eller data från andra samlingar.

Ytterligare metoder för Array

Metod Bboundary() returnerar antalet element minus ett. De där. om vi använder en slinga För, då istället för Kvantitetsmetoden kan vi omedelbart använda metoden Gränsen().

I synnerhet kunde variabeln NumberInArray ha definierats annorlunda:

NumberInArray = OurArray.InBorder();
Då, när man beskriver själva cykeln, bör man inte subtraheras från denna variabel.

Med Set-metoden kan du tilldela ett värde till ett Array-element efter index.

Syntax: Installera(,)

Exempel: OurArray.Set(2,8);

Alternativt alternativ: OurArray = 8;

Du kan använda metoden för en Array Skaffa sig, för att läsa värdet vid index utan att använda hakparenteser.

Syntax: Skaffa sig()

Exempel: OurVariable = OurArray.Get(2);

Alternativt alternativ: OurVariable = OurArray;

Universell samlingsstruktur

En struktur, som en Array, kan ha ett obegränsat antal element, men innehållet i ett element skiljer sig från en Array.

Strukturen är en samling, vars värde består av ett par. Det första elementet i ett par kallas Nyckel. Det andra elementet i paret är Menande.

Nyckelär en strikt strängdatatyp som beskriver ett värde. Till exempel, nyckel-"Kod" kan motsvara värdet 113; nyckel-"Namn" betyder "Vasya". Det finns ingen datatypsbegränsning på själva värdet.

Strukturen är mycket bekväm att använda om vi vill skapa en lista med parametrar. Om det här Strukturera kallad Vår struktur, då kommer vi att hänvisa till dess två värden enligt följande: OurStructure.Code och OurStructure.Name.

En sådan överklagande är mycket bekvämare än om vi definierade alla parametrar i en Array och nådde dem via index.

Strukturen gör programkoden läsbar (förståelig). Strukturen används ganska ofta, mycket oftare än Arrayen.

Den används för att beskriva vissa parametrar, som ofta är ganska stora i alla algoritmer.

Dessutom används strukturen om proceduren och funktionen innehåller ett stort antal godkända parametrar.

Då är det mycket bekvämare att skriva in alla parametrar i strukturen och skicka det vidare. De där. det finns en "packning" av parametrar för procedurer och funktioner.

Separat bör det noteras att som nyckel- absolut inte vilken sträng som helst kan visas i strukturen. Vissa restriktioner gäller.

Nyckel bör fungera som en identifierare. Det betyder att i nyckel- det får inte finnas några mellanslag och det får inte börja med ett nummer.

Tillåten start nyckel- med en bokstav eller understreck. På det här sättet, Nyckel måste uppfylla kraven för att skapa identifierare.

Låt oss notera hur strukturen skiljer sig från Arrayen. Strukturen har en metod Föra in, Array har två sätt att infogas: Föra in(till en viss position) och Lägg till(i slutet av listan). I en Array är alla element ordnade.

En struktur är en sorts oordnad uppsättning. Det är därför det bara finns en insättningsmetod för en struktur.

Värdet infogas inte vid en specifik position, utan i den angivna uppsättningen. En struktur kan inte refereras av index som andra generiska samlingar.

Elementen i strukturen refereras endast till med nyckelns namn. För varje av-loop fungerar dock också för strukturen, men du bör inte förlita dig på ordningen på elementen i strukturen.

En struktur skapas på samma sätt som andra generiska samlingar genom att använda New constructor, som anger datatypen för struktur.

Liksom en Array kan en Structs konstruktor ha parametrar. De där. det är möjligt att beskriva innehållet i själva strukturen med hjälp av en konstruktor.

Till skillnad från en Array, där du helt enkelt kan ange antalet element för alla dimensioner, är det i en Structure möjligt att ställa in själva innehållet.

Till exempel: OurStructure = New Structure("Kod,Namn", 133, "Vasya");

Först listas namnen på nycklarna separerade med kommatecken och sedan, i samma sekvens, parametrarnas värden.

För att lägga till ett nytt värde till strukturen finns det en metod Föra in, som infogar ett nytt par (nyckel och värde).

Till exempel: OurStructure.Insert("Familjemedlemmar",3);

Strukturen kännetecknas av en annan metod som används ganska ofta. Detta är metoden Fast egendom.

Med den här metoden kan du förstå om det finns ett sådant element i den här strukturen, för vilket nyckeln har ett sådant och ett sådant namn.

Om ett sådant element finns kommer systemet att returnera True, annars returnerar det False.

Till exempel uttrycket OurStructure.Property ("familjemedlemmar") kommer att vara lika med True. Denna metod används ganska ofta i analysen av strukturen.

Som för alla universella samlingar är det tillåtet att få tillgång till strukturens egenskaper efter index. Men indexet för strukturen är ett strängvärde.

Till exempel: Report(OurStructure["Familjemedlemmar"]);

Man bör dock inte glömma att en struktur inte är en ordnad uppsättning objekt, varför åtkomst med index 0, 1, 2 är oacceptabel.

Generisk samlingslista över värden

Lista över värdenär en linjär lista över element av valfri datatyp.

Varje element består av flera värden. Schematiskt kan en värdelista representeras som en lista med fyra kolumner.

Första kolumnen - märke. Den har en boolesk datatyp och låter användaren antingen markera rutorna eller avmarkera dem.

Den andra kolumnen är en bild som på något sätt visuellt kan avbilda detta element, d.v.s. matcha denna linje med vilken bild som helst.

Den tredje kolumnen är själva det lagrade värdet, dvs. detta är vilken datatyp som helst och den kan vara olika i olika rader.

Den fjärde kolumnen är vyn, d.v.s. det är en strängbeskrivning av det givna värdet. Vyn kommer att visas för användaren när han tittar på detta element. I det här fallet, om vyn inte är inställd, kommer systemet att försöka få vyer för elementet som finns i denna position.

Lista över värden- detta är objektet som användaren visuellt kan arbeta med. De där. Lista över värden kan visas på formuläret.

Användaren kan utföra vissa åtgärder med den. Förutom, Lista över värden kan härledas oberoende med hjälp av metoder, dvs. visas på skärmen i någon gren av algoritmen (förutom serverkod) så att användaren väljer en rad eller markerar några rutor.

Låt oss hitta Lista över värden i sitax-hjälpare. Konstruktör Lista över värden inte parametrerad (inga standardvärden kan ställas in).

Det finns metoder som:

  • Föra in(,) ;
  • Lägg till(,);
  • Kvantitet();
  • Index().

Det finns också speciella metoder, t.ex. UnloadValues(). Detta skapar en Array till vilken värdelistan kopieras. Till exempel:

ArrayElements = ListPriceTypes.UnloadValues();

Det finns också en omvänd metod:
PriceTypeList.LoadValues(ElementsArray);

Det finns sökmetoder:
FindByValue(); FindByIdentifier().

Det finns en kopieringsmetod:
CopyList = ListPriceTypes.Copy();
Den här metodenär avsedd att göra någon form av modifiering med en kopia.

Det finns metoder:
SortByValue();
SortByView().

Metoder Välj föremål(,) och MarkItems() anropa en modal dialogruta som stoppar exekveringen av algoritmen tills användaren stänger detta fönster.

För att använda dessa metoder i konfigurationsegenskaper Modalitetsanvändningsläge måste ställas in på Använda sig av.

Exempelkod anropad från en hanterad applikationsmodul:

Visa denna kod i användarläge (modal dialogruta).

Nedan Lista över värden används som tillgänglig datatyp för formulärattributet. Vi skapar ett nytt attribut för bearbetningsformuläret, bestämmer typen för det Lista över värden och visa det på formuläret.

Vi skapar nytt lag Butiksgåvor, överför det till formuläret och definiera en åtgärdshanterare för det.

I användarläge, när du klickar på knappen Fyll i gåvor i bearbetningsformuläret, visas en komplett lista.

Om så önskas kan listan redigeras: lägg till några element, ta bort några.

Universal Collection Compliance

Denna samling är väldigt lik Strukturera. Precis som en struktur är en matchning en uppsättning värden som består av en nyckel och själva värdet.

Den största skillnaden är att vilken datatyp som helst kan anges som en nyckel, såväl som för ett värde. Med tanke på denna funktion är det nödvändigt att komma åt matchningsvärdet per index, nyckelvärdet anges som indexvärdet.

Nyckeln kan vara en annan datatyp än en sträng. Egenskaperna och metoderna för att arbeta med Matchning är nästan desamma som strukturens.

Matchkonstruktören, till skillnad från en struktur, innehåller inte möjligheten att ange parametrar.

Användningsexempel:

Korrespondens är användbar när det är nödvändigt att länka vilka två strukturer som helst. Till exempel måste varje rad i tabelldelen matchas med en rad från värdetabellen.
I detta fall används raden i tabellsektionen som matchningsnyckel och motsvarande värde anges.

När du infogar element i en Match-samling annat än metoden Föra in(,) Det finns ett annat sätt att infoga ett värde, och det är att använda den normala tilldelningsoperatorn.

Till exempel: OurMatch = Ny match;
Match = 999;

De där. om elementet inte fanns i samlingen kommer det att läggas till med tilldelningsoperatorn, och om det finns kommer det att uppdateras.

Detta skiljer sig från struktur.

Generisk samlingsvärdetabell

Värdetabellär en tabell med ett godtyckligt antal rader och ett godtyckligt antal kolumner. En korsning kan lagra värden av vilken datatyp som helst. Vid behov kan kolumner skrivas in, d.v.s. bestämma i vilken kolumn vilken typ av data som lagras.

Du kan lämna kolumnerna oskrivna, sedan kan samma kolumn i olika rader lagra värden av olika typer.

Skillnader Tabellvärden från en 2D-array:

  • detta är ett objekt som användaren kan arbeta med (värdetabellen kan visas på skärmen, användaren kan fylla i den, i framtiden kan de inmatade uppgifterna läsas);
  • bygga index för snabb sökning;
  • kloning, fylla hela kolumnen med ett visst värde, tömma alla kolumner i en array.

Värdetabell används som en slags buffert för att lagra information. Värdetabell returneras och accepteras som en parameter av många av systemets metoder. Det är möjligt att bygga en fråga till värdetabellen.

Så, Värdetabell består av en uppsättning rader och en uppsättning kolumner. Både rader och kolumner är samlingar.

De där. inne i samlingen Värdetabell det finns ytterligare två samlingar. Låt oss vända oss till syntaxassistenten och hitta Värdetabell.

Datatyper som stöds: sig själv Värdetabell, som består av strängar. Varje rad representeras av en datatyp RowTableValues, som har sina egna egenskaper och metoder. Tillgängligt CollectionColumns Tabellvärden har också vissa egenskaper.

Viktig poäng! Proceduren som genererar Värdetabell, bör kompilera & OnServer.

Innan du börjar arbeta med Värdetabell måste du bestämma vilka kolumner den ska innehålla (dvs skapa dem). Syntax:

Lägg till(,)
(frivillig)
Typ: Sträng.
(frivillig)
Typ: Beskrivning Typer
(frivillig)
Typ: Sträng.
(frivillig)
Typ: Antal.

Till exempel:

För att anropa denna procedur använder vi kommandot.

I beskrivning Tabellvärden som delar av samlingen är exakt RowsTableValues.

Till skillnad från kolumner, som endast består av egenskaper (namn, typ, titel, bredd), i RowTableValues det finns både egenskaper (referens genom kolumnnamn) och metoder (du kan få och ställa in ett värde, arbeta med ägare).

Tillägga ny linje till bordet måste du använda metoden heller Lägg till(), eller Föra in(). I det andra fallet bör du ange i vilken position den önskade strängen ska placeras.

För att tilldela ett värde till en kolumn hänvisar vi till det med kolumnnamnet eller indexet (med hakparenteser) separerade med en punkt.

För fyllning Tabellvärden följande metoder kan användas:

klar()- för att ta bort alla rader från Tabellvärden.

FillValues(,)– låter dig fylla alla kolumner eller valda kolumner med ett värde.
LoadColumn(,)– laddar en kolumn från en array.
UnloadColumn()– laddar ur en kolumn i en array.

De två sista metoderna är användbara när du behöver flytta en kolumn från en värdetabell till en annan.

Kopiera(,)- låter dig skapa en ny tabell baserat på en befintlig tabell Värdetabell, samtidigt som du inte anger alla rader och alla kolumner, utan bara några av dem. Returvärde - Värdetabell.

Du kan kopiera strukturen Tabellvärden. Det finns en motsvarande metod för detta. CopyColumns(). Vi kommer att få en tom Värdetabell med önskad struktur.

Värdetabell det finns en metod total(). Du kan ange i vilken kolumn du vill summera de numeriska värdena. Med hänsyn till den tidigare visade koden i tablån kan du beräkna värdet: TK.Total(”Summa”).

Värdetabell det är möjligt att gruppera (komprimera) numeriska värden med samma värden i vissa kolumner med metoden Kollaps(,).

Med hänsyn till den tidigare visade koden i tablån kan du beräkna värdet: TK.Collapse ("Veckodag", "Belopp").

Värdetabell kan visas på användarens skärm så att du kan utföra alla åtgärder med den. Men till skillnad från Lista över värden från programkoden kan du inte bara ringa bordet på skärmen.

Att visa Värdetabell skapa ett formulärattribut på skärmen och tilldela det en datatyp Värdetabell.

Efter det ska den resulterande tabellen visas på formuläret.

I formulärmodulen, i slutet av den tidigare kompilerade algoritmen (i Proceduren för att skapa en värdetabell), lägg till:
ValueVFormData(TK, Tabell);

Generiskt samlingsträd av värden

en mångsidig kollektion som är väldigt lik Värdetabell. Skillnaden mot tabellen är att trädets rader kan vara underordnade varandra, d.v.s. någon sorts hierarki kan bildas.

Det kan också visas på skärmen. Värdeträdet består uttryckligen av en samling rader och en samling kolumner. Det finns två egenskaper i trädet, rader och kolumner.

Eftersom rader kan vara underordnade varandra, kan för varje rad en överordnad specificeras, såväl som rader underordnade den.

Låt oss skapa lämpligt trädkommando och dess bearbetningsprocedur.

Låt oss skapa där det finns en överordnad rad och två underordnade rader.

Skapa ett formulärattribut DerZn(datatyp - Värdeträd).

För det här attributet skapar vi kolumnerna År och Månad.

Flytta motsvarande element DerZn till formuläret.

I slutet Procedurer TreeOnServer() Lägg till:

ValueVFormData(TreeZn, DerZn);

Låt oss kolla vad som hände i användarläge.

Med knapp Lägg till du kan lägga till nya rader. De kan också bilda en hierarki.

För att iterera över alla element i värdeträdet behöver vi använda rekursion, d.v.s. kallar en procedur från sig själv. Bearbetning av ett värdeträd kan till exempel se ut så här:

Detta avslutar vår första introduktion till universella samlingar.

I nästa artikel kommer vi att titta på vilken viktig mekanism en utvecklare kan använda för att förenkla åtkomsten till ett ordbokselement från programkoden.

Den är byggd enligt följande. Sekvensen av poster som motsvarar posterna i källtabellen är ordnad efter värdena för primärnyckeln. Logiska poster kombineras till block (k poster i block).

Blocknyckelvärdet är det minsta nyckelvärdet för de poster som ingår i blocket. Blocksekvensen är den sista nivån i B-trädet. Ett index av föregående nivå byggs upp. Poster av denna nivå innehåller nyckelvärdet för blocket för nästa nivå och länkpekarens adress för motsvarande block; poster på denna nivå kombineras också till block (k poster vardera). Sedan byggs ett högre index upp på liknande sätt, och så vidare, tills antalet indexposter på en viss nivå inte är mer än k .

Betrakta proceduren för att arbeta med ett B-träd med hjälp av ett exempel. Låt det finnas en fil med instanser av logiska poster, vars nycklar tar värdena 2, 7, 8, 12, 15, 27, 28, 40, 43, 50. För visshetens skull tar vi k=2 (vi kombinera 2 registrerar instans). Den som byggdes för detta exempel visas i fig. 9.7 (för att förenkla figuren presenteras endast nycklarna för logiska poster på nivå 4 och värdena för andra fält i dessa poster presenteras inte).


Ris. 9.7.

Blocken innehåller nyckelvärdet för motsvarande block. Värdet på k tas lika med 2.

Genom att bygga ett B-träd är alla källposter på samma avstånd från toppindexet (trädet är balanserat).

Låt oss överväga genomförandet av huvudoperationerna.

Sök och läs post från satt värde nyckel-

Uppskriften läses. Jämför det givna nyckelvärdet med nyckelvärdet sista posten index. Om det specificerade nyckelvärdet är större än eller lika med nyckelvärdet för nästa indexpost (om en sådan post finns), så läses blocket av indexposter för nästa nivå vid länkadressen specificerad i den aktuella posten. Därefter upprepas processen.

Vi antar att alla block är belägna i VP. Då blir antalet anrop till VI vid informationssökning lika med antalet trädnivåer. Antalet trädnivåer är lika med minimivärdet l, vid vilket villkoret k l >= N (N är antalet logiska poster) är uppfyllt.

Ändring (korrigering) av posten

Efter sökning och läsning av posten ändras de justerbara fälten. Om det inte är nyckeln till posten som korrigeras, så sätts den ändrade posten på sin plats. Om nyckelns värde ändras, raderas den gamla posten (en "tom" post visas i motsvarande block), och den ändrade posten matas in på samma sätt som den nyligen tillagda.

Ta bort en post

Efter sökningen raderas den hittade posten (en "tom" post läggs in i motsvarande block istället för denna post).

Lägger till en post

Först och främst bestäms var den tillagda posten med det givna nyckelvärdet ska placeras. Proceduren för att hitta blocket där denna post ska placeras liknar proceduren som beskrivs ovan för att hitta poster med ett givet nyckelvärde. Om det finns en "tom" post i blocket på lägre nivå, läggs den tillagda posten till detta block (med nödvändig omordning av poster inom blocket).

Om det inte finns något tomt utrymme i motsvarande block på lägre nivå, delas blocket upp i två block. Poster skrivs in i den första av dem, resten skrivs in i den andra. Nyckelvärdet för vart och ett av de specificerade blocken kommer, såsom beskrivits tidigare, att vara minimivärdet för nycklarna för de poster som ingår i blocket. Den tillagda posten matas in i blocket, vars nyckelvärde är mindre än nyckelvärdet för den tillagda posten. Uppkomsten av ett nytt block med ett nytt nyckelvärde kräver bildandet av ett lämpligt nytt rekord i index på föregående nivå. Denna post innehåller det nya nyckelvärdet för det nya blocket och en pekare till dess plats. Proceduren för att lägga till en sådan post liknar den som beskrivs ovan. Blocket på föregående nivå är placerat där denna post ska placeras. Om det finns ett tomt utrymme i blocket läggs posten till i blocket, om blocket är fullt delas det upp i två block, posten läggs in i ett av blocken, en indexpost av föregående nivå bildas , och så vidare.

En variant är möjlig när du måste dela upp blocket av högsta nivån och bildar en annan nivå av trädet.

Tänk på exemplet som visas i fig. 9.7 , lägga till en post med tangent 10.

1. Jämförelse på första nivån.

Rörelse på vänster gren.

2. Jämförelse på andra nivån.

Rörelse på vänster gren.

3. Jämförelse på tredje nivån.

Rörelse längs höger gren.

Det önskade blocket

4. Blocket är fullt.

Den är uppdelad i 2 block

Jämförelse 8<10<12.

Post med knapp 10 läggs in i block 1

På den lägsta nivån har en ny post dykt upp med nyckelvärdet 12. Det är nödvändigt att lägga till en ny post med nyckeln 12 och en pekare till ingången för den lägsta nivån till indexet för den föregående nivån.

5. En post med en nivå 3-nyckel på 12 måste läggas till i blocket. Blocket är fullt, det är uppdelat i två block

Jämförelse 8<12.

Posten läggs till i det andra blocket

6. På nivå 3 har ett block med en ny nyckel 8 dykt upp. Det är nödvändigt att lägga till en ny post med en nyckel på 8 och en pekare till motsvarande block på nivå 3 på nivå 2.

7. En post med en nivå 2-nyckel på 8 bör läggas till i blocket. Blocket är fullt, det är uppdelat i två block.

Posten läggs till i block 1.

8. På nivå 2 har ett block med en ny nyckel 15 dykt upp, det är nödvändigt att lägga till en ny post med en nyckel på 15 och en pekare till motsvarande block på nivå 2 på nivå 1.

Standarder, begränsningar och regler - dessa är valfria attribut som kan definieras på databaskolumner och tabeller. På tystnad(standardvärden) - dessa är värdena som skrivs in i en specifik kolumn. Restriktioner(begränsningar) används som ett sätt att identifiera giltiga värden för en kolumn (för att avvisa ogiltiga värden), såväl som ett sätt att säkerställa dataintegritet i databastabeller och mellan relaterade tabeller. En begränsning på endast en kolumn kallas en värde (kolumn) begränsning: den begränsar endast värdena för den kolumnen. En begränsning som påverkar flera kolumner kallas en referensrestriktion: i det här fallet måste kombinationen av värden för kolumnerna som anges i begränsningen uppfylla kraven för begränsningen. Det finns fem typer av begränsningar: NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY och CHECK.

Nullvärde(nullvärde) är ett okänt värde för vilket NULL-notationen gäller . Ett nollvärde i en kolumn betyder vanligtvis att det inte finns några data för den kolumnens rad eftersom värdet är okänt, eller inte vettigt, inte är inställt eller kommer att ställas in i framtiden. Nullvärden är inte tomma värden och inte värden på talet 0, deras verkliga värden är okända (okänt), så inga två nollvärden är lika.

IDENTITY egendom. När du skapar en tabell kan du ange en av kolumnerna som en identitetskolumn genom att lägga till IDENTITY-egenskapen i kolumndefinitionen. Om en kolumn skapas med IDENTITY-egenskapen genererar SQL Server automatiskt ett radvärde för den kolumnen, beräknat från startvärdet och inkrementvärdet. Frövärdet är identitetsvärdet för den första raden som infogas i tabellen. Ökningen är mängden med vilken SQL Server ökar identitetsvärdet för på varandra följande rader. Varje gång en rad skrivs in tilldelar SQL Server det aktuella identitetsvärdet till dataelementet i identitetskolumnen som anges på den nya raden. Nästa rad som anges kommer att få ett identitetsvärde som är större än det nuvarande maximala identitetsvärdet med ett steg. Identitetskolumner används ofta i primärnyckelbegränsningar i tabeller som gör att rader kan identifieras unikt. Till exempel, om du anger IDENTITET(1, 10), så kommer värdet på den identifierande kolumnen för den första raden som anges att vara 1, för den andra raden blir det 10, för den tredje raden blir det 20, och så vidare . Om du inte anger ett startvärde eller inkrement kommer de att använda standardvärdena 1 och 1. Identitetskolumner kan inte innehålla standardvärden och får inte vara null. Varje tabell kan bara ha en identifierande kolumn.


Som standard kan identifieringskolumner inte anges direkt och kan inte ändras. Om du vill skriva om en raderad sträng och vill behålla det gamla identifieringsvärdet för den strängen, kan du åsidosätta standardinställningen genom att använda denna sats:

SÄTT IDENTITET INFOGA tabell.namn PÅ

Med den här operatorn kan du infoga en rad och tilldela värdet på den identifierande kolumn du behöver. När du har skrivit klart strängen måste du ta bort möjligheten att infoga i identifieringskolumnen med följande operator:

STÄLL IN IDENTITYINSERT tabellnamn AV

Efter det kommer SQL Server att ta det största värdet från denna kolumn som det initiala värdet som används när följande rader läggs till.

Skapa en standard för en kolumn som använder CREATE TABLE-satsen är den föredragna standardmetoden. Följande sats skapar en tabell i MyDB-databasen som innehåller standardvärdena för båda kolumnerna, kolumnA (av typen char) och kolumnB (av typen int):

SKAPA TABELL MyTable

(kolumnA char(15) NULL DEFAULT "st",

kolumnB int NULL DEFAULT 0)

Standardvärdet "st" för kolumn kolumnA är kompatibelt med kolumnens char-datatyp, och standardvärdet 0 för kolumnB är kompatibelt med int-datatypen. Om ett specifikt värde inte anges för en eller båda kolumnerna när en ny rad infogas i en tabell, används lämpligt standardvärde. Därför är det enda sättet att tilldela NULL till dessa kolumner att uttryckligen infoga NULL. Nullvärden är giltiga eftersom NULL-attributet är specificerat för båda kolumnerna. Om kolumnerna var definierade som NOT NULL, kunde du inte uttryckligen infoga ett NULL-värde.

PRIMÄR NYCKEL begränsning används för att ange tabellens primärnyckel, som är en kolumn eller uppsättning kolumner som unikt identifierar en tabellrad. Eftersom primärnyckeln identifierar en rad kommer motsvarande kolumn aldrig att innehålla ett NULL-värde. Om du definierar en PRIMARY KEY-begränsning på en uppsättning kolumner, anger denna begränsning att kombinationen av värden för dessa kolumner måste vara unik för varje rad. PRIMARY KEY-begränsningen tillåter inte dubbletter av värden. Om en PRIMARY KEY-begränsning tilldelas en kolumn eller en uppsättning kolumner, skapas automatiskt ett unikt index på den primära nyckelkolumnen eller kolumnerna. En tabell kan bara ha en PRIMARY KEY-begränsning. En kolumn med ett IDENTITY-attribut passar bra för en primärnyckel. Följande T-SQL-sats är ett sätt att ange SSN-kolumnen som primärnyckel när du definierar en tabell.

SKAPA TABELL-kund

midinit char(1) NULL,

efternamn char(20) INTE NULL,

Custom_phone char(10) NULL)

Alternativt kan du namnge denna begränsning genom att lägga till nyckelordet CONSTRAINT. För att tilldela namnet PK_SSN till din PRIMARY KEY-begränsning, använd följande sats:

SKAPA TABELL-kund

(förnamn char(20) INTE NULL,

midinit char(1) NULL,

efternamn char(20) INTE NULL,

SSN char(11) CONSTRAINT PK_SSN PRIMÄRNYCKEL,

cust_phone char(10) NULL)

Du kan också ange en PRIMARY KEY-begränsning efter att alla kolumner i tabellen har definierats. När du använder den här syntaxen måste kolumnnamnet omges inom parentes och anges efter CONSTRAINT-satsen, som visas i följande sats:

SKAPA TABELL-kund

(förnamn char(20) INTE NULL,

midinit char(1) NULL,

efternamn char(20) INTE NULL,

cust_phone char(10) NULL,

CONSTRAINT PK_SSN PRIMÄRNYCKEL (SSN))

Unik begränsning säkerställer att inga dubbletter av värden är tillåtna i en kolumn eller uppsättning kolumner; med andra ord, unika värden i denna kolumn eller uppsättning kolumner säkerställs. För att stödja denna unikhet skapar SQL Server, som standard, ett unikt index på den eller de kolumner som anges i UNIQUE-begränsningen. En UNIK begränsning kan användas på vilken kolumn som helst som inte är en del av en PRIMARY KEY-begränsning. En UNIK begränsning kan användas på kolumner som tillåter nollvärden, medan PRIMARY KEY-begränsningar inte kan användas på sådana kolumner. En kolumn med en UNIK begränsning kan refereras till med en FOREIGN KEY-begränsning. Flera UNIKA begränsningar kan ställas in på en enda tabell, så länge som det totala antalet index för den tabellen inte överstiger 250 index.

För att skapa en UNIK begränsning på en tabell med T-SQL, använd CREATE TABLE-satsen. Till exempel skapar följande sats en kundtabell med en UNIK begränsning på SSN-kolumnen som ett index:

SKAPA TABELL-kund

(förnamn char(20) INTE NULL,

midinit char(1) NULL,

efternamn char(20) INTE NULL,

SSN char(11) NOT NULL UNIQUE CLUSTERED,

cust_phone char(10) NULL)

KONTROLLERA begränsning används för att begränsa uppsättningen tillåtna värden för en kolumn till vissa värden. Värden som används vid infogning i en kolumn eller uppdatering av en kolumn kontrolleras mot sanningen (TRUE-värdet) för det booleska sökvillkoret som anges i begränsningen. Om vi ​​till exempel vill begränsa intervallet av möjliga värden som är tillåtna för priskolumnen i artikeltabellen till mellan $0,01 och $500,00, skulle vi använda följande uttalande:

SKAPA TABELLobjekt

(artikelnamn char(15) NOT NULL,

itemid smallint INTE NULL IDENTITY(1,1),

pris småpengar NULL,

item_desc varchar(30) NOT NULL DEFAULT "ingen",

CONSTRAINT PK_ itemid PRIMARY KEY (itemid),

CONSTRAINT CK_price CHECK (pris >=0,01 OCH pris<= 500.00))

Skapa och ändra begränsningar med Management Studio

För att skapa en tabell, expandera servermappen och databasmappen i den vänstra rutan i Management Studio, högerklicka på mappen Tabeller och välj sedan Ny tabell från snabbmenyn. För att visa designtabellfönstret för en befintlig tabell, klicka först på mappen Tabeller, högerklicka på tabellens namn i den högra rutan och välj sedan Designtabell från snabbmenyn.

För att indikera om den ska användas eller inte nollvärden i valfri kolumn markerar eller avmarkerar du helt enkelt lämplig ruta i kolumnen Tillåt nollvärden i Design Table-fönstret. Du kan ställa in det här alternativet när du skapar en tabell eller när du ändrar den.

För att skapa eller ändra Unik begränsning Använd Management Studio , följ dessa steg:

1. Klicka på knappen Index/Nycklar i verktygsfältet i Design Table-fönstret.

  1. Följande fönster kommer att visas där du kan skapa, redigera och ta bort begränsningar associerade med primära och unika nycklar

Välj de kolumnnamn du vill inkludera i begränsningen och definiera egenskaper för den.

Du kan fråga PRIMÄR NYCKEL begränsning en eller flera kolumner. Denna kolumn eller kolumner måste unikt identifiera varje rad i tabellen. Följ dessa steg för att ställa in en PRIMARY KEY-begränsning:

  1. I fönstret Design Table väljer du en kolumn genom att klicka på en av cellerna i dess rad. (Du kan välja flera kolumner genom att hålla ned Ctrl-tangenten och klicka på de grå cellerna till vänster om kolumnnamnen.)

  1. Högerklicka på en av de valda kolumnerna och välj Ange primärnyckel från snabbmenyn. En bild av en liten nyckel kommer att visas till vänster om kolumnerna du definierade för primärnyckeln.
  2. Om du behöver flytta PRIMARY KEY-begränsningen till en annan kolumn, ställ helt enkelt in den här nya kolumnen som primärnyckel. Du behöver inte uttryckligen ta bort den ursprungliga primärnyckeln först - SQL Server tar bort och återskapar PRIMARY KEY-indexet åt dig. Du kan också ändra PRIMÄRKEY-indexet i fönstret Egenskaper. Dina ändringar träder i kraft när du har sparat ditt arbete genom att klicka på knappen Spara i verktygsfältet.

Att skapa KONTROLLERA begränsning Använd fönstret Design Table, öppna det här fönstret för tabellen du vill arbeta med och följ stegen nedan.

1. Högerklicka på Design Table-fönstret och välj Egenskaper från snabbmenyn för att visa Egenskapsfönstret. Klicka på fliken Kontrollera begränsningar och klicka på knappen Ny för tabellen.

3. Lägg märke till de tre kryssrutorna längst ner i det här fönstret. Att kryssa i kryssrutan Kontrollera befintliga data vid skapande innebär att tabellens befintliga data kommer att kontrolleras mot KONTROLLERA-begränsningen, och om de inte stämmer överens kommer begränsningen inte att skapas. Att markera kryssrutan Framtvinga begränsning för replikering betyder att denna begränsning kommer att kontrolleras när data replikeras. Att markera kryssrutan Framtvinga begränsning för INFOGA och UPPDATERINGAR betyder helt enkelt att begränsningen KONTROLL kommer att vara aktiverad. Om du inte markerar den här rutan kommer denna begränsning att skapas, men den kommer inte att aktiveras, d.v.s. kommer inte att ha någon effekt.

4. Klicka på knappen Stäng och sedan på knappen Spara för att spara den nya begränsningen. För att ändra en CHECK-begränsning använder du fliken Check Constraint för att ändra begränsningsnamnet, begränsningsuttrycket och flaggorna.

Du kan också använda fliken Kontrollera begränsningar för att ta bort en begränsning genom att välja namnet på den begränsning du vill ta bort från listan Valda begränsningar och klicka på knappen Ta bort.

Laboratoriearbeteär designad för 3 timmars klassrumslektioner och består i att studera teoretiskt material och få praktiska färdigheter i att definiera databastabeller, skapa regler, begränsningar, standardinställningar, anpassade datatyper, index. Leverans av laborationer består i att besvara kontrollfrågor och demonstrera en individuell uppgift på en PC.

  1. Verkets titel och syfte
  2. Individuell uppgift
  3. Skript för att skapa en anpassad datatyp och databastabeller, i enlighet med en individuell uppgift

testfrågor

  1. Lista över datatyper som stöds?
  2. Anpassad datatyp. Syfte och metoder för skapandet?
  3. Sätt att definiera tabeller?
  4. Tilldela standardvärden, regler och begränsningar?
  5. Lista över standardinställningar, begränsningar, regler som stöds?
  6. Metoder för att tilldela standardvärden, begränsningar, regler
  7. Vad är ett nollvärde?
  8. IDENTITY kolumnegenskap?

n. (pzegt (papperstider (K, h))

Infogar värdet av h i objektet n i position, märkt med nyckeln 1c.

Om det redan finns ett porterbart värde som motsvarar nyckeln 1c, så ändras det inte. Returnerar ett objekt av typen pamphlet::stringtor, boo1>, vars första komponent pekar på elementet med den givna nyckeln, och den andra anger om ett nytt element har infogats. Var uppmärksam på att enligt den högra valsen genererar pa1 r ett objekt av typen pa(r sk, h ”, som efter starten av funktionen snzegm omvandlas till ett objekt av typen raz r

p.uzpb (1s)

Returnerar en pterator som länkar till elementet (om det finns) med nyckel 1c. Om inget sådant element existerar, returnerar värdet av n.enb0 Genererar ett typ-objekt r som smermits nyckeln och värdet med vilket denna upoch slås samman, vid den position som indikeras av iteratorn me. Således är elementet me->r(gm av typen conn k och prgl anger nyckeln, och elementet me->jesnb är av typen y och prgl anger värdet som motsvarar denna nyckel

B.Z. Algoritmer

Studbiblioteket innehåller många generiska algoritmer som är skrivna med iteratorer i åtanke; sålunda blir algoritmer oberoende av de specifika datastrukturer de arbetar på och typerna av deras medlemmar. Observera att associativa behållare har iteratorer som hänvisar till sammansatta typer som klassen pa(r. Blint, att använda dessa algoritmer med associativa behållare kräver noggrann design.

De flesta algoritmer fokuserar på sekvenser som begränsas av ett par iteratorer, där den första iteratorn pekar på det första elementet och den andra pekar på minnesområdet som ligger efter det sista elementet i denna efterpost. Om inte annat anges definieras alla algoritmer i rubriken.

Inkluderar deklarationer av allmänna algoritmer

accppite(b, e, t)

accipate(b, e, t, r)

Deflaterad i titeln. Skapar ett temporärt objekt o1y av samma typ och med samma värde som objektet m. För varje inmatning av iterator me i intervallet (b, e), beräknar ady" = aby + *mt eller aby" = T(ab) ", *3m), beroende på formen av acccpplyate-funktionen som anropades. Resultatet är en kopia av objektet aby. Observera att eftersom "+"-operatorn kan överbelastas, kan även den första formen av acpplyate-funktionen fungera på icke-inbyggda typer.arithmeticguskill type Till exempel kan vi använda Assppp1ate-algoritmen för att sammanfoga alla strängar i kopieraren

B.Z. Algoritmer

b(na~y sevgsp(b, e, c)

Returnerar ett värde av typen boo1 som anger om värdet c tillhör den (sorterade) pastlglaturen som begränsas av de enkelriktade iteratorerna b och e

kopia (b, e, b)

Kopierar värdena för sekvensen som anges av ingångsiteratorerna b och e till destinationsområdet, kallat iterator d. Returnerar ett värde som anger positionen bakom det sista elementet i mottagaren

epv1(b, e, b2)

epv1(b, e, b2, p)

Ett exponentiellt värde av typen bao1, som indikerar om elementen i storleksordningen som ges av ingångsiteratorerna b och e är lika med elementen i en sekvens av samma storlek, vars början ges av ingångsiteratorn b2. Använder predikatet p för att testa, eller operatorn "=" om predikatet p inte är specificerat.

H 11(b, e, c)

Ställer in elementen för blindhet som ges av hunditeratorerna b och e lika med värdet c. Returnerar värdet av r(nb(b, e, c)

r(n0 (r(b, e, p)

Returnerar en iterpore som anger den första iterationen av värdet c, eller en iterator som pekar på elementet för vilket previkatet p är sant (om ett är angivet) i sekvensen som ges av iteratorerna b och e. ​​Returnerar e om det elementet inte gör det existera

1ex(condgvr sv1 conpvge(b, e, b2, e2)

1ex(condgvp(c1 conp(b, e, b2, e2, p)

Returnerar ett boolvärde som anger om följden av element i intervallet [b, e) är mindre än följden av element i intervallet [b2, e2). För att jämföra element, använd p-predikatet eller operatorn "

pvc(s1, s2)

Returnerar de större (två pvc-funktioner) eller mindre (i termer av bn-funktionen) k3-värden som ges av c1- och c2-argumenten som båda har pvc pdig-typ e1epeps(b.e) nmp e1epeps(b, e) Returnerar en iterator som pekar till den största (minsta) ) är ett element i pastellbarheten som ges av enkelriktade spelelement b inte

Bilaga B Standardbibliotek(kort recension)