Entwickler-Ecke

Datenbanken - Neue Tabelle feldweise füllen


D. Annies - Sa 18.02.12 23:11
Titel: Neue Tabelle feldweise füllen
Hi, Delpher,

wie kann ich eine neu angelegte Tabelle mit mehreren Datensätzen feldweise füllen?

Ich habe bisher folgenden Code:


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:
while not eof(tc) do    // tc ist eine csv-Textdatei
    begin
      readln(tc, recStr);                            // 1. Lies den String ein
      rcol := 0;
      repeat
        PosKomma := Pos(',', recStr);                // 2. Finde das (jeweils) erste Komma
        if PosKomma > 0 then
          sField := Copy(recStr, 1, PosKomma - 1)    // 3.a  Kopiere den Teilstring bis zum Komma nach sField
        else
          sField := recStr;                          // 3.b  das ist der letzte Teilstring
        
        if TbSynctab.Fields[rcol].DataType = ftInteger then
          TbSynctab.Fields[rcol].AsInteger := strtoint(sField);
        if TbSynctab.Fields[rcol].DataType = ftString then
          TbSynctab.Fields[rcol].AsString := sField;            // 4.  ordne ein, z.B. in ein Stringgrid
        if TbSynctab.Fields[rcol].Datatype = ftDate then
          TbSynctab.Fields[rcol].AsDateTime := strtodate(sField);
        
        if PosKomma > 0 then
        begin                                        // 5. Lösche bis zum Komma incl.
          Delete(recStr, 1, PosKomma);
          rCol := rCol + 1;                          //    next column
        end;
      until PosKomma = 0;                            // 6. bis zum Ende des String
    end;


Wie kann ich den ersten Datensatz füllen, bzw. in der dbf-Tabelle "weiterschalten"?
Vielen Dank, Detlef


Narses - Sa 18.02.12 23:18

Moin!

BDE? Ist schon länger her... :gruebel: Das ging so ähnlich:

Delphi-Quelltext
1:
2:
3:
  Table1.Append;
  Table1['Feld1'] := 'Test';
  Table1.Post;

Noch ein Tipp: Wenn du eine CSV-Datei lesen willst, dann geht das relativ elegant mit zwei TStringList. Eine für die Datei, die andere für eine Zeile, einfach auf .CommaText schreiben, dann hast du die Felder direkt getrennt. :idea:

cu
Narses


D. Annies - So 19.02.12 13:03

Danke, das war der richtige Tipp!
Ja, es geht eleganter, aber ich bin gehalten, es so (nach-) zu machen, wie ein Dozent es vorgetragen hat.
:) Gruß, Detlef


jasocul - Mo 20.02.12 08:54

Da die Feld-Typen (ftString, ftInteger, ...) aufzählbar sind, kannst du aus deiner If-Struktur auch eine Case-Struktur machen.

Zu Narses Tipp:
Das kommt sehr auf die Datenmenge an. Eine Zuweisung ohne Typ-Prüfung ist nach meiner Erfahrung langsamer, als eine typengenaue Zuweisung.
Wenn es also nur um ein paar Datensätze geht, die eingelesen werden sollen, kann man das so machen. Bei großen Datenmengen, kann das dann aber dauern.

Außerdem solltest du dafür sorgen, dass Umwandlungen "sicher" sind. Ein StrToInt muss nicht unbedingt das Ergebnis haben, das man sich wünscht. Besser ist in dem Fall wohl StrToIntDef, wobei du dann noch eine Plausibilitätsprüfung dranhängen könntest/solltest. Aber das nur am Rande. :wink:


D. Annies - Di 21.02.12 10:09

Hi, Peter,
danke für deine Nachsorge. Die CASE..Of-Struktur werde ich wohl noch setzen.
Bis dann denn, :))
Detlef