Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Access 2013/makro - Brak automatycznego ID w formularzu podrzędnym

strzyga85 26 Lut 2014 13:56 2391 20
  • #1 26 Lut 2014 13:56
    strzyga85
    Poziom 8  

    Witam,
    Próbuję poradzic sobie z tym problemem już jakiś czas i nikt nie jest w stanie mi pomódz. Problem polega na tym, że wywołując podformularz z przycisku wyświetlany powienien byc rekord pokrewny do tego z formularza głównego. Zależność jest OK jeżeli rekord pokrewny jest przypisany ale jeżeli np chodzi dla wartości pokrewnych dla nowego rekordu w formularzu głównym Id wynosi 0.
    Niestety nie wkleje kodu VB bo oczywiście przy konewertowaniu makra osadzonego występuje jakiś problem z jego otwarciem i Access wyrzuca nazwę procedury bez jego składni. Więc wklejam XML i dorzucam bazę.

    Kod: xml
    Zaloguj się, aby zobaczyć kod

    0 20
  • #2 26 Lut 2014 14:59
    mickpr
    Poziom 39  

    strzyga85 napisał:
    Problem polega na tym, że wywołując podformularz z przycisku wyświetlany powienien byc rekord pokrewny do tego z formularza głównego. Zależność jest OK jeżeli rekord pokrewny jest przypisany ale jeżeli np chodzi dla wartości pokrewnych dla nowego rekordu w formularzu głównym Id wynosi 0.
    Nie wiem czy o to chodzi, ale nowy rekord przed jego dodaniem nie ma jeszcze wygenerowanego (autonumer) ID. Źle do tego podchodzisz.
    Skoro podformularz można anulować (esc, zamknięcie krzyżykiem itd), to dobrze by było żeby aktualizacja bazy wykonywała się PO ZATWIERDZENIU go. Niestety metoda którą wybrałeś do tego się nie sprawdzi.
    Teoretycznie mógłbyś wyliczyć sobie autonumer (Max(kolumnaID)+1), ale nie zawsze to jest prawdą. Jeśli dodasz rekord i usuniesz go - autonumer nie będzie równał się Max(kolumnaID)+1.

    Co do przekazywania argumentów między formularzami wykorzystaj np. argument OpenArgs

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #3 26 Lut 2014 15:55
    strzyga85
    Poziom 8  

    Moja idea polegała na tym że.
    1. jak wywołam formularz podrzędny to w głównym nie wyrzuci mnie znów na pierwszy rekord w formularzy głównym po zamknięciu form, tylko dzięki zmiennej tymczasowej zostanę na tym samym rekordzie
    2. id wyrobu powinno być pobierane z formularza głównego [frmKatalog] i przypisywane w formularzu podrzędnym [frmObróbka] co za tym idzie w tabeli [tblObróbka] dzieki relacjom zostaje dopisany [IdIdsWyrobu]. W taki o to piękny sposób zostanie zaautomatyzowany proces uzupełnienia danych a nie jak jest do tej pory dla starych wartości wszystko jest Ok a dla nowych trzeba ręcznie przypisywać [IdIdsWyrobu]

    Dodano po 15 [minuty]:

    Cała zabawa polega na tym, że jeżeli podformularz jest wywołany przez przycisk to nie mam sprzeżenia a jeżeli jest umiejscowiony w formularzu głównym to nie ma problemu bo operuje sie na tym samym [IdIdsWyrobu] ale formularze opierają sie na osobnych tabelach i to dla niech generowane jest osobne ID, które jest zarazem kluczem, tzn. [tblKatalog]![IdIdsWyrobu] i [tblObróbka]![IdIdsObróbki].

    0
  • #4 26 Lut 2014 16:00
    mickpr
    Poziom 39  

    strzyga85 napisał:
    1. jak wywołam formularz podrzędny to w głównym nie wyrzuci mnie znów na pierwszy rekord w formularzy głównym po zamknięciu form, tylko dzięki zmiennej tymczasowej zostanę na tym samym rekordzie
    Co za problem, wystarczy nie odświeżać formularza lub zapamiętać wybór (zwykła zmienna) i odtwarzać po powrocie z podformularza.

    strzyga85 napisał:
    2. id wyrobu powinno być pobierane z formularza głównego [frmKatalog] i przypisywane w formularzu podrzędnym [frmObróbka] co za tym idzie w tabeli [tblObróbka] dzieki relacjom zostaje dopisany [IdIdsWyrobu]. W taki o to piękny sposób zostanie zaautomatyzowany proces uzupełnienia danych a nie jak jest do tej pory dla starych wartości wszystko jest Ok a dla nowych trzeba ręcznie przypisywać [IdIdsWyrobu]
    (Prawie) zawsze szerokim łukiem omijam oferowane przez Ms "ułatwienia" - bo w 90% przypadków mają się jak "ni przypiął, ni przyłatał" do rzeczywistości.
    Relacje fajna rzecz - można się pochwalić przed znajomymi, pokazać fajne diagramy, ale w 80% wolę osobiście dbać o relacje - niż nakładać sobie kagańce (relacje, więzy integralności itd). Sam, wiem co robię - i sam mogę sobie dać w pysk jak coś sknocę.. i nie mam powodu wkurzać się na Ms, że coś spartolił.

    Dodano po 4 [minuty]:

    strzyga85 napisał:
    Cała zabawa polega na tym, że jeżeli podformularz jest wywołany przez przycisk to nie mam sprzeżenia a jeżeli jest umiejscowiony w formularzu głównym to nie ma problemu bo operuje sie na tym samym [IdIdsWyrobu] ale formularze opierają sie na osobnych tabelach i to dla niech generowane jest osobne ID, które jest zarazem kluczem, tzn. [tblKatalog]![IdIdsWyrobu] i [tblObróbka]![IdIdsObróbki].
    Możesz zrezygnować z automatycznego generowania ID, jeśli ci to przeszkadza. Zrób sobie klucz na bazie wartości liczbowej unikalny itd... ale sam o niego dbaj. Wtedy tego problemu nie będzie (ale zawsze będziesz musiał o niego dbać sam).

    0
  • #5 26 Lut 2014 21:17
    strzyga85
    Poziom 8  

    Mickpr doskonale Cię rozumiem ale mi nie o to chodzi. Raczj o to żeby MS Access otwierał podformularz oparty na tabeli [tblObróbka], generowal [IdIdsObróbki] ale też pobierał z formularza [frmKatalog, który jest zarazem otwarty, [IdIdsWyrobu] dla którego ma dotyczyć dany rekord.

    1
  • #6 27 Lut 2014 08:12
    PRL
    Poziom 33  

    Prześlij sobie tę wartość przez zmienną globalną.

    Dodano po 1 [godziny] 25 [minuty]:

    Cytat:
    Tyle, że kolega w zasadzie nie używa (nie widzę w przesłanej bazie) kodu VBA.


    Dobrze, że chociaż Akcesa używa.;)

    A do Autora:
    Dodaj moduł, a w nim
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    i za jej pomocą przekaż sobie potrzebne dane z formularza nadrzędnego do podrzędnego.

    0
  • #7 27 Lut 2014 09:37
    strzyga85
    Poziom 8  

    Zadeklarowałem w module zmienną le powiem szczerze że nie wiem za bardzo jak ją wykorzystać w formularzu. Liczyłem na bardziej"łopatologiczną" podpowiedź.

    0
  • #8 27 Lut 2014 09:51
    PRL
    Poziom 33  

    Pisze z komorki. Meczarnia;)
    W form. nadrzednym, przy klinieciu przycisku otwirajacym podrzedny TwojaZmienna = IdCzegos.
    W podrzednym IdCzegos = TwojaZmienna.

    0
  • #9 27 Lut 2014 10:55
    strzyga85
    Poziom 8  

    Nie wiem czy o to chodziło ale nie działa.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #10 27 Lut 2014 14:02
    PRL
    Poziom 33  

    Formularz nadrzędny:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    A w formularzu podrzednym, w miejscu gdzie to powinno się znaleźć (nie wiem, bo nie mam możliwości otwarcia Twojego załącznika) np.:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Jeżeli chcesz bardziej łopatologicznie, to zapisz swój projekt do formatu 2007 i podeślij, gdyż to, co napisałem, to teoria.

    0
  • #12 03 Mar 2014 14:21
    PRL
    Poziom 33  

    Uwaga (dotycząca tego tematu) jest jedna.
    Otwieraj formularza korzystając z

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    a nie za pomocą makr. Tak jest przejrzyście i wygodnie.

    W załączniku to, o co prosiłeś.

    0
  • #13 03 Mar 2014 14:54
    PRL
    Poziom 33  

    P.S. Zapomniałem, że miało być łopatologicznie.

    Formularz główny, przycisk 'Obróbka', zdarzenie 'przy kliknięciu' - procedura zdarzenia.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #14 03 Mar 2014 15:12
    strzyga85
    Poziom 8  

    Akurat na to wpadłem już sam trochę wcześniej (oczywiście nie pomniejszając Ci zasług), tylko że to nie działa, bo jeżeli dla ID wyrobu 9 i 13 w tblObróbka ręcznie przypisałem IDWyrobu to dla 14 IdWyrobu wynosi null a powinno być 14, przegladając i edytując dane w formularzu oczywiście.

    0
  • #15 03 Mar 2014 15:28
    PRL
    Poziom 33  

    A skąd aplikacja ma wiedzieć kiedy i w jaki sposób ma dodać pozycje w tabeli 'Obrobka'?
    W formularzu 'frmKatalog' musisz (dodając rekord w nim, dodać powiązany z nim rekord w tblObróbka.

    Namalowałeś relacje, a się nich nie trzymasz...

    0
  • #16 03 Mar 2014 15:54
    strzyga85
    Poziom 8  

    W takim razie zostają mi dwie opcje (jeżeli dobrze rozumiem):
    1. abo dodac przycisk w frmObróbka "Nowy" który przypisze IdIdsWyrobu
    2. albo przy wprowadzaniu nowego rekordu w frmKatalog, automatycznie utworzy powiązany rekord w tblObróbka używając

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #17 03 Mar 2014 15:57
    PRL
    Poziom 33  

    Cytat:
    albo przy wprowadzaniu nowego rekordu w frmKatalog, automatycznie utworzy powiązany rekord w tblObróbka

    O to chodzi Kolego.

    0
  • Pomocny post
    #18 04 Mar 2014 03:00
    PRL
    Poziom 33  

    Możesz zrobić tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #19 04 Mar 2014 12:33
    strzyga85
    Poziom 8  

    Wielkie dzięki. Działa ale występuje komunikat z pytaniem "czy dodac wiersz w tabeli w ilości 1" a chciałbym go uniknąć.Chciałbym aby osoby które korzystają z bazy miały do dyspozycji tylko interfejs a nie zajmowały się jeszcze akceptacją procesów, które powinny być zautomatyzowane.
    Nie ma może czegoś w rodzaju:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #21 10 Mar 2014 16:55
    strzyga85
    Poziom 8  

    Witam,
    Mam kolejny problem z aplikacją.
    1. Odwołując się do kodu

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    stworzyłem coś co wogóle nie działa (w sumie sie nie dziwie bo VB to kiedyś tam na studiach i to podstawy), miało dodać IdIdsWyrobu do kilu tabel
    Kod: vb
    Zaloguj się, aby zobaczyć kod



    2.frmWłaściwości jest formularzem nawigacji i jest problem z powiązaniem [frmWłaściwości].[IdIdsWyrobu]=[Me]!(IdIdsWyrobu] pomimo że w właściwościach zakładek formularza ustawiłem "klauzula WHERE nawigacji" wartość: "[IdIdsWyrobu]"=[Me].[IdIdsWyrobu]

    0