Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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:

ausblenden 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:

ausblenden 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 user profile iconKlabautermann: SQL-Tag hinzugefügt.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 31.03.08 12:03 
Semikolon am Ende vielleicht? :nixweiss:

_________________
Na denn, dann. Bis dann, denn.
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
ftFloat: Result := 'FLOAT';					


in
ausblenden 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

ausblenden SQL-Anweisung
1:
CREATE TABLE ARTIKEL ( ARTNR TEXT(25))					


funktioniert es.

Noch ne Idee? Oder braucht jemand mehr Code?
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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... :idea:
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 31.03.08 14:05 
Da wird doch der Hund in der Pfanne verrückt.

Es liegt ab der Felddefinition

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mo 31.03.08 14:41 
user profile iconArne 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mo 31.03.08 20:52 
Habs probiert, funktioniert prima bei mir... :nixweiss:

ausblenden 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.