20. august 2007 - 22:53 Der er 14 kommentarer og
1 løsning

Indsætte et ekstra field i en Paradox tabel i runtime

Jeg har søgt på kryds og tværs i de eksisterende spørgsmål, men jag har ikke kunnet finde et der giver svar på mit spørgsmål. Jeg håber der er en derude som kender svaret.

Hvis man har et program ude at køre forskellige steder, og man får brug for et ekstra felt i sin tabel, for at kunne tilfredsstille kundernes ønsker, hvordan indsætter man så dette ekstra felt.

Jeg havde håbet at man kunne gøre noget lignende:

Tabel1.DataSet.AddField('Slags').AsInteger;

Men det kan man ikke.
Avatar billede kroning Nybegynder
20. august 2007 - 22:58 #1
Du kan bruge SQL:
ALTER TABLE "employee.dbf" ADD BUILDING_NO SMALLINT
-----------------------

Her er mere tekst fra hjælpen:
Local SQL supports the following subset of the ANSI-standard ALTER TABLE statement. You can add new columns to an existing table using this ALTER TABLE syntax:

ALTER TABLE table ADD column_name data_type [, ADD column_name data_type ...]

For example, the following statement adds a column to a dBASE table:

ALTER TABLE "employee.dbf" ADD BUILDING_NO SMALLINT

You can delete existing columns from a table using the following ALTER TABLE syntax:

ALTER TABLE table DROP column_name [, DROP column_name ...]

For example, the next statement drops two columns from a Paradox table:

ALTER TABLE "employee.db" DROP LAST_NAME, DROP FIRST_NAME

ADD and DROP operations can be combined in a single statement. For example, the following statement drops two columns and adds one:

ALTER TABLE "employee.dbf" DROP LAST_NAME, DROP FIRST_NAME, ADD FULL_NAME CHAR[30]
Avatar billede martinlind Nybegynder
21. august 2007 - 10:19 #2
Lige et godt tip, brug en anden db end Paradox, den er forældet og bliver ikke vedligeholdt, du kan bruge ADO / Firebird / eller MyDB :)
Avatar billede hrc Mester
21. august 2007 - 12:52 #3
... og skip brugen af TTable-nedarvinger. De er meget tunge at åbne da de flytter al data, struktur og sekundære indekser over, mens en TQuery-nearving kun henter det man har brug for.

En mellemvej der ligner TTable men er TQuery er at sætte RequestLive = true;

En endnu bedre løsning er at bruge TClientDataSet som helt ligner TTable, men arbejder med SQL-queries i baggrunden. Endelig bliver opdateringer af datasættet ikke skrevet til databasen før man laver en ApplyUpdates.
21. august 2007 - 20:56 #4
Hvordan ser syntaxen ud?

ALTER TABLE "employee.dbf" ADD BUILDING_NO SMALLINT
ALTER TABLE "Blok.db" ADD SlagsNr INTEGER;

De to der æder den i hvert fald ikke.
Avatar billede kroning Nybegynder
21. august 2007 - 21:27 #5
Hvilken fejl får du?
Avatar billede kroning Nybegynder
21. august 2007 - 21:31 #6
Jeg har lige forsøgt på en paradox tabel og det virker fint.

Query1.SQL.Text:='ALTER TABLE "MedlemsKartotek.db" ADD SlagsNr INTEGER';
Query1.ExecSQL;
21. august 2007 - 21:50 #7
Hvor kommer Query1 fra?
Jeg forsøgte at lægge en TADOQuery på min form og kalde den 'Query1'.
Så ville den godt compilere, men da jeg startede programmet fik jeg en Application error.
'Exception EOleSysError in module Radio.exe at 000710F9.
Colnitialize er ikke blevet kaldt.'.
Avatar billede kroning Nybegynder
21. august 2007 - 22:24 #8
Nu nævnte du ikke at du bruge ADO komponenter, desværre kender jeg intet til ADO komponenter.
Men hvad sker der hvis du kalder:
CoInitialize(nil);

lige inden du kalder:
ADOConnection1.Open();
21. august 2007 - 23:18 #9
Jeg tror vi snakker to forskellige sprog.
Jeg har aldrig snakket om at jeg bruger ADO komponenter.
Jeg har aldrig brugt SQL før.
Du kom med en SQL sætning som kunne tilføje et felt til en tabel. Jeg spurgte om syntaksen, som du så kom med.
Jeg undrede mig over hvor 'Query1' kommer fra.
Det eneste jeg kunne finde som mindede lidt om en Query var ovennævnte TADOQuery.
Lige nu ved jeg mindre en da jeg stillede spørgsmålet.
Avatar billede kroning Nybegynder
21. august 2007 - 23:30 #10
ok, så skal jeg lige høre hvad du benytter til at forbinde til dine paradox tabeller?
Bruger du BDE?
Bruger du TTable?
Avatar billede hrc Mester
22. august 2007 - 10:13 #11
Bruger du TADOQuery skal den forbindes til database-tabellerne vha. en ConnectionString (der er en ...-knap i "Object Inspectoren" der kan hjælpe dig med det). Men det er det forkerte sted at lave forbindelsen. Det bliver lettere at forbinde vha. TADOConnection som du forbinder din TADOQuery til.

TADOConnectionen skal naturligvis åbnes før du kan bruge TADOQuery.
22. august 2007 - 21:56 #12
Jeg bruger BDE
Normalt tilgår jeg mine tabeller sådan her:
Tabel1.DataSet.Open;
Tabel1.DataSet.First;
Str1 := Tabel1.DataSet.FieldByName('Slags').AsString;
Tabel1.DataSet.Close;

Det jeg har brug for et et ekstra felt, så jeg kan skrive:
Vaerdi := Tabel1.DataSet.FieldByName('Nummer').AsInteger;

Derfor skal der tilføjes et ekstra felt til tabellen.
Da programmet kører flere steder, skal der laves en opdatering som kan tilføje dette felt i runtime, og konvertere nogle data som skal gemmes deri. Derefter skal der laves en opdatering som udnytter disse ekstra data.
Avatar billede kroning Nybegynder
22. august 2007 - 22:56 #13
På samme fane som du har din TTable findes der en TQuery og det er den du skal bruge.
28. august 2007 - 22:23 #14
Hej Kroning drop et svar så du kan få dine point.
Du hjalp mig godt på vej, du glemte dog at skrive at tabellen skal være lukket imens.

      Global.Blok.DataSet.Close;
      Query1.SQL.Text:='ALTER TABLE "Blok.db" ADD SlagsNr INTEGER';
      Query1.ExecSQL;
      Global.Blok.DataSet.Open;

Det her det virkede.
Avatar billede kroning Nybegynder
29. august 2007 - 21:29 #15
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester