AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi 2 Tabellen in einem Grid?
Thema durchsuchen
Ansicht
Themen-Optionen

2 Tabellen in einem Grid?

Ein Thema von Sharky · begonnen am 16. Jul 2002 · letzter Beitrag vom 17. Jul 2002
Antwort Antwort
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#1

2 Tabellen in einem Grid?

  Alt 16. Jul 2002, 08:27
Hai,

jetzt habe ich auch mal wieder eine Fräge:

Ich habe zwei Tabellen.

Tabelle1:
Artikel_id
Artikelnummer
Artikelbezeichnung

Tabelle2:
Artikel_id
Adressart
Preis

In der ersten Tabelle stehen die Artikeldaten (logelich). In der zweiten stehen für jeden Artikel Preise die von einer Adressart (die stehen in einer dritten Tabelle) abhängig sind.

z.B.:
Code:
Tabell1:
Artikelnummer Artikelbezeichnung Artikel_id
650-0001-000   Testartikel            100
Code:
Tabelle2:
Artikel_id Adresart Preis
100         1            150,00
100         2            120,00
100         3            99,00
100         4            111,00
Es kann beliebig viele Adressarten geben. Die Anzahl der Einträge pro Artikel in Tabelle2 sind aber immer gleich viel.
Wenn es 4 Adressarten gibt, gibt es für jeden Artikel in Tabelle2 vier einträge. Bei 10 sind es 10 usw.

Jetzt würde ich gerne ein Grid haben in dem ich für jeden Artikel eine Zeile habe und in den Spalten dann die Preise pro Adressart.

Hat einer eine Idee wie ich das am besten lösen kann? (Gibt es eventuell eine SQL-Abfrage die mir eine Sicht erzeugt?)

So das das Ergebniss etwa so aussehen würde:

Code:
Artikelnummer Adressart-1 Adressart-2 Adressart-3 Adressart-4
650-0001-000   150,00        120,00        99,00           111,00
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 16. Jul 2002, 09:33
Unseres (hier in der Firma) Wissens nach kann das nur der SQL Server, wenn es Dir um die gewünschte Ansicht geht. Dazu musst Du dann allerdings T-SQL nutzen (nicht von der Telekom ) -> Temporäre Tabellen.

Wenn es Dir genügt, dass die verschiedenen Artikelpreise in Reihen untereinander auftauchen, dann poste dieses bitte, dann ist es recht einfach.

Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 16. Jul 2002, 10:23
Hai Sakua,

ich habe einen MS-SQL 7 am laufen. Eine Sicht um für jeden Preis eine Zeile zu erzeugen habe ich.

Mich würde es interessieren ob ich es halt schaffe pro Artikel eine Zeile zu erzeugen in der die Daten aus der anderen Tabelle ich einzelnen Feldern stehen.

Wenn es hilft kann ich es darauf beschränken das es nicht n-Zeilen für den Preis gibt sondern immer nur 5 Stück pro Artikel.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 16. Jul 2002, 10:29
Gut,

ich habe meinen SQL-Spezi eine Hausaufgabe aufgegeben, der wird sich dass heute Abend mal anschauen. Er hat zu Hause sogar den 7er MS SQL zu laufen.

Schicke mir doch bitte mal die genaue Tabellendefinition als .SQL Datei, dann gibts die "Customized Solution" wahrscheinlich schon morgen...

sakura@delphipraxis.de

Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Alfons_G

Registriert seit: 7. Jun 2002
Ort: München
296 Beiträge
 
Delphi 2007 Architect
 
#5
  Alt 16. Jul 2002, 11:18

Temporäre Tabellen sind auch bei anderen Systemen, wiez.B. bei Oracle problemlos möglich.
Man kann dies aber auch durch Erzeugen und löschen einer normalen Tabelle simulieren, allerdings mit Performance-Einbußen.

Eine Lösung, welche vom jeweiligen SQL-Dialekt unabhängig ist:
Per select-Anweisung die Anzahl verschiedener Adressierungsarten feststellen.
Ausgabetabelle mit CreateTable mit der entsprechenden Spaltenzahl erzeugen.
Abfrage mit Artikelnummer, Adressart und Preis öffnen.
Tabelle in einer Schleife füllen, dabei die Preise in den jeweiligen Spalten eintragen. Du kannst z.B. mit Next die Anzahl Spalten nach vorne gehen, die Werte holen und schreiben.
DBGrid dynamisch erzeugen.

Falls Dir fünf Preisspalten reichen, geht es auch per View.
Zuerst musst Du die Preise nebeneinander bekommen. Das geht mit einer fünffach verschachtelten Abfrage. Ein Beispiel kann ich Dir allerdings nur in Oracle-SQL bringen
Code:
select
  q.ID, q.A_1, q.A_2, q.A_3, q.A_4, p.Preis as A_5 
from
  Tabelle2 p,
  (select
     q.ID, q.A_1, q.A_2, q.A_3, p.Preis as A_4
   from
     Tabelle2 p,
     (select ...
...
   ) q
where
  (q.ID (+)= p.Artikel_id)
  and
  (p.Adressart = 5)
Du erzeugst also zuerst eine Abfrage, welche Adressart 1 mit Preis und ID ergibt. Diese Abfrage ist mit einem Left Join mit der Tabelle verbunden. So wird das gesamte Ergebnis der ersten Abfrage in der zweiten Abfrage mit Adressart 2 verbunden - bis zur Adressart 5.
Das Ergebnis solltest Du allerdings zwischenspeichern, da für 5 Spalten 5^4 Abfragen, also 625 Abfragen ausgeführt werden.

Alfons Grünewald



Alfons Grünewald
  Mit Zitat antworten Zitat
Alfons_G

Registriert seit: 7. Jun 2002
Ort: München
296 Beiträge
 
Delphi 2007 Architect
 
#6
  Alt 16. Jul 2002, 11:26

Vorhin musste ich das Schreiben meiner Antwort wegen einer dringenden Besprechung unterbrechen - jetzt war sakura in der Zwischenzeit dran



Alfons Grünewald



Alfons Grünewald
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 17. Jul 2002, 21:42
Jetzt auch noch für alle bei Delphi-PRAXiS.
[code:1:e9b55a6387]
CREATE PROCEDURE Preisliste AS
SET NOCOUNT ON

/* Deklaration der Variablen für Statements */
declare @ColName nvarchar(100)
declare @Query nvarchar(1000)

/* Deklaration der Variablen für CURSOR */
declare @adressart_id int
declare @artikel_id int
declare @artikel_name varchar(50)
declare @artikel_artikelnummer varchar(15)
declare @artikel_warengruppe int
declare @artikel_artikelgruppe int
declare @artikel_vk_id int
declare @artikel_vk_preis float
declare @artikel_vk_prozent float
declare @artikel_vk_rabat float

/* Löschen der Temporären Tabelle TEMPPREISLISTE falls diese existiert */
if exists (select * from sysobjects where id =
object_id(N'[dbo].[TempPreisliste]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[TempPreisliste]

/* Erstellen der Temporären Tabelle TEMPPREISLISTE */
CREATE TABLE [dbo].[TempPreisliste] (
[preis_id] [int] IDENTITY (1, 1) NOT NULL ,
[artikel_id] [int] NULL ,
[Name1] [varchar] (50) NULL ,
[Artikelnummer] [varchar] (15) NULL ,
[Warengruppe] [int] NULL ,
[Artikelgruppe] [int] NULL
)

/* CURSOR für Artikeltabelle */
DECLARE artikel_cursor CURSOR FOR
Daniel W.
Ich bin nicht zurück, ich tue nur so
  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 13:54 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