Probleem met MIN functie in Access door tekstveld met lege waarde

Status
Niet open voor verdere reacties.

MatthijsJonkers

Nieuwe gebruiker
Lid geworden
6 jul 2016
Berichten
4
Als ik de MIN functie op een tekst-veld uitvoer, dan geeft dit een onverwacht resultaat.
Ik heb een tabel met 1 tekstveld met respectievelijk de waardes: 'a','','c'.
Mijn verwachting is dat de lege waarde als minimum wordt gezien, maar in plaats daarvan krijg ik de 'c' als resultaat!!!

Dit is eenvoudig reproduceerbaar door in een access database de volgende queries uit te voeren:
create table testbug(Veld1 varchar(255) NULL)
insert into testbug(Veld1) values ('a')
insert into testbug(Veld1) values ('')
insert into testbug(Veld1) values ('c')
select min(veld1) from testbug

Als de lege waarde iets anders bevat (al is het een spatie bijv.) dan gaat het wel goed!
Kan iemand dit reproduceren en/of verklaren en/of aangeven of dit inderdaad een bekende bug is (ik heb er niets over terug kunnen vinden).

Ik werk met onderstaande versie:
Microsoft Office Professional 2010
Microsoft Access Versie: 14.0.7166.5000 (32-bits)

#EDIT 2016-07-22: helaas nog steeds geen bruikbare reactie ontvangen#
 
Laatst bewerkt:
Mijn verwachting is dat de lege waarde als minimum wordt gezien,
Waarom is dat je verwachting? De functie MIN is, net als MAX en GEM bedoeld voor numerieke waarden. Jij laat hem los op tekst. Dat wordt, uiteraard, een zooitje. Dat Access de letter 'c' pakt en niet een ander ligt dan aan de invoer van dat moment. Als ik meer letters invoer krijg ik er een 'a' uit als 'laagste'. Wil je op een tekst een numerieke vergelijking loslaten, dan moet je dus die tekst eerst omzetten naar een getal. Bijvoorbeeld met Nz.
Code:
Expr1: Min(Asc(Nz([Veld1];0)))
Of dat de gewenste oplossing is, weet ik niet want ik vind je probleem al een beetje vreemd, en om dat op te lossen dus ook.
 
Laatst bewerkt:
Dat is het resultaat. Als je door had gelezen had je dit gezien:
The expr placeholder represents a string expression identifying the field that contains the data you want to evaluate or an expression that performs a calculation using the data in that field.
Als een veld leeg is, is er geen data om te evalueren, en doet het veld dus ook nooit mee. Maar afgezien daarvan: MIN en MAX zijn m.i. bedoeld voor getallen. Doe ik dezelfde tekst op woorden, dan pakt hij het eerste woord dat met een 'a' begint. Of, bij meerdere woorden met een 'a', het woord waarvan de tweede letter de laagste ascii waarde heeft. Daarbij wordt dus geen onderscheid gemaakt tussen Hoofd- en kleine letters.
 
@OctaFish:
Ik vind je onderbouwing niet bepaald steekhoudend. Je negeert het feit dat Microsoft Access op z'n website aangeeft dat het veld een 'string expression' mag zijn (en dat slaat op 'expr' wat niet het resultaat is, maar wel degelijk het veld waar de functie op werkt). Tegelijk geef je zonder onderbouwing aan dat je denkt/vindt dat de MIN functie enkel voor numerieke waardes bedoeld is (Wellicht omdat het je niet lukt om voorbeelden te verzinnen waarbij het handig kan zijn om de MIN functie ook op tekst-waardes los te laten).

Of een lege string wel of geen informatie (data) bevat lijkt me meer een filosofische vraag (als het veld tussenvoegsel bijv. leeg is bij persoonsgegevens terwijl de rest, zoals voornaam en achternaam wel ingevuld is, dan zegt deze lege waarde mij dat deze persoon geen tussenvoegsel in z'n naam heeft en dat is wel degelijk informatie, toch?)
Bij de omschrijving van de 'ORDER BY' (https://msdn.microsoft.com/en-us/library/bb208913(v=office.12).aspx staat ook: 'if you want your DATA displayed in sorted order, then you must use ORDER BY.' Betekent dit volgens jou dat het sorteren van tekstwaardes waar ook een lege string in voorkomt, dus logischerwijs fout gaat? Niet dus! (ook niet als je descending sorteert)

Het klopt inderdaad dat letters ascii waardes hebben (Bijv. A=65, Z=90, a=97, z=122). Als de MIN functie alleen met getallen overweg kan zoals jij beweert en daarom deze ascii waardes hanteert om te bepalen wat het minimum is, dan zou de hoofdletter Z kleiner zijn dan de kleine letter a!!!! Je geeft zelf al aan dat dit niet het geval is en dat de MIN functie blijkbaar wel degelijk de tekst als tekst behandelt! Dan lijkt het me dus nog steeds gewoon een bug, toch?
 
Laatst bewerkt:
Er is een behoorlijk verschil tussen Null, en lege waarden. Zo zullen de formules IsNull([Veld]), ([Veld] = Null en ([Veld] = "" vaak verschillende uitkomsten geven. Verdiep je daar eerst eens in, zou ik zeggen. Ik gaf alleen een voorbeeldje met de ASCII waarden om het probleem inzichtelijk te maken. Je hoeft mij niet uit te leggen hoe (alfanumeriek) sorteren werkt...
 
@Octafish:
Ik wil me best ergens in verdiepen, maar het verschil tussen Null-values en een lege string is mij allang bekend. Kun je echter aangeven waarom jij denkt dat dit relevant is voor mijn probleem, want in mijn tabel zitten 3 records waarvan 1 een lege string is, maar de tabel bevat toch echt geen Null-values!
Ik ben blij dat je probeert me te helpen door het probleem inzichtelijk te maken, maar vind je ook niet dat jouw uitleg over ASCII waardes en jouw overtuiging dat de MIN functie alleen met getallen overweg kan juist een duidelijke aanwijzing is dat de MIN functie blijjkbaar toch de tekst-waardes op een tekst-manier benadert (anders zouden hoofd- en kleine letters toch echt verschillend worden geïnterpreteerd).
Wellicht is mijn uitleg niet altijd even duidelijk opgeschreven, maar je moet het toch wel met me eens zijn dat Microsoft zelf expliciet aangeeft dat de MIN functie toch echt wel op een 'string expression' zou moeten werken? Zie https://support.office.com/en-us/art...d-e1b2a5317b58

Wellicht dat ik het verkeerd zie, maar ik wil dolgraag begrijpen waarom de MIN functie zo werkt en of dit eigenlijk een bug is. Dus als iemand anders denkt ook een zinvolle bijdrage te kunnen leveren, graag!
 
... maar het verschil tussen Null-values en een lege string is mij allang bekend.
Dat vraag ik mij dus af.
Mijn verwachting is dat de lege waarde als minimum wordt gezien, maar in plaats daarvan krijg ik de 'c' als resultaat!!!
Je probeert met de functie MIN een nullwaarde op te halen. Gaat nooit lukken, moet je dus zo niet doen.
Ik heb nergens gezegd dat de MIN waarde niet met tekst gebruikt kan worden, hooguit dat je het niet zou moeten doen omdat je die functies beter voor getallen kunt gebruiken. En dat je probleem ook min of meer is opgelost als je de ASCII waarden gebruikt. Ik zie het ‘probleem’ niet als een bug, maar hooguit als een verkeerd uitgevoerde functie die kijkt naar de eerstvolgende onderste waarde onder het veld met de lege waarde. Zet er maar eens een record bij met een ‘b’, dan krijg je die als onderste waarde.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan