Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ClientDataSet MSSQL Tabelle durcheinander (https://www.delphipraxis.net/169968-clientdataset-mssql-tabelle-durcheinander.html)

Barthiboy 23. Aug 2012 06:24

Datenbank: MSSQL • Version: 2012 • Zugriff über: XE2

ClientDataSet MSSQL Tabelle durcheinander
 
Hallo zusammen,

ich habe ein Problem bei dem zugriff auf meine Datenbank.
Folgender Porgrammaufbau:
Serververbindung:
SQLConnection->SQLDataSet->DataSetProvider->ClientDataSet.
Datenzugriff:
DBGrid->DataSource->ClientDataSet

Ich befülle das DBGrid und möchte dann mit Fehler := ApplyUpdate(-1) die Daten auf den Server laden.
Es sind Testweise 800 Zeilen in 8 Spalten.
Die Zeilen enthalten aufsteigend Zahlen. Die Daten werden im DB aufsteigend eingetragen.
Allerdings werden sie in falscher Reihenfolge auf dem Server abgelegt.
Bsp:
1 Eintrag = 1
2 Eintrag = 2
.
.
.
55 Eintrag = 55
56 Eintrag = 56
57 Eintrag = 103

Die ersten ca. 50 Einträger werden aufsteigend geschrieben. Dann werden sie zufällig vertauscht.
Für mich ist bis jetzt noch kein Vertauschungsschema zu erkennen.
Hatte schon jemand mal so ein Problem?
Danke für die Hilfe

Hier mein Code
Code:
procedure TFahrplan.Btn_beschriftenClick(Sender: TObject);
var FP, pos, u: Word;
Fahrplan_PM, Fahrplan : String;
DBFehler, Absender,Ziel,Alter,Fehler,Info,SP_FK,Field : LongInt;
begin
  Field := 1;
  Absender := 1;
  Ziel := 1;
  Alter:= 1;
  Fehler:= 1;
  Info := 1;
  SP_FK := 1;
    //mssql.ClientDataSet.Edit;
    for FP := 1 to StrToInt(Edit1.Text) do begin
      Fahrplan_PM := '';
      case FP of
        1..9    : Fahrplan := 'FP0' + IntToStr(FP);
        10..100 : Fahrplan := 'FP' + IntToStr(FP);
      end;
      for u := 1 to 2 do begin
        for pos := 1 to 50 do begin
          case pos of
            1..9  : Fahrplan_PM := Fahrplan + '_U' + IntToStr(u) + '_Pos0' + IntToStr(pos);
            10..50: Fahrplan_PM := Fahrplan + '_U' + IntToStr(u) + '_Pos' + IntToStr(pos);
          end;
          mssql.ClientDataSet.AppendRecord ([ Fahrplan_PM,Fahrplan,0,0,0,0,0,0]);
        end;
      end;
    end;
  DBFehler := mssql.ClientDataSet.ApplyUpdates(0);
end;

procedure TFahrplan.FormActivate(Sender: TObject);
begin
  if mssql.ClientDataSet.Active then
    mssql.ClientDataSet.Close;
  mssql.SQLDataSet.CommandText := 'select * from Fahrplan';

  mssql.ClientDataSet.Open;
  mssql.ClientDataSet.Active := true;
  DS_FahrPos.Enabled := true;
  mssql.FMetaDataProvider := TDBXDataExpressMetaDataProvider.Create;
end;

Furtbichler 23. Aug 2012 06:32

AW: ClientDataSet MSSQL Tabelle durcheinander
 
Es gibt in einem RDBMS keine Reihenfolge der Daten. Es handelt sich um eine Daten*menge*, und Mengen haben keine Ordnung. Erst durch explizite Angabe einer Sortierreihenfolge in einem SELECT wird eine willkürliche Reihenfolge hergestellt.

Code:
SELECT * FROM Tabelle ORDER BY <FeldzumSortieren>
Der Server liefert dir die Daten also in irgendeiner Reihenfolge. Das ist dann die, in der er die Daten ausgelesen hat. Sogar diese Reihenfolge kann sich zwischenzeitlich ändern, nämlich dann, wenn der Server die Daten umsortiert, um z.B. Löcher, die durch Löschoperationen entstanden sind, zu stopfen.

Sofern du allerdings eine Identity-Spalte als 'Primary Key' in deinem SQL-Server definiert hast, bin ich mir ziemlich sicher, das der Server dir dann die Daten sortiert nach Erstellungszeitpunkt liefert. Genauergesagt sortiert nach dem PK, aber die Ordnung dieser Spalte entspricht der Ordnung des Erstellungszeitpunktes.

Barthiboy 23. Aug 2012 06:57

AW: ClientDataSet MSSQL Tabelle durcheinander
 
Vilen Dank für die schnelle Antwort.
Sehr gute Erklärung.
Hat auf Anhieb funktioniert.
Danke
Schönen Tag noch


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr.

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