AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Daten in Zwischentabelle schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Daten in Zwischentabelle schreiben

Ein Thema von hirnstroem · begonnen am 30. Nov 2006 · letzter Beitrag vom 30. Nov 2006
Antwort Antwort
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

Daten in Zwischentabelle schreiben

  Alt 30. Nov 2006, 13:01
Datenbank: Access • Version: kA • Zugriff über: ADO
'loha Folks,

seit geraumer Zeit scheitern meine Versuche Daten in eine "Zwischentabelle" zu schreiben.

In Worte gefasst sieht die Sache folgendermassen aus:

In der Tabelle Device befinden sich Geräte. In der Tabelle Key befinden sich Schlüssel. In der Tabelle Device_Key wird einerseits die Beziehung zwischen Geräten und Schlüsseln geschaffen und andererseits wird hier angegeben auf welchen Geräten der jeweilige Schlüssel gesperrt ist und auf welchen er nicht gesperrt ist.

Die Tabelle Device sowie die Key Tabelle werden nun mit Daten gefüllt. Die Tabelle Device_Key bleibt aber noch leer. Wenn alle Geräte und Schlüssel erfasst sind, wird definiert welcher Schlüssel auf welchem Gerät gesperrt bzw. nicht gesperrt ist. Und dies bereitet mir Probleme.

Die folgende Abfrage wird ausgeführt sobald ein Schlüssel ausgewählt und auf einem Formular angezeigt wird und zeigt sämtliche Geräte eines bestimmten Typs (Geräte welche etwas mit Schlüsseln anfangen können).
SQL-Code:
SELECT *
FROM
(Device_Key RIGHT JOIN
  (Room INNER JOIN
    (Floor INNER JOIN
      (DeviceType INNER JOIN
        (Building INNER JOIN
          (Application INNER JOIN
            Device
          ON [Application].[ApplicationID] =[Device].[ApplicationID])
        ON [Building].[BuildingID] =[Device].[BuildingID])
      ON [DeviceType].[DeviceTypeID] =[Device].[DeviceTypeID])
    ON [Floor].[FloorID] =[Device].[FloorID])
  ON [Room].[RoomID] =[Device].[RoomID])
ON [Device_Key].[DeviceID] = [Device].[DeviceID])
WHERE
Device.DeviceTypeID = 1
ORDER BY Address;
Das Ergebnis dieser Abfrage ist, dass sämtliche Geräte angezeigt werden. Zusätzlich werden durch den RIGHT JOIN die Felder aus der Tabelle Device_Key, welche für die Zuweisung erforderlich sind, angezeigt. Lässt man diese Abfrage in Access laufen kann im Ergebnis diese Zuweisung vorgenommen werden. Das Ziel wäre aber, dass dies über ein mit IntraWeb erstelltes Webinterface abläuft.

Nun habe ich als erstes folgendes Versucht:

Die obenstehende Abfrage wird ausgeführt und das Ergebnis in einem Grid angezeigt. Dieses Grid hat einen Edit Button. Wird dieser Betätigt, kann angegeben werden ob der jeweilige Schlüssel gesperrt ist oder nicht. Anschliessend wird der Datensatz über den selben Button, welcher nun im Speichergewand erscheint, gespeichert. Beim speichern durchsuche ich die Tabelle Device_Key nach bereits existierenden Einträgen, falls welche existieren wird das Gesperrt Feld geändert und der Datensatz gespeichert. Dieser Fall trat bisher nie ein, da ich nich im Stande bin etwas zu speichern. Jedenfalls wird, wenn kein übereinstimmender Datensatz gefunden wird, ein neuer hinzugefügt und mit den fehlenden Angaben (DeviceID, KeyID, Locked) versehen und abgespeichert. Beim speichern erscheint aber jedes mal die folgende Fehlermeldung:

Der Datensatz kann nicht hinzugefügt oder geändert werden, da ein Datensatz in der Tabelle 'Device' mit diesem Datensatz in Beziehung stehen muss.

Dies sagt mir, dass man das Problem so nicht lösen kann. Nun gut, der nächste Versuch war folgender:

Ein ADODataSet mit obiger SQL-Abfrage als CommandText wird geöffnet. Es erscheinen alle Geräte im Grid. Editiert wird wieder über den Edit Button. Beim Speichern mache ich folgendes mid dem DataSet:

Delphi-Quellcode:
    DataSetDevice_Key.RecNo := (Sender as TIWImageFile).Tag;
    DataSetDevice_Key.Edit;
    DataSetDevice_Key.FieldByName('LockedAccess').Value :=
      (FindComponent('cbEdit' + IntToStr(EditRecNo)) as TIWDBCheckBox).Checked;
    DataSetDevice_Key.FieldByName('KeyID').Value :=
      UserSession.ADODataSet_KeyUser.FieldByName('Key.KeyID').Value;
    DataSetDevice_Key.Post;
Es werden also lediglich die benötigten Felder (DeviceID, KeyID, Locked) mit Daten versehen und natürlich abgespeichert. Nun erscheint aber diese Meldung:

Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Es wurden ggf. die daten seit dem letzten lesen geändert.

Es ist wohl etwas pessimistisch anzunehmen, dass diese Zeile niemand liest, aber falls doch, wäre ich extremst froh, wenn mir wenn auch nur ansatzweise weitergeholfen wird.

Danke und Grüsse
hirnstoem
inde deus abest
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Daten in Zwischentabelle schreiben

  Alt 30. Nov 2006, 14:13
Ich fasse zusammen:
Du möchtest in der Tabelle "Device_Key" anhand des Schlüssels "KeyID" das Feld "LockedAccess" ändern.
Dann nimm doch folgende Update-Anweisung:
UPDATE Device_Key SET LockedAccess=:LockedAccess WHERE KeyID=:KeyID
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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