Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi primärschlüsselfeld definieren (https://www.delphipraxis.net/124221-primaerschluesselfeld-definieren.html)

hyype 17. Nov 2008 07:50

Datenbank: MSSQL • Zugriff über: ADO

primärschlüsselfeld definieren
 
hi Kollegen,

ich habe folgendes Problem:
Ich hole mir aus einer MS SQL DB Daten über eine ADOConnection und ein ADOQuery usw. und hau sie dann in ein CDS.
Das Problem ist, dass die Information, welche Spalte der Primärschlüssel ist, nicht ebenfalls der DB entnommen wird.
Ich brauche aber für die ApplyUpdates-Funktion des CDS diese Information.
Aber wie definier ich ein Feld als Primärschlüsselfeld (der Primärschlüssel ist bei der Tabelle nur eine Spalte, nix zusammengesetztes) und bei welchem Steuerelement mach ich das? Ich würd denken bei der ADOQuery, weils von da aus an die anderen Steuerelemente (also ans CDS) weitergegeben wird.
Ich versuche gerade, in der ADOQuery ein Feld zu erstellen, bevor die SQL-Anweisung ausgeführt wird, damit ich dem Feld den fieldkind-Wert fkLookup geben kann. Dann hab ich gedacht, kann ich's vielleicht mit keyfields zum Primärschlüsselfeld machen, aber kA, ob das so geht.
Schöner wäre es auf jeden Fall, wenn man die ADOQuery dazu bringen könnte, selber mal in der DB zu gucken, was der Primärschlüssel ist, das muss doch auch irgendwie gehen..
Bitte um Mithilfe ^^

mkinzler 17. Nov 2008 07:55

Re: primärschlüsselfeld definieren
 
Das solltesst du in der DB anlegen

hyype 17. Nov 2008 08:10

Re: primärschlüsselfeld definieren
 
Die Tabelle mit dem Primärschlüssel ist in der DB selbstverständlich als Primärschlüsseltabelle definiert, nur diese Information wird nicht aus der DB geholt...
Mein oben beschriebener Versuch führte jetzt zu diesem Ergebnis:
"Lookup-Information für Feld 'MYPE_NR' ist unvollständig"
MYPE_NR ist die Spalte mit dem Primärschlüssel.
Hier mal noch bissl Code:
Delphi-Quellcode:
var
  pkf:TIntegerfield;
begin
  pkf:=TIntegerfield.Create(datamodule3.adoquery1);
  pkf.FieldName:=tblname+'_NR';
  pkf.Lookup:=true; //setzt fieldkind auf fkLookup

.
.
.

    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    adoquery1.Fields.Add(pkf);
    ADOQuery1.SQL.Add(sql_anweisung);
    ADOQuery1.Open;
P.S.:
kann auch gut sein, dass das, was ich versuche zu tun, nix mit dem zu tun hat, was ich machen will.. ^^
evtl haben lookup felder eine ganz andere funktion
wenn ich z.bsp. ein feld monatsgehalt, ein feld prämie und ein feld jahresgehalt habe und das jahresgehalt zur laufzeit berechnet wird (12*monatsgehalt + prämie), dass dann monatsgehalt und prämie lookup-felder sein müssen, das also nix mit dem primärschlüssel zu tun hat

hyype 17. Nov 2008 09:00

Re: primärschlüsselfeld definieren
 
ICH HABS!!!
adoquery1.FieldByName(tblname+'_NR').ProviderFlags :=[pfInKey];
Diese Zeile besagt, dass wenn DSP.UpdateMode auf upWhereKeyOnly gesetzt ist, er die Felder mit dem ProviederFlag pfinKey benutzt, um den zu ändernden Datensatz in der DB zu erkennen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz