Accesul nu se încarcă în 1s. Codul sursă al funcției pentru a crea un fișier de bază de date

Particularitati:

  1. Fișierul bazei de date poate fi creat separat de date.
  2. Un tabel dintr-un fișier de bază de date poate fi creat separat de date.
  3. Tipurile de date sunt convertite pentru a fi compatibile cu acces.
  4. Valorile egale cu o dată sau un șir gol sunt convertite în nul.
  5. Tipurile de date non-primitive și fără șir (referință) sunt trunchiate la 255 de caractere.
  6. Tipurile de date șir se adaptează la lungimea șirului pentru a economisi spațiu.
  7. Caracterul ghilimele simple ' va fi scris în baza de date folosind funcţia de interogare char().
  8. Adăugarea automată a unui index primar (contor de rânduri).

Restrictii:

  1. Funcționează numai cu un tabel de valori ca sursă de date.
  2. Mecanismul funcționează doar în modul client gros. Acest lucru se datorează utilizării bibliotecii ADO și a tabelului de valori în același timp.
  3. Lucrul este posibil doar pe sistemele Windows.

Mecanismul în sine este format din trei blocuri:

  1. Funcție pentru crearea unui fișier de bază de date.
  2. Funcție pentru crearea unui tabel de bază de date.
  3. Funcție pentru scrierea datelor într-un tabel de bază de date.

Schematic, funcționarea mecanismului arată astfel:

Sursă Funcții de creare a fișierelor DB:

//funcția creează fișier nou DB cu capacitatea de a-l suprascrie pe cel vechi//Parametru //Parametru 2: boolean - steag de rescrie dacă fișierul bazei de date există deja // returnează 0 dacă funcția a fost finalizată cu succes și nu 0 dacă funcția a eșuat Funcția CreateFileAccess(ValueFileName,ValueOverwriteFile = True) //Verificați valabilitatea numelui fișierului Dacă EmptyString(FileName) Then Return - 2 ; In caz contrar //analizează unde se află fișierul pe disc If OverwriteFile Then File = New File(FileName) ; Dacă File. Exists() Then File = Undefined ; DeleteFiles(FileName) ; EndIf ; EndIf ; EndIf ; Stat(" Fișierul de acces este creat:" + FileName); //creez un shell de bază de dateÎncercați ADOX = New COMObject (" ADOX . Catalog" ); Raport de excepție (" " + Simboluri. PS + Descrierea erorii() ); Încetare încercare ; //Conectați-vă la noua bază de date creată ConnectionString = " Furnizor " " " + FileName + " " " " ; //conectați Încercați ADOH. Create(ConnectionString) ; Raport de exceptie(" Nu s-a putut genera fișierul de date. La crearea unui obiect ADOX. Catalog a apărut o eroare!" + Simboluri. PS + DescriptionError() ; Return - 1 ; EndAttempt ; ADOH. ActiveConnection. Close() ; ADOH = Undefined ; Return 0 ; EndFunction

Funcția primește 2 parametri:

  1. Numele de fișier al viitoarei baze de date este un șir. Aceasta este calea completă către fișier; dacă nu este trecută, procedura se va încheia.
  2. Suprascrieți un fișier - boolean. Acesta este un semnal boolean care utilizează un mecanism de suprascriere a fișierelor.

Mai întâi, este verificat numele complet al fișierului. Apoi mecanismul de rescriere a fișierului funcționează. Dacă este necesar, fișierul existent este șters. După care procedura continuă cu crearea dosar gol DB. Acest lucru se face folosind obiectul ADOX.Catalog. Pentru a înțelege complexitatea modului în care funcționează ADOX.Catalog, vă recomand să căutați informații relevante pe site-ul Microsoft.

A doua „roată” a mecanismului de încărcare în acces implementează crearea unui tabel în fișierul bazei de date. Pentru a crea tabele, se folosește același obiect ADOX.Catalog.

Cod sursă pentru procedura de creare a unui nou tabel în baza de date:

//Parametru 1: șir - Numele complet fișier de bază de date//Parametru 2: Tabel cu valori - Tabel cu date de încărcat//Parametru 3: structura - descrierea tabelului care se creează (poate fi generat utilizând funcția: Crearea structurii de descriere a câmpurilor) //Returnează 0 dacă funcția a fost finalizată cu succes și nu 0 dacă funcția a eșuat Funcția EnterTableData(FileNameValue, DataTableValue, TableDescriptionValue)ConnectionString = " Furnizor =Microsoft. Avion. OLEDB. 4 . 0; Sursa datelor=" " " + FileName + " " " ; Jet OLEDB:Tip motor= 5;" ; Conector = New COMObject (" ADODB . Conexiune" ) ; Conector. ConnectionString = Șir de conexiune; //Conector de încercare de conectare. Deschidere() ; Raport de excepție(" Nu s-a putut deschide fișierul bazei de date!" ); Raport (EroareDescriere() ) ; Return - 1 ; EndTempt ; Stare(" Completez tabelul cu date:" + TableDescription.TableName); //Obiect de comandă DB Com = New COMObject (" ADODB . Comanda" ) ;Com. ActiveConnection = Conector; //constant 1 înseamnă „interogare”, există și vizualizări și proceduri stocate Com. CommandType = 1; RowCounter = 1 ; Pentru fiecare linie TK din tabelul de date Loop ProcessingUserInterrupt() ; //coloane de date transversale FieldList = Format(RowCounter, " CH = " ) + " , " + Simboluri. PS; Contor rând = Contor rând + 1 ; Contor coloană = 0 ; Pentru fiecare coloană TK din tabelul de date. Columns Cycle CurrentValue = Row TK [ Coloana TK. Nume] ; Descriere câmp = Descriere tabel. Descriere câmp. Get(Contor de coloane); //analiza tipului de date Dacă DescriptionFields. Tip = " 3 " Apoi // întreg TechValue = ? (TechValue = null , 0 , TechValue); FieldList = FieldList + Format(TechValue, " CHN = nul ; CHG=" ) + " , 5 „Atunci //numărul este fracționar //conversia null la 0 deoarece funcția ulterioară Format() nu o convertește corect TechValue = ? (TechValue = null , 0 , TechValue) ; FieldList = FieldList + Format(CurrentValue, " BRD = . ; CHN= nul ; CHG=" ) + " , " + Simboluri. PS; Descriere ElseIfField. Tip = " 7 „Atunci //data CurrentValue = ? (TechValue = null , " 00010101 " , TechValue) ; Dacă TechValue = " 00010101 " Apoi ModValue = " nul" ; Else ModValue = " " " + Format(TechValue, " DLF = DT" ) + " " " ; EndIf ; FieldList = FieldList + ModValue + " , " + Simboluri. PS; Descriere ElseIfField. Tip = " 11 " Apoi //boolean TechValue = ? (TechValue = null , False , TechValue); FieldList = FieldList + Format (TechValue, " BL = fals ; BI= adevărat" ) + " , " + Simboluri. PS; Descriere ElseIfField. Tip = " 202 " Apoi // șir TechValue = ? (TechValue = null , " " , TechValue); ; StringValue = Lev(TechValue, 255 ) ; Dacă EmptyString(StringValue) Atunci FieldList = FieldList + " nul" + Simboluri. PS; Else ModValue = StrReplace(ValueString, " " " , " " + chr() + " " ); FieldList = FieldList + " " " + Abbr(Lev(ModValue, 255 ) ) + " " , " + Simboluri. PS EndIf; ElseIfField Descriere. Tip = " 203 " Apoi // șir Dacă EmptyString(ValueString) Atunci FieldList = FieldList + " nul" + Simboluri. PS; Else ModValue = StrReplace(CurrentValue, " " " , " " + chr(" + CodSimbol (" " " ) + " ) + " "); FieldList = FieldList + " " " + ModValue + " " , " + Simboluri. PS EndIf; EndIf; Contor coloană = Contor coloană + 1; EndCycle; //tăiați ultima virgulă FieldList = Lev(FieldList, StrLength(FieldList) - 2 ) ; QueryText = „INSERT INTO” + TableDescription. TableName + " VALUES ( " +FieldList+ " ) " ; Com. CommandText = Solicitare text; Încercați Com. Execute () ; Raport de excepție (" Eroare la scrierea datelor!" + Simboluri. PS + " Text de solicitare: " + Text de solicitare + Simboluri. PS + Descriere eroare() ); Return - 2 ; EndTempt ; EndCycle ; //închide conexiunea Com. ActiveConnection. Închide() ; Com = nedefinit ; Conector = Nedefinit ; Returnează 0; EndFunction

Funcția primește 3 parametri:

  1. Structura de descriere a tabelului - o structură care conține o descriere a tabelului în sine și a câmpurilor sale. Este format dintr-o funcție auxiliară, pe care o voi furniza mai jos.
  2. Nume fișier - numele șir al fișierului bazei de date.
  3. DeleteExistingTable - un flag care determină comportamentul funcției în raport cu tabelele existente cu același nume.

După ce a primit controlul, funcția deschide fișierul bazei de date. Dacă conexiunea are succes, se creează un obiect „ADOX.Catalog” (catalog tabel), care verifică mai întâi existența tabelului în conformitate cu parametrul funcției nr. 3. Următoarea acțiune creează masa noua. Un câmp cheie (index) este adăugat la tabel. În continuare, pe baza parametrului funcției nr. 2, sunt create câmpuri de tabel de tipurile corespunzătoare. Odată finalizat, tabelul nou creat este adăugat la catalog și conexiunea este închisă.

Desigur, colectarea manuală a parametrului funcției nr. 2 este destul de laborioasă; pentru a o ușura, am scris o funcție care, pe baza unui tabel de valori cu date, formează structura descrierii tabelului.

Codul sursă al funcției care compune structura de descriere a câmpului:

//funcție auxiliară pentru formatarea structurii descrierii câmpului//Parametru 1: Tabel cu valori - Tabel cu date de încărcat//Parametru 2: șir - numele complet al tabelului (nu trebuie să conțină caractere ilegale: " , .) //Returnează structura descrierii tabelului Funcția ComposeFieldDescriptionStructure(DataTableValue, TableNameValue)DescriptionStructure = New Structure("TableName , Câmpuri de descriere" ) ;DescriptionStructure.TableName =TableName;DescriptionStructure.FieldDescription = Matrice nouă; //trecem prin coloanele tabelului de valori Pentru fiecare coloană TK din tabelul de date. Ciclul coloanelor StructurePropertyFields = Structură nouă ("Nume , Tip, Lungime, Sinonim" ); ColumnValueType = ColumnTZ.ValueType;StringLength =ColumnValueType.StringQualifiers.Length; //verificarea tipurilor conținute în coloană //orice tip compozit va fi un șir IfColumnValueType. Tipuri() . Cantitate() > 2 Apoi StructurePropertyField. Nume = ColumnTZ. Nume; StructurePropertyFields. Tip = " 202 " ; //adVarWChar, tip FieldPropertyStructure. Lungime = 255 ;FieldPropertyStructure. Sinonim = ColumnTK. Antet; ElseIfColumnValueType. ContainsType(Type(" Linia" ) ) Apoi FieldPropertyStructure. Nume = coloană TK. Nume; Dacă LineLength = 0, atunci FieldPropertyStructure. Type = " 203 " ; //adLongVarWChar("memo"), tastați 203 [flux de text Unicode (DT_NTEXT)]202 " ; //adVarWChar, tastați 202 [șir Unicode de 255 de caractere (DT_WSTR)] //FieldPropertyStructure.Length = ?(LineLength 0 Then //Eroarea editorului de articole la inserarea codului, nu s-a putut remedia, vezi procesare StructurePropertyFields. Tip = " 5 " ; //adDouble, tastați 5 În caz contrar, StructurePropertyFields. Tip = " 3 " ; //adInteger, tastați 3 EndIf ; ElseIfColumnValueType. ContainsType(Type(" Boolean ") ) Apoi StructurePropertyField. Nume = ColumnTZ. Nume; StructurePropertyFields. Tip = " 11 " ; //adBoolean, tastați 11 StructurePropertyFields. Lungime = nedefinit ; StructurePropertyFields. Sinonim = ColumnTZ. Titlu; ElseIfColumnValueType. ContainsType(Type("Data")) Apoi StructurePropertyField. Nume = ColumnTZ. Nume; StructurePropertyFields. Tip = " 7 " ; //adDate, tastați 7 StructurePropertyFields. Lungime = nedefinit ; StructurePropertyFields. Sinonim = ColumnTZ. Titlu; În caz contrar, StructurePropertyFields. Nume = ColumnTZ. Nume; StructurePropertyFields. Tip = " 202 " ; //adVarWChar, tastați 202 [șir Unicode de 255 de caractere (DT_WSTR)] StructurePropertyFields. Lungime = 255 ; StructurePropertyFields. Sinonim = ColumnTZ. Titlu; EndIf ; StructureDescription. Câmpuri de descriere. Adăugați(FieldPropertyStructure) ; EndCycle ; returnDescriptionStructure; EndFunction

Funcția primește 2 parametri:

  1. DataTable - un tabel de valori cu date. Din acest parametru, funcția generează o descriere a tipurilor de date ale câmpurilor viitoare. Recomand crearea acestui tabel de valori printr-o interogare, deoarece în acest caz toate câmpurile atribuirii tehnice vor fi tastate.
  2. TableName - nume șir tabelul viitor acces.

Inițial, se creează o structură care descrie baza de date în sine, după care se adaugă o matrice care va conține alte structuri care descriu câmpurile. În procesul de parcurgere a coloanelor din tabelul de valori, este completată o serie de descrieri de câmpuri. Structura descrierii câmpului conține 4 proprietăți principale:

  1. Nume - șirul numelui câmpului viitor. Nu trebuie să conțină spații sau caractere incompatibile. Dacă creați un tabel cu valori folosind o interogare, atunci nu ar trebui să existe probleme, dar dacă completați singur tabelul cu valori, responsabilitatea cade în întregime asupra dvs.
  2. Tipul este șir, este o constantă Microsoft. În cazul nostru, folosim doar: un număr întreg, un număr fracționar, un șir (de lungimi diferite), un boolean și o dată.
  3. Lungime - număr, pentru tipuri de șir.
  4. Sinonim - șir, descriere text a câmpului.

După ce a terminat de format structura, se întoarce.

În cele din urmă, puteți trece la funcția care scrie date în tabelul bazei de date. În această funcție, s-ar putea spune, nucleul funcționalității întregului mecanism este concentrat. Prin urmare, această funcție este cel mai dificil, dar asta nu ar trebui să te sperie. Un programator este un programator pentru că își dezvoltă o mentalitate analitică.

Cod sursă pentru funcția de introducere a datelor într-un tabel:

//funcția introduce date în tabel //Parametru 1 : șir - numele complet al fișierului bazei de date //Parametru 2 : Tabel cu valori - Tabel cu date de încărcat //Parametru 3 : structura - descrierea tabelului creat (poate fi generat folosind funcția: Compiling StructureDescription of Fields) //Se intoarce 0 în cazul încheierii cu succes a lucrării şi nu 0 dacă funcția a eșuat Funcţie Introducerea datelor într-un tabel (Sens Nume de fișier , Sens Tabel de date , Sens Tabele de descriere ) Șir de conexiune = " Furnizor = Microsoft . Avion . OLEDB . 4 . 0 ; Sursă de date = " " " + Nume de fișier + " " " ; Jet OLEDB: Tip motor = 5 ; " ; //obiect responsabil de comunicarea cu baza de date Conector = Nou COMObject (" ADODB . Conexiune" ) ; Conector . ConnectionString = Șir de conexiune ; //conexiune Atentat, încercare Conector . Deschis () ; Excepție A raporta (" Nu a reusit sa deschida fisierul bazei de date!" ) ; A raporta ( DescriereErori () ) ; Întoarcere - 1 ; EndTempt; Stat (" Completez tabelul cu date:" + Tabele de descriere . TableName ) ; //Obiect de comandă DB Com = Nou COMObject (" ADODB . Comanda" ) ; Com . ActiveConnection = Conector ; //constant 1 înseamnă „interogare”, există și vizualizări și proceduri stocate Com . CommandType = 1 ; Contor de rânduri = 1 ; Pentru Fiecare linie TK Din Tabel de date Ciclu Gestionarea întreruperilor utilizatorului () ; //coloane de date transversale Lista câmpurilor = Format ( Contor de rânduri , " CHG = " ) + " , " + Simboluri . PS ; Contor de rânduri = Contor de rânduri + 1 ; Contor de coloane = 0 ; //ciclu pentru generarea unei liste de câmpuri Pentru Fiecare coloană TK Din Tabel de date . Coloane Ciclu Valoare tehnică = Linia TK [ ColoanaTZ . Nume ] ; Câmpuri de descriere = Tabele de descriere . Câmpuri de descriere . obține ( Contor de coloane ) ; //analiza tipului de date Dacă Câmpuri de descriere . Tip = " 3 " Apoi //întreg Lista câmpurilor = Lista câmpurilor + Format ( Valoare tehnică , " CHN = nul; CHG = " ) + " , " + Simboluri . PS ; AltfelDacă Câmpuri de descriere . Tip = " 5 " Apoi //număr fracționar Lista câmpurilor = Lista câmpurilor + Format ( Valoare tehnică , " CHRD = . ; CHN = nul; CHG = " ) + " , " + Simboluri . PS ; AltfelDacă Câmpuri de descriere . Tip = " 7 " Apoi //Data Dacă Valoare tehnică = "00010101 " Apoi ModValue = " nul" ; In caz contrar ModValue = " " " + Format ( Valoare tehnică , " DLF = D.T." ) + " " " ; EndIf; Lista câmpurilor = Lista câmpurilor + ModValue + " , " + Simboluri . PS ; AltfelDacă Câmpuri de descriere . Tip = " 11 " Apoi //boolean Lista câmpurilor = Lista câmpurilor + Format ( Valoare tehnică , " BL = fals; BI = Adevărat" ) + " , " + Simboluri . PS ; AltfelDacă Câmpuri de descriere . Tip = " 202 " Apoi //linia ValueString = un leu ( Valoare tehnică , 255 ) ; Dacă Linie goală ( ValueString ) Apoi Lista câmpurilor = Lista câmpurilor + " nul, " + Simboluri . PS ; In caz contrar //Citalele simple sunt un caracter special în sql //conversia acest simbol prin cod ModValue = Înlocuire pagină ( ValueString , " " " , " " + chr (" + Cod simbol (" " " ) + " ) + " " ) ; Lista câmpurilor = Lista câmpurilor + " " " + AbbrLP ( un leu ( ModValue , 255 ) ) + " ", " + Simboluri . PS EndIf; AltfelDacă Câmpuri de descriere . Tip = " 203 " Apoi //linia Dacă Linie goală ( ValueString ) Apoi Lista câmpurilor = Lista câmpurilor + " nul, " + Simboluri . PS ; In caz contrar ModValue = Înlocuire pagină ( Valoare tehnică , " " " , " " + chr (" + Cod simbol (" " " ) + " ) + " " ) ; Lista câmpurilor = Lista câmpurilor + " " " + ModValue + " ", " + Simboluri . PS EndIf; EndIf; Contor de coloane = Contor de coloane + 1 ; Sfârșitul ciclului; //Pentru fiecare coloană TK din tabelul de date. Ciclul coloanelor //tăiați ultima virgulă Lista câmpurilor = un leu ( Lista câmpurilor , StrLength ( Lista câmpurilor ) - 2 ) ; //formarea finală a testului de cerere Solicitare text = " INTRODU IN" + Tabele de descriere . TableName + " VALORI (" + Lista câmpurilor + " ) " ; Com . CommandText = Solicitare text ; //scrierea datelor în baza de date (executarea unei interogări) Atentat, încercare Com . A executa() ; Excepție A raporta (" Eroare la scrierea datelor!" + Simboluri . PS + " Text cerere:" + Solicitare text + Simboluri . PS + DescriereErori () ) ; Întoarcere - 2 ; EndTempt; Sfârșitul ciclului; //Pentru fiecare LineTK din ciclul de date //închide conexiunea Com . ActiveConnection . Închide () ; Com = Nedefinit; Conector = Nedefinit; Întoarcere 0 ; EndFunction

Funcția primește 3 parametri:

  1. FileName - numele șir al fișierului bazei de date.
  2. DataTable - un tabel de valori care conține date.
  3. Descriere tabel - o structură care descrie câmpurile și numele tabelului.

Pentru a lucra cu baza de date, se creează o conexiune care ne este deja familiară. După ce ne conectăm, creăm un obiect responsabil cu executarea instrucțiunilor SQL. Apoi, organizăm o buclă prin rândurile tabelului de valori (parametrul funcției nr. 2) și o buclă imbricată prin coloanele tabelului. Contorul de rânduri va fi folosit pentru a indexa rândurile. Contorul coloanei va fi folosit pentru a căuta o descriere a câmpului în structura de descriere a tabelului (parametrul nr. 3). Parcurgând coloanele din rândul următor, analizăm tipurile acestora (conform descrierii tabelului) și efectuăm transformările corespunzătoare. Ca rezultat, avem o comandă sql gata făcută pentru a scrie o linie în baza de date. Aplicăm instrucțiunea sql primită folosind obiectul ADODB.Command. La sfârșitul procesului, închideți conexiunile și ștergeți memoria.

Din păcate, pe acest site nu am reușit să atașez procesare pentru un client gros, care poate încărca orice directoare în baza de date de acces. Dar îl puteți descărca pe disc Yandex: http://yadi.sk/d/UzK_PAsJ3vjTS. Această prelucrare implică toate părțile mecanismului universal de descărcare. Desigur, acest mecanism nu se limitează la această prelucrare. Poate fi copiat în siguranță ca în modul separat, și în procesarea dvs. Nu exclud situațiile eronate care ar putea duce la eșec la încărcare, dar acesta nu este un proiect comercial. Sunteți liber să modificați acest mecanism pentru a se potrivi nevoilor dvs. Mai jos sunt 2 anexe care descriu constantele adox. Sper că acest mecanism vă va fi de folos. Vă doresc succes în cariera profesională!

Lista de apendice 1 cu proprietăți suplimentare ale câmpului tabelului de acces:

Increment auto

Setează tipul câmpului la „Contor” cu valoarea incrementată automat când este adăugată o înregistrare.

Mod implicit

Valoarea implicită a câmpului.

Descriere

Descrierea câmpului.

Lungime fixă

Stabilește dacă câmpul va fi de lungime fixă ​​sau variabilă.

Creştere

Valoarea cu care câmpul tip contor va fi incrementat.

Nulăbil

Stabilește dacă câmpul nu poate conține nicio valoare, cu alte cuvinte, dacă câmpul ar trebui să fie obligatoriu.

Sămânță

Valoarea de la care va începe numărătoarea inversă din prima înregistrare pentru un câmp de tip „contor”.

Jet OLEDB: Permiteți lungimea zero

Stabilește dacă câmpurile de text pot conține șiruri de lungime zero. Ignorat pentru câmpurile fără caractere.

Jet OLEDB: AutoGenerate

Stabilește dacă o nouă valoare GUID va fi generată automat pentru câmpurile de tip adGUID.

Jet OLEDB: Regulă de validare a coloanei

O expresie care determină corectitudinea valorii scrise în câmp trebuie să fie scrisă în formatul SQL WHERE dar fără cuvânt cheie UNDE.

Jet OLEDB:Text de validare a coloanei

Textul care va fi afișat dacă valoarea introdusă în câmp nu corespunde regulii definite pentru acest câmp (Regulă).

Jet OLEDB: șiruri UNICODE comprimate

Stabilește dacă Microsoft Jet va comprima șirurile UNICODE atunci când scrie pe disc. Ignorat dacă baza de date nu este în format Microsoft Versiunea Jet 4.0.

Jet OLEDB: Hyperlink

Specifică faptul că datele din câmp sunt un hyperlink. Ignorat pentru câmpurile cu alt tip decât adLongVarWChar.

Jet OLEDB:IISAM nu este ultima coloană

Pentru instalabile-ISAM, această proprietate informează I-ISAM că există mai multe coloane care vor fi adăugate la tabel după aceasta. Dacă utilizați ITableDefinition::AddColumn sau ITableDefinition::CreateTable, este necesar să setați această proprietate pentru fiecare.

Jet OLEDB: un BLOB pe pagină

Stabilește dacă datele ar trebui stocate în pagini separate (Adevărat) sau dacă pot folosi pagini de bază de date partajate pentru a economisi spațiu pe disc. Funcționează numai cu câmpuri de tip adLongVarBinary.

Anexa 2 listă de tipuri de valori utilizate în ADOX

adDouble, tastați 5 - număr fracționar

adDate, tastați 7 - dată/ora

adCurrency, tip 6 - întreg

adInteger, tip 3 - întreg fără semn

adBoolean, tip 11 - boolean

adVarWChar, tip 202 - șir unicode de 255 de caractere

adLongVarWChar(„memo”), tip 203 - șir unicode șir nelimitat

Recent am avut nevoie să descarc toate datele dintr-o singură bază de date Access într-o configurație scrisă de sine (1C:Enterprise. Nu erau prea multe informații de transferat și, în principiu, a fost posibil să descarc acest proces fascinant către utilizator, dar Am decis să-mi ajut angajații deja ocupați.

Ajutorul a constat în automatizarea completă a acestui proces. A trebuit să scriu o procesare simplă care a făcut totul în câteva secunde. Înainte de această sarcină, nu a trebuit să lucrez cu combinația 1C + Access, așa că înainte să apuc tastatura și să încep să bat codul, am decis să citesc manualele.

Am știut de la bun început că orice interacțiune ar implica utilizarea furnizorilor corespunzători, dar am decis totuși să sapă în exemple.

M-am gândit mult timp în ce sens să scriu acest bilet. În cele din urmă, m-am hotărât pe cea mai simplă opțiune - furnizați codul pentru soluția mea. Chiar dacă nu este foarte optim, este mai mult decât suficient pentru majoritatea sarcinilor.

Deci, să începem să privim totul în ordine. Creăm o nouă procesare și aruncăm o singură componentă pe ea - „TableField”. Am întins această componentă pe întreaga formă. Ca rezultat, forma mea arăta ca în Figura 1.


Figura 1. Formular de procesare

În acest moment putem presupune că designul formularului este gata. Nu vom crea coloane manual, ci vom efectua această procedură în mod dinamic. Din fericire, nu este greu. Creați un handler de evenimente „On Click” pentru butonul „Run” și scrieți următorul cod în el:

//Ștergeți câmpul tabelului TableField1.Clear(); TableField1.Columns.Clear(); //Pregătirea șirului de conexiune pentru MS Access //Calea către baza de date este indicată la sfârșit șir de conexiune = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"C:\mydb.mdb"; ConnectionWithBase = New COMObject("ADODB.Connection"); //Conectează ConnectionWithBase.Open(ConnectionString); //Obțineți un set de înregistrări din tabelul demo_table Record Collection = New COMObject("ADODB.Recordset"); RecordsCollection.Open("selectați * din demo_table", DatabaseConnection, 1); //citește structura câmpurilor tabelului //În tabelul de valori, creați toate coloanele care se află în tabelul Access Pentru număr = 0 după Colectare Înregistrări.Câmpuri.Număr - 1 Ciclu TableField1.Columns.Add("Column" + count, Row(Records Collection .Fields.Item(count).Name)); EndCycle; //Mutați marcatorul la prima înregistrareRecordsCollection.MoveFirst(); //citiți datele din tabel //și adăugați-le la ToR Nu încăRecordsCollection.EOF Ciclu NewRow = TableField1. Add(); Pentru număr = 0 de RecordsCollection.Fields.Count - 1 Ciclu NewLine["Column" + count] = RecordsCollection.fields(TableField1.Columns[count].Header).Value ; EndCycle; RecordsCollection.MoveNext(); Sfârșitul ciclului; //Afișează datele din specificație în TableFieldFormElements.TableField1.Value = TableField1;FormElements.TableField1.CreateColumns();

Codul s-a dovedit a nu fi prea mare, dar destul de util. Nu am făcut nicio legătură cu o anumită structură. Codul funcționează excelent pe o mare varietate de tabele. Nu mai am nimic de adăugat, așa că îmi iau rămas bun

Pe scurt - în niciun caz. În tot ceea ce ține de interacțiunea cu agențiile guvernamentale (fie ea fiscală, raportare contabilă, tot felul de accize etc.), 1C nu poate fi înlocuit cu nimic și încercarea de a face acest lucru este, cel puțin, neconstructivă.

Dar nu încetați să citiți acest articol, aceasta nu este încă ideea principală. Principalul lucru este să nu cădeți într-o capcană logică și să considerați 1C complet indispensabil în orice parte a automatizării tuturor proceselor din întreprindere. Aici există ceva cu ce să discutăm și ceva de oferit. Vreau să vorbesc despre o experiență de succes în automatizarea diverselor aspecte ale activităților de afaceri ale unei companii de calculatoare și, bineînțeles, despre conectarea acestei soluții cu 1C. Lucrarea a luat naștere din necesitatea de a interfața un sistem auto-dezvoltat cu programul 1C, dar această abordare (diviziunea în 2 blocuri de program) poate fi dezvoltată într-o filozofie cu drepturi depline pentru construirea unui sistem informațional în general.

Inițial, sarcina a fost următoarea. A fost sistem corporativ automatizare scrisă în Microsoft Access. De-a lungul multor ani de dezvoltare, a absorbit aproape toate sarcinile de zi cu zi - menținerea unei bănci, emiterea de facturi, pregătirea documentelor contabile pentru expediere, întreținerea unui depozit, contabilizarea componentelor. numere de serie, compilare harti tehnologice pentru producție etc. Recent, la capacitățile sistemului au fost adăugate următoarele completări: crearea de plăți bancare direct pe baza facturilor primite, generare automată liste de prețuri în diverse formate pentru publicare pe resursele web, actualizarea site-ului companiei și pregătirea Contractelor pe baza șabloanelor existente (așa-numita automatizare de birou). Plus prezența unei cantități mari de analize și menținerea întregii contabilități de gestiune. Toate acestea au făcut sistemul complet de neînlocuit - transferul tuturor acestor funcționalități la 1C ar fi luat o mulțime de timp și bani.

Pe de altă parte, programul 1C-Enterprise a servit doar nevoilor departamentului de contabilitate pentru menținerea evidenței contabile și contabile și depunerea rapoartelor. Astfel, 1C a fost „dezlegat” de funcționarea zilnică a companiei, iar documentele completate au fost introduse în baza de date a posteriori.

Ce este bun la această schemă? Există mai multe avantaje:
- excluderea managerilor și a altor persoane (i)responsabile din „sfânta sfintelor” - baza de date contabilă, care ar trebui să fie formată numai din angajați care au o înțelegere a subiectului; întreținerea corectă a directoarelor,
- scoaterea din 1C a tot ceea ce nu are legătură cu acesta: de la sarcinile de management care nu necesită reflectare în contabilitate, până la toate celelalte puncte care sunt specifice companiei și la care nu ar trebui să aibă acces cei din afară,
- economii la licențe: stațiile de lucru 1C costă bani semnificativi,
- punct important: atunci când implementați toate funcționalitățile suplimentare descrise mai sus direct „în interiorul” 1C, există o nevoie constantă de îmbunătățire a acesteia atunci când sunt lansate actualizări de produs. Acest lucru, desigur, garantează angajarea aproape constantă a programatorilor 1C, dar acesta este un loc în care puteți economisi semnificativ.

Ei bine, marele minus, desigur, este necesitatea de a verifica toate documentele și de a actualiza directoarele.

De fapt, aceasta a fost sarcina principală - să scapi de munca dublă.

Mai întâi trebuie să vă ocupați de tot felul de directoare - în primul rând, acesta este un director de contractori și articole. Problema sincronizării directoarelor, care apare atât de des în programele de acest fel, a fost suficient de rezolvată și este de înțeles în implementare. Cu toate acestea, în acest caz, a fost luată o decizie puternică de a nu folosi 2 directoare cu sincronizare reciprocă, ci de a avea o versiune inițială - cea introdusă în MS Access și pur și simplu să o reproducă în 1C ( Părere- acesta este doar un semn în MS Access că această poziție a fost deja descărcată).
Această abordare simplifică foarte mult sarcina. Pentru nevoi pur contabile, aveți nevoie de foarte puține poziții în astfel de directoare - și sunt introduse și într-un program extern pentru a nu încălca principiul formulat. În acest fel, puteți elimina încă unul Problemă comună- umflare imensă a cărții de referință a nomenclaturii folosite. Mai jos este grupul de produse „Monitoare”

Încărcarea unei astfel de groază în directorul 1C (și modelele noi de monitoare apar aproape în fiecare săptămână) poate fi configurată astfel încât toate să se încadreze într-o singură poziție, deoarece nuanțele culorii cadrului din jurul ecranului și numărul de pixeli sunt complet nesemnificativ pentru contabilitate! Și, să fiu sincer, dimensiunea diagonalei este cu atât mai mult dacă diferă cu jumătate de inch.

Mai mult, într-un program extern, puteți rezolva fuzionarea pozițiilor duplicate în directoare, în special în directorul contrapărților, cu mult mai puține pierderi, deoarece în 1C acest lucru necesită mult efort.

Astfel, numai datele „rafinate”, curățate și aduse în formă adecvată sunt încărcate în 1C. Descărcarea se poate face cu o oarecare frecvență - porționarea vă permite să depanați activitatea departamentului de contabilitate și să evitați munca inutilă dacă în timpul zilei (sau o perioadă mai lungă) ceva a fost anulat, schimbat, efectuat din nou - toate aceste lucruri se întâmplă în timpul lucrului. Baza de date MS Access și doar „stabilit” „Starea de lucruri este raportată la 1C. În plus, acest tip de descărcare poate fi sincronizat cu operațiunile de backup și poți fi întotdeauna sigur că starea curentă a bazei de date 1C este corectă.

Este clar că documentele ajung fără postare automată (deși aceasta ar putea fi configurată). Apropo, baza de date MS Access verifică în sine disponibilitatea mărfurilor necesare în depozit - pentru anulare pentru expediere (dilema este să vă asigurați că factura poate fi emisă data curenta ca toate articolele necesare pentru anulare sunt in depozit - adica achizitionate sau produse - trebuie... sa postezi documentul in 1C. Aparent, nu ar trebui să încredeți acest lucru managerilor - sau un angajat contabil ar trebui să stea întotdeauna în spatele managerului)

Acum despre implementare. Programele 1C acceptă o interfață de schimb de date prin mecanismul ADO. Pe partea 1C se folosește cel standard interfata software pentru a crea elemente de directoare și documente, astfel încât funcționarea acestui mecanism să nu depindă de detaliile interne ale implementării 1C, care se pot schimba de la versiune la versiune și de la actualizare la actualizare. Pe de altă parte, principalul slogan de dezvoltare a fost „a folosi la maximum capabilitățile 1C acolo unde este posibil”. Prin urmare, în implementarea finală a pachetului, doar numele și TIN-ul contrapărții au fost încărcate din MS Access - datele au fost „extrase” din Registrul de stat unificat al persoanelor juridice și al antreprenorilor individuali folosind mecanismul încorporat în 1C ( același lucru este valabil și pentru detalii bancare– sunt actualizate folosind BIC).

Interogările au fost create într-o bază de date externă MS Access care pregătește toate datele necesare pentru încărcare în 1C - luați-le și aranjați-le în documente și câmpuri.

Schema de descărcare constă din două etape. În primul rând, sunt încărcate noi poziții în directoarele contrapărților și articolelor. GUID-urile alocate lui 1C sunt returnate la MS Access, astfel încât la încărcarea tuturor documentelor din a doua etapă, referințele corecte la directoare pot fi setate. Arata cam asa

Credem că o astfel de ideologie a construcției sisteme de informare poate fi luată ca bază nu numai în acele companii în care există sisteme vechi non-1C, ci și atunci când se organizează munca de noi entitati legale, deoarece avem multă experiență cu MS Access. Avantajele acestei abordări sunt descrise mai sus.

În acest articol vom vorbi despre configurarea drepturilor de acces utilizator la obiectele de sistem 1C.

În 1C 8, pentru a controla accesul utilizatorului, este utilizat un obiect de metadate separat, care este numit Roluri.

Notă! Acest articol a fost scris pentru a ajuta programatorii. Configurarea drepturilor în modul utilizator folosind exemplul 1C Accounting este discutată în.

Un rol definește setul de drepturi pe care le are un utilizator. Mecanismul de rol este foarte asemănător cu mecanismele de drepturi Windows Director activ. Pentru fiecare dintre obiecte (directoare, documente), dezvoltatorul își stabilește propriul set de drepturi - citire / scriere / adăugare / modificare / ...

Set de drepturi disponibile - colectarea tuturor permisiunilor în rolurile de utilizator.

Dacă deschidem obiectul metadate Role, putem vedea următoarea imagine:

Obiectul are două file - Șabloane pentru drepturi și restricții. Drepturi - fila principală, Șabloane - filă pentru setarea drepturilor la nivel de înregistrare în 1C ( RLS). Acesta este un subiect foarte important, pe care voi încerca să îl descriu în articolele viitoare.

Vom lua în considerare doar fila Drepturi.

  • Obiecte— o listă pentru care se vor stabili drepturi.
  • Drepturi— o listă de posibile setări de drepturi pentru setare.
  • Restricționarea accesului la date— câmpuri de rol pentru personalizare

Vă rugăm să acordați atenție casetelor de selectare din partea de jos:

  • Setați permisiunile pentru obiecte noi— dacă marcajul este setat pentru rol, drepturile permisive vor fi setate automat pe noile obiecte de metadate. Recomand să-l instalați dacă uitați adesea să setați drepturi pentru obiecte noi.
  • Setați drepturile pentru detalii și părți tabulare Mod implicit— un steag, atunci când este setat, detaliile și părțile tabelare vor moșteni drepturile proprietarului (director, document etc.)
  • Drepturi independente ale obiectelor subordonate— dacă flag-ul este setat, atunci sistemul va ține cont de drepturile asupra obiectului părinte atunci când stabilește drepturile asupra unui obiect de configurare

Setări de permisiuni pentru întreaga configurație

Dacă deschidem Rol și facem clic pe rădăcina de configurare, vom vedea următoarele setări:

Mai multe detalii despre fiecare drepturi asupra întregii configurații:

Obțineți 267 de lecții video pe 1C gratuit:

  • Administrare— administrare baza de informatii(necesită dreptul de „Administrare a datelor”)
  • Administrarea datelor— dreptul la acțiuni administrative asupra datelor
  • Actualizarea configurației bazei de date- drept spre
  • Modul monopol— utilizarea modului exclusiv
  • Utilizatori activi— vizualizați lista utilizatorilor activi
  • — jurnalul de bord
  • - lansează corect client slab
  • - dreptul de a lansa client web
  • Client gras— dreptul la rolul de lansare a clientului gros
  • Îmbinare exterioară— dreptul de a începe o conexiune externă
  • Automatizare— dreptul de a utiliza automatizarea
  • Modul toate funcțiile— în modul aplicație gestionată
  • Salvarea datelor utilizatorului— permisiunea sau interdicția de a salva datele utilizatorului (setări, favorite, istoric). Acest lucru este valabil mai ales pentru formularele gestionate 1C.
  • Descoperire interactivă tratamente externe — deschiderea prelucrării externe
  • Deschiderea interactivă a rapoartelor externe— deschiderea rapoartelor externe
  • Concluzie— imprimarea, înregistrarea și copierea în clipboard

Configurarea drepturilor 1C 8.2 pentru alte obiecte de metadate

Pentru alte obiecte principale (directoare, constante, documente, registre...), setul de drepturi pentru rol este destul de standard:

  • Citind- citire (software)
  • Plus- adăugarea (software)
  • Schimbare- schimbare (software)
  • Îndepărtarea- eliminare (software)
  • Vedere— vedere
  • Adăugarea interactivă- adaos interactiv
  • Editare— editare
  • Steagul de ștergere interactiv— marcaj interactiv pentru ștergere
  • Demarcați interactiv ștergerea— demarcarea pentru ștergere
  • Eliminarea interactivă a marcatelor— ștergerea obiectelor marcate
  • Intrare de linie— folosind modul de intrare linie
  • Eliminare interactivă— ștergere directă (shift +del)

Drepturi numai pentru documente:

  • Dirijare interactivă— efectuarea
  • Anulare— anularea documentelor
  • Dirijare interactivă non-operativă— deținerea (cu comenzi de formular standard) a unui document în modul neoperațional
  • Anulare interactivă— anulare interactivă
  • Schimbarea interactivă a cheltuirii— editarea documentului postat. Dacă dreptul rolului nu este setat, utilizatorul nu poate șterge un document postat, nu poate seta un marcaj de ștergere, îl poate retrimite sau îl poate neîncărca. Forma unui astfel de document se deschide în modul de vizualizare

P.S. Dacă tot nu vă puteți da seama de rolurile utilizatorului, puteți comanda .
Videoclip cu un exemplu de configurare a drepturilor în 1C Accounting 3.0:

Acțiune