Avatar billede kennethv Nybegynder
05. februar 2009 - 09:04 Der er 3 kommentarer og
1 løsning

ADOQuery og delimiter spørgsmål.

Hvis ADOQuery fejler med at den ikke kan finde noget udfra min søge streng, hvor fanger man så at den ikke kan finde noget?

Hvordan undgåes at SPACE bliver opfattet som en "Delimiter"?




procedure TFrmMain.FindNames(Names: string; List: TStrings);
var Temp: TStrings; I : integer;
strtemp : string;
begin
  Temp := TStringList.Create;
  Temp.Delimiter := ';';
  Temp.DelimitedText := Names;
  list.Clear;
  try
    for I := 0 to Temp.Count-1 do
    begin
      ADOquery1.SQL.Text := 'SELECT cn FROM ' + QuotedStr('LDAP://OU=USERS,' + edit2.Text ) + ' where cn = ' + QuotedStr(temp[i]+'*') +' OR samAccountName = ' + QuotedStr(temp[i]+'*');
      ADOQuery1.Open;
      if ADOQuery1.RecordCount > 0  then
      begin
        ADOQuery1.First;
        while not ADOQuery1.Eof do
        begin
          List.Add(Format('%s=%s', [Temp[I], ADOQuery1.FieldByName('cn').AsString]));
          ADOQuery1.Next;
        end;
      end
      else
        List.Add(Format('%s=%s', [Temp[I]]));
    end;
  finally
    FreeAndNil(Temp);
  end;
end;
Avatar billede kentjohansen Nybegynder
09. februar 2009 - 17:57 #1
Mht til dit første spørgsmål om hvordan du fanger at dit søgeresultat er tomt, så kan problemet være at dit ADOQuery1 er UNIDirectionalt. I stedet for ADOQuery1.RecordCount så kan du prøve med ADOQuery1.IsEmpty.
Avatar billede kennethv Nybegynder
12. februar 2009 - 08:57 #2
Jo, men det jeg søger efter er sådanne noget som det her:

"Kenneth v;Peter;Kurt Han;"

I det her tilfælde vil min query søge efter Kenneth, v, Peter, Kurt og han. Men jeg er interesseret i at søge efter Kenneth v, Peter og Kurt Han og finde alle dem der svare til det jeg har søgt efter.
Avatar billede kentjohansen Nybegynder
12. februar 2009 - 19:17 #3
Ahaa, så er jeg vist med.
Altså 'Names' i din oprindelig besked er "Kenneth v;Peter;Kurt Han;" og når du siger DelimitedTest så betragtes  MELLEMRUM også som delimiter. Sådan er DelimitedText - mellemrum bliver altid betragtet som delimiter. Det du så kan gøre er et tilføje nedenstående linie i starten af din procedure:

Names := StringReplace(Names, ' ', '_', [rfReplaceAll]);

Og så hælde 'names' ind i din 'temp' stinglist, som du allerede gør. Når du så løber elementerne af 'temp' skal du så igen konverterer '_' tilbage til et mellemrum, således:

QuotedStr(StringReplace(temp[i], '_', ' ', [rfReplaceAll])+'*');

Jeg er dog i tvivl om '*' ikke skal være '%', men det kan du jo altid teste.
Avatar billede kennethv Nybegynder
12. februar 2009 - 21:12 #4
Det var sgu en god løsning. Tak for det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester