Gegevenstypen komen niet overeen in criteriumexpressie

Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedemorgen Access experts,
Ik zit met de volgende uitdaging. Via Excel krijg ik3 bestanden die ik in Access tabellen wil importeren. Dat lukt allemaal prima als ik alles zou willen importeren. In de Excel bestanden staat echter ook oude data die ik wil uitsluiten op basis van een datum die ik moet filteren uit een code: bijv. LR0I-42997. Daarvoor gebruik ik deze formule:
Code:
Expr1: Trim(Right([codering];Len([codering])-InStr([codering];"-")))+1462
Omdat de Excel bestanden gebaseerd zijn op het 1904 datasysteem moet ik er 1462 bij optellen om de juiste datum te krijgen.
Nu wil ik de gegevens voor 29-9-2021 uitsluiten:
Code:
SELECT [T&T import].codering, Trim(Right([codering],Len([codering])-InStr([codering],"-")))+1462 AS Expr1
FROM [T&T import]
WHERE (((Trim(Right([codering],Len([codering])-InStr([codering],"-")))+1462)<44468));

Nu krijg ik de foutmelding: Gegevenstypen komen niet overeen in criteriumexpressie.

Wie kan mij hier op het juiste spoor zetten?
Alvast bedankt

Gr. Jan
 
Misschien dat deze variant werkt
Code:
SELECT codering, CDBL(Trim(Right([codering],Len([codering])-InStr([codering],"-"))))+1462 AS Expr1
From [T&T import] WHERE (CDBL(Trim(Right([codering],Len([codering])-InStr([codering],"-"))))+1462)<44468
 
Bedankt voor het meedenken, maar helaas krijg ik dezelfde foutmelding.
Om eerlijk te zijn, ik heb geen idee.
Ik heb ook nog geprobeerd om er eerst een datum van te maken, het is allemaal lood om oud ijzer of te wel, het maakt niet uit wat voor type veld het wordt.
Misschien hebben de experts nog andere ideeën?

Alvast bedankt.

Gr. Jan
 

Bijlagen

  • Afb1.PNG
    Afb1.PNG
    12,4 KB · Weergaven: 15
  • Afb2.PNG
    Afb2.PNG
    7 KB · Weergaven: 15
Ik heb nog eens naar je code gekeken, maar door te filteren op <44468 pak je toch juist de verkeerde? En sowieso kan je formule een stuk korter. Wellicht handig om een voorbeeldje te posten, want ik kan het niet reproduceren. Ik heb zelf dit voorbeeldje gemaakt:

Code:
SELECT Datum, Codering, Onderwerp, CDbl(Right([Codering],InStrRev([Codering],"-"))+1462) AS Importdatum FROM Calendar WHERE CDbl(Right([Codering],InStrRev([Codering],"-"))+1462)>44468;
 
Net deze SQL getest en geeft het goed weer.


Code:
SELECT Trim(Right([codering],Len([codering])-InStr([codering],"-")))+1462 AS Expr1, *
FROM Tabel1
WHERE (((Trim(Right([codering],Len([codering])-InStr([codering],"-")))+1462)>44468));

Gr, Cor
 
Goedemorgen,

Bedankt voor het meedenken!
Ik heb een testbestand gemaakt en een Excel bestandje.
In de database heb ik 2 query's staan, één gebaseerd op een Access tabel die wel werkt en één op de gekoppelde Excel file welke niet werkt.

Hopelijk kunnen jullie hier iets mee.

Alvast bedankt

Gr. Jan
 

Bijlagen

  • Test.xlsx
    20,3 KB · Weergaven: 11
  • Database6.zip
    25,1 KB · Weergaven: 10
Nou zie je hoe belangrijk het is om de juiste gegevens aan te leveren... Je Excel bestand bevat nogal wat lege velden/records. En ja, dan werkt de formule niet. Je zult die dus moeten uitsluiten of converteren. Dit werkt:
Code:
SELECT Codering, IIf([Codering] Is Null,0,CDbl(Right([Codering],InStrRev([Codering],"-")))) AS Expr1 FROM Blad1 WHERE (((IIf([Codering] Is Null,0,CDbl(Right([Codering],InStrRev([Codering],"-")))))>44444));
 
Bedankt voor de hulp.

Sorry dat ik een verkeerd Excel bestand heb aangeleverd. Ik had regels gewist i.p.v. verwijderd, vandaar de lege records.
De fout zit ergens in de originele Excel bestanden. Ik ben al aan het testen geweest met Top 10, 20, 50 enz. Het gaat bijv. goed totdat je de Top 110 gekozen hebt en dan gaat het fout, Top 109 doet het dan bijv. wel. Ga je dan bijv. aflopend sorteren dan doet de Top 109 het ook niet meer.
Ik zie nergens corrupte data en/of vreemde tekens. Ook al gesplitst met de right functie voor het geval er ergens een _ staat i.p.v - , ook geen beter resultaat.

Het blijft een vreemd fenomeen.

Als ik meer tijd heb, ga ik de Excel bestanden eerst in een tijdelijke tabel zetten en daarna importeren in de definitieve tabel. Ik denk dat dat wel goed gaat

Gr. Jan
 
Tja, dan moet je toch het originele bestand er maar bij posten denk ik. Want de selectie query doet het prima. Ook dus met de door mij aangepaste query. En daar zitten meer dan 110 records in. Maar ik zie geen toevoegquery in je db. Ik vermoed dat daar een fout in zit.
 
Goedemiddag,

Dan doe ik een nieuwe poging met een nieuw testbestand en een originele Excel.

Ik heb geen toevoeg query in het bestand, het gaat immers in de selectie query al mis.

Alvast bedankt voor de hulp.

Gr. Jan
 

Bijlagen

  • Track trace en planning export okt 2021.xlsx
    18,4 KB · Weergaven: 12
  • Database6.zip
    33,6 KB · Weergaven: 12
Dan kijk ik hier nu even naar. Zoals ik al zei: in de andere kon ik verder weinig fout vinden.
 
Kijk nog eens goed naar je aangeleverde bestand, dat klopt nog steeds niet.
1. Rij 1-5: leeg
2. Rij 327-347: alleen waarden als -42997 (mag geen probleem zijn overigens)
3. Rij 434: waarde "(leeg)" (als tekst, niet leeg)
4. Rij 435: --1462 (geen correcte datum)
5. Rij 436: tekst "monteurcode-Einddatum rit" (al helemaal geen datum)
6. Rij 481: wel een Eindtotaal, geen waarde in kolom A.

Kortom: een zooitje. Kan je zo niet goed importeren.
Deze laat in ieder geval de waarden zien:
Code:
SELECT codering, Eindtotaal, CDate(CDbl(Right([Codering],InStrRev([Codering],"-"))+1462)) AS Expr1, IsNumeric(Right([codering],5)) AS Expr2FROM [T&T import]
WHERE IsNumeric(Right([codering],5))=True;
 
Goedemiddag,

Dat het een zooitje is, dat was mij ook al wel duidelijk. Sterker nog, het andere bestand is nog een graadje erger!

Ik heb in de WHERE > 44468 gezet en dan helaas, dezelfde melding.

Code:
SELECT [T&T import].codering, [T&T import].Eindtotaal, CDate(CDbl(Right([Codering],InStrRev([Codering],"-"))+1462)) AS Expr1, IsNumeric(Right([codering],5)) AS Expr2, IsNumeric(Right([codering],5)) AS Expr3, CDbl(Right([Codering],InStrRev([Codering],"-"))+1462) AS Expr4
FROM [T&T import]
WHERE ((([T&T import].codering) Like "L*") AND ((IsNumeric(Right([codering],5)))=True) AND ((CDbl(Right([Codering],InStrRev([Codering],"-"))+1462))>44468));

Het blijft voor mij een raadsel. Ik zal morgen eens proberen om dit gemankeerde bestand zonder WHERE in een tijdelijke tabel te zetten en van daaruit de definitieve tabel met de gefilterde data te vullen.

Gr. Jan
 
Ja, dat klopt uiteraard. Je kunt een tekstveld nu eenmaal niet filteren op > 44468. Je zou op basis van de correcte selectie een tijdelijke tabel kunnen maken met een Tabelmaak query. Daar kun je de selectiequery wel voor gebruiken. Het is een beetje lastig, zoals ik al zei, om in de query een preselectie te maken die de foute records er uit filtert. Dan moet je denk ik met een subquery gaan werken, en dat komt de snelheid niet ten goede. Een knop die de tijdelijke tabel maakt en de daarop gebaseerde query dan opent werkt vermoedelijk een stuk sneller, zeker als je daar dan ook de importfunctie achter hangt.
 
Goedemiddag,

ik heb het kunnen oplossen m.b.v. een tijdelijke tabel.
Eerst deze tabel leegmaken:

Code:
CurrentDb.Execute "DELETE tbl_import_reistijd_tdl.*FROM tbl_import_reistijd_tdl;", dbFailOnError

Dan vullen met deze code, waarbij Like L* ervoor zorgt dat de lege velden en andere zooi niet mee gaat.

Code:
CurrentDb.Execute "INSERT INTO tbl_import_reistijd_tdl ( codering, Eindtotaal ) " & _
"SELECT [T&T import].codering, [T&T import].Eindtotaal " & _
"FROM [T&T import] " & _
"WHERE ((([T&T import].codering) Like ""L*"")) " & _
"GROUP BY [T&T import].codering, [T&T import].Eindtotaal;", dbFailOnError

Daarna met deze code de definitieve tabel vullen met data vanaf 27-9-2021:
Code:
INSERT INTO tbl_reisuren ( Code, Tracktijd, Geïmporteerd )
SELECT Left([codering],InStr([codering],"-")-1) & "-" & CDbl(Right([Codering],InStrRev([Codering],"-"))+1462) AS Code, tbl_import_reistijd_tdl.Eindtotaal, Yes AS Expr1
FROM tbl_import_reistijd_tdl
WHERE (((CDbl(Right([Codering],InStrRev([Codering],"-"))+1462))>44465))
ORDER BY Left([codering],InStr([codering],"-")-1) & "-" & CDbl(Right([Codering],InStrRev([Codering],"-"))+1462);

Bij het importeren lopen nog meer queries en alles gebeurt binnen een paar seconden, dus tijd is geen issue in dit geval.
Ik moet nog wel kijken met de opdrachtgever of er nu geen data buiten de boot valt, zo ja dan zal hij betere data moeten aanleveren

Bedankt voor het meedenken.

Gr. Jan
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan