Access VBA: between werkt niet...

Status
Niet open voor verdere reacties.

mani1988

Gebruiker
Lid geworden
11 jan 2011
Berichten
15
Ik voer volgende query uit in VBA om een rapport te genereren:
Code:
SQL = "SELECT c.companycode, c.ss_name, cr.contract_set, e.originator, ge.ErrorExpression, ge.type, COUNT(*) AS aantal " & _
"FROM contracts c, errorlog e, contract_ranges cr, gekende_errors ge " & _
"WHERE c.CONTRACT_ID = e.CONTRACT_ID " & _
"AND ((e.contract_id) >= (cr.start_contract_range+0)) AND ((e.contract_id) <= (cr.end_contract_range+0)) " & _
"AND cr.bns_dt =  #" & Format(Me.bns_dt.Value, "MM/DD/YYYY") & "# " & _
"AND e.description LIKE '%' & ge.ErrorExpression & '%' " & _
"GROUP BY c.companycode, c.ss_name, cr.contract_set, e.ORIGINATOR, ge.ErrorExpression, ge.type"

* 'contracts', 'contract_ranges' en 'errorlog' zijn Oracle tabellen.
* 'gekende_errors' is een Access tabel

Ik zou liefst in de query gewoon e.contract_id BETWEEN cr.start_contract_range AND cr.end_contract_range gebruiken maar dit werkt niet. Ik krijg dan volgende foutmelding: 'Data type mismatch', nochtans zijn alle drie deze velden als 'Number' gedefinieerd in Oracle. Hoe dan ook, via het omwegje (gebruik van '>=' en '<=' + vermeerderen met 0 om er een Integer van te maken) lukt het wel.

Het eigenlijke probleem is dat ik via deze query teveel records verkrijg.
Ik krijg in totaal een 100-tal rijen, waarvan er een 5-tal totaal verkeerd zijn (gegevens kloppen niet).
Wanneer ik de 'cr.bns_dt' van deze contracts controleer, blijkt dat deze verschillend zijn van de datum die ik gebruik in de expressie...

Als ik een Debug.Print doe van mijn SQL-statement en dit uitvoer in Oracle (mits een paar kleine wijzigingen, aangezien tabel 'gekende_errors' enkel bestaat in Access), dan krijg ik wel het verwachtte en correcte resultaat. Wat gaat er dan in Access verkeerd? Waarom selecteert hij daar 5 rijen totaal verkeerd met bovendien ook nog een verkeerde waarde voor 'cr.bns_dt' (terwijl ik net daarop filter)?

Ik heb wel bij de laatste uitvoering van mijn SQL-query in Access ook de waarde van 'cr.bns_dt' eens laten afdrukken en blijkt dat volgens Access de 'cr.bns_dt' wel degelijk dezelfde is als degene die ik gebruik als filter in de WHERE-clausule. Nochtans als ik in Oracle ga kijken, is dit wel degelijk een andere datum (en zou de rij dus niet mogen worden geselecteerd). Bovendien werkt de query w�l in Oracle en worden deze foute rijen daar niet geselecteerd.

Is er iemand die mij verder kan helpen aub?
 
UPDATE:
Stel dat Me.bns_dt.Value = '04/30/2011', dan hebben de foutieve rijen toch bns_dt = '01/31/2011'.
Hoe kan dit, want de datum staat nochtans duidelijk in mijn WHERE-clausule.
Als ik cr.bns_dt echter ook in de SELECT van de query zet, krijg ik wel '04/30/2011' (terwijl deze records eigenlijk behoren tot datum '01/31/2011')
 
Je Datumfiltering is niet goed. Maak een variabele aan met deze waarde:
Code:
Const strcJetDate = "\#mm\/dd\/yyyy\#"  'Do NOT change it to match your local settings.
En filter je datum zo:
Code:
"AND cr.bns_dt = " & Format(Me.bns_dt.Value, strcJetDate)
 
Bedankt maar het probleem is daarmee helaas niet opgelost..
Nog steeds hetzelfde resultaat :(
 
Beetje meer info graag... zoals: hoe ziet je string er nu uit?
 
String is nog steeds hetzelfde als in openingspost, op jouw wijziging na:

Const strcJetDate = "\#mm\/dd\/yyyy\#"

"SELECT c.companycode, c.ss_name, cr.contract_set, e.originator, ge.ErrorExpression, ge.type, COUNT(*) AS aantal " & _
"FROM contracts c, errorlog e, contract_ranges cr, gekende_errors ge " & _
"WHERE c.CONTRACT_ID = e.CONTRACT_ID " & _
"AND cr.bns_dt = " & Format(Me.bns_dt.Value, strcJetDate) & " " & _
"AND ((e.contract_id) >= (cr.start_contract_range+0)) AND ((e.contract_id) <= (cr.end_contract_range+0)) " & _
"AND e.description LIKE '%' & ge.ErrorExpression & '%' " & _
"GROUP BY c.companycode, c.ss_name, cr.contract_set, e.ORIGINATOR, ge.ErrorExpression, ge.type"
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan