and / or is completely misunderstood by many people and as a result is largely left unused, those who attempt to use it frequently have problems because of the dynamic nature of our thinking and the linear nature of computing (at least that is what someone smarter than me said one time)
if we say (or (/= a "0")(/= a "DEF")) what we think we are saying is if a does not have a value equal to "0" or "DEF" inclusive, meaning that we think we are saying it cannot equal "0" and it cannot equal "DEF" as follows:
(setq a "DEF")
(/= a "0") true
(/= a "DEF") false
So since we think that one is false, the result is false, however the result is true....
what the computer sees is if either of the or arguments is true, then the statement is true
that is where you have the problem... replace or with and, then you will run the code only if the value is neither "0" or "DEF"