ListView - Anordnung nebeneinander....

Rund um die LCL und andere Komponenten
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

ListView - Anordnung nebeneinander....

Beitrag von Joachim Raap »

Hallo, ich hänge leider fest und finde keine Lösung; brauche also etwas Unterstützung.
Das Problem:
Ich habe eine ListView mit z.B. 4 Spalten. Beim Einlesen der Sätze aus der Datenbank (meinetwegen aus dem Jahr 2023) werde die Spalten 1 und 2 zeilenweise gefüllt. (das ist kein Problem).
Ein zweiter Datensatz der irgendwann mal aus dem Jahr 2022 kommt soll in der korrespondierenden Zeile zum Satz aus 2023 die Spalten 3 und 4 füllen (fungiert als Vergleichswert zum Jahr 2023).
Ich bekomme es nun nicht hin, erstens die richtige Zeile zu finden und dann in dieser Zeile die Einträge in die Spalten 3 und 4 zu machen.
Kann mir bitte jemand aufs Pferd helfen?

Ich hoffe, das war verständlich .....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView - Anordnung nebeneinander....

Beitrag von af0815 »

Listview und DB haben mal nicht so wirklich was gemeinsam.

Das erste, kannst du die Staments so machen, das du alle Daten richtig bereits vorliegen hast, wenn nicht, so bist du im reinen Code von Pascal, das du dort deine Reihung zusammenbringst. Die Listview ist nur ein Darstellungsgeschichte. Also die Daten müssen so vorliegen, das man das in die Listview bekommt.

Ach ja, wenn man das Pferd nicht sieht, kann man es nicht beurteilen (ob es ein toter Schimmel oder ein alter Rappe ist) = Code.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ListView - Anordnung nebeneinander....

Beitrag von Joachim Raap »

Ja af0815, das es zwischen Datenbank und ListView keinen wirklichen Zusammenhang gibt, ist schon klar - und den Code kann ich nicht posten; den oder eine Idee dazu suche ich....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView - Anordnung nebeneinander....

Beitrag von af0815 »

Wenn du im Selektion Statement eine Spalte von 1-4 dazubekommst hast du gewonnen. Der Rest ist ohne Daten oder Code nur raten ins blaue.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ListView - Anordnung nebeneinander....

Beitrag von Joachim Raap »

werde ich nicht hinbekommen; die Daten kommen aus unterschiedlichen mit "join" verbundenen Tabellen.
Ich denke, die Herkunft der Daten ist auch egal - meinetwegen kommen sie sequenziell aus einem File.....
Na, dann warte ich mal auf mögliche andere Aussagen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView - Anordnung nebeneinander....

Beitrag von af0815 »

Ein Join ist mal kein Hindernis (ausser für die Performance wenn man Pech hat), man kann das ganze mal in einen Sub-Select packen. Was ist das Kriterium für die Spalte. Es kommt für nicht wirklich heraus, wie du das in die Spalten packen willst.
Beim Einlesen der Sätze aus der Datenbank (meinetwegen aus dem Jahr 2023) werde die Spalten 1 und 2 zeilenweise gefüllt. (das ist kein Problem).
Ein zweiter Datensatz der irgendwann mal aus dem Jahr 2022 kommt soll in der korrespondierenden Zeile zum Satz aus 2023 die Spalten 3 und 4 füllen (fungiert als Vergleichswert zum Jahr 2023).
Was heisst da korespondierender Datensatz aus 2023 ? Laut dem müsstest du Datensätze aus 2022 den gleichen Sätzen aus 2023 gegenüberstellen. Das sind so abstrakte Angaben, wenn es so unklar ist, weiche ich auf TSQL am MS Sqlserver aus und stelle die Daten mal in eine 2022 Temporär Tabelle, die Daten für 2023 und dann kann man das ganze so zusammenfügen wie man will.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ListView - Anordnung nebeneinander....

Beitrag von Joachim Raap »

mh - ich kann es wohl nicht gut genug beschreiben....
noch ein Versuch: Ich habe eine Tabelle, in der ich in EINER Zeile Werte aus 2023 mit dem Vorjahr 2022 vergleich wil.

Das Ergebnis soll also so aussehen:

Spalte1 Spalte2 Spalte3
Zeile 1 2023 2022
Zeile 2 Artikel 15 5,00€ 4,00€

und nicht so

Spalte1 Spalte2 Spalte3
Zeile 1 2023 2022
Zeile 2 Artikel 15 5,00€
Zeile 3 Artikel 15 4,00€

Die Preise sind in unterschiedlichen Tabellen (eben 2023 und 2022) gespeichert und kommen nacheinander. Wenn also der Satz 2022 kommt, bin ich in der ListView schon eine Zeile weiter und muß irgendwie wieder zurück in die 2.Zeile Spalte3.

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView - Anordnung nebeneinander....

Beitrag von theo »

Kannst du mal den Code zeigen, damit man sieht, was du (ggf. falsch) machst?
Ich verstehe dein Problem so auch nicht wirklich. Glaskugel ist in der Reparatur.

charlytango
Beiträge: 1058
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: ListView - Anordnung nebeneinander....

Beitrag von charlytango »

Joachim Raap hat geschrieben: So 15. Jan 2023, 22:21
Das Ergebnis soll also so aussehen:

Zeile 0 Spalte1 Spalte2 Spalte3
Zeile 1 ++++ 2023 2022
Zeile 2 Artikel 15 5,00€ 4,00€
Das sieht mir weniger nach einem Darstellungsproblem als einem Datenbankproblem aus. Wenn die Abfrage sauber aus der DB kommt stellt das jeder TDBGrid leicht dar.
Klassische Kreuztabelle nehme ich mal an (aus den rudimentären Informationen destilliert)

af0815 hat dir eine der Möglichkeiten schon skizziert.

Um hier eine auch nur halbwegs valide Aussage treffen zu können wäre folgendes nötig zu wissen:

-- Welcher SQL Server in welcher Version (die kochen alle ihr eigenes Süppchen und die Version sagt welche Funktionen zur Verfügung stehen)
-- Tabellenstruktur der relevanten Daten (sonst weiß man nicht welche Joins nötig sind)
-- ggfs auch Testdaten (Struktur und Daten) die man leicht in eine DB importieren kann.

Nur als Denkanstoß: Du benutzt einen SQL Server und die können das was du scheinbar möchtest auch darstellen. (also einen Jahresvergleich von Zahlen zu bestimmten Artikeln). Dann macht es wenig Sinn sich über Handarbeit von Daten in einem Listview Gedanken zu machen. Da ist dann SQL scripting angesagt. Suchbegriffe dazu: "MySQL Kreuztabelle","MySQL Pivot", "MySQL transform" .. analog auch mit dem Server deiner Wahl.
Zuletzt geändert von charlytango am So 15. Jan 2023, 23:12, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView - Anordnung nebeneinander....

Beitrag von af0815 »

Ich gehe davon aus, das er eine pivot Transformation der Ergebnisse benötigt. Wenn ich richtig liege, geht das abhängig vom DB System oder man muss es in Pascal Coden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1058
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: ListView - Anordnung nebeneinander....

Beitrag von charlytango »

kommt drauf an wie die Daten vorliegen, aber ich kann mir echt nicht vorstellen dass das ein halbwegs aktueller SQL Server nicht kann.

Doch solange er uns nichts genaueres mitteilt ist das alles nur Kaffesudlesen. In Hogwarts nimmt man dazu auch gerne Teeblätter.

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: ListView - Anordnung nebeneinander....

Beitrag von Joachim Raap »

zunächst mal "Danke".
Ich habe noch mal überlegt und kam zum Schluß, daß der Hinweis auf "join" wohl die falsche Fährte ist.
Die erste Tabelle liefert nur irgendwelche Stammdaten und die zweite Tabelle die Werte dazu. Man kann das Problem auch beschreiben, wenn es nur die zweite Tabelle - also die mit den Werten - gäbe. Hier sind zu einem Artikel mehrere Sätze vorhanden; pro Jahr (einer aufgeteilt in Monate). In der ListView werden pro Artikel Werte aus dem aktuellen Jahr mit dem des Vorjahres gegenübergestellt. das führt derzeit bei mir dazu, daß gegliedert nach Artikeln die Jahre 2023 und 2022 untereinander stehen und nicht - wie gewünscht - nebeneinander in einer Zeile.
Ich suche eben eine Möglichkeit, beim Einlesen des Satzes für 2022 in die Zeile zu springen, in der zum Artikel X das Jahr 2023 steht um dort in der gleichen Zeile die Werte für 2022 darzustellen.
Mein bisheriger Code dazu (mit dem falschen Ergebnis); M enthält den Monat, Y enthält das aktuelle Jahr, VY enthält das Vorjahr:

Code: Alles auswählen

case M of
          1: begin
              if StrToInt(StrPerJahr)=Y then
               begin
                item.Subitems.Add(StrPerJan);  //6
                item.Subitems.Add(StrPerGes);  //7
               end;
              if StrToInt(StrPerJahr)=VY then
               begin
                for i:=0 to LVArtikel.Items.Count-1 do
                 begin
                  if LVArtikel.Items[i].SubItems[0]=StrArtNr then
                    begin
                     LVArtikel.Items[i].Subitems.Add(StrPerJan);   //8
                     LVArtikel.Items[i].Subitems.Add(StrPerGes);   //9
                    end
                 end;
               end;
             end;
          2: begin          

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ListView - Anordnung nebeneinander....

Beitrag von af0815 »

Ok, jetzt wird es klarer, ein reines Listview Problem und wie man die Daten darstellt. Ok, das ist nicht unbedingt mein Thema.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 837
Registriert: Do 1. Jul 2010, 19:01

Re: ListView - Anordnung nebeneinander....

Beitrag von six1 »

Ich bin, auch nach mehrmaligem lesen des Beitrages der Meinung, dass ein JOIN die Lösung ist.
Ohne aber eine genaue Definition der Tabellen und der Bezüge untereinander zu sehen, blicke ich absolut nicht durch.
Das liegt vielleicht nicht mal an den Versuchen, das Problem darzustellen, sondern vielleicht mehr an der Struktur der Tabellen....
Gruß, Michael

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView - Anordnung nebeneinander....

Beitrag von theo »

Nochmal zum Anfang:
Joachim Raap hat geschrieben: So 15. Jan 2023, 19:14 Ich bekomme es nun nicht hin, erstens die richtige Zeile zu finden und dann in dieser Zeile die Einträge in die Spalten 3 und 4 zu machen.
Du machst das ja im Prinzip schon in deinem Code, deshalb weiss ich nicht, was du noch wissen willst.

Code: Alles auswählen

                 for i:=0 to LVArtikel.Items.Count-1 do
                 begin
                  if LVArtikel.Items[i].SubItems[0]=StrArtNr then //Suchen
                    begin
                     LVArtikel.Items[i].Subitems.Add(StrPerJan);   //Anhängen
                     LVArtikel.Items[i].Subitems.Add(StrPerGes);   //Anhängen
                    end
                 end;
Ob das so richtig ist, kann man deinem Code nicht entnehmen.

Antworten