Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Operation muss eine aktualisierbare Abfrage verwenden

929 views
Skip to first unread message

Alexander Bierig

unread,
Mar 15, 2011, 4:45:50 PM3/15/11
to
Hallo

ich weis, es ist vielfach gefragt udn auch beantwortet worden. Dennoch
kriege ich das nicht gebacken.

Wir kriegen immer wieder mal Daten aus einer Exceltabelle, welche
aktualisierte Werte über Bauteile enthält.

Diese lesen wir (noch manuell) in eine Tabelle ins Access ein.

Inder Tabelle stehen auch Zeitenwerte, diese sind in der Excel, klar, in
einer Zeile angebracht -nebeneinander.

Die letztendlcih Zieltabelle verwendet aber die Spalten untereinander:

Schemata:
XLS:
t_gesamt t_f t_g ti_f ti_g fg_bauteil
95 0 0 0 0 Teil1
50 0 0 0 0 Teil2

Zieltabelle:
id_tbl_fg_komponente_zeiten (Autowert) PK
id_fg_komponente (long)
t_thema_fg_komp (text)
t_thema_fg_komp (double)
id_relevanzen (long)

Das heist aus den 5 Spalten werden 5 zeilen. Ist einfacher um ein 6
Element zu erweitern.

Es gibt eine Query "qry_t_thema_fg_komp" welche die o.a. 5
Zeiten(Themen) namentlich und mit ID darstellt (ich habe eine lange
Tabelle in welcehr alle wichtigen Themen/Relevanzen drin stehen, mit
ihrem zu geordneten Thema als Filtermöglichkeit)

Diese Übersetzung hat (und wir reden NUR von aktualisierungen!)
folgenden Testcode:
UPDATE (tbl_fg_komponenten AS tfk INNER JOIN XLS_Daten ON tfk.fg_bauteil
= XLS_Daten.fg_bauteil) INNER JOIN (tbl_fg_komponente_zeiten AS tz INNER
JOIN qry_t_thema_fg_komp AS qt ON tz.id_relevanzen = qt.id_relevanzen)
ON tfk.id_fg_komponente = tz.id_fg_komponente SET tz.t_value =
[tfk].[ref_arbeitszeit_bauteil]
WHERE (((qt.relevanz) ALike "t_gesamt") AND
((tz.id_fg_komponente)=[tfk].[id_fg_komponente]));
(vom Access-Abfrage-Generator erstellt)

Abfrage läuft!
TBL_FG_KOMPONONENTE_ZEITEN wird aktualisiert.

Nun müsste ich das also fünfmal schreiben mit jeweils anderer bedingung.
Effizenter ist m.E. eine Union als Basis zu machen:


SELECT x.id_fg_komponente, x.fg_bauteil, x.id_relevanzen, x.relevanz,
x.t_value
FROM (select tfk.id_fg_komponente, tfk.fg_bauteil, qt.id_relevanzen,
qt.relevanz, xls.t_gesamt as t_value
from qry_t_thema_fg_komp AS qt,tbl_fg_komponenten as tfk inner join
xls_daten as xls on tfk.fg_bauteil=xls.fg_bauteil
where qt.relevanz='t_gesamt'
union
select tfk.id_fg_komponente, tfk.fg_bauteil, qt.id_relevanzen,
qt.relevanz, xls.t_f as t_value
from qry_t_thema_fg_komp AS qt,tbl_fg_komponenten as tfk inner join
xls_daten as xls on tfk.fg_bauteil=xls.fg_bauteil
where qt.relevanz='t_f'
union
select tfk.id_fg_komponente, tfk.fg_bauteil, qt.id_relevanzen,
qt.relevanz, xls.t_g as t_value
from qry_t_thema_fg_komp AS qt,tbl_fg_komponenten as tfk inner join
xls_daten as xls on tfk.fg_bauteil=xls.fg_bauteil
where qt.relevanz='t_g'
union
select tfk.id_fg_komponente, tfk.fg_bauteil, qt.id_relevanzen,
qt.relevanz, xls.ti_f as t_value
from qry_t_thema_fg_komp AS qt,tbl_fg_komponenten as tfk inner join
xls_daten as xls on tfk.fg_bauteil=xls.fg_bauteil
where qt.relevanz='ti_f'
union
select tfk.id_fg_komponente, tfk.fg_bauteil, qt.id_relevanzen,
qt.relevanz, xls.ti_g as t_value
from qry_t_thema_fg_komp AS qt,tbl_fg_komponenten as tfk inner join
xls_daten as xls on tfk.fg_bauteil=xls.fg_bauteil
where qt.relevanz='ti_g'
) AS x;

diese Abfrage ist einfach zu erweitern und pflegen, sie heist
"qrx_xls_99_import_komponente_liste_zeiten"

der daraus resultierende, versagende UpdateCode:

UPDATE qrx_xls_99_import_komponente_liste_zeiten AS xls INNER JOIN
tbl_fg_komponente_zeiten AS sd ON (xls.id_fg_komponente =
sd.id_fg_komponente) AND (xls.id_relevanzen = sd.id_relevanzen) SET
sd.t_value = [xls].[t_value];

Access 2003, Query im Frontend, Daten (mit ausnahme der Table XLS_Daten)
irgendwo im Netz, also via verknüpfte Tabellen.

kann doch irgendwo nicht sein, dass die Jet-Engine das nicht gebacken
kriegt?

Mfg Alex

Alexander Bierig

unread,
Mar 15, 2011, 4:59:44 PM3/15/11
to
Hallo,

ich glaube, es wird so langsam spät....

Am 15.03.2011 21:45, schrieb Alexander Bierig:
> Hallo
>
> ich weis, es ist vielfach gefragt udn auch beantwortet worden. Dennoch

....

>
> Mfg Alex
Asche auf mein Haupt, die vorentwickelte Abfrage verwendet ein anderes
Feld und liest die Wert NICHT aus der XLS-Import-Datei aus.
Meine grudnsätzliche Frage bleibt davon alelrdigns unberührt.

MfG Alex.

Bernd Gilles

unread,
Mar 16, 2011, 3:39:29 AM3/16/11
to
> Operation muss eine aktualisierbare Abfrage verwenden

Passiert immer wieder und ist meist einfach zu lösen:
Wenn die Abfrage per se aktualisierbar sein sollte (also kein UNION etc.) hilft meist, die
Eigenschaft "Eindeutige Datensätze" der Abfrage auf TRUE zu setzen.

Im SQL wird das durch das Schlüsselwort DISTINCTROW ausgedrückt.

--
Gruß, Bernd
---
Access goes Subversion - http://oasis.dev2dev.de

Stefan Schulte-Kellinghaus

unread,
Mar 16, 2011, 5:57:03 AM3/16/11
to
Ich habe immer mal wieder die gleichen Probleme.
Dabei geht es in der Regel darum eine lokale Tabelle mit Daten aus einer Oracle-BE-Datenbank zu aktualisieren.
Mein Eindruck ist, daß Access bei allen beteiligten Tabellen Schreibrechte haben will, auch wenn nur eine aktualisiert wird. Und diese Schreibrechte können aus unterschiedlichen Gründen fehlen:
z.B. bei einer view (wie der union-Abfrage) ist Schreiben natürlich nicht möglich, das merkt access aber nicht !?
Kann das eine Erklärung sein?
Gruß, Stefan

Karl Donaubauer

unread,
Mar 17, 2011, 3:56:40 AM3/17/11
to
Alexander Bierig wrote:
> ...

> Abfrage läuft!
> TBL_FG_KOMPONONENTE_ZEITEN wird aktualisiert.
>
> Nun müsste ich das also fünfmal schreiben mit jeweils anderer
> bedingung. Effizenter ist m.E. eine Union als Basis zu machen:
>
> SELECT ...
> union
> select
> ...

> diese Abfrage ist einfach zu erweitern und pflegen, sie heist
> "qrx_xls_99_import_komponente_liste_zeiten"
>
> der daraus resultierende, versagende UpdateCode:
>
> UPDATE qrx_xls_99_import_komponente_liste_zeiten ...

> kann doch irgendwo nicht sein, dass die Jet-Engine das nicht
> gebacken kriegt?

In keinem DBMS der Welt kannst du ein Update auf eine
UNION-Abfrage machen. Die ist per se schreibgeschützt.

Ich verstehe deine Aufgabenstellung nicht ganz, aber jedenfalls
ist es "effizienter" 5 aktualisierbare Abfragen auszuführen - das
geht ja z.B. mit 5-7 Zeilen Code oder Makro - als 1 Abfrage
auf eine niemals aktualisierbare Union. ;-)

--
Servus
Karl
*********
Access-FAQ: http://www.donkarl.com +
3. .NET-Entwickler-Konferenz, 7./.8.5. Nürnberg, 21./22.5. Hannover

Alexander Bierig

unread,
Mar 20, 2011, 4:23:55 PM3/20/11
to
Am 17.03.2011 08:56, schrieb Karl Donaubauer:

Grüss Dich Karl,


....


>
> In keinem DBMS der Welt kannst du ein Update auf eine
> UNION-Abfrage machen. Die ist per se schreibgeschützt.
>
> Ich verstehe deine Aufgabenstellung nicht ganz, aber jedenfalls
> ist es "effizienter" 5 aktualisierbare Abfragen auszuführen - das
> geht ja z.B. mit 5-7 Zeilen Code oder Makro - als 1 Abfrage
> auf eine niemals aktualisierbare Union. ;-)

mein Code, den übrigens das Access selbst so vorgeschlagen hat


UPDATE qrx_xls_99_import_komponente_liste_zeiten AS xls INNER JOIN
tbl_fg_komponente_zeiten AS sd ON (xls.id_fg_komponente =
sd.id_fg_komponente) AND (xls.id_relevanzen = sd.id_relevanzen) SET
sd.t_value = [xls].[t_value];

Aktualisiert wird NICHT die Unionabfrage, sondern die Tabelle (so der
Plan). Die Union wird nur verwendet, um eine breite tabelle in eine
lange Tabelle zu übersetzen.

Würden dei drei Spalten der Unionatabelle mit dem Alias XLS physikalisch
existieren in eienr normalen Tabelle, könnte das Access die
Aktualisierung ja machen...nur wegen der Sicht auf die Daten mag es ja
nicht.

Aufgabe: Breitere Exceltabelle übersetzen in lange aber schmale
AccessTabelle udn dabei dei Werte übernehmen.

Grüsse aus den waremn Süden

Alex.


Karl Donaubauer

unread,
Mar 21, 2011, 5:56:06 AM3/21/11
to
Alexander Bierig wrote:
> ... UPDATE qrx_xls_99_import_komponente_liste_zeiten AS xls INNER JOIN

> tbl_fg_komponente_zeiten AS sd ON (xls.id_fg_komponente =
> sd.id_fg_komponente) AND (xls.id_relevanzen = sd.id_relevanzen) SET
> sd.t_value = [xls].[t_value];
>
> Aktualisiert wird NICHT die Unionabfrage, sondern die Tabelle (so der
> Plan). Die Union wird nur verwendet, um eine breite tabelle in eine
> lange Tabelle zu übersetzen.
>
> Würden dei drei Spalten der Unionatabelle mit dem Alias XLS
> physikalisch existieren in eienr normalen Tabelle, könnte das Access
> die Aktualisierung ja machen...nur wegen der Sicht auf die Daten mag
> es ja nicht.
>
> Aufgabe: Breitere Exceltabelle übersetzen in lange aber schmale
> AccessTabelle udn dabei dei Werte übernehmen.

Deine Beschreibungen verstehe ich noch immer nicht ganz,
aber egal. Grundsätzlich:

Wie du merkst, hindert die Beteiligung einer UNION-Abfrage eine
JET-Abfrage am Aktualisieren. Das lässt sich nicht ändern.
Der übliche Workaround ist der Umweg über eine "Arbeitstabelle",
denn Anfügen (und Tabellenerstellen) kann eine UNION. D.h.

- Arbeitstabelle erstellen, die alle Felder der UNION enthält
- Anfügeabfrage ausführen, in der die gespeicherte UNION-Abfrage
ihre Daten an die Arbeitstabelle anfügt
- deine Aktualisierungsabfrage da oben mit der Arbeitstabelle ausführen
statt mit der UNION
- danach (vermutlich) die Arbeitstabelle leeren

Ob das einfacher oder besser ist als fünf Abfragen auszuführen,
musst du entscheiden.

Alexander Bierig

unread,
Mar 22, 2011, 3:39:49 PM3/22/11
to
Hallo Karl,


Am 21.03.2011 10:56, schrieb Karl Donaubauer:
> Alexander Bierig wrote:
>> ... UPDATE qrx_xls_99_import_komponente_liste_zeiten AS xls INNER JOIN

...


>> tbl_fg_komponente_zeiten AS sd ON (xls.id_fg_komponente =

> Deine Beschreibungen verstehe ich noch immer nicht ganz,
> aber egal. Grundsätzlich:

...

>
> - Arbeitstabelle erstellen, die alle Felder der UNION enthält
> - Anfügeabfrage ausführen, in der die gespeicherte UNION-Abfrage
> ihre Daten an die Arbeitstabelle anfügt
> - deine Aktualisierungsabfrage da oben mit der Arbeitstabelle ausführen
> statt mit der UNION
> - danach (vermutlich) die Arbeitstabelle leeren

Seufz...

ich danke Dir für die Hilfe.
Im Moment sind es nur 5 Abfragen - aber ich kenne das Projekt. Es war
mal nur eine Spalte benötigt, nun sind es fünf und es werden sicher mehr
werden...
Und eine Tabelle ist leichter verlängert als verbreitert. (Finde ich)


LG Alex.

0 new messages