09. marts 2001 - 21:39Der er
4 kommentarer og 1 løsning
Udtrække oplysninger i Delphi fra Interbase ;)
Jeg vil gerne kunne udtrække ALLE oplysninger fra en tabel på baggrund af en værdi, der ikke er en nøgle. Når jeg bruger formen: DatasetX.Params.ByName(\'X\').AsInteger := X; - så får jeg kun én række ud og jeg ved der skal være 3 i tabellen med værdien X.
Er der en der kender en metode ? På forhånd tak ;)
Jeg regner med at du med ordene \"jeg ved der skal være 3 i tabellen med værdien X\" mener at der er 3 poster (rækker) i din tabel ?. Når du skriver \"DatasetX.Params.ByName(\'X\').AsInteger := X;\" så får du ikke \"en række ud\" tværdigmod så sætter du et parameter til din SQL-forespørgsel, og efter som du ikke har skrevet hvordan den ser ud så er det svært at \"rådgive\" desangående. Det er meget mulig at du sætter et parameter du bruger sammen med \"where\" i din sql-sætning (feks. \"... where x = :x\") og så vil du kun få de poster der opfylder den betingelse. Hvis du vil have ALLE poster i din tabel så skal du ikke bruge en \"where\" i din SQL-sætning.
Nedenstående viser hvordan du læser alle posterne som din forespørgsel og summere værdien. <SNIP> X := 0; DatasetX.Fist; repeat X := X + until DatasetX.EOF; <SNIP>
Sammen effekt kan opnås direkte via SQL <SNIP> select sum(felt1) from DataBaseTabel </SNIP>
Ja jeg formulerede mig vist ikke korrekt - forsøger lige igen.
I SelectSQL på datasetX har jeg skrevet: SELECT * FROM CHECKDELE WHERE CHECKDELE.X= :X
I koden har jeg skrevet: DatasetX.Params.ByName(\'X\').AsInteger := X; DatasetX.Active := true; showmessage(inttostr(DatasetX.RecordCount));
DatasetX.First;
For i:= 1 to DatasetX.RecordCount do begin Showmessage(DatasetX.FieldByName(\'X\').asstring); Showmessage(DatasetX.FieldByName(\'Y\').asstring); DatasetX.Next; end;
Det er her min recordcount siger 1 og jeg ved at der er tre rækker i tabellen hvor kolonnen X har den værdi jeg sætter i DatasetX.params.ByName ... Håber det kan give et bedre indtryk af problemstillingen ;)
Det er \"meget normalt\" at man ikke kan regne med RecordCount i mange (C/S) database-miljøer. This du endelig vil vide poster der er så lad database serveren om at tælle disse \"select count(*) from checkdele where checkdele.X = :X\". I dette tilfælde har du ikke behov for at vide hvor mange poster der er. Skriv i stedet dit program om til:
<SNIP> // \"Parameter halløj\" DatasetX.First; if not((DatasetX.EOF) and (DatasetX.BOF)) then begin repeat Showmessage(DatasetX.FieldByName(\'X\').asstring); Showmessage(DatasetX.FieldByName(\'Y\').asstring); DatasetX.Next; until dsetImportWeekProj.Eof; end; <SNIP>
Ovenstående kode vil således \"behandle\" alle posterne i dit resultatsæt (uanset hvor mange der end måtte være). Hvis jeg har BRUG for at vide hvor mange der er så bruger jeg som sagt \"count (*)\" hvor jeg lader DB-serveren udføre arbejdet. Et IBX dataset har en methode ved navn \"FetchAll\" der henter alle posterne over på clienten. Muligvis kan du bruge RecordCount efter du har lavet et kald til FetchAll - men igen det er \"meget normalt\" at RecordCount ikke kan bruges i et C/S miljø
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.