Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98
Erhaltene Danke: 8

Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
BeitragVerfasst: 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.

ausblenden 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..79of 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(nilnil,nil, d.Handle, A, nil,
  nil, High(Sortfeld)+1, @Field[0], @CaseIns, nilnil, False, nil, Recs));
DBSort:=Recs;
end;


bye

Markus
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98
Erhaltene Danke: 8

Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 27.05.08 20:32 
Hi, Markus,

danke erstmal, jetzt habe ich den folgenden Code:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98
Erhaltene Danke: 8

Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 27.05.08 21:17 
Hi, Markus, das war klasse!! und so geht es problemlos.

Herzlichen Dank an dich! :D :D :D
(greetings to America)

_________________
ut vires desint, tamen est laudanda voluntas
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 31.05.08 08:00 
Hi, Markus,
leider habe ich mich etwas zu früh gefreut:

Code:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98
Erhaltene Danke: 8

Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 31.05.08 20:30 
Hi, Markus,

geht (immer( noch nicht. Code:

ausblenden 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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, :evil: :shock: :?: :idea: :!:
Gruß, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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