Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Probleme beim TTable sortieren (https://www.delphipraxis.net/175799-probleme-beim-ttable-sortieren.html)

JHOF 19. Jul 2013 18:08

Datenbank: Access / ADO • Version: Neueste • Zugriff über: ADO

Probleme beim TTable sortieren
 
Hallo,
ich versuche eine Tabelle in einer Access-Datenbank zu sortieren (in einer TADOTable (nennen wir sie DBT) dargestellt) und zwar nach einem Long Integer Feld in der Access-Tabelle ( nennen wir es 'AF'; das Feld ist indiziert):
if (DBT.Active = True) then DBT.Close;
DBT.IndexFieldNames := 'AF';
DBT.Open;
Wenn ich das so mache, bekomme ich beim Ausführen des DBT.Open die Nachricht: "Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar".
Ich habe das genau so in der Steinzeit mit Delphi 5 genau so gemacht und das funktionierte. Was mache ich falsch bzw. was hat sich geändert? Ich würde jetzt ungerne mit SQL anfangen und das Ganze über eine Query realisieren. Es müsste ja wohl auch noch so (oder ähnlich) gehen?
Übrigens: kann man auch ein double Feld nach der Größe der Zahlen sortieren? Wenn ja wie?
Schon jetzt vielen Dank von einem Gelegenheitsprogrammierer.

DeddyH 19. Jul 2013 18:13

AW: Probleme beim TTable sortieren
 
Ich hab da zwar nicht wirklich Ahnung von (SQL-"geschädigt"), aber in der Hilfe steht:
Zitat:

Um mit IndexFieldNames eine Sortierreihenfolge des Recordsets einzurichten, muss das Recordset über einen client-seitigen Cursor geöffnet worden sein (die Eigenschaft CursorLocation der Datenmengenkomponente muss auf clUseClient gesetzt sein). Wenn versucht wird, IndexFieldNames mit server-seitigen Cursorn zu verwenden, wird eine Exception ausgelöst.
Könnte es daran liegen?

Sir Rufo 19. Jul 2013 18:18

AW: Probleme beim TTable sortieren
 
Bist du dir sicher, dass du ADO verwendest?

Delphi-Referenz durchsuchenTTable gehört zum BDE Geraffel
Delphi-Referenz durchsuchenTADOTable gehört zu ADO

BTW: Access Version neueste :roll:

JHOF 19. Jul 2013 18:32

AW: Probleme beim TTable sortieren
 
Vielen Dank für den Hinweis, aber die CursorLocation der Datenmengenkomponente ist auf "clUseClient" gesetzt.

JHOF 19. Jul 2013 18:34

AW: Probleme beim TTable sortieren
 
Sorry, TADOTable ist natürlich richtig und so verwendet.

haentschman 19. Jul 2013 18:54

AW: Probleme beim TTable sortieren
 
Hallo...
Zitat:

Ich habe das genau so in der Steinzeit mit Delphi 5 genau so gemacht und das funktionierte.
...entschuldige, aber bei dir sind mit ADO Table gerade mal die ersten Dino´s ausgestorben. :roll:
Vieleicht investierst du deine kostbare Zeit besser um den Umgang mit aktuellen DBMS und SQL zu erlernen.

...auch dabei können wir dir behilflich sein. :thumb:

nahpets 19. Jul 2013 19:01

AW: Probleme beim TTable sortieren
 
Du willst ja einen bereits vorhandenen Index nutzen und das geht über IndexName.
Delphi-Quellcode:
if DBT.Active then DBT.Close;
DBT.IndexName := 'AF';
DBT.Open;
Schließen und Öffnen sollten eigentlich nicht erforderlich sein.
Delphi-Quellcode:
  DBT.IndexName := 'AF';
  DBT.First;
sollte beim neu gesetzten Index den Datensatzzeiger auf den ersten Satz setzen, andernfalls bleibt der Datensatzzeiger unverändert.

Bernhard Geyer 19. Jul 2013 19:19

AW: Probleme beim TTable sortieren
 
Zitat:

Zitat von JHOF (Beitrag 1222074)
Vielen Dank für den Hinweis, aber die CursorLocation der Datenmengenkomponente ist auf "clUseClient" gesetzt.

Bei Access nimmt man clUseServer. Da die Access-DLL's eh im eigenen Adressraum laufen wäre clUseClient nur eine Stupides kopieren der Daten von einer in Access-Verwalteten Pointer in einen per COM/OLE DB-Verwalteten Pointer.

JHOF 19. Jul 2013 19:49

AW: Probleme beim TTable sortieren
 
Nette Antworten, leider lösen sie nicht mein Problem.
Meine Frage war, was am Code falsch ist. Da helfen mir Hinweise auf SQL nicht. Damit kann ich durchaus umgehen, aber ich habe ein altes Programm, das ich auf die Schnelle wieder zum Laufen bringen muss, um es an den wirklich wichtigen Stellen zu verändern. Ich will keinesweg das Programm in Gänze umschreiben. Übrigens: die einzig sinnvolle Antwort auf ein Problem, ist die Antwort, die das Problem löst!

nahpets 19. Jul 2013 20:52

AW: Probleme beim TTable sortieren
 
Hast Du denn IndexName schon ausprobiert, so wie ich schrieb? Und wenn ja, was funktioniert nicht? Welche Fehlermeldung erscheint?

In einem korrekt funktionierenden Programm von mir nutze ich dieses:
Delphi-Quellcode:
procedure TfmMain.dbGridTitleClick(Column: TColumn);
begin
  try
    case Column.Field.FieldNo of
      1 : tb.IndexFieldNames := 'sender,datum,zeit';
      2 : tb.IndexFieldNames := 'zeit,datum,sender';
      3 : tb.IndexFieldNames := 'datum,zeit,sender';
      4 : tb.IndexFieldNames := 'sendung,sender,datum,zeit';
      5 : tb.IndexFieldNames := 'kategorie,datum,zeit,sender';
      6 : tb.IndexFieldNames := 'beschreibung,sender,datum,zeit';
      7 : tb.IndexFieldNames := 'id';
    else
      tb.IndexFieldNames := 'sender,datum,zeit';
    end;
  except
    on e : exception do ShowMessage(e.Message);
  end;
end;
tb = TAdoTable

In diesem Fall müssen bei IndexFieldNames die Felder durch Komma getrennt angegeben werden, nach denen sortiert werden soll. Da ich das immer problemlos bei geöffneter Tabelle mache, könntest Du ja eventuell mal das Schließen der Tabelle weglassen. Es ist halt überflüssig und kostet nur Zeit.

Die Hilfe zu Delphi schreibt hierzu:
Zitat:

Die Eigenschaft IndexFieldNames listet die Felder auf, die als Index verwendet werden sollen.

Delphi-Syntax:

property IndexFieldNames: string;

C++ Syntax:

__property AnsiString IndexFieldNames = {read=GetIndexFieldNames, write=SetIndexFieldNames}

Beschreibung

Verwenden Sie IndexFieldNames als alternative Methode zum Festlegen des Index für eine Client-Datenmenge. Geben Sie den Namen jedes Feldes an, nach dem die Datenmenge indexiert werden soll. Die einzelnen Namen werden durch ein Semikolon getrennt. Die Reihenfolge der Feldnamen wird im Index berücksichtigt.

Mit IndexFieldNames hinzugefügte Indizes unterstützen keine Gruppierungen oder gewarteten Aggregate.
Tipp: Mit IndexFieldNames können Sie zur Laufzeit Sortierreihenfolgen erstellen.
Hinweis: Die Eigenschaften IndexFieldNames und IndexName schließen sich gegenseitig aus. Durch Einstellen der einen Eigenschaft wird die andere zurückgesetzt.
sowie
Zitat:

Die Eigenschaft IndexName bezeichnet einen Index der Client-Datenmenge.

Delphi-Syntax:

property IndexName: string;

C++ Syntax:

__property AnsiString IndexName = {read=GetIndexName, write=SetIndexName};

Beschreibung

Mit IndexName können Sie einen anderen Index für eine Client-Datenmenge angeben. Wenn die Eigenschaft keinen Wert enthält, basiert die Sortierfolge der Datenmenge auf der Eigenschaft IndexFieldNames oder der Standardsortierung im Datenpaket. Die Standardsortierung richtet sich nach dem vordefinierten Index (DEFAULT_ORDER).

Enthält IndexName einen gültigen Indexnamen, werden die Datensätze basierend auf diesem Index sortiert.

Hinweis: IndexFieldNames und IndexName schließen sich gegenseitig aus. Durch Einstellen der einen Eigenschaft wird die andere zurückgesetzt.



Zitat:

Übrigens: kann man auch ein double Feld nach der Größe der Zahlen sortieren? Wenn ja wie?
Indem man 'nen Index drauf legt und den Namen des Index bei IndexName angibt.

PS:

Fehlermeldungen der ADO-Schnittstelle sind nicht immer zwingend aussagefähig und geben nicht zwingend einen Hinweis auf den tatsächlich aufgetretenen Fehler und der tritt meist nicht dort auf, wo die Ausnahme geworfen wird. ( <-- sakastisch formulierte Praxiserfahrung)

Also folgendes Versuchen:

Umsteigen auf IndexName und dort den Namen des zu nutzenden Index angeben.
Zuerst ohne vorheriges Schließen und anschließendes Öffnen der Tabelle. Nur wenn es dann nicht geht mit Close und Open arbeiten.

Geht's damit nicht, was passiert, wenn nur ein Close und ein Open aufeinander folgen, ohne das Setzen des Index?

Geht das alles nicht, dann auf IndexFieldNames ausweichen. Schreibweise der Feldnamen eventuell so, wie in der Datenbank, also Groß-/Kleinschreibung beachten (auch wenn's meiner Meinung nach irrelevant sein sollte).

IndexFieldNames zuerst bei geöffneter Tabelle setzen, nur wenn das scheitert, mit Schließen und Öffnen probieren.

Ist die TAdoTable über eine TDataSource mit irgendwelchen Komponenten zur Anzeige... verbunden? Wenn ja, diese Verbindung probeweise entfernen und erneut probieren.

Der Fehler "Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar" deutet etwas globalgalaktisch auf ein dateninduziertes Problem hin, der Fehler muss letztlich nicht zwingend in Deinen drei Zeilen Quelltext liegen, sondern kann überall dort auftreten, wo beim Öffnen oder Scrollen (was beim Öffnen automatisch passiert) etwas mit den Daten (z. B. das Anzeigen) geschieht. Ggfls. auch mal alle Ereignisroutinen der TADOTable (im Objektinspektor) entfernen, sofern vorhanden.

Läßt sich die Tabelle im Objektinspektor öffnen? Wenn ja, im Objektinspektor mal IndexName bzw. IndexFieldNames wie gewünscht befüllen. Klappt das dort?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz