Results 1 to 10 of 10

Thread: AnsiContainsText gebruiken voor FilterRecord

  1. #1
    Senior Member Antoine's Avatar
    Join Date
    Apr 2011
    Location
    Molenwaard
    Posts
    2,399

    AnsiContainsText gebruiken voor FilterRecord

    Dag all,

    Ik heb de volgende code:

    Delphi Code:
    1. Accept := ANSIContainsText(DataSet['NAAM'], edSearch.Text);

    Maar ik wil in meerdere velden tegelijk kijken naar welke tekst er in zit..

    Dat probeer ik zo:

    Delphi Code:
    1. Accept := ANSIContainsText(DataSet['NAAM'], edSearch.Text)
    2.             OR ANSIContainsText(Dataset['STRAAT'], edSearch.Text)
    3.             OR ANSIContainsText(Dataset['NR'], edSearch.Text)
    4.             OR ANSIContainsText(Dataset['WOONPLAATS'], edSearch.Text)
    5.             OR ANSIContainsText(Dataset['TELEFOON'], edSearch.Text);

    Maar dat vind Delphi niet leuk, ik krijg de volgende foutmelding: Message: 'Could not convert variant of type (Null) into type (OleStr)'.

    Kan iemand me een zet in de goede richting geven?

    Gr Anton
    " De waarde van het leven is niet in geld uit te drukken "

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Wat is "DataSet"?

    De (vroeger) gangbare manier van het benaderen van velden was altijd:
    Delphi Code:
    1. MyName := DataSet.FieldByName('NAAM').AsString;
    Is dat nu anders geworden?

    Mijn persoonlijke mening is dat je zo min mogelijk gebruik moet maken van variants
    (of zo snel mogelijk er van af moet zien te raken).
    Het probleem wat je namelijk tegenkomt is dat NULL niet bestaat als geldige waarde
    bij de strong-types van Delphi; dat is ook waar Delphi hier over klaagt.

    Dus: wil of verwacht je een string uit een veld, gebruik dan direct Veld.AsString (uitgang
    is string) en niet Veld.Value (uitgang is variant).
    Stel dat de veldwaarde NULL is (en dat gebeurt geheid ooit eens), dan krijg je bij .AsString
    keurig '' terug als waarde, maar bij .Value een "Could not convert variant..."-fout.

    Greetz,

    Peter.
    Last edited by VideoRipper; 23-Apr-14 at 12:59.
    TMemoryLeak.Create(Nil);

  3. #3
    @VideoRipper, die korte notatie werkt ook. Werkt op zich prima, wordt volgens mij veel gebruikt en is ook niet bepaald nieuw.

    Maar je krijgt dan inderdaad de veldwaarde terug als variant, alsof je TField.Value of eigenlijk TField.AsVariant hebt aangeroepen.

    En daar zit ook meteen het probleem. Als je veld de waarde NULL bevat, dan kan dat niet impliciet naar string omgezet worden. Daarvoor kun je de VarToStr functie gebruiken, of je kunt de langere notatie van VideoRipper gebruiken. Daarbij krijg je een TField terug, waarop je methods als ToString aan kunt roepen, die zelf al de conversie voor je regelen. NULL wordt daarbij omgezet naar een lege string, 0, of andere 'defaults' afhankelijk van de gekozen conversiemethod.
    1+1=b

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by GolezTrol View Post
    @VideoRipper, die korte notatie werkt ook.
    Ah, weer wat geleerd vandaag: thanks.
    TMemoryLeak.Create(Nil);

  5. #5
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    gerbruik: vartostr(dataset[veldnaam])

  6. #6
    Senior Member Antoine's Avatar
    Join Date
    Apr 2011
    Location
    Molenwaard
    Posts
    2,399
    Weet niet wat je bedoeld willem, maar ik denk dat we iets anders bedoelen... Ik wil gewoon zoeken in de dataset, en dat gaat met 1 OR maar gebruik ik er nog 1, dan gaat de compiler klagen.. Geen idee waarom..
    Maar maybe zijn er meer manieren... (Tuurlijk!)..

    Gr Anton
    " De waarde van het leven is niet in geld uit te drukken "

  7. #7
    Het is niet de compiler die klaagt. De melding die je krijgt is een runtime error (treedt op tijdens het uitvoeren van je programma, niet tijdens het compileren).
    Willem's oplossing is wat ik ook aandroeg als één van de mogelijkheden. VideoRipper geeft een andere, maar met hetzelfde effect. Het probleem is niet de extra or, maar het stuk dat daar achter staat.
    1+1=b

  8. #8
    Quote Originally Posted by Antoine View Post
    Weet niet wat je bedoeld willem, maar ik denk dat we iets anders bedoelen...
    ...
    en dat gaat met 1 OR maar gebruik ik er nog 1, dan gaat de compiler klagen..
    Wat Willem bedoelde is om ANSIContainsText(vartostr(Dataset['STRAAT']), edSearch.Text) te gebruiken.

    Dit dus:
    Delphi Code:
    1. Accept := ANSIContainsText(vartostr(DataSet['NAAM']), edSearch.Text)
    2.        OR ANSIContainsText(vartostr(Dataset['STRAAT']), edSearch.Text)
    3.        OR ANSIContainsText(vartostr(Dataset['NR']), edSearch.Text)
    4.        OR ANSIContainsText(vartostr(Dataset['WOONPLAATS']), edSearch.Text)
    5.        OR ANSIContainsText(vartostr(Dataset['TELEFOON']), edSearch.Text);

    Het probleem is namelijk niet de 2e OR maar dat één van die velden NULL is en die mag je niet meegeven aan ANSIContainsText.
    (Je Dataset['STRAAT'] of Dataset['NR'] heeft dus waarschijnlijk NULL als waarde)
    (en met vartostr(Dataset['xxx']) voorkom je dat.)

    Maar je zou ook (zoals Peter al aangaf) het volgende kunnen doen:
    Delphi Code:
    1. Accept := ANSIContainsText(DataSet.FieldByName('NAAM').AsString, edSearch.Text)
    2.        OR ANSIContainsText(DataSet.FieldByName('STRAAT').AsString, edSearch.Text)
    3.        OR ANSIContainsText(DataSet.FieldByName('NR').AsString, edSearch.Text)
    4.        OR ANSIContainsText(DataSet.FieldByName('WOONPLAATS').AsString, edSearch.Text)
    5.        OR ANSIContainsText(DataSet.FieldByName('TELEFOON').AsString, edSearch.Text);

    (DataSet.FieldByName('xxx').AsString zet een eventuele NULL ook om naar een lege string)

    Het kan allebei. Zolang je er maar voor zorgt dat je geen NULL waardes mee geeft aan ANSIContainsText.

  9. #9
    Senior Member Antoine's Avatar
    Join Date
    Apr 2011
    Location
    Molenwaard
    Posts
    2,399
    Ow ok.. weer wat geleerd!

    Dank allemaal!
    " De waarde van het leven is niet in geld uit te drukken "

  10. #10
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    Quote Originally Posted by Antoine View Post
    Weet niet wat je bedoeld willem, maar ik denk dat we iets anders bedoelen...
    dataset['veldnaam'] geeft een variant terug. Als het veld leeg is wordt een NULL teruggegeven. Daar kan ANSIContainsText niets mee (die eist een string).
    Delphi Code:
    1. vartostr(dataset['veldnaam'])
    zet de variant om naar een string, doet hetzelfde als
    Delphi Code:
    1. DataSet.FieldByName('veldnaam').AsString
    maar is wat korter

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •