AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird Embedded + AUTOINC
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Embedded + AUTOINC

Ein Thema von himitsu · begonnen am 17. Jan 2015 · letzter Beitrag vom 10. Okt 2015
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: Firebird Embedded + AUTOINC

  Alt 18. Jan 2015, 17:31
Sortiert das eigentlich auch neue Datensätze?
Aber sicher doch. Wenn ich einen neuen Datensatz einfüge, steht der immer gleich an der richtigen Stelle, wenn in der Query-Komponente IndexFieldNames mit einem oder mehreren gültigen Feldnamen gesetzt ist. Das ist doch Sinn und Zweck dieses Propertys, z.B.:

FireDac: Mit IndexFieldNames erstellen Sie Ad-hoc-Sortierreihenfolgen.

Oder anders ausgedrückt: Bislang ist es mir noch niemals untergekommen, daß eine via IndexFieldNames sortierte Datenmenge nach dem Einfügen oder Ändern eines Datensatzes nicht mehr korrekt sortiert war, und zwar bei allen mir bekannten Datenbank-Komponenten (FireDac, FibPlus, IbDac, dbGo, Zeos usw.). Einzig mit der BDE hab ich keinerlei Erfahrung vorzuweisen, aber die sollte man ja sowieso nicht mehr einsetzen.

Geändert von Perlsau (18. Jan 2015 um 17:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firebird Embedded + AUTOINC

  Alt 18. Jan 2015, 18:06
Hatte bisher nur im Grid sortiert (was richtige Grids ja können) oder halt über das SELECT und die Sortierung vom Select wird ist nach dem Laden nicht mehr existent.
Neue Zeilen rutschten beim ORDER-BY da rein, wo der Cursor grade stand (Insert) oder ans Ende (Append).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#3

AW: Firebird Embedded + AUTOINC

  Alt 18. Jan 2015, 19:27
Soooo, ich glaub nun geht erstmal alles wieder.

Hätte nicht gedachte, daß für solche "Kleinigkeiten" so viel Zeit drauf geht.

Zuletzt gab es nur bei dem Query probleme, mit JOINs drin.
Anfangs ging es und dann plötzlich nicht mehr, obwohl ich mich nicht erinnern kann da was Schlimmes geändert zu haben.

Waren beim Insert Fehler wie Folgendes, obwohl das Feld nachweislich gefüllt war.
[FireDAC][Phys][FB]validation error for column "COINS_SERIES", value "*** null ***"
Oder beim Löschen "Feld xxxx nicht gefunden", was auch klar war, denn das kam auch aus einem JOIN.

Viel rumprobiert und ich glaub FireDAC ignoriert die ProviderFlags, mit welchen es (vor)zuletzt versuchte.
Nun ja, aus "SELECT *, xxx, yyy" statt "SELECT xxx, yyy, *" versucht und nun geht es und grade beim Schreiben fällt mir was auf.
Das Feld "NULL" war bestimmt zwei mal drin, wegen dem * (anfangs war das bestimmt noch tabelle.*)

[edit] Nee, es war doch "SELECT xxx, yyy, tabelle.*" und jetzt mit "SELECT tabelle.*, xxx, yyy" geht es und außerdem hab ich die Reihenfolge der Felder in der Query-Komponente umgedreht, so wie es Jetzt im Query steht.
[edit2] Letzteres hat keinen Einfluß.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Jan 2015 um 19:46 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#4

AW: Firebird Embedded + AUTOINC

  Alt 18. Jan 2015, 20:15
Bequemer und eleganter find ich's, mit Views zu arbeiten: Du legst deine Joins praktisch schon in der DB an und kannst dann darin nach Herzenslust blättern und sortieren.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

AW: Firebird Embedded + AUTOINC

  Alt 18. Jan 2015, 23:57
Views eleganter ? Dann erkläre mal bitte, wie ich die Daten einer Tabelle abrufe, sagen wir mal Artikel von Nr. 1 bis 1000 bestückt. Ich will aber jetzt aus meinem Delphi-Prograam nur die von 100 bis 199 sehen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#6

AW: Firebird Embedded + AUTOINC

  Alt 19. Jan 2015, 01:34
Beim View kann man ja auch ein WHERE oder sowas wie LIMIT, STARTS usw. verwenden
und ein ordentliches DBMS kann das genau so schnell und optimal auflösen, als wenn man das SELECT direkt verwendet.
Der View ist logisch gesehen wie eine virtuelle Tabelle und lässt sich fast genauso verwenden. (nur beim Beschreiben trifft man auf die selben Probleme wie beim JOIN ... also wenn es um das zurückschreiben geht.)

Solange es kein Writable-View ist, kommt doch am Ende genau das Selbe raus ... nur mit nocheiner Zwischenschicht, die man erstmal schreiben muß.
Da ich diese Tabelle aktuell nur einmal benutze, ist es doch erstmal keine Vereinfachung.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Jan 2015 um 01:39 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Firebird Embedded + AUTOINC

  Alt 19. Jan 2015, 06:45
Auch eine VIEW mit JOINs kann man beschreiben, wenn das RDBMS das unterstützt. Es muss sich nur jedes Feld der View auf ein Feld der darunterliegenden Tabelle abbilden lassen.

Natürlich muss ich eine VIEW entsprechend formulieren, wenn ich windowing funktionen verwenden, und dabei nicht ewig warten will. Ich persönlich find es es jedoch auch eleganter, eine Trennung einzuziehen und Zugriffe der Applikationen nur über Views und SP zuzulassen. Dann kann ich die DB-Struktur nach Herzenzlust ändern, ohne meine Programme anfassen zu müssen.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Firebird Embedded + AUTOINC

  Alt 19. Jan 2015, 07:31
Views eleganter ? Dann erkläre mal bitte, wie ich die Daten einer Tabelle abrufe, sagen wir mal Artikel von Nr. 1 bis 1000 bestückt. Ich will aber jetzt aus meinem Delphi-Prograam nur die von 100 bis 199 sehen.
Gerne, obwohl du das sicher auch selbst weißt, weil es so simpel ist:
Code:
select * from MyView where ArtikelNummer < 1001;
select * from MyView where ArtikelNummer > 99 and ArtikelNummer < 200;
In deiner Delphi-Anwendung arbeitest du dann mit Filtern, nachdem du im SQL-Property deiner Query-Komponente select * from MyView angegeben hast:
Delphi-Quellcode:
Datenmodul.Query_MyView.Filter := 'ArtikelNummer > 99 and ArtikelNummer < 200';
Datenmodul.Query_MyView.Filtered := True;
Einer meiner zahlreichen Views sieht z.B. so aus:
Code:
CREATE OR ALTER VIEW V_HOERBUCH(
    ID,
    TITEL,
    HOERART,
    AUTOR,
    KATEGORIE,
    SPRACHE,
    VORLESER,
    SPIELDAUER,
    ANZAHL,
    QUELLE,
    URL,
    GESEHEN,
    MARKIERT,
    NOTIZEN)
AS
select

HOERBUCH.ID_HOERBUCH,
HOERBUCH.TITEL,
BUCHSPIEL.HOERART,
AUTOREN.NAMEFULL,
KATEGORIEN.KATEGORIE,
SPRACHEN.SPRACHE,
VORLESER.NAMEFULL,
HOERBUCH.SPIELDAUER,
HOERBUCH.ANZAHL,
QUELLEN.QUELLE,
HOERBUCH.URL,
HOERBUCH.GESEHEN,
HOERBUCH.MARKIERT,
HOERBUCH.NOTIZEN

from HOERBUCH

inner join BUCHSPIEL on BUCHSPIEL.ID_BUCHSPIEL  = HOERBUCH.HOERART
inner join AUTOREN   on AUTOREN.ID_AUTOREN      = HOERBUCH.AUTOR
inner join KATEGORIEN on KATEGORIEN.ID_KATEGORIEN = HOERBUCH.KATEGORIE
inner join SPRACHEN  on SPRACHEN.ID_SPRACHEN    = HOERBUCH.SPRACHE
inner join VORLESER  on VORLESER.ID_VORLESER    = HOERBUCH.VORLESER
inner join QUELLEN   on QUELLEN.ID_QUELLEN      = HOERBUCH.QUELLE
;
Man sieht, das ist letztendlich einfacher zusammenzubauen als ein komplizierter SQL-Befehl in deiner Anwendung. Ein weiterer Vorteil von Views besteht darin, daß ich in einer Query, die eine View-Datenmenge selektiert, direkt auch nach den Inhalten der verlinkten Sub-Tabellen sortieren kann, z.B.:
Delphi-Quellcode:
Procedure TDatMod.SortierenHoerbuch(Spalte: Integer);
Const
  K = ';';
  SortText = ' Hörbücher sortiert nach "';

Var
  SortAus,
  SortOrd,
  SqlSort : String;

begin
  If GLD.URec.HB_SortOrd Then
  Begin
    SortOrd := '" aufwärts';
    SqlSort := ':A';
  End Else
  Begin
    SortOrd := '" abwärts';
    SqlSort := ':D';
  End;

  Case Spalte Of
   0 : Begin
         Tab_V_Hoerbuch.IndexFieldNames := 'TITEL'      + SqlSort + K + 'AUTOR'     + SqlSort + K + 'VORLESER' + SqlSort + K +
                                           'SPRACHE'    + SqlSort + K + 'KATEGORIE' + SqlSort + K + 'HOERART'  + SqlSort + K;
         SortAus := 'Titel';
...

Geändert von Perlsau (19. Jan 2015 um 07:50 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#9

AW: Firebird Embedded + AUTOINC

  Alt 19. Jan 2015, 09:31
Man sieht, das ist letztendlich einfacher zusammenzubauen als ein komplizierter SQL-Befehl in deiner Anwendung.
Nee, nix einfacher ... es ist genau das Selbe.
Einfach das CREATE VIEW ... AS weglassen und schon hat man das selbe SELECT-Statement, welches man direkt im Programm verwenden kann.

Ein weiterer Vorteil von Views besteht darin, daß ich in einer Query, die eine View-Datenmenge selektiert, direkt auch nach den Inhalten der verlinkten Sub-Tabellen sortieren kann, z.B.:
Und das Sortieren geht natürlich auch ohne VIEW problemlos ... bzw. es hätte auch mit einem VIEW nicht funktioniert, wenn man, so wie ich, in der Query-Komponente nochmal eine andere Sortierung drüber jagt.
Ein Therapeut entspricht 1024 Gigapeut.
  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 07:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz