MS ACCESS - Jak w kodzie VBA połączyć dwa zapytania w jednym recordsecie?

Odpowiedz Nowy wątek
2019-05-10 13:27
0

Cześć - taki problem. Mam pewien kod (poniżej). Czy jest opcja żeby przerobić to tak, żeby nie pisać za każdym razem tego: "dim rst5 as dao.recordset" tylko zrobić jakiś globalny recordset? Po aktualizacji jednego pola ma wykonać się wiele zapytań sqlowych i średnio mi się widzi robić 10x deklaracje, seta, zamykanie. Da się to uprościć?

Private Sub wpr_krotkaNazwaProjektu_AfterUpdate()
Dim rst4 As DAO.Recordset
Dim rst5 As DAO.Recordset
Dim strSql4 As String
Dim strSql5 As String
Dim krotkaNazwaProjektu4 As String
Dim krotkaNazwaProjektu5 As String

krotkaNazwaProjektu4 = wpr_krotkaNazwaProjektu.Text
krotkaNazwaProjektu5 = wpr_krotkaNazwaProjektu.Text

strSql4 = "SELECT Ewidencje.E_dataRozpoczeciaProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu4) & "' "
strSql5 = "SELECT Ewidencje.E_dataPlanowaneZakonczenieProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu5) & "' "

Set rst4 = CurrentDb.OpenRecordset(strSql4)
Set rst5 = CurrentDb.OpenRecordset(strSql5)

przypisanie4 = rst4!E_dataRozpoczeciaProjektu
przypisanie5 = rst5!E_dataPlanowaneZakonczenieProjektu

rst4.Close
Set rst4 = Nothing
rst5.Close
Set rst5 = Nothing

wpr_planowanaDS.Value = przypisanie4
wpr_planowanaDZ.Value = przypisanie5
End Sub
Może po prostu zrób pętlę i wywołuj w niej poszczególne działania na tych samych zmiennych. - dbuser 2019-05-10 13:56

Pozostało 580 znaków

2019-05-10 13:58
2

Z tego co pokazujesz to nie wiem dlaczego ma sie to robić 2 razy, bo można zrobić 1, kod robiacy dokładnie to samo co Twój:

Private Sub wpr_krotkaNazwaProjektu_AfterUpdate()
    Dim rst As DAO.Recordset
    Dim strSql As String
    Dim krotkaNazwaProjektu As String

    krotkaNazwaProjektu = wpr_krotkaNazwaProjektu.Text

    strSql = "SELECT Ewidencje.E_dataRozpoczeciaProjektu, Ewidencje.E_dataPlanowaneZakonczenieProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu) & "' "

    Set rst = CurrentDb.OpenRecordset(strSql)

    wpr_planowanaDS.Value = rst!E_dataRozpoczeciaProjektu
    wpr_planowanaDZ.Value = rst!E_dataPlanowaneZakonczenieProjektu

    rst.Close
    Set rst = Nothing

End Sub
Rozumiem odpowiedź, jednak gdybyś mógł odpowiedzieć stricte na moje. Czy da się to zrobić w taki sposób jak zapytałem? - Tomasz Papryka 2019-05-10 14:02

Pozostało 580 znaków

2019-05-10 14:03
0

Chodzi Ci o to żeby zmienna rst5 była dostępna z poziomu innych makr? Wtedy poza funkcją (najlepiej góra modułu):

Public rst5 As DAO.Recordset
edytowany 1x, ostatnio: JustCuzICan, 2019-05-10 14:03

Pozostało 580 znaków

2019-05-10 14:16

Rozumiem odpowiedź, jednak gdybyś mógł odpowiedzieć stricte na moje. Czy da się to zrobić w taki sposób jak zapytałem?

No możesz korzystać z jednej zmiennej ale wtedy musisz zmienic kolejność, pobieram-> zapisuje->zamykam

Private Sub wpr_krotkaNazwaProjektu_AfterUpdate()
    Dim rst As DAO.Recordset
    Dim strSql As String
    Dim krotkaNazwaProjektu4 As String
    Dim krotkaNazwaProjektu5 As String

    krotkaNazwaProjektu4 = wpr_krotkaNazwaProjektu.Text
    krotkaNazwaProjektu5 = wpr_krotkaNazwaProjektu.Text

    strSql = "SELECT Ewidencje.E_dataRozpoczeciaProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu4) & "' "
    Set rst = CurrentDb.OpenRecordset(strSql)
    przypisanie4 = rst!E_dataRozpoczeciaProjektu
    rst.close

    strSql = "SELECT Ewidencje.E_dataPlanowaneZakonczenieProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu5) & "' "
    Set rst = CurrentDb.OpenRecordset(strSql)
    przypisanie5 = rst!E_dataPlanowaneZakonczenieProjektu

    rst.Close
    Set rst = Nothing

    wpr_planowanaDS.Value = przypisanie4
    wpr_planowanaDZ.Value = przypisanie5
End Sub

Samo w sobie mija się to z celem, to moment by wodrębnić powtarzający się kod do funkcji:

Private Sub wpr_krotkaNazwaProjektu_AfterUpdate()
    Dim strSql As String
    Dim krotkaNazwaProjektu4 As String
    Dim krotkaNazwaProjektu5 As String

    krotkaNazwaProjektu4 = wpr_krotkaNazwaProjektu.Text
    krotkaNazwaProjektu5 = wpr_krotkaNazwaProjektu.Text

    strSql = "SELECT Ewidencje.E_dataRozpoczeciaProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu4) & "' "
    przypisanie4 = cDLookup(strsql)

    strSql = "SELECT Ewidencje.E_dataPlanowaneZakonczenieProjektu from Ewidencje INNER JOIN KP_KartyProjektow on Ewidencje.ID_kartyProjektu = KP_KartyProjektow.ID_kartyProjektu WHERE KP_KartyProjektow.KP_krotkaNazwaProjektu = '" & (krotkaNazwaProjektu5) & "' "
    przypisanie5 =  = cDLookup(strsql)

    wpr_planowanaDS.Value = przypisanie4
    wpr_planowanaDZ.Value = przypisanie5
End Sub
Function cDLookup(byval sql as string) as string
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset(sql)
    cDLookup = nz(rst.Fields(0).Value,"")

    rst.Close
    Set rst = Nothing
End Function

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0