Avatar billede trold Nybegynder
20. november 2000 - 19:18 Der er 6 kommentarer og
5 løsninger

Sammenligne 2 Tekststrenge

Jeg er ved at lave et projekt i Borland Builde 3, og skal sammenligne to tekst strenge af typen AnsiString

kan man gøre det således

while (!strAmbulanceID != Table2->FieldValues[\"AmbulanceId\"]);
Next();

eller skal man bruge AnsiStrComp, og i givet fald hvordan

Avatar billede moa Nybegynder
20. november 2000 - 21:49 #1
Nu har jeg aldrig prøvet Borlands CBuilder, men strenge er i C normalt pointere, dvs. at det du gør når du prøver \"string 1 != string2\" er at du spørger om string1 og 2 referer til det samme stringobjekt!! - og det du ønsker er jo at tjekke om indholdet af de to strenge er ens. Så AnsiStrComp er sikkert en udmærket ide - prøv noget i retning af:
while (AnsiStrComp(strAmbulanceID, Table2->FieldValues[\"AmbulanceId\"]) != 0)
Next();

Altså AnsiStrComp returnerer 0 hvis strengene er ens.

Nu har jeg ikke lige adgang til CBuilder-dokumentationen, så ovenstående er ikke testet, men noget i den retning burde virke!!

Held og lykke med det
/moa
Avatar billede lbs Nybegynder
20. november 2000 - 22:17 #2
du skal bruge strcmp

#include \"string.h\" //i toppen af filen

char * et = \"haha\";
char * to = \"haha\";

int returnVal = strcmp(et,to);

// på returnVal kan du se om de er ens.
// hvis returnVal > 0 er \"et\" den længste streng
// hvis returnVal < 0 er \"to\" den længste streng
// hvis funktionen returnerer 0 er strengene ens!
Avatar billede stringbuffer Nybegynder
21. november 2000 - 12:05 #3
istedet for
while(!strAmbulanceID != Table2->FieldValues[\"AmbulanceId\"]);

prøv
while(!strcmp(strAmbulanceID, Table2->FieldValues[\"AmbulanceId\"])
Avatar billede stringbuffer Nybegynder
21. november 2000 - 12:09 #4
hovsa, der skulle nok stå

while (strcmp(strAmbulanceID, Table2->FieldValues[\"AmbulanceId\"])) Table2->Next();

eller sådan... kan ikke huske helt præcis det med tabellen, men hvis du gør det sådan så vil den standse loopet når de 2 værdier er ens
Avatar billede stringbuffer Nybegynder
21. november 2000 - 12:16 #5
Men sådan helt teoretisk... hvorfor bruger du ikke bare en SQL-forespørgsel?
SELECT * FROM Tabelnavn WHERE AmbulanceId = \'ditID\'

Ved at køre dit loop laver du jo principielt en sekvenciel søgning, hvilket er fint hvis du har max 100 tupler i din tabel, men hvis det er 100000 som det jo nemt kan blive i større systemer, så bruger man i hvert fald IKKE sekventiel søgning.
Databaser har jo inbyggede søgestrukturer, der gør det muligt at søge meget smartere og hurtigere
Avatar billede borrisholt Novice
21. november 2000 - 12:52 #6
I C Bilderen findes der  ganske udemærkede funktioner til håndtering af den slags ...

Kig på AnsiStrComp, som ligger i SysUtils.hpp
Skal del være lidt mere sofisrikeret kan du også bruge CompareMEM ....

strcmp er noget til brug for M$ C++ og ligende fordi de ikke har et ordenligt string begreb. En af C++ Builderens helt store forcer er netop at det er gjort nemt og hurtigt, således du sjældent behøver ar kalde en masse grimme funktioner ....

Jens B
Avatar billede trold Nybegynder
21. november 2000 - 15:53 #7
stringbuffer >>

Det er en SQL update jeg skal lave, men det kunne jeg ikke få til at virke

Query2->Close();
    Query2->SQL->Clear();
Query2->Open();
Query2->First();
Query2->SQL->Add(\"update AMBULANCE set Udrykningsstatus = 1\");
Query2->SQL->Add(\"where AmbulanceId = \'\" + strAmbulanceID + \"\'\");
Query2->ExecSQL();
Avatar billede trold Nybegynder
21. november 2000 - 15:54 #8
stringbuffer >>

Vedr SQL Jeg prøvede først

http://www.eksperten.dk/spm/34306
Avatar billede stringbuffer Nybegynder
22. november 2000 - 09:16 #9
mener at det i SQL skal hedde noget med UPDATE DISTINCTROW Tabelnavn SET Udrykningsstatus = 1 WHERE AmbulanceID = \'\"+strAmbulanceID+\"\'\"
Avatar billede duck Nybegynder
22. november 2000 - 10:17 #10
Hej Trold.

AnsiString kan nu sagtens sammenlignes med brug af operatoren \'==\'. Din fejl er blot, at du skal angive feltet (fra tabellen) som en AnsiString. Derfor skal din kode se således ud:

while (!strAmbulanceID != Table2->FieldByName(\"AmbulanceId\")->AsString)
  Next();

/duck
Avatar billede soepro Nybegynder
22. november 2000 - 10:46 #11
1) Duck har ret, du kan sammenligne to AnsiString direkte vha. == operatoren. Værdien af et felt som AnsiString får du ved at bruge ->AsString property\'en.
2) Du har lavet samme fejl som tidligere nævnt i din ADD:
    Query2->SQL->Add(\"update AMBULANCE set Udrykningsstatus = 1\");
    Query2->SQL->Add(\"where AmbulanceId = \\\'\" + strAmbulanceID + \"\\\'\");
  altså manglende \\\' på delimiterne.

(Husk på det er stadig en alm. ANSI C streng du angiver som værdi - AnsiString klassen \"oversætter\" dem direkte.)
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