Autor Beitrag
Morpheus1572
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Fr 12.09.08 19:14 
Moin,

ich habe ein Verständnisproblem - wobei ich noch nicht mal sicher bin, dass ich es richtig anpacke...

Zum besseren Verständnis:

es existiert eine Tabelle 'Tour' in der logischerweise Tourennummern hinterlegt sind. Ich lese eine Datei ein, in der jedoch eine Tour vorkommen kann, dich die Tabelle noch nicht kennt. um nun diese tour in die tabelle zu schreiben und deren index zu erfahren habe ich gedacht, dass ich es mit try und except mache (siehe unten).

nur finde ich nicht den dreh- und angelpunkt wie ich es erreiche in den except-bereich zu gelangen. solange die touren vorhanden sind ist alles schön. kommt er an die stelle der unbekannten tour "rotzt" mir das programm ab, weil er die tour nicht kennt.

Vorgeschichte zum code:
ich lese eine txt.datei ein und verlege sie in einzelne segmente dich ich auf verschiedene tabellen verteile. hoffe man versteht was ich suche, wenn nicht helfe ich gern, hoffe auch, dass ich soweit "sauber" programmiert habe.

ausblenden Delphi-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:
      try
      // Um die TID zu erfahren muss ich sie ermitteln
      ADOTable7.TableName :='Tour';
      ADOTable7.Active:=true;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
      except
  // Wenn die Tour nicht existiert muss sie hinzugefügt werden
//      if not ADOQuery1.Parameters.ParamByName('apptype').Value=Tour then
//        begin
        ShowMessage('Komm ich in die Schleife?');
        ADOTable7.Insert;
        ADOTable7.FieldByName('Tour').AsString:=Tour;
        ADOTable7.Post;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
//        ADOQuery1.Prepared := true;
//        ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
    end;
  ADOQuery1.Prepared := true;
  ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
  ADOQuery1.Active:=true;
  ds := DataSource7.DataSet;
  Tour := ds['TID'];


Thx im Voraus

Morph.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Fr 12.09.08 19:29 
Der Teil zwischen Except und End wird nur ausgeführt, wenn es zu einer Ausnahme kommt. Soviel zum Verständnis. Wenn du dann trotzdem ne Fehlermeldung siehst, deutet dies darauf hin dass im Exception-Teil noch eine weitere Exception ausgelöst wird. Entweder ist also dein Code Feherhaft, oder du musst den Code im Exception-Teil verschachteln noch einmal in ein try..except setzen (vermutlich trifft jedoch ersteres zu).

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1337
Erhaltene Danke: 119

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 12.09.08 21:15 
Ich glaube, so wie bisher kann das nichts werden. Es knallt in Zeile 22 deines Quelltextauschnittes.
Diese Lösung dürfte an dein Ergebnis sicher näher rankommen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
      try
      // Um die TID zu erfahren muss ich sie ermitteln
      //ADOQuery1.SQL.Clear; <- das brauchst du nicht wenn du den SQL String via .Text zuweist
      ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
      ADOQuery1.Prepared := true;
      ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
      ADOQuery1.Active:=true;
      except
  // Wenn die Tour nicht existiert muss sie hinzugefügt werden
        ShowMessage('Komm ich in die Schleife?'); // Such, Hasso such! Wo ist die Schleife?
        ADOTable7.TableName :='Tour';
        ADOTable7.Active:=true;
        ADOTable7.Insert;
        ADOTable7.FieldByName('Tour').AsString:=Tour;
        ADOTable7.Post;
        Tour := ADOTable7.FieldByName('TID').AsInteger; // <- so müsstest du auch an die ID kommen
    end;

Wobei ich nicht verstehe warum deine Query eine Exception liefern sollte wenn sie keine Daten findet.
Aber das kann ja an der Implementierung liegen.
Ich hätte darauf getippt auf RecordCount = 0 testen zu können:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
      // Um die TID zu erfahren muss ich sie ermitteln
      ADOQuery1.SQL.Text := 'SELECT TID FROM Tour WHERE Tour = :apptype';
      ADOQuery1.Prepared := true;
      ADOQuery1.Parameters.ParamByName('apptype').Value:=Tour;
      ADOQuery1.Active:=true;
      if ADOQuery1.RecordCount = 0 then
      begin
        ADOTable7.TableName :='Tour';
        ADOTable7.Active:=true;
        ADOTable7.Insert;
        ADOTable7.FieldByName('Tour').AsString:=Tour;
        ADOTable7.Post;
        Tour := ADOTable7.FieldByName('TID').AsString; // <- so müsstest du auch an die ID kommen
      end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.09.08 21:36 
Das kann man und sollteman ohne Exception lösen. Exceptions sind dazu da Ausnahmefehler, also Fehler auf die du so gut wie keinen Einfluss hast, b zu behandel und wenn für dich das nicht existieren der Tablle eine Ausnahme ist, dann stimmt was in deinem Konzept nicht.
Morpheus1572 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: So 14.09.08 09:16 
Morgen,

Danke leute für die vielen Berichte. ich habe es letzendlich auch mit einer IF-Then-Else erledigt. dachte es wäre eleganter mit try-except, aber nachdem mein code immer schlimmer wurde kam mir endlich die idee mit if.

Morph.