UPDATE table query issue

Status
Niet open voor verdere reacties.

obiku

Gebruiker
Lid geworden
25 jul 2004
Berichten
60
All,

Ik wil met onderstaande query in een tabel veld TRUE of FALSE zetten.
Code:
UPDATE tblWTS_CD_ImportData SET ImportOK = True 
WHERE fValidAWB([AWB]) = TRUE AND fValidHWB([HWB]) = TRUE AND  fValidREF([REF]) = TRUE AND
fValidPalletID([PalletID]) = TRUE AND  Quantity > 0

Deze query wordt uitgevoerd nadat een CSV bestand is ingelezen in de tabel. Het veld ImportOK moet WAAR worden wanneer de gegevens voldoen aan de voorwaardes uit de functie's

Omdat het tonen van alle functie's te veel tekst geeft en onnodig is, geef ik hier de functie voor het controleren van het eerste veld (AWB)
Code:
Public Function fValidAWB(ByVal AWB As String) As Boolean
On Error GoTo Err_Handler
Dim strValAWB

    'Check if AWB contains only 11 digits
    If Not IsNull(AWB) And AWB <> "" And my_regexp(AWB, "\b\d{11}\b") = True Then
    'Validate AWB
        strValAWB = Left(AWB, 10) & CStr(CLng(Mid(AWB, 4, 7)) Mod 7)

        If AWB = strValAWB Then
            fValidAWB = True
            Exit Function
        End If
    End If

Exit_Handler:
    fValidAWB = False
   Exit Function
Err_Handler:
    Call fLogError(Err.Number, Err.Description, UserNameWindows(), "mdlWTS_Tools", "fValidAWB()", fValidAWB, True)
    Resume Exit_Handler
End Function
Doordat een waarde aan verschillende eisen moet voldoen, is het niet mogelijk om dit in de query zelf te controleren.
De functie werkt perfect als deze op een normaal tekst input gebruikt word, ook wanneer de tekst input leeg is. Maar zodra ik de functie gebruik om in de WHERE clause te controleren of de waarde voldoet krijg ik continue, zodra een veld leeg is, de onderstaande fout melding:
Gegevens komen niet overeen in criteriumexpressie
Kan iemand een aanwijzing geven hoe dit eventueel op te lossen
 
En waar draait die update query? Op een formulier?
 
Als aanvulling: als je een zelfstandige query gebruikt, of vanaf een formulier alle records wilt bijwerken, dan moet je zowiezo twee gekoppelde tabellen in de query zetten. Ik heb een simpel testje gemaakt, en dat ziet er dan zo uit:
Code:
UPDATE tblWTS_CD_ImportData INNER JOIN Table1 ON tblWTS_CD_ImportData.ID = Table1.ID SET tblWTS_CD_ImportData.ImportOK = True
WHERE (((fValidAWB([AWB]))=True));
Hierin heb ik je (aangepaste, want hij kan volgens mij simpeler) functie dus ook gebruikt.
 
OctaFish bedankt voor je reactie. Hierbij nog een toelichting:
Het CSV bestand wordt geimporteerd m.b.v. een vba script.
Hierna wordt ook weer m.b.v. vba scripting de gegevens uit de geimporteerde CSV bestand ge-insert in de tabel tblWTS_CD_ImportData. Gegevens worden door dat vba script in de juiste velden geplaatst.

Hierna volgend een update query die ongewenste tekens weg haalt uit de tabel. Als laatste wil ik de bovenstaande query gebruiken om te controleren of gegevens ook wel correct zijn. (Bij niet correct moet ImportOK FALSE zijn).

Na alle controles wordt de tabel weergegevens in een formulier voor de gebruiker, waarbij recordset met incorrecte gegevens een andere kleur krijgen. Dit zodat de gebruiker die gegevens kan aanpassen.

Na wijziging door de gebruiker moeten de gewijzigde gegevens opnieuw door de controle heen gaan, en dit opnieuw fisueel weergeven of de gegevens een correcte form hebben.

UIteindelijk zal de gebruiker op het formulier accoord geven, en worden alleen de recordsets waarbij ImportOK TRUE is in de database verwerkt.

M.a.w. er is maar 1 tabel "tblWTS_CD_ImportData" en geen gekoppelde tabellen.

(B.t.w. alle update queries kunnen waarschijnlijk samen gevoegd worden, maar dat ga ik in een later stadium doen, eerst zorgen dat alles werkt ;))
 
Als alles in één tabel plaats vindt, hoef je uiteraard geen tabel te koppelen. Mijn aangepaste (werkende) voorbeeld ziet er dan zo uit:
Code:
UPDATE tblWTS_CD_ImportData SET ImportOK = True
WHERE fValidAWB([AWB])=True;
Kortom: eigenlijk jouw query maar dan met maar één controleveldje. Maar dat mag niet uitmaken, want daar zit het probleem niet.
Je kunt dus eens kijken naar je functies; wellicht dat daar wat te verbeteren is.
Wat ik in die van jou heb aangepast, om hem compatible te laten zijn (op basis van deze beschrijving ('Check if AWB contains only 11 digits):
Ik heb de RegExp vervangen door
Code:
    If Not IsNull(AWB) And AWB <> "" And Len(AWB) = 11 And IsNumeric(AWB) Then
Oftewel: check op een getal van 11 cijfers, maar dan met de ingebouwde functionaliteit die altijd werkt.
 
Laatst bewerkt:
Ik heb alles nogmaals door gelopen, maar ook dmv Len en IsNumeric te controleren of het een geldige waarde is krijg ik dezekfde foutmelding.
Ik heb daarna ipv een Update query er even een select query van gemaakt. Daaruit blijkt dat zodra een veld leeg is er een #fout waarde in het veld komt te staan..... Dit terwijl in mijn functie ook Null wordt afgevangen???

Uiteindelijk heb ik in mijn query fValidAWB([AWB]) vervangen door IIF(IsNull([AWB]), TRUE, fValidAWB([AWB]))
Hierna werkt de query naar behoren..... Ik zal verder uitzoeken hoe ik van de IIF af kan komen door nogmaals mijn functies onder de loep te nemen, zodat ze naast in formulieren ook in queries goed gaan werken.

In ieder geval bedankt zover. Eventueele tips zijn altijd welkom. (B.t.w. ik wacht nog een week met het op Opgelost zetten van de thread)
 
Er is verschil tussen IsNull(Veld) en [Veld] Is Null, om maar eens wat aan te geven. Zoek maar eens op de verschillen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan