Guten Morgen,
in unserem Projekt hab ich in den letzten zwei Wochen zwei Fehlermeldungen von Anwendern bekommen, die ich hier in unseren Umgebungen nicht nachvollziehen kann. Die "sporadischen" Fehler halt, die jeder Programmierer so sehr liebt.
Und zwar folgendes ...
Zitat:
AdsQuery: Operation bei geschlossener Datenmenge nicht ausführbar.
Exception class: EDatabaseError
Exception address: 0048A704
------------------------------------------------------------------------------
Stack list, generated 4/02/2008 11:24:17
[0048A6FF]
DB.DatabaseError + $5F
[0049688D]
DB.TDataSet.CheckActive + $31
[004993B0]
DB.TDataSet.CheckBrowseMode + $8
[00498B0F]
DB.TDataSet.First + $B
[00617BE1] RDataModule.TDBModule.AssignSendingScheduleItems (Line 3576, "units\RDataModule.pas" + 6) + $3
[00496943]
DB.TDataSet.SetActive + $77
[006181A9] RDataModule.TDBModule.GetSendingScheduleItems (Line 3693, "units\RDataModule.pas" + 21) + $C
[005B230D] RSendingManager.TSendingManager.CollectScheduleIte ms (Line 347, "units\RSendingManager.pas" + 5) + $12
[005B2F14] RSendingManager.TSendingManager.Start (Line 726, "units\RSendingManager.pas" + 22) + $3
[005BE4E7] F_SendingAssistantForm.TSendingAssistantForm.BitBt n1Click (Line 1032, "frames\F_SendingAssistantForm.pas" + 20) + $9
[004725BC] Controls.TControl.Click + $64
...
Das einzig markante ist, dass diese Anwender bereits das neueste Update haben, was wir Mitte Februar releasen wollen (haben aber auch noch ein paar mehr). Die meisten anderen Anwender haben noch eine ältere Version von Dezember. Allerdings hab ich in dem Teil des Programms in dem Zeitraum nichts weiter verändert, außer die ProgressForm da reinzupacken. Die war vorher eine "Ebene" höher (noch mit in TSendingManager).
Ist es vielleicht der zweite Zugriff auf "
Query.RecordCount" in RDataModule.AssignSendingScheduleItems für "FPrgFrm.ShowProgressForm(Language.GetString(LID_L ABEL_STATUS_CREATING_OPTIMIZATION_PLAN) + ' ...',
Query.RecordCount, nil, TRUE);"? (Code siehe unten) Kann ich mir aber nur schwer vorstellen ...
... Wie schon gesagt läuft der gleiche Spaß hier auf 4 verschiedenen Systemen blasenfrei. Auf einem Vista-Laptop laufen die Sendeaufträge sogar quasi 24/7 durch.
Ich hab bisschen gegoogelt und
gelesen, dass der Fehler eigentlich nur bei Verwendung von TTable auftritt. Da ich hier aber in dem Zusammenhang keine TTable verwende (eigentlich nirgends in dem Projekt), komme ich hier nicht weiter.
Hier noch die Codes zu den Routinen CollectScheduleItems, GetSendingScheduleItems und AssignSendingScheduleItems. TSendingManager.Start aktiviert nur einen Timer, der wiederum CollectScheduleItems bei OnTimer aufruft.
Delphi-Quellcode:
procedure TSendingManager.CollectScheduleItems;
begin
if Assigned (FOnClearHealingsheetsQue)
then
// nur Zugriff auf einen VST
FOnClearHealingsheetsQue (Self);
// FScheduleList-Items freigeben und FScheduleList.Clear;
DisposeScheduleItems;
// Sendeaufträge aus DB holen
DBModule.GetSendingScheduleItems(TRUE, 0, FScheduleList);
// nur Zugriff auf VST
DisplayHealingsheetSchedule (DEFAULT_SENDING_SCHEDULE_ITEMS);
end;
Delphi-Quellcode:
function TDBModule.RemoveInactiveSendingScheduleItems: Integer;
begin
Result := 0;
with AdsQuery,
SQL do
try
Clear;
Add ('
DELETE FROM SendingSchedule ' +
'
WHERE Active=FALSE');
ExecSQL;
Close;
Result := 1;
except
on E:
Exception do ThrowSQLException (
SQL[0], FALSE, E);
end;
end;
procedure TDBModule.GetSendingScheduleItems (ActiveOnly: Boolean; MaxItems: Integer;
var List: TSendingScheduleList);
var
s:
String;
begin
// Inaktive Sendeaufträge im Vorfeld löschen
RemoveInactiveSendingScheduleItems;
with AdsQuery,
SQL do
//try
begin
Clear;
if ActiveOnly
then
s := '
WHERE Active=TRUE '
else s := '
';
Add ('
SELECT * FROM ' +
'
SendingSchedule ' +
s +
'
ORDER BY ' +
'
SendingTimestamp');
Open;
if (RecordCount > 0)
then
AssignSendingScheduleItems (List, AdsQuery);
Close;
{ except // Catch von Exception ausgeschalten wg Fehlersuche
on E: Exception do ThrowSQLException (SQL[0], FALSE, E);}
end;
end;
Delphi-Quellcode:
procedure TDBModule.AssignSendingScheduleItems (
var List: TSendingScheduleList;
Query: TADSQuery);
var
a: Integer;
ScheduleItem: PSendingScheduleItem;
FPrgFrm: TProgressForm;
begin
FPrgFrm := TProgressForm.Create(
nil);
with Query do
try
a := 0;
FPrgFrm.ShowProgressForm(Language.GetString(LID_LABEL_STATUS_CREATING_OPTIMIZATION_PLAN) + '
...',
Query.RecordCount,
nil, TRUE);
First;
// ... entweder knallts hier ...
try
while not EOF
do // ... oder hier ...
begin
FPrgFrm.UpdateProgressBar(a + 1);
inc (a);
ProcessMessages;
New (ScheduleItem);
ScheduleItem^.ID := FieldByName ('
ID').AsInteger;
ScheduleItem^.HealingsheetIndexID := FieldByName ('
HealingsheetIndexID').AsInteger;
ScheduleItem^.ClientID := FieldByName ('
ClientID').AsInteger;
ScheduleItem^.Duration := FieldByName ('
Duration').AsInteger;
ScheduleItem^.Frequency := FieldByName ('
Frequency').AsInteger;
ScheduleItem^.SendingTimestamp := FieldByName ('
SendingTimestamp').AsDateTime;
ScheduleItem^.EndingTimestamp := FieldByName ('
EndingTimestamp').AsDateTime;
ScheduleItem^.SendingType := TSendingType (Byte (FieldByName ('
SendingType').AsInteger));
ScheduleItem^.Active := FieldByName ('
Active').AsBoolean;
List.Add(ScheduleItem);
Next;
end;
except
on E:
Exception do ThrowSQLException (
SQL[0], FALSE, E);
end;
finally
FreeAndNil (FPrgFrm);
end;
end;
Habt ihr vielleicht noch eine Idee?