legatura între Tabele si Formulare

Informatii despre cum se utilizeaza Microsoft Access 2003. Baze de date, Interogari, Formulare, Rapoarte, etc
Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Re: legatura între Tabele si Formulare

Mesaj de dinu » Joi Aug 26, 2010 5:42 pm

Primul lucru la un formular este sa i se stabileasca niste proprietati de aspect.
Se deschide formularul in Design View. Dublu-Click pe patratelul din Stanga-Sus a ferestrei formularului, si se deschide fereatra de proprietati a acestuia.
In fereastra de proprietati, tabul Format in general sant necesare de vazut numai urmatoarele proprietati (ele pot fi schimbate si cu dublu-click pe valorile cu care apar in fereastra):
Caption - Titlul ferestrei.
Default View - O fereastra poate sa aibe mai multe vizulizari. Ca o fereastra asa cum incercati dvs sa o proiectati (Single Form), ca mai multe formulare unul sub altul care pot fi parcurse cu o bara de derulare (Continuous Forms), exact ca un tabel (Data Sheet), ca un PivotTable, sau ca un grafic. Aceasta proprietate stabileste vizualizarea normala default a ferestrei atunci cand e deschisa fara nici o optiune pentru vizualizare.
Allow Form/Datasheet/PivotTable/PivotChart View - Stabilesc care vizualizari sunt permise si care nu pentru fereastra.
Scroll Bars - Cum sant folosite barele de derulare ca sa nu incurce.
Record Selectors, Navigation Buttons, si Dividing Lines fac ca o fereastra sa apara ca o inregistrare. O ferestra clasica are False pentru aceste proprietati.
Auto Resize nu l-am inteles.
Border Style - stabileste daca fereastra sa aibe border (chenar), daca sa aibe border redimensionabil (tragand de el) sau nu, sau cu border si modala. In legatura cu a fi sau nu modala este si proprietatea Modal din tabul Other al ferestrei de proprietati, de vazut in Help unde sunt prezentate amandoua.
Min Max Buttons si Close Button - ce butoane sa aibe fereastra.

Un Query poate fi folosit exact ca un tabel, o diferenta ar fi daca inregistrarile pot fi modificate sau nu. Acest lucru poate fi stabilit si la nivelul formualrului (inregistrarii) sau al unui control (un ComboBox de exemplu).
Printr-o interogare de selectie se pot modificarea inregistrarile din tabelul de baza, atentie!

Pentru adaugarea in lista a unor noi Nume/Prenume puteti sa incercati tratarea evenimentelor BeforeUpdate ale celor doua ComboBox-uri din formular. Pentru asta se poate porni si din tabul Event al ferestrei de proprietati.

Cod: Selectaţi tot

Private Sub Nume_Angajat_BeforeUpdate(Cancel As Integer)
   Dim rst As Recordset
   
   If Nume_Angajat.ListIndex = -1 Then
      If MsgBox("Un nou Nume nu a fost recunoscut." & vbflcr & _
                "Doriti sa il adaugati in lista?", vbOKCancel, "Nou Nume") = vbCancel Then Exit Sub
      
      Set rst = CurrentDb.OpenRecordset("Denumire_Nume", dbOpenDynaset) 'dbOpenTable
         'Dynaset e bun nu numai pentru tabele ci si pentru interogari
      
'      rst.EditMode = adEditAdd 'sau
      rst.AddNew
         rst.Fields("Nume") = Nume_Angajat.Text
      rst.Update
      rst.Close 'Asta nu stiu daca este neaparat necesara
      
      Nume_Angajat.Requery
   End If
End Sub

Private Sub Prenume_Angajat_BeforeUpdate(Cancel As Integer)
   Dim rst As Recordset
   
   If Prenume_Angajat.ListIndex = -1 Then
      If MsgBox("Un nou Prenume nu a fost recunoscut." & vbflcr & _
                "Doriti sa il adaugati in lista?", vbOKCancel, "Nou Nume") = vbCancel Then Exit Sub
      
      Set rst = CurrentDb.OpenRecordset("Denumire_Prenume", dbOpenDynaset)
      
'      rst.EditMode = adEditAdd 'sau
      rst.AddNew
         rst.Fields("Nume") = Prenume_Angajat.Text
      rst.Update
      rst.Close
      
      Prenume_Angajat.Requery
   End If
End Sub
Daca Numele/Prenumele introdus nu face parte din lista, operatorul este intrebat daca doreste adaugarea lui in lista sau nu.

Access spre deosebire de celelalte programe Office foloseste doua bblioteci de tipuri. Biblioteca Access, si o biblioteca pentru lucrul cu datele.
In Access sunt posibile doua tipuri de aplicatii:
1) Locale (si nu numai), numite de tip Jet SQL Engine (sau ODBC !?!), care folosesc pentru lucrul cu datele biblioteca de tipuri DAO.
2) De retea, numite de tip "data access page", care folosesc pentru lucrul cu datele biblioteca ADO. In legatura cu care eu nu am nici un fel de experienta.
Dumneavoastra ati mers pe a doua varianta, si nu stiu in ce masura poate sa functioneaze bine ce am incercat eu.

Fara stabilirea proprietatii Limit to List (= False), din tabul Data al ferestrei de proprietati a ComboBox-urilor, sant permise si nume/prenume care nu se regasesc in acele tabele. Dvs ati lasat-o asa, proprietatea trebuie stabilita la True. Solutia mea incearca sa rezove problema inainte de a se declansa o eventuala eroare din aceasta cauza.

Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Re: legatura între Tabele si Formulare

Mesaj de dinu » Joi Aug 26, 2010 6:10 pm

Asa cum ati facut dvs in toate celelalte tabele sunt inregistrate numele/prenumele, ca atare, sub forma de siruri de caractere.
Daca se doreste schimbarea unui nume, el trebuie schimbat peste tot pe unde a fost folosit.

Se poate ca sa asociati ID-uri (numere intregi Long, eventual atribuite automat) pentru fiecare Nume sa zicem.
Si in toate celelalte locuri unde sunt inregistrate Numele sa fie inregistrate defapt numere - ID-urile - si din tabele pana la interogari sa fie afisate/prezentate/vizibile sirurile respective de caractere ale numelor.
Simpla schimbare a unui nume in tabelul de baza (tabelul cu numele) l-ar actualiza instantaneu peste tot pe unde a fost folosit.
Pentru asta trebuie ca campul respectiv din tabel sa fie definit ca Lookup Column. Adica din tabul al doilea de proprietati sa ii fie stabilit un ComboBox ca "dispozitiv" de introducere a datelor. Comboul sa aibe cel putin doua coloane - ID si nume/prenume - prima coloana sa fie ID-ul si sa aibe latimea zero. Acest mic artificiu realizeaza ce am spus mai sus. Si poate fi realizat chiar mai usor de acolo de unde se stabileste tipul de date al campului (Text, Numer, Yes/No), daca este ales "tipul de date" Lookup Column.

Ei! Pentru asta poate trebuie ceva mai multa experienta pentru a putea lucra cu incredere cu tabele, pentru a obtine numele in locul numerelor daca nu apar, si alte treburi de acest tip.
Ce am vrut sa spun este ca se poate avea incredere in aceste jonctiuni dintre tabele bazate pe ID-uri pentru ca ruleaza ultra-rapid, ca si cum nu ar fi.

adof
Mesaje: 466
Membru din: Mie Iul 14, 2010 12:42 pm
Localitate: Sibiu

Re: legatura între Tabele si Formulare

Mesaj de adof » Joi Aug 26, 2010 9:23 pm

mulţumesc pt raspuns

acuma am de citit şi de experimentat în baza de date :)

Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Re: legatura între Tabele si Formulare

Mesaj de dinu » Vin Aug 27, 2010 1:03 pm

Eu cred ca numele si prenumele ar trebui sa fie inregistrate impreuna intr-o singura coloana.
Dar pentru siguranta pentru ca numele sa fie primul, ele pot sa fie introduse separat numai in formular in niste TextBox-uri care sa nu fie asociate la nici o coloana. Si prin VBA, din formular, sa fie inregistrate cum trebuie in tabel.

adof
Mesaje: 466
Membru din: Mie Iul 14, 2010 12:42 pm
Localitate: Sibiu

Re: legatura între Tabele si Formulare

Mesaj de adof » Sâm Aug 28, 2010 2:36 pm

nu e bine într-o singură coloană
deoarece am pe cineva care are 3 prenume, iar în tabelele pe care le fac folosec un singur prenume deaia în baza de date construita separat de cea pusă pe forum am asa
Nume
Prenume
Prenume folosit
Funcţie
Funcţie pe care lucrează

în unele tabele folosesc funcţiile pe care sunt încadraţi iar în altele funcţiile pe care lucrează (în românia e posibil)

Şi acum O ÎNTREBARE

se pot construi relatii între Tabele şi Query ?
nu am vazut în nici un exemplu cum se fac aceste relaţii dacă se pot face
am vazut numai între Tabele

Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Re: legatura între Tabele si Formulare

Mesaj de dinu » Dum Aug 29, 2010 5:32 pm

Aveti dreptate, e mai usor pana la urma de memorat numele si prenumele separat pe doua coloane, dar cum pot fi foarte multe variatii nu stiu dece ar trebui sa fie alese dintr-o lista.
Uitati cum as face eu,
Incercari.mdb
Am modificat baza de date ca sa nu mai fie o "data access page" si sa foloseasca motorul Jet SQL din biblioteca DAO.
Asta se stabileste atunci cand este creata baza de date, cu click pe butonul New (Data Base) si alegand din Task Pane prima sau a doua optiune.
Probabil ca si extensia fisierului ar fi trebuit sa difere.


Se pot stabili relatii si intre tabele si interogari. In fereastra Tools > Relationships..., faceti click-dreapta si alegeti Show Table.
In fereastra Show Table sant trei taburi, cu tabelele, cu interogarile, si cu toate tabelele si interogarile. Se pot stabili relatii si intre tabele/interogari si interogari.
Pot fi formulare si subformulare, lafel si rapoarte, indiferent daca sant bazate pe tabele sau interogari.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

adof
Mesaje: 466
Membru din: Mie Iul 14, 2010 12:42 pm
Localitate: Sibiu

Re: legatura între Tabele si Formulare

Mesaj de adof » Sâm Sep 04, 2010 11:16 pm

sal
ce relaţie trebuie sa fac intre tabele ca atunci când scriu anul la un agajat sa apară la toţi angajaţii

la fel sa apara şi la lunile anului cu pontajul

sau atunci când scriu anul sa apară la toţi angajatii deodată şi cu toate 12 lunile pt fiecare angajat

atasez fisierul
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Avatar utilizator
dinu
Mesaje: 158
Membru din: Lun Mar 08, 2010 2:48 pm

Re: legatura între Tabele si Formulare

Mesaj de dinu » Lun Sep 06, 2010 11:03 am

Adica fiind trei tabele - Angajati, AniDePontaj, si LuniDePontaj.
Pentru fiecare angajat ar fi mai multe inregistrari cu ani de pontaj in tabelul AniDePontaj. Si
pentru fiecare inregistrare AnDePontaj_Angajat ar fi mai multe inregistrari cu lunile de pontaj in tabelul LuniDePontaj?

Daca e asa probabil ca va trebuie o procedura ca aceasta,

Cod: Selectaţi tot

Private Sub IncarcaInregistrariAn(Anul As Integer)
   Dim Ln As Integer
   Dim rsAngs As Recordset, rsPAni As Recordset, rsPLni As Recordset
   
   Set rsAngs = CurrentDb.OpenRecordset("TabelulCuAngajatii", dbOpenTable)
'   Set rsPAni = CurrentDb.OpenRecordset("TabelulCuPontajeAni", dbOpenTable)
                     'tabelul asta e folosit direct de RunSQL
   Set rsPLni = CurrentDb.OpenRecordset("TabelulCuPontajeLuni", dbOpenTable)
   Do Until rsAng.EOF
      DoCmd.RunSQL ("INSERT INTO TabelulCuPontajeAni (Angajatul, Anul) " & _
                    "VALUES (" & rsAng.Fields!ID & ", " & Anul & ")")
            'Incarca inregistrarea anului pentru angajat
      
      For Ln = 1 To 12
         With rsPLni
            .AddNew
               .Fields("Angajatul") = rsAng.Fields!ID
                                 'sau rsAng.Fields("ID"), e acelasi lucru
               .Fields("Anul") = Anul
               .Fields("Luna") = Ln
            .Update
         End With
      Next
   Loop
End Sub
Eu nu am folosit niciodata relatii intre tabele, de tipul celor care ar sterge toate inregistrarile din tabelele respective daca ar fi sters un angajat, din tabelul cu angajati. Nu stiu daca se poate stanili o relatie care sa adauge inregistrari atunci cand ar fi adaugat un angajat.

Sant doua tipuri de interogarii Append, cautati "INSERT", sau "Append", in Helpul Access-ului.

adof
Mesaje: 466
Membru din: Mie Iul 14, 2010 12:42 pm
Localitate: Sibiu

Re: legatura între Tabele si Formulare

Mesaj de adof » Lun Sep 13, 2010 11:52 am

mulţumesc
va trebui până la urmă sa ma apuc de VBA
vad ca toate lucră în VBA
Exel
Access
Autocad

adof
Mesaje: 466
Membru din: Mie Iul 14, 2010 12:42 pm
Localitate: Sibiu

Re: legatura între Tabele si Formulare

Mesaj de adof » Mie Sep 15, 2010 4:03 pm

în Access se poate extrage data nasterii din CNP ca şi în Exel ?

Închis

Înapoi la “Intrebari despre Access 2003”