| Autor |
Beitrag |
Arne Danikowski
      
Beiträge: 194
|
Verfasst: Mo 31.03.08 10:48
Hallo erst mal.
Ich hänge total fest. Brauch da echt mal Unterstützung:
Ich lese über folgenden Code die Feleigenschaften einer DBase Datei aus:
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:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; s: string; function getAccessType(fd: TFieldDef): string; var ft: TFieldType; begin memo1.Visible:=True; FoundFiles.Visible:=false;
ft := fd.DataType; case ft of ftAutoInc: Result := 'COUNTER'; ftString: Result := 'TEXT(' + IntToStr(fd.Size) + ')'; ftSmallint: Result := 'SMALLINT'; ftInteger: Result := 'INTEGER'; ftWord: Result := 'WORD'; ftBoolean: Result := 'YESNO'; ftFloat: Result := 'FLOAT'; ftCurrency: Result := 'CURRENCY'; ftDate, ftTime, ftDateTime: Result := 'DATETIME'; ftBlob, ftGraphic: Result := 'LONGBINARY'; ftMemo, ftFmtMemo: Result := 'MEMO' else Result := 'MEMO' end end; begin
Table1.TableName := dbfname; Table1.FieldDefs.Update; s := 'CREATE TABLE ' + Table1.TableName + ' ('; with Table1.FieldDefs do begin for i := 0 to Count - 1 do begin s := s + ' ' + Items[i].Name; s := s + ' ' + getAccessType(Items[i]); s := s + ',' end; s[Length(s)] := ')' end; Memo1.Clear; Memo1.Lines.Add(s); button2.Enabled := true; AccessTabelleinDatenbankerstellen1.Enabled:=true; StatusBar.SimpleText:='SQL Anweisung erfolgreich erzeugt' end; |
Das funktioniert auch so weit. Ich erhalte im Momofeld folgendes Ergebnis:
SQL-Anweisung 1:
| CREATE TABLE ARTIKEL ( ARTNR TEXT(25), MATCH TEXT(36), ARTBEZ1 TEXT(50), ARTBEZ2 TEXT(50), KURZ TEXT(3), ERSATZ TEXT(16), EINHEIT TEXT(10), WGR TEXT(10), HERSTELLER TEXT(25), LIEFERANT TEXT(20), SYMBOLNR TEXT(3), SYMBOLDAT TEXT(2), MAKRO TEXT(16), BESTAND FLOAT, MBESTAND FLOAT, X FLOAT, Y FLOAT, Z FLOAT, ZEIT FLOAT, LOHNK FLOAT, MWST FLOAT, EK FLOAT, VK FLOAT, KNG TEXT(3), LAGERORT TEXT(10), LAND1 TEXT(50), LAND2 TEXT(50), LAND3 TEXT(50), LAND4 TEXT(50), LAND5 TEXT(50), ARTBEZ3 TEXT(50), MATKEY TEXT(30), MKZ TEXT(1), GEWICHT FLOAT, WAEHRUNG TEXT(3), ZUSARTNR TEXT(5), TEILEART TEXT(1), PRODUKTGR TEXT(3), BEMERKUNG TEXT(20), STATUS TEXT(1), STATNR TEXT(11), ERFASSER TEXT(20), ERFDAT DATETIME, AENDERNAME TEXT(20), AENDERDAT DATETIME, DOKVERW TEXT(80), BESTANDKZ TEXT(3), GEWICHTKZ TEXT(1), ENTSPRICHT TEXT(16), BAUFORM TEXT(20), TECHDAT TEXT(20), TDAT MEMO) |
Über einen zweiten Button versuche ich eine Tabelle in einer Accessdatenbank anzulegen. Hier der Code des 2.Buttons:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button2Click(Sender: TObject); begin try ADOCommand1.CommandText := 'DROP TABLE ' + combobox1.text; ADOCommand1.Execute except end; ADOCommand1.CommandText := Memo1.Text; ADOCommand1.Execute; button3.Enabled := true; DatenKopieren1.Enabled:=true; StatusBar.SimpleText:='Tabelle wurde erstellt'; end; |
Nun erhalte ich zwei Fehlermeldungen:
1. Tabelle nicht forhanden
2. Syntextfehler in Felddefinition
Wenn ich den ausgelesenen Code in Access als SQL Anweisung eingebe, funktioniert aber alles.
Wo liegt mein Fehler? Kann da jemand weiterhelfen?
Moderiert von Klabautermann: SQL-Tag hinzugefügt.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 31.03.08 12:03
Semikolon am Ende vielleicht? 
_________________ Na denn, dann. Bis dann, denn.
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mo 31.03.08 12:32
Die erste Meldung kommt wohl daher, dass beim DROP TABLE die Tabelle nicht vorhanden ist. Das gibt einen Fehler, ist aber erst einmal nicht weiter schlimm.
Versuch mal im CREATE TABLE statement die FLOATs durch DOUBLE zu ersetzen.
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: Mo 31.03.08 13:37
Hallo, danke für die schnellen Antworten.
zu alzaimar
ich wüsste nicht, wo da ein Simikolon hin sollte
zu iKilledKenny
Stimmt es kann vorkommen, das die Tabelle nicht vorhanden ist, daher dachte ich versuch ich es mit einem Try. Komisch ist nur, das es manchmal funktioniert und manchmal nicht. Ist aber echt nicht so wichtig, damit kann ich mich beschäftigen, wenn es soweit ist
ich habe die
Delphi-Quelltext 1:
| ftFloat: Result := 'FLOAT'; |
in
Delphi-Quelltext 1:
| ftFloat: Result := 'DOUBLE'; |
geändert.
Der Fehler bleibt. Mir ist allerdings aufgefallen, wenn ich die SQL Anweisung im Momofeld auf einen Eintrag beschränke also sum Beispiel
SQL-Anweisung 1:
| CREATE TABLE ARTIKEL ( ARTNR TEXT(25)) |
funktioniert es.
Noch ne Idee? Oder braucht jemand mehr Code?
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mo 31.03.08 13:59
Dann nimm der Reihe nach ein Feld nach dem anderen mit dazu, irgendwann kriegst du den Fehler und du weisst, woran es lag... 
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: Mo 31.03.08 14:05
Da wird doch der Hund in der Pfanne verrückt.
Es liegt ab der Felddefinition
SQL-Anweisung 1:
| CREATE TABLE ARTIKEL ( MATCH TEXT(25)) |
Alle anderen Felder funktionieren, nun kapier ich aber nicht warum, die Feldbezeichnung ist nunmal MATCH. Das muss auch so bleiben.
Der Feldtyp stimmt auch. In der Dbase Datei als <C> gekennzeichnet, also Text.
Was nun ?
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mo 31.03.08 14:08
Versuch mal, das MATCH in Anführungszeichen zu setzen, das kannst du auch gefahrlos mit allen anderen Feldern machen.
Wenn das nicht geht, musst du wohl oder übel das Feld umbennen...
Zuletzt bearbeitet von iKilledKenny am Mo 31.03.08 14:09, insgesamt 1-mal bearbeitet
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 31.03.08 14:09
'MATCH' ist wohl ein reserviertes Wort, klammere es in '[' und ']' oder '"', je nachdem, was Access so kann.
Ach, und das Semikolon könnte ans Ende, einige DBs sind da zigig.
_________________ Na denn, dann. Bis dann, denn.
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: Mo 31.03.08 14:27
Hab alles ausprobiert, geht nicht wenn ich Access öffne und über Abfragen die SQL Anweisung in die SQL Abfrage kopiere und ausführe, dann funktioniert das tadellos.
Bin total am Ende meiner Weisheit, und die ist eh schon nicht besonders groß! 
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mo 31.03.08 14:41
Arne Danikowski hat folgendes geschrieben: | Hab alles ausprobiert, geht nicht wenn ich Access öffne und über Abfragen die SQL Anweisung in die SQL Abfrage kopiere und ausführe, dann funktioniert das tadellos.
Bin total am Ende meiner Weisheit, und die ist eh schon nicht besonders groß!  |
Was hast du alles ausprobiert? Nur die Anführungszeichen, oder auch die eckigen Klammern, oder auch die Kombination von beidem? Anführungszeichen gibts einzeln und doppelt...
Probier bitte alle Kombinationen aus um sicher zu gehen, ansonsten: Feld umbenennen... 
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: Mo 31.03.08 15:43
Alle Kombinationen ausprobiert [] [''] '' "" [""] etc.
Das Feld kann ich nicht umbenennen, da die Datenbank ja nur ins Access Format konvertiert wird, die Anwendung greift ja auf das Feld zu.
Die Tabellen sind alle miteinander verknüft über mehrere Anwendungen 
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mo 31.03.08 20:52
Habs probiert, funktioniert prima bei mir...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject);
var cmd : TAdoCommand; begin ADOConnection1.Connected := True; cmd := TAdoCommand.Create (nil); cmd.Connection := ADOConnection1;
cmd.CommandText := 'create table test ([MATCH] text(25))'; cmd.CommandType := cmdText; cmd.Execute; end; |
Die Connection liegt auf einer Form und ist mit einer Access 2003 DB verknüpft. Ich nutze Delphi 5 Enterprise.
|
|
|