AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Queryfelder ohne Tablerows?
Thema durchsuchen
Ansicht
Themen-Optionen

Queryfelder ohne Tablerows?

Ein Thema von mcinternet · begonnen am 6. Jun 2019 · letzter Beitrag vom 6. Jun 2019
Antwort Antwort
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#1

Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 12:36
Datenbank: MySQL • Version: 8.015 • Zugriff über: MyDAC
Hallo,

ich stelle gerade eine Altlast um und schmeiße da die FireDAC Komponenten raus, weil ich nativ auf die DB zugreife. Dieses Rumgehampel mit der mysql.lib geht mir nur auf den Senkel. Da aber an diesem Projekt schon viele Köche rumgedoktort haben, ist die mir vorliegende Version ohnehin nicht compilierfähig, so dass ich diese nicht testen kann. Ich übernehme Form für Form in ein neues Projekt.

So, nun die Problemstellung:

Ich finde in den alten Queries rows, die gar nicht in der Datenbank sind, aber nicht über LocalSQL, sondern über die normale Connection angesprochen werden. Diese sind also offensichtlich nicht einer virtuellen Table zugeordnet. Es sind bei besagten Queries 2-3 Rows, welche nicht vorhanden sind und auch keinen Sinn machen (Felder zum Ankreuzen Mahnen, ja nein, etc.).
Gibt es bei den Queries eine Möglichkeit diverse Felder innerhalb einer Row virtuell anzusprechen??
Oder waren die Felder nur "voreingetragen", um die DB später "nachzurüsten" ?

Beste Grüße

mcinternet
Jörg
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 13:09
Weiß nicht, ob ich die recht verstehe, meinst Du sowas in der Art?
SQL-Code:
CREATE TABLE DUAL (DUMMY VARCHAR(1));

insert into dual (dummy) values ('X');

select 'Wie Bitte?as Frage, 42 as Antwort from dual;
(Ja, ist etwas blöde das Beispiel )

Wenn ich Dich recht verstehe, möchtest Du doch wissen, wie Du Spalten in ein Abfrageergebnis bekommst, die nicht existieren.

Das geht eigentlich grundsätzlich in der Form: select 'irgendein konstanter Wertas Spaltenname from Tabelle . Für jede Zeile der Tabelle bekommst Du nun in der Spalte "Spaltenname" die Zeichenfolge "irgendein konstanter Wert" ausgegeben.

select 1 as Spaltenname from Tabelle geht natürlich auch. Im Programm kannst Du auf solche Spalten dann mit FieldByName('Spaltenname').AsString oder FieldByName('Spaltenname').AsInteger , je nach dem von Dir im Select vorgegebenen Datentyp, zugreifen.
SQL-Code:
select
  existierendes_Feld_1,
  existierendes_Feld_2,
  existierendes_Feld_3,
  'ein Textas nicht_existierende_Zeichenfolge_1,
  1 as nicht_existierende_Zahl_1
from Tabelle
where existierendes_Feld_1 = 'irgend ein Wert, für existierendes_Feld_1'
Das finde ich das Schöne bei Oracle: Mit Hilfe der Tabelle Dual kann man alles Mögliche und Unmögliche aus der Datenbank bekommen, ohne dass man dazu eine passende Tabelle mit entsprechenden Daten haben muss.
Kann man in anderen Datenbanken (sofern sie kein entsprechendes "Gegenstück" haben), leicht nachbauen.
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 13:15
ok, das würde ich noch verstehen. Daher gebe ich Dir hier mal das Select-Statement und als Screenshot-Anhang die Felder der Query :

Code:
SELECT DISTINCT Bk_LieferantNr, Bk_Datum, Name1, bp.ID, bk.ID AS BkID, Bk_BestellNr, Bp_Bestellmenge, Bp_Liefermenge,
coalesce(Bp_Index,0) Bp_Index, Bk_Rohstoff, Bp_Rohstoff, Bp_Termin, Bp_AB, Bk_AB, RO_Bezeichnung_1, Ah_Liefermenge
FROM BESTELLKOPF bk
LEFT JOIN BESTELLPOSITION bp ON bp.Bp_BestellNr = bk.Bk_BestellNr
LEFT JOIN ROHSTOFFSTAMM ON Bp_Rohstoff = RO_Nummer
LEFT JOIN LIEFERANTENARTIKEL ON Bp_Rohstoff = ArtikelNr
LEFT JOIN ANLIEFERHISTORIE ah ON bp.Bp_Bestellnr = ah.Ah_BestellNr AND bp.Bp_Index = ah.Ah_Pos
LEFT JOIN LIEFERANTENSTAMM ls ON bk.Bk_LieferantNr = ls.Lieferant_Nr

WHERE (((Bp_Termin >= :Terminvon) AND (Bp_Termin <= :Terminbis) AND (Bp_Bestellmenge > 0) AND (Bp_Status < 2))
OR (Bp_Termin IS NULL AND Bk_Rahmenvertrag = 1))
AND (Bk_LieferantNr >= :Lieferantvon) AND (Bk_LieferantNr <= :Lieferantbis)
AND (Bk_Fertig <> 'True')
AND ((Ah_Liefermenge IS NULL) OR ((Bp_Bestellmenge - Bp_Liefermenge) > 0))

ORDER BY Name1, Bp_Rohstoff, Bp_Termin, Bp_Index

Da können doch meiner Meinung nach, die Felder "Mahnen", "Verzug" und "Rohstoff" gar nicht auftauchen!!
Auch das automatische Zufügen der Felder bringt diese drei nicht.


beste Grüße

mcinternet
Miniaturansicht angehängter Grafiken
queryrueckstand.png  
Jörg

Geändert von mcinternet ( 6. Jun 2019 um 13:19 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 13:29
Achso, genau umgekehrt.

Im Programm wird bereits etwas angesprochen, das das zugehörige SQL garnicht liefert.

Befremdlich.

Ok:

In der IDE mal auf das Formular gehen.
Doppelklick auf die Komponente qryRueckstand.
Es sollten die im Screenshot aufgeführen Felder angezeigt werden.

Rechte Maustaste.
Im Menü "Neues Feld" auswählen.
Im folgenden Dialog kannst Du nun auch Felder erstellen, die es nicht in der Datenbank gibt, z. B. berechnete Felder oder Felder, die aus eine Nachschlagtabelle befüllt werden sollen.

Schalte die Formularanzeige mal auf die Quelltextansicht um, suche Dir eines der Felder und schau mal nach, was da so "verhackstückt" wurde. Eventuell kannst Du so ja ein paar der "Fragezeichen", die der Quelltext momentan noch aufwirft, auflösen.

(Meine Beschreibung bezieht sich auf Delphi 7, kann sein, dass das heute etwas anders ist, aber die grobe Richtung dürfte stimmen.)
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 13:34
Das habe ich alles schon getan. Bin normal auf Qracle und die ODAC-Komponenten fixiert, aber dieses Projekt hier nutzt nun einmal die MYSQL.

Besagte rechte Maustaste "Alle Felder hinzufügen" bringt nix - diese drei tauchen nicht auf.
Wie gesagt, an diesem Projekt haben schon einige Köche den Brei verdorben und diverse Altlasten hinterlassen. Keiner hat dieses Projekt je von D7 auf XE... oder höher komplett durchgearbeitet. Alle haben den Löffel geworfen. Dementsprechend anspruchsvoll ist da nun meine Aufgabe.

Also muss ich das wohl unter "unvollendete Altlast" verbuchen und sehen, was ich daraus mache.....

Beste Grüße

Jörg
Jörg
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 13:41
Also geht es nicht um Rows, sondern um Columns?!
Dataset Felder ohne Äquivalent in der Query.

Mein Verdacht wäre, dass das jetzige Bild eine "historiche Entwicklung" wiedergibt. Wir machen hier also Softwarearchäologii..
Du musst einfach nur das Alter der Codeschicht um diese "Relikt" Felder analysieren und kannst dann vielleicht anhand alter Dokumentation rückschließen, was mit den Feldern geschehen ist und warum sie ausgestorben sind.

Nagut, mal ernst:
Ich tippe, die Felder wurden nicht mehr benötigt und unsauber entfernt, also nur aus der Query, ohne den "Feld Persistenzmechnismus" des Datasets zu berücksichtigen. Interessant wäre dann höchstens noch, warum die Relikt Felder ohne DB Schicht keine Fehler produzieren (oder lässt es sich z.B. deswegen eben nicht mehr kompilieren?) und welche Effekte sich durch Weglassen des zugehörigen Codes ergeben können.
Man kann natürlich auch auf DB Seite schauen, ob die Spalten noch in den Tabellen sind und ob diese Daten darin noch leben / genutzt werden. Oder mal einen alten Hasen fragen.
Gruß, Jo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#7

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 13:50
Das habe ich alles schon getan. Bin normal auf Qracle und die ODAC-Komponenten fixiert, aber dieses Projekt hier nutzt nun einmal die MYSQL.

Besagte rechte Maustaste "Alle Felder hinzufügen" bringt nix - diese drei tauchen nicht auf.
Wie gesagt, an diesem Projekt haben schon einige Köche den Brei verdorben und diverse Altlasten hinterlassen. Keiner hat dieses Projekt je von D7 auf XE... oder höher komplett durchgearbeitet. Alle haben den Löffel geworfen. Dementsprechend anspruchsvoll ist da nun meine Aufgabe.

Also muss ich das wohl unter "unvollendete Altlast" verbuchen und sehen, was ich daraus mache.....

Beste Grüße

Jörg
Naja, das Dual von Oracle hab ich mir halt für FireBird (wie oben im Beispiel) "nachgebaut", kann man in MySQL auch machen.

Im Felddialog ging es mir nicht um das Hinzufügen von Feldern, sondern darum, was da bereits vorhanden ist, wurden die "vermissten" Felder also schon vorher hinzugefügt?

Der Screenshot lässt das vermuten. Irgendwo müssen die Felder herkommen und bereits definiert sein, sonst könnte Dir die IDE sie ja nicht anzeigen. Die Frage ist halt: Wo genau ist da was definiert?

Hast Du schon in den Quelltext des Formulars, also die DFM, geschaut.

Ggfls. mal alle Dateien des Projektes nach den Feldnamen durchsuchen. Für sowas nehme ich gerne den TotalCommander, der durchsucht ggfls. auch mal diverses "binäres Gelumpe". Damit kommt man dann aber in der Regel dem Ziel näher.
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Queryfelder ohne Tablerows?

  Alt 6. Jun 2019, 14:17
Also,

erstmal die Richtigstellung, ja es geht um Coloumns nicht um Rows - sorry - mein Fehler.

die Analyse ergibt, dass diese Felder nie in der db waren. Sie sind auch vom Typ ftcalculated. Es wird dort eine Liste von Lieferanten, welche im Lieferrückstand sind,erzeugt. Soweit ok - dann kommt das Feld "Mahnen" ins Spiel. Das ist offensichtlich rein temporär, wird angeklickt "X" und die mit dem "X" werden gedruckt, danach wird das komplette Grid verworfen. Es wird also nix in der db gespeichert.
Das Compilieren dieses Teiles klappt auch soweit - die Felder sind assoziiert, also z.B. qryRueckstandMahnen ist vorhanden.

Somit bin ich da schon mal ein Stückchen weiter.

Ich danke Euch für die schnelle Hilfe zur Selbsthilfe. Das Ding ist echt ....


Beste Grüße


mcinternet
Jörg
  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 11: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