Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: dSUG - Forum der deutschsprachigen Servoy User Group. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Montag, 13. Februar 2012, 14:09

Datenbank View benutzen, die keinen eindeutigen Schlüssel hat - falsche Ergebnisse

Ich bin kürzlich beim Rumprobieren mit einer View über ein Problem gestolpert, das bei mir sofort die - hoffentlich unbegründete - Reaktion "ich kann mich nicht auf die von Servoy gelieferten Daten verlassen" ausgelöst hat.

Ich benutze in diesem Fall eine View, die mir keinen PK zurückliefert (und dies auch nicht kann), da sie über mehrere UNION unterschiedliche Sichten auf eine Tabelle in einer einzigen Liste darstellen soll (bitte jetzt keine Diskussion über Datenmodelle o.ä.... ;-)

ein simples/"nacktes" select * from fbd_v_delegations where ... liefert die richtigen Ergebnisse (hier aus dem SQL Editor).



Wenn ich die View 1:1, d.h. ohne Row Ident benutzen will, wird die für mich noch verständliche Fehlermeldung ausgegeben
...servoy.j2db.persistence.RepositoryException: Es muss mindestens eine Schlüsselspalte exisitieren 'fbd_v_delegations'

ok - dann definiere ich halt mal die beiden Spalten, die eh Foreign Keys sind als "Row Ident"...
Wenn ich das dann in eine Form einbaue, erhalte ich dieses Ergebnis:


Das Ergebnis hat zwar die richtige Anzahl Zeilen, aber leider zumindest in einem Datensatz einen falschen Wert in Spalte "Scope".

Besonders interessant wird es dann, wenn nur eine der o.g. Spalten auf "Row Ident" gesetzt wird. In diesem Falls habe ich dann gleich zumindest zwei Spalten mit falschen Werten:




Dass hier anscheinend die richtigen Datensätze, jedoch mit einzelnen, falschen Feldwerten geliefert werden, macht mich zumindest etwas ratlos...

Heisst das jetzt für mich primär erst mal: Views ohne PK kann/darf ich nicht (direkt) benutzen?


Viele Grüße
Joachim

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Fuchstänzer« (13. Februar 2012, 14:34)


2

Montag, 13. Februar 2012, 18:41

Servoy muss wissen, wie eine Zeile eindeutig angesprochen werden kann. Kannst Du in Deinem view eine oder mehrere Spalten identifizieren, die alleine oder gemeinsam eindeutig sind? Eventuell kannst Du dem View noch eine Spalte hinzufügen, die die Zeilen eindeutig identifiziert?

Um Probleme zu finden, hilft auch gelegentlich ein Blick auf servoy-admin, Performance data. Dort sind alle Abfragen zu sehen, die generiert werden. Dieses Übersicht kann man löschen (Clear). Wenn Du danach in Deinen view navigierst, siehst Du dann nur die Abfrage, die für Deinen view abgesetzt wird.

Wenn die Zeilen nicht eindeutig identifiziert werden können, kann es durchaus zu "merkwürdigen" Ergebnissen kommen...

3

Dienstag, 14. Februar 2012, 11:36

natürlich könnte ich hier "irgendwie" einen Schlüssel durch die View erzeugen lassen...
In einem existierenden Fremd-System, das ich folglich ungerne anpacken möchte, wäre das allerdings ziemlich unschön.

Alle möglichen vorhandenen Felder zu einem "potentiell eindeutigen" Key zusammenzufassen würde nicht wrklich helfen. Bei ersten Tests war die Performace dieser View dann absolut grausam.

Und ich hätte dann immer noch das von mir beschriebene Problem, dass ich NIEMALS erwarten würde, dasss einzelne FELDER einer Abfrage, die nur eine einzige View abfragt, falsch sein könnten. Eine falsche Anzahl gelieferter ZEILEN könnte ich ja noch verstehen.

Ich werde aber mal versuchen, mir das von Servoy erzeugte SQL anzusehen.

4

Dienstag, 14. Februar 2012, 12:57

Du könntest z.B. einfach den Namen der Tabelle und den PK der Tabelle mit in den view aufnehmen, z.B.

SELECT 'tabelle_1_' + pk_spalte_t1 + ...
UNION SELECT 'tabelle_2_' + pk_spalte_t2 + ...

Warum Du sonderbare Ergebnisse erhälst, verstehst Du am Besten, wenn Du Dir die Abfrage ansiehst.

5

Dienstag, 14. Februar 2012, 15:31

wie schon erwähnt kann/will ich die View nicht anpacken, da "existierendes Fremd-System"...

Folgend die letzten beiden Einträge aus dem Log.

Der Vorletzte: ich vermute, dass das hier die query ist, die tatsächlich gegen die DB läuft

Quellcode

1
2
3
QuerySet { prepares = <null>, select = select top 3 logon1, id, typ, scope, typ2, delegator_id 
, logon2, [Start], [Stop] from dbo.FBD_v_Delegations where logon1 in (?, ?, ?) 
[[TheUser,TheUser,TheUser]] <0^3>, cleanups = <null> }



Der Letzte: hier wird das Ergebnis in das foundset gemappt? (korrigier mich wenn ich falsch liege)

Quellcode

1
2
3
4
5
6
7
8
9
10
AWT-EventQueue-0: getting RowData time: 46, 
SQL: SELECT ISR:dbo:FBD_v_Delegations#FBDvDelegations202.14413=logon1<12,255,0>
,ISR:dbo:FBD_v_Delegations#FBDvDelegations202.14414=id<4,0,0>
,ISR:dbo:FBD_v_Delegations#FBDvDelegations202.14415=typ<12,10,0>
,ISR:dbo:FBD_v_Delegations#FBDvDelegations202.14417=scope<12,50,0>
,ISR:dbo:FBD_v_Delegations#FBDvDelegations202.14418=typ2<12,3,0>
...
FROM ISR:dbo:FBD_v_Delegations#FBDvDelegations202 
SEARCH ((ISR:dbo:FBD_v_Delegations#FBDvDelegations202.14413=logon1<12,255,0>)=
(${ISR:dbo:FBD_v_Delegations#FBDvDelegations202:PK=[[TheUser,TheUser,TheUser]]}))


Interpretiere ich das richtig?

Wenn ja, dann sollt das immer noch ein identisches Ergebnis meines bereits aufgeführten SLQs liefern

select * from fbd_v_delegations where logon1 = ...

ok - ggf. in einer anderen Sortierung...

Auf jeden Fall schon mal danke für deine Hilfe!

6

Dienstag, 21. Februar 2012, 08:52

Hallo Patrick,
>
Warum Du sonderbare Ergebnisse erhälst, verstehst Du am Besten, wenn Du Dir die Abfrage ansiehst.
so richtig weitergekommen - zumindest bezüglich meiner ursprünglichen Frage - bin ich jetzt leider immer noch nicht...



Deshalb noch mal gefragt:
darf ich eine View, die keinen PK hat (zu Anzeige-/Reportingzwecken soll es so was ja schon mal geben) nicht nicht direkt an eine Form binden, da ich sonst schlicht ziemlich üblen Blödsinn angezeigt bekomme?


Viele Grüße
Joachim

7

Dienstag, 21. Februar 2012, 14:55

Ohne ein eindeutiges Kennzeichen einer Zeile in dem View sind merkwürdige Ergebnisse möglich. Hast Du Dir die Abfrage unter Performance data einmal angesehen? Was Du weiter oben geschickt hast, ist Output mit aktiviertem "Tracing". Ich würde das einmal abschalten, dann die Performance-Statistik leeren und den view aufrufen. Danach in die Performance-Statistik zurück und nachsehen, welche Abfrage verschickt wird.

8

Dienstag, 21. Februar 2012, 15:57

zuerst habe ich gefiltert :

Quellcode

1
2
Find 
select top 201 logon1 from dbo.FBD_v_Delegations where logon1 = ? order by logon1 asc

und anschliessend hat Servoy so die 3 Treffer geladen:

Quellcode

1
2
3
Load foundset 
select top 4 logon1, id, typ, scope, typ2, delegator_id, logon2, [Start], [Stop] 
from dbo.FBD_v_Delegations where logon1 in (?, ?, ?)


wenn ich das 2. SQL im SQL Editor manuell abschicke (die Params dabei fest verdrahtet) erhalte ich die richtigen Datensätze. Das Servoy Foundset liefert mir zwar auch drei Datensätze, scheint aber einzelne davon mehrfach zu benutzen.
Und das macht mich etwas "stutzig"...

>Ohne ein eindeutiges Kennzeichen einer Zeile in dem View sind merkwürdige Ergebnisse möglich
das würde ich jetzt als klare Aussage "das geht nicht" interpretieren...?

Wie kann ich diese View trotzdem auf den Schirm bekommen?

9

Mittwoch, 7. März 2012, 18:35

Nur zur Info:
Es sieht so aus, als hätte ich das gefunden, wonach ich gesucht habe und zwar einer Form zur Laufzeit per Solution Model eine Datasource zuweisen, die auf einer x-beliebigen Query beruht.

Also irgendwas in der Richtung:

Quellcode

1
2
3
4
5
6
var query = 'your query';
var uri = databaseManager.createDataSourceByQuery('mydata', 'example_data', query, null, 999);
// the uri can be used to acces a foundset directly
var fs = databaseManager.getFoundSet(uri)
fs.loadAllRecords();
forms.myform.foundset.loadRecords(fs);


Was mir im Moment daran n.n. "passt" ist, dass ich dann anscheinend die Form, bzw. deren Feldliste komplett per Code aufbauen muss, was natürlich nicht sonderlich komfortabel wäre.
Mal sehen, ob ich was finde, womit ich auf der Form vor-platzierte (und vor allem vor-formatierte) Felder der Reihe nach an die Felder des Ergebnisses hängen kann...

Stay tuned!

P.S.: wer hat diesen Thread eigentlich als erledigt markiert? X(

Ähnliche Themen

Social Bookmarks

Thema bewerten