Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > DlookUp на данных первого DLookUp показывает Null


Автор: GalinaLina 17.10.2017, 14:31
Привет народ!

Я не имею опыта работы с vba в access, потому очень надеюсь на вашу помощ.

У меня имеется главна таблица SendDaten, которая состоит из множества столбцов и 818 строк. В нее мне надо подтянуть данные из других таблиц (что я делаю при помощи функции DLookUp, которую вписываю между .Edit и .Update) и вот потом на основании данных,которые записались в мою таблицу SendDaten после .Update мне нужно написать еще один DLookUp критериями которого являются новые заполненные поля из таблицы SendDaten.

Что-то явно идет не так, поскольку критерии при наведении на них курсора отображаются, но результат функции = NULL. smile 
Что я делаю не так?

Вот код:

Код

Function Transportkostenberechnung()
'Funktion ermittelt die Transportkosten
'Variablen der Funktion festlegen
Dim Snd_land As String
Dim Snd_Ort_M As String
Dim snd_plz_M As Double
Dim empf_land As String
Dim empf_ort As String
Dim empf_plz As Double
Dim ldm As Double
Dim brgew As Double
Dim tbl_ZuordnGeb As DAO.Recordset
Dim gebietsnr As Double
Dim tbl_ZuordnZielreg As DAO.Recordset
Dim zielreg As Double


Dim db As DAO.Database

Dim tbl_SendDaten As DAO.Recordset

Set db = CurrentDb()

Set tbl_SendDaten = db.OpenRecordset("Sendungsdat", dbOpenDynaset)
Set tbl_ZuordnGeb = db.OpenRecordset("Zuordnung_Gebiet", dbOpenDynaset)
Set tbl_ZuordnZielreg = db.OpenRecordset("Zuordnung_Zielregion", dbOpenDynaset)

Dim volumengewicht As Double
Dim frachtpfl_gew As Double
Dim frachtpfl_gew1 As Double
Dim frachtpfl_gew2 As Double
Dim Lademeter As Double
Dim Zielregname As String
Dim Gebietsnummer As Double
Dim Transportmodus As String
Dim LGZuschl As Double



    
    tbl_SendDaten.MoveFirst

    Do Until tbl_SendDaten.EOF = True
    'Gewichte berechnen
             volumengewicht = tbl_SendDaten.Fields("Lademeter") * 1500
             brgew = tbl_SendDaten.Fields("brgew")
    'Gewichte aufrunden
             frachtpfl_gew1 = -100 * Int(volumengewicht / -100)
             frachtpfl_gew2 = -100 * Int(brgew / -100)
    'Gewichtsprьfung and display
                 If tbl_SendDaten.Fields("volumengewicht") > tbl_SendDaten.Fields("brgew") Then
    
                     tbl_SendDaten.Edit
                     tbl_SendDaten.Fields("volumengewicht") = volumengewicht
                     tbl_SendDaten.Fields("frachtpfl_gew") = frachtpfl_gew1
        
                          If frachtpfl_gew1 < 20001 Then
                          tbl_SendDaten.Fields("Transportmodus") = "LTL"
                          Else
                          tbl_SendDaten.Fields("Transportmodus") = "FTL"
                          End If
        

        tbl_SendDaten.Fields("gebietsnr") = DLookup("[Gebietsnummer]", "Zuordnung_Gebiet", "Land = '" & tbl_SendDaten.Fields("Empf_Land") & "' and PLZ_min <= " & Val(tbl_SendDaten.Fields("Empf_PLZ")) & " and PLZ_max >= " & Val(tbl_SendDaten.Fields("Empf_PLZ")) & "")
        Debug.Print DLookup("[Gebietsnummer]", "Zuordnung_Gebiet", "Land = '" & tbl_SendDaten.Fields("Empf_Land") & "' and PLZ_min <= " & Val(tbl_SendDaten.Fields("Empf_PLZ")) & " and PLZ_max >= " & Val(tbl_SendDaten.Fields("Empf_PLZ")) & "")
        
        tbl_SendDaten.Fields("zielreg") = DLookup("[Zielregion]", "Zuordnung_Zielregion", "PLZ = " & tbl_SendDaten.Fields("Snd_PLZ_M") & " and Stadt = '" & tbl_SendDaten.Fields("Snd_Ort_M") & "'")
        Debug.Print DLookup("[Zielregion]", "Zuordnung_Zielregion", "PLZ = " & tbl_SendDaten.Fields("Snd_PLZ_M") & " and Stadt = '" & tbl_SendDaten.Fields("Snd_Ort_M") & "'")
        tbl_SendDaten.Update
        
                Zielregname = tbl_SendDaten.Fields("zielreg")
                Gebietsnummer = tbl_SendDaten.Fields("gebietsnr")
                Transportmodus = tbl_SendDaten.Fields("Transportmodus")
                
                If tbl_SendDaten.Fields("Transportmodus") = "LTL" Then
                tbl_SendDaten.Edit
                tbl_SendDaten.Fields("LGZuschl") = DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                Debug.Print DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                tbl_SendDaten.Update
                Else
                tbl_SendDaten.Edit
                tbl_SendDaten.Fields("LGZuschl") = DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                Debug.Print DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                tbl_SendDaten.Update
                End If
                tbl_SendDaten.MoveNext

        
    Else
    
        tbl_SendDaten.Edit
        tbl_SendDaten.Fields("volumengewicht") = volumengewicht
        tbl_SendDaten.Fields("frachtpfl_gew") = frachtpfl_gew2
        
               If frachtpfl_gew2 < 20001 Then
               tbl_SendDaten.Fields("Transportmodus") = "LTL"
               Else
               tbl_SendDaten.Fields("Transportmodus") = "FTL"
               End If
        
        tbl_SendDaten.Fields("gebietsnr") = DLookup("[Gebietsnummer]", "Zuordnung_Gebiet", "Land = '" & tbl_SendDaten.Fields("Empf_Land") & "' and PLZ_min <= " & Val(tbl_SendDaten.Fields("Empf_PLZ")) & " and PLZ_max >= " & Val(tbl_SendDaten.Fields("Empf_PLZ")) & "")
        tbl_SendDaten.Fields("zielreg") = DLookup("[Zielregion]", "Zuordnung_Zielregion", "PLZ = " & tbl_SendDaten.Fields("Snd_PLZ_M") & " and Stadt = '" & tbl_SendDaten.Fields("Snd_Ort_M") & "'")
      
        tbl_SendDaten.Update
        
                Zielregname = tbl_SendDaten.Fields("zielreg")
                Gebietsnummer = tbl_SendDaten.Fields("gebietsnr")
                Transportmodus = tbl_SendDaten.Fields("Transportmodus")
                
                If tbl_SendDaten.Fields("Transportmodus") = "FTL" Then
                tbl_SendDaten.Edit
                tbl_SendDaten.Fields("LGZuschl") = DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                Debug.Print DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                tbl_SendDaten.Update
                Else
                tbl_SendDaten.Edit
              
                tbl_SendDaten.Fields("LGZuschl") = DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                Debug.Print DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
                tbl_SendDaten.Update
                End If

    End If
    
    tbl_SendDaten.MoveNext
Loop
End Function


Функция выдает значение NULL начиная со строчки номер 77 smile 
Спасибо за советы!!!

Автор: Akina 17.10.2017, 16:03
Перепишите код так, чтобы видеть, что именно Вы выполняете. Скажем, тот же оператор 77 перепишите так:
Код

' было
tbl_SendDaten.Fields("LGZuschl") = DLookup("[Gebietszuschlag]", "Leergutzuschlдge", "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'")
' стало
strWhere = "Gebietsnummer = " & Gebietsnummer & " and Versandregion = '" & Zielregname & "' and Transportmodus = '" & Transportmodus & "'"
Debug.Print "Operator 77 WHERE Condition is -=" & strWhere & "=-"
tbl_SendDaten.Fields("LGZuschl") = DLookup("[Gebietszuschlag]", "Leergutzuschlдge", strWhere)

и посмотрите, насколько правильно с точки зрения структуры таблицы и SQL-синтаксиса построенное условие.
Особое внимание уделите кавычкам - вдруг они имеются в подставляемых значениях...

Автор: GalinaLina 18.10.2017, 10:19
Привет ребята! 
Мне помогли найти ошибку!  smile 

Она не в коде. DLookUp написан правильно, но вот его критерий Versandregion был ответственный за то,что значение не подтягивалось. В таблице "Leergutzuschlдge"в которой он обрабатывал столбик Versandregion данные были написаны вот так: "DE Süd", а в критерий Versandregion = '" & Zielregname & "' подтягивались значения в форме "DE Sued". Поэтому не работало.

Вывод: для функции DLookUp важно проверить,чтоб данные во всех таблицах, с которыми вы работаете совпадали smile  Не всегда сразу заметно.

Автор: Akina 18.10.2017, 12:15
Да я бы вообще рекомендовал отказаться от DLookUp, ибо каждое обращение к ней вызывает выполнение полноценного SQL-запроса. Более того, я бы рекомендовал в принципе пересмотреть логику - ну бред же править по одному полю, да ещё таская туда-сюда данные, когда можно одним запросом внести сразу все изменения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)