Entwickler-Ecke

Datenbanken - Oracle-Delphi


chibi-chan - Mi 01.09.10 17:47
Titel: Oracle-Delphi
Habe in Oracle eine Procedure erstellt.

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
PROCEDURE UPDATE_TABLE (p_filename IN VARCHAR2)
IS
   current_transaction_id   INT := 0;
BEGIN
   SELECT sn_tr_seq.NEXTVAL
     INTO current_transaction_id
     FROM DUAL;

   INSERT INTO sosa_tools.serial_transaction
               (transaction_id, filename, tr_date
               )
        VALUES (current_transaction_id, p_filename, SYSDATE
               );

   COMMIT;
END;

Daten aus dem ExcelFile in die Datenbank hinein schreiben und anzeigen funktioniert ganz gut.

Jedoch das Speichern von Filename in die Datenbank funktioniert leider nicht.

Bitte helft miiir! >.<


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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
implementation

{$R *.dfm}

procedure TfMain.FormShow(Sender: TObject);
begin
 Caption := AppVersion;
end;

procedure TfMain.Button1Click(Sender: TObject);
begin
 loadExcel('C:\Development\Tools\SerialTracker\Data\08_27082010.xlsx');
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
  if not VarIsEmpty(V) then
    V.Quit;
end;

procedure TfMain.loadExcel(FileName: String);

  var
   exit : Boolean;
   i : integer;
   test : String;
   MySettings: TformatSettings;

begin
  MySettings.DateSeparator := '.';
  MySettings.ShortDateFormat := 'dd.mm.yy';
  V := CreateOleObject('Excel.Application');
  V.Visible := True;
  V.Workbooks.Open(FileName);
  //ShowMessage(V.activeWorkbook.worksheets[1].Cells[1,1]);
  dm.qSerialTracker.Close;
  dm.qSerialTracker.Open;
  //dm.qSerialTracker.Edit;
  //dm.qSerialTracker.Insert;
  //dm.qSerialTracker.FieldByName('order_no').AsString := V.activeWorkbook.worksheets[1].Cells[i,1];

   // Dies funktioniert leider nicht..
   dm.update_table_serial.ParamByName('p_filename').AsString := ('08_27082010.xlsx');

   
//Dieser Teil funktioniert
i := 1;
   exit := False;
   repeat
     Inc(i);
     test := V.activeWorkbook.worksheets[1].Cells[i, 1];
       dm.sp_ins_sn_line.ParamByName('p_order_no').AsString := V.activeWorkbook.worksheets[1].Cells[i, 1];
       dm.sp_ins_sn_line.ParamByName('p_digit8').AsString := V.activeWorkbook.worksheets[1].Cells[i, 2];
       dm.sp_ins_sn_line.ParamByName('p_bezeichnung').AsString := V.activeWorkbook.worksheets[1].Cells[i, 3];
       dm.sp_ins_sn_line.ParamByName('p_snr').AsString := V.activeWorkbook.worksheets[1].Cells[i, 4];
       dm.sp_ins_sn_line.ParamByName('p_empfaenger').AsString := V.activeWorkbook.worksheets[1].Cells[i, 5];
       dm.sp_ins_sn_line.ParamByName('p_adresse').AsString := V.activeWorkbook.worksheets[1].Cells[i, 6];
       dm.sp_ins_sn_line.ParamByName('p_plz').AsString := V.activeWorkbook.worksheets[1].Cells[i, 7];
       dm.sp_ins_sn_line.ParamByName('p_ort').AsString := V.activeWorkbook.worksheets[1].Cells[i, 8];
       dm.sp_ins_sn_line.ParamByName('p_lieferdatum').AsDate := StrToDate(V.activeWorkbook.worksheets[1].Cells[i, 9], MySettings);
       dm.sp_ins_sn_line.Execute;
     test := V.activeWorkbook.worksheets[1].Cells[i + 11];
   until Length(test) = 0;

end;

end.

Moderiert von user profile iconNarses: SQL-Tags hinzugefügt
Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


uko - Do 02.09.10 05:40

Guten Morgen,

was genau geht denn nicht? Was ich aus den Zeilen rausles: du setzt zwar den Parameter für die Stored Procedure, führst sie aber nicht aus.
kleine Nebenbemerkung: nimm das Commit aus der SP raus. Damit zerstörst Du Dir in der Regel jegliches Fehlerhandling! Immer erst dann committen, wenn die komplette logische Transaktion beendet ist. Geht nämlich beim Einlesen der eigentlich Daten etwas schief, dann hast Du jetzt nämlich einen Kopfsatz in der DB stehen, der keine/unvollständige Daten enthält!

Grüße,
Uli


chibi-chan - Do 02.09.10 08:20

Das Hineinschreiben von transaction_id, filename und tr_date in die Datenbank funktioniert nicht...

SQL-Anweisung
1:
2:
3:
4:
5:
INSERT INTO sosa_tools.serial_transaction
               (transaction_id, filename, tr_date
               )
        VALUES (current_transaction_id, p_filename, SYSDATE
               );

wie kann ich es ausführen??

Moderiert von user profile iconNarses: SQL-Tags hinzugefügt


uko - Do 02.09.10 08:55

das Statement ist doch in der Stored Procedure. Also führ halt die aus. Oder rufst Du die SP doch irgendwo auf und du bekommst irgendwo einen Fehler der unterdrückt wird? Wie greifst Du überhaupt von Delphi aus auf Oracle zu.
Etwas mehr Info wäre halt dann doch hilfreich! :roll:


chibi-chan - Do 02.09.10 09:02

Auf die Datenbank greife ich mit OraStoredProc zu.
Das problem ist das ich keine Fehlermeldungen bekomme..
aber ich werde es ausprobieren


uko - Do 02.09.10 09:17

Hast Du's mal mit

Delphi-Quelltext
1:
2:
   dm.update_table_serial.ParamByName('p_filename').AsString := ('08_27082010.xlsx');
   dm.update_table_serial.Execute;

probiert?

Ansonsten: Ich rate jetzt mal: Du verwendest von DevArt die ODAC Komponenten als Zugriff, oder? Dann sollte es mit dem Execute oben gehen (eventuell noch Prepare davor aufrufen).

Uli


chibi-chan - Do 02.09.10 11:36

ja natürlich!!

Vielen Dank!!

Es war wirklich ein blöder Fehler... peinlich peinlich