Care este problema
ms accesul nu ne permite să alegem cum să identificăm în mod unic rândurile de tabelă. Singura opțiune este contorul. Adevărat, trebuie să-i dăm datoria - în marea majoritate a cazurilor acest lucru este suficient.
Dificultăți încep atunci când doriți să consolidați date din diferite baze de date. Evident, chiar și utilizarea contoarelor cu valori aleatorii nu garantează absența conflictelor. Pentru a rezolva astfel de situații nu este ușor, în principal din cauza faptului că acestea implică în plus față de unul mai mult mai mult și o mulțime de tabele subordonate. Când se repetă, există dificultăți similare.
O altă caracteristică neplăcută a contorului este că uneori valorile sunt duplicate, mai ales dacă nu există un indice unic pentru un astfel de câmp.
moduri de a rezolva
Metoda tradițională de generare a unei valori unice se bazează pe crearea unei tabele speciale cu un câmp care se modifică în funcție de un algoritm dat de fiecare dată când o aplicație client accesează. Cu valoarea obținută în acest fel, puteți efectua alte manipulări și scrieți câmpul cheie. Dezavantajul metodei îl reprezintă laboriositatea evidentă și fiabilitatea îndoielnică. În particular, funcția folosită pentru a obține un astfel de identificator unic nu poate fi utilizată în proprietatea "Valoare implicită" a câmpului de tabelă.
O altă metodă este alocarea intervalelor de contragreutate pentru fiecare dintre baze. Această metodă nu este chiar rău. Dezavantajul poate fi considerat nevoia de a planifica în prealabil numărul și dimensiunea intervalelor. În caz contrar, cineva ar putea pur și simplu să nu aibă suficiente încăperi. În plus, setarea valorilor inițiale ale contoarelor necesită în continuare acțiuni suplimentare.
A treia abordare implică crearea unei expresii care are ca rezultat o valoare adecvată pentru utilizare ca un identificator unic. De asemenea, trebuie să puteți specifica această expresie în proprietatea "Valoare implicită" a câmpului din tabel. Mai jos, două astfel de expresii sunt descrise în detaliu: un șir și altul de tip numeric.
Șir de identificare de tip
Primirea unei valori unice în acest caz se bazează pe generarea unui șir de 16 caractere. Primul este cel din stânga al argumentelor liniei de comandă. Valoarea liniei de comandă poate fi setată nu numai în parametrul de pornire / cmd, ci și în program:
application.setoption "argumente linie de comandă", "w"
Este urmată de valorile hexazecimale ale datei și orei curente. Restul de 7 caractere ocupă un număr aleator (și în format hexazecimal). Rezultatul este următorul:
id = stânga (comanda (), 1) hex (acum () mod 2 ^ 16) hex (acum () - int (acum ())) * 65535) hex (rnd () * (2 ^ 28-1))
stânga (comanda (), 1) orice caracter adecvat (trebuie să fie primul în argumentul liniei de comandă)
hex (acum () mod 2 ^ 16) data modulo 65536 (adică nu mai mult de 4 caractere)
hex (acum () - int (acum ())) * 65535) timpul scalat la 65535 (pentru maxim 4 caractere)
hex (rnd () * (2 ^ 28-1)) număr aleator în intervalul de la 0 la 2 ^ 28-1 (nu mai mult de 7 caractere)
Cu această metodă, numărul de clienți din sistem este limitat de numărul de caractere valide pentru primul (stâng) octet din șir. Desigur, există cel puțin o sută dintre ei. Dacă aveți nevoie de mai mult, puteți mări numărul de caractere inițiale. De asemenea, mărimea identificatorului va crește, de asemenea. Un avantaj suplimentar este faptul că un astfel de identificator poate fi folosit fără nicio modificare ca o cheie pentru arborele.
Identificator tip de monedă
Acest mod de a crea un identificator unic este o dezvoltare a celui anterior. Vă permite să reduceți la jumătate dimensiunea câmpului și să accelerați toate operațiile cu acesta, deoarece lucrul cu numerele este mai rapid decât cu șiruri de caractere. Funcția este, cu toate acestea, mai greoaie:
(ccur (abs (val (comanda ()) - 64) * (2 ^ 57) / 10000) + ccur acum ()) mod 2 ^ 15) * (2 ^ 42) / 10000) + ccur ((acum) () * (2 ^ 26-1)) / 10000))
argument în linia de comandă (care se află în spatele / CMD) ar trebui să fie un număr cuprins între 1 și 127. Acesta este numărul de clienți pot fi într-un sistem folosind metoda de generare a unui identificator unic. Pentru a atribui această valoare, de exemplu, 127, puteți utiliza următoarea comandă:
application.setoption "argumente linie de comandă", "127"
Tipul de valută se află în intervalul de la - (2 ^ 63) / 10000 la (2 ^ 63-1) / 10000. Prin urmare, de fiecare dată este necesar să se împartă la 10000 și să se transforme rezultatele intermediare în tip de monedă, deoarece accesul se încearcă în mod constant să se folosească dublu. Dacă reprezintă o valoare a valutei de tip ca număr întreg, utilizarea cifrelor sale este după cum urmează:
Utilizări de biți în identificator
Senior 63rd Sign (din argumentul liniei de comandă)
6 (de la 57 la 62) Numărul (din argumentul din linia de comandă)
15 (de la 42 la 56) Data
16 (de la 26 la 41) Timp
Tânăr 26 (de la 0 la 25) Numărul aleatoriu
Semnarea numărului (mai mult sau mai puțin jumătate din numere)
iif (val (comanda ())> 63, 1, -1)
Numărul din jumătățile mai mici (1,63) sau mai mari (64,127). Pentru a se încadra în tipul de monedă, numărul nu trebuie să depășească 63. Din acest motiv, se folosește funcția abs.
ccur (abs (val (comanda () (64)) * (2 ^ 57) / 10000)
Data. Diviziunea modulo 2 ^ 15 vă permite să strângeți în 15 biți alocați, păstrând în același timp unicitatea de aproximativ 80 de ani.
ccur (ccur ((int (acum ()) mod 2 ^ 15) * (2 ^ 42) / 10000)
Timpul spre interior
1,3 secunde. În intervalul de la 00:00:00 până la 23:59:59 ia o valoare de la 0 la 0.99999 și este scalată la 16 biți doriți prin înmulțirea cu 65535.
ccur (((acum () - int (acum ())) * 65535) * (2 ^ 26) / 10000)
Un număr aleator în intervalul de la 0 la 2 ^ 26 - 1. Reducerea intervalului duce la repetări.
ccur (rnd () * (2 ^ 26-1)) / 10000))
concluzie
A doua metodă este în mod evident mai preferată, deoarece vă permite să creați mai mulți identificatori compacți. În plus, permite trecerea relativ fără durere de la utilizarea contoarelor, deoarece lucrul cu șiruri este mult diferit de lucrul cu tipuri lungi sau valutare, decât acestea diferă una de cealaltă.
Cu toate acestea, există dezavantaje. În primul rând, acesta este un număr limitat de clienți din sistem (nu mai mult de 127), cauzate de complexitatea stoarcerii în cadrul unui număr de 8 octeți. De asemenea, nu există nicio garanție completă că numerele aleatoare nu se vor repeta în acele 1,3 secunde, când unicitatea cheii este determinată numai de funcționarea generatorului de numere aleatorii. În cazul unei astfel de repetări, va apărea o eroare de duplicare, care va necesita repetarea întregii operații de adăugare a înregistrărilor. Adevărat, trebuie să plătim un omagiu funcției accesului rnd (): generează un flux de valori nerecurgător de valori suficient de lungi.