Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 27.05.08 17:29
Hi, Delpher,
blöde Frage, vielleicht habe ich auch etwas übersehen...
Mit einer query kann ich ein table sortieren, aber wie kann ich eigentlich den table selbst logisch / physikalisch sortieren? Ich mache das zurzeit mit einem externen Hilfsprogramm und speichere das Ergebnis ab. Schöner wäre es aber, wenn ich auch mit Delphi den table sortieren könnte.
Wie sieht's aus?
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Muck
      
Beiträge: 98
Erhaltene Danke: 8
Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
|
Verfasst: Di 27.05.08 17:59
Hallo,
hier eine Routine, die ich mal in Programmen von etwa 1998 benutzt habe. BDE ist schon ein bisschen her.
Aufruf ist Feldnamen und Zieldatei.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Function DBSort(var D:TTable;SortFeld: Array of String;S:String): Longint; var A:Array[0..79] of Char;Field:array of Word;caseins:Boolean;Recs:Longint;SortField:TField;I:Integer; begin Recs:=d.RecordCount;CaseIns:=True; SetLength(Field,length(SortFeld)); for I:=0 to High(SortFeld) do begin SortField:=d.FieldByName(SortFeld[I]); Field[i]:=SortField.Index + 1; end; StrPCopy(A,S);d.First; Check(DbiSortTable(nil, nil,nil, d.Handle, A, nil, nil, High(Sortfeld)+1, @Field[0], @CaseIns, nil, nil, False, nil, Recs)); DBSort:=Recs; end; |
bye
Markus
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 27.05.08 19:05
Hi, Markus,
danke für deine Antwort. Ich rufe auf mit
DBSort(table1, ['Klasse', 'Name', 'Vorname'], table1.TableName);
weil ich nach den drei Feldern sortieren möchte - so weit, so gut.
Leider bekomme ich beim compilieren die Fehlermeldung:
Undefinierter Bezeichner: 'DBISortTable'
die Unit DbTables habe ich eingebunden.
Was kann da los sein?
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Muck
      
Beiträge: 98
Erhaltene Danke: 8
Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
|
Verfasst: Di 27.05.08 19:17
Halloechen aus der Ferne,
okay binde die units
bde,db,dbtables
ein, und alles sollte gefunden werden.
bye
Markus
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 27.05.08 20:32
Hi, Markus,
danke erstmal, jetzt habe ich den folgenden Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| table1.Filter := ''; table1.Filtered := false; table1.Active := false; table1.exclusive := true; table1.Active := true; DBSort(table1, ['Klasse', 'Name', 'Vorname'], table1.TableName); table1.Active := false; table1.exclusive := false; table1.Active := true; table1.Filter := 'Klasse = ' + QuotedStr(form1.Edit1.Text); table1.Filtered := true; showmessage('Tabelle wurde sortiert'); |
Aber da kommt die Fehlermeldung : Tabelle in Gebrauch oder Operation bei geschlossener Datenmenge nicht möglich, je nachdem.
Kannst du noch einmal helfen? Ich grüße in die Ferne,
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Muck
      
Beiträge: 98
Erhaltene Danke: 8
Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
|
Verfasst: Di 27.05.08 20:45
Hallo,
die Zieldatei in einem BDE sort muss eine andere als die Quelldatei sein. Du gibst als Ziel table1.tablename an.
Sortiere in eine temporaere Datei.
Loesche die Originaldatei.
Und bennene die Temporaerdatei um.
Falls die Datei nicht besonders gross ist kann man auch ein
copyfile der temporaer datei auf die originaldatei wagen und anschliessend die temporaere datei loeschen.
table1 muss waehrend dessen nicht aktiv also geschlossen sein.
bye
Markus
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 27.05.08 21:17
Hi, Markus, das war klasse!! und so geht es problemlos.
Herzlichen Dank an dich!
(greetings to America)
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 31.05.08 08:00
Hi, Markus,
leider habe ich mich etwas zu früh gefreut:
Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| table1.Filter := ''; table1.Filtered := false; t_nam := table1.TableName; t_hnam := 'h.dbf'; showmessage(inttostr(table1.recordcount)); DBSort(table1, ['Klasse', 'Name', 'Vorname'], t_hnam); showmessage('sortiert'); table1.active := false; CopyFile(pchar(t_nam), pchar('schulesic.dbf'), False); CopyFile(pchar(t_hnam), pchar('sortsic.dbf'), False); deletefile(t_nam); renamefile(t_hnam, t_nam); table1.TableName := t_nam; table1.active := true; showmessage(inttostr(table1.recordcount)); table1.Filter := 'Klasse = ' + QuotedStr(form1.Edit1.Text); table1.Filtered := true; showmessage('Tabelle wurde sortiert'); showmessage(inttostr(table1.recordcount)); |
Wie man sieht, bin ich ganz vorsichtig vorgegangen. Aber schon in sortsic.dbf fehlen Datensätze! Und zwar klassenweise.
Was ist die Lösung?
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Muck
      
Beiträge: 98
Erhaltene Danke: 8
Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
|
Verfasst: Sa 31.05.08 17:07
Hallo,
ich habe Deinen Code bei mir laufen lassen mit einer DBF (200000 Saetze).
Ich konnte nicht die letzte Filterbedinung aus Edit1.Text hier testen, aber Rest ging problemlos, nirgendwo gingen Saetze verloren.
Es muss also wohl mit dem Zustand aus Table1 zu tun haben. Vielleicht hilft ja ein Schliessen von Table1 und anschliessendes oeffnen. Oder schliesse Table1 und erstelle ein neues TTable Objekt nur in der Sortier Routine fuer die Quelldatenbank. Vielleicht hast Du ja irgendwelche Index Dateien offen.
bye
Markus
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 31.05.08 19:05
Hi, Markus,
danke erstmal für deine neue Idee,
ich prüfe sie und melde mich dann wieder,
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 31.05.08 20:30
Hi, Markus,
geht (immer( noch nicht. Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| showmessage(inttostr(table1.recordcount)); hnam := table1.TableName; showmessage(hnam); table1.Filter := ''; table1.Filtered := false; showmessage(inttostr(table1.recordcount)); table1.Close; table1.open; table1.First; DBSort(Table1, ['Klasse', 'Name', 'Vorname'], 'h.dbf'); showmessage('table wurde sortiert'); table1.Close; if deletefile(hnam) then showmessage(hnam + ' wurde gelöscht') else showmessage(hnam + ' wurde nicht gelöscht'); renamefile('h.dbf', hnam); table1.TableName := hnam; showmessage(hnam); table1.Open; showmessage(inttostr(table1.recordcount)); table1.Filter := 'Klasse = ' + QuotedStr(form1.Edit1.Text); table1.Filtered := true; showmessage('weiter mit RETN ...'); form2.table1.locate('KLASSE', form1.Edit1.Text, []); |
Frust!
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 31.05.08 21:08
hallo detlef,
sag mal, weshalb nimmste nicht 'ne query? da kannst doch 'n schönes SQL statement hinterlegen und so deine daten sortiert ausgeben, wie du grad lustig bist...
im übrigen sind die tabellen immer unsortiert. wenn du die zugriffsreihenfolge ändern möchtest, kannst hier neue schlüssel hinzufügen oder löschen...
schöne grüsse
GG
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 31.05.08 22:09
Hi, GG,
is mir schon klar, die Herausforderung ist ja gerade, es ohne Query zu machen, aber es will (noch?) nicht gelingen.
Ich hoffe,
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 01.06.08 19:06
So, jetzt habe auch ich die Faxen dicke, zumal die Routine aus Delphi1 /2 - Zeiten stammt. Aber trotzdem vielen Dank für deinen Hinweis, Markus.
Ich habe jetzt als Dreizeiler eine Query genommen, und es geht prima.
Viele Grüße,
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
|