Autor |
Beitrag |
der Berliner
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mo 03.04.06 18:38
Hallo zusammen,
Ich steh mal wieder auf der Leitung
Warum bekomme ich hier:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Query1.Active:=True; Query1.First; for i:=1 to BrAnz do begin Query1.Edit; Query1.FieldByName('SitzNr').Value:=i; Query1.Post; Query1.Next; end; |
den Fehler: Zitat: | Query1:eine Datenmenge die nur zum lesen ist, kann nicht geändert werden. |
Beim Query kann ich doch gar nicht readonly True/False setzen oder.
Oder liegt daran das das Query Active ist?
Danke für evtl. Hilfe
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 03.04.06 18:59
Wie sieht deine Query aus?
Hast Du RequestLive auf True gesetzt?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Mo 03.04.06 19:03
Ja hab ich ...
Mit dem Query sortiere ich eine Tabelle
SQL-Anweisung 1:
| SELECT * FROM Kandidaten ORDER BY Hoechstzahl DESC |
nach dem sortieren will ich ich in der Spalte SitzNr. Die Sitze von 1-27 durchnummerieren.
Gruß
Moderiert von raziel: Quote- durch SQL-Tags ersetzt
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Mo 03.04.06 21:00
Moin
der Berliner hat folgendes geschrieben: | Ja hab ich ...
Mit dem Query sortiere ich eine Tabelle
SQL-Anweisung 1:
| SELECT * FROM Kandidaten ORDER BY Hoechstzahl DESC |
nach dem sortieren will ich ich in der Spalte SitzNr. Die Sitze von 1-27 durchnummerieren.
... |
Punkt 1: Dieses ist eine Abfrage und die hat nur Lesecharakter! Somit ist die Fehlermeldung auch sinnvoll und richtig!!
Query1.Edit etc geht also nicht. zur Eigenschaft RequestLive siehe die OH...
Punkt 2: Wie willst Du die Sitze durchnummerieren? Nach welchem Kriterium?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 03.04.06 21:28
Ein "order by" kann bei Datenbanken dazu führen, dass auch ein RequestLive := true ignoriert wird. Das muss nicht immer sein, aber ich wäre da vorsichtig.
In diesem Fall würde ich ein Update-Statement verwenden und hinterher ein Refresh auf deine sortierte Abfrage machen.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 03.04.06 22:35
Evtl. wäre auch zu überlegen, ob man das nicht auch über ne Table machen kann und dort dann die OrderBy's vom TDataSet verarbeiten lässt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Do 06.04.06 07:45
HAllo
Zitat: | Punkt 2: Wie willst Du die Sitze durchnummerieren? Nach welchem Kriterium? |
Na einfach nach dem sortieren mit dem ORDER BY Größte Höchstzahl = Sitz Nr 1
nächst kleinere Höchstzahl = Sitz NR 2 usw.
bis 27 Sitze vergeben sind.
Gruß
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Do 06.04.06 07:50
BenBE hat folgendes geschrieben: | Evtl. wäre auch zu überlegen, ob man das nicht auch über ne Table machen kann und dort dann die OrderBy's vom TDataSet verarbeiten lässt. |
Moin
Hab ich auch schon mal versuch.
Hab die Hoechtszahlen in ein ARRAY gepackt und mit nem ShellSort sortiert.
dann hatte ich das Problem das ich die Sortierten Zahlen danach nicht mehr dem Kandidaten zuordnen konnte(könnte an meiner Unwissenheit liegen)und somit die Sitzverteilung nicht mehr korrekt war.
gruß
|
|
raiguen
      
Beiträge: 374
WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
|
Verfasst: Fr 07.04.06 12:13
Moin
Eine Möglichkeit wäre das z.B.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure ButtonSitzverteilungClick(Sender: TObject); var aHighScore: array of String; I,RecAnz: Integer; begin Query1.SQL.Text := 'SELECT KandidatName, Hoechstzahl FROM Kandidaten ORDER BY Hoechstzahl DESC'; Query1.Open; RecAnz := Query1.RecordCount; SetLength(aHighScore,RecAnz+1);
while not Query1.Eof do begin aHighScore[Query1.RecNo] := Query1.Fields[0].AsString; Query1.Next; end;
query1.Close; Query1.SQL.Text := 'UPDATE Kandidaten SET SitzNr=:NR WHERE kandidatname=:KN');
for I := 1 to High(aHighScore) do begin Query1.ParamByName('KN').AsString := aHighScore[I]; Query1.ParamByName('NR').AsInteger := I; Query1.ExecSQL; end; ... end; |
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Fr 07.04.06 14:44
Hallo raiguen
Funktioniert gut..Danke
Ein kleines prob gibt es dennoch.
Wenn ich das prog ein paar mal Gestartet (und natürlich wieder geschlossen) habe kommt ne fehlermeldung:
"Das Feld SitzNr wurde nicht gefunden"
woran kann das liegen?
alles andere klapp die sitze werden richtig eingetragen ..muß nur noch ein bischen an der Anzahl Arbeiten. es dürfen nur 27 sein.
Das sollte aber kein prob sein.
ein Dankbare Berliner
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 07.04.06 14:56
Datenzugriffsfeld erzeugt ?
_________________ Markus Kinzler.
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Fr 07.04.06 15:06
Kannst du das erklären Datenzugriffsfeld..meint du ein Grid oder sowas ?
Steh grad aufm Schlauch
und gleich noch ne Frage (Siehe Quelltext):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| procedure TForm1.PageControl2Change(Sender: TObject); Var i,recanz:Integer; var aHighScore: array of String; begin if PageControl2.ActivePageIndex=0 then begin TableKandidaten.Filter:='ListeNr='+QuotedStr(IntToStr(TableListenListeNr.AsInteger)); TableKandidaten.Filtered:=True; end else begin TableKandidaten.Filtered:=False; Query1.SQL.Text := 'SELECT KandidatName, Hoechstzahl FROM Kandidaten ORDER BY Hoechstzahl DESC'; Query1.Open; RecAnz := Query1.RecordCount;
SetLength(aHighScore,RecAnz+1);
while not Query1.Eof do begin aHighScore[Query1.RecNo] := Query1.Fields[0].AsString; Query1.Next; end;
query1.Close; Query1.SQL.Text := 'UPDATE Kandidaten SET SitzNr=:NR WHERE kandidatname=:KN';
for I := 1 to High(aHighScore) do begin Query1.ParamByName('KN').AsString := aHighScore[I]; Query1.ParamByName('NR').AsFloat := I; Query1.ExecSQL; end; Query1.Active:=True; end; end; |
Es kommt aber der Fehler "Fehler beim Erstellen des Cursor-Handle"
Ich weiß nich mehr weiter. 
Zuletzt bearbeitet von der Berliner am Fr 07.04.06 15:20, insgesamt 1-mal bearbeitet
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 07.04.06 15:13
Entweder eine Komponente, die mit dem DataSet verknüpft ist oder ein durch Doppelklick auf das DataSet erzeugtes Zugriffsfeld (TField).
_________________ Markus Kinzler.
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Fr 07.04.06 15:22
jepp...siehe oben ist ein DBGrid
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Fr 07.04.06 15:24
Ich würde für den Update-Vorgang eine eigene Query-Komponenete nehmen oder ein gleich TUpdateSQL. Sonst mußt du nach dem Update die ursprüngliche Select-Abfrage wieder in den Query eintragen und erneut ausführen.
_________________ Markus Kinzler.
|
|
der Berliner 
      
Beiträge: 417
Win Xp Home
delphi 2005
|
Verfasst: Fr 07.04.06 15:34
Hey cool danke..
Der Tipp war Goldrichtig..
Die Betriebsräte werden Euch ewig danken.
|
|