Autor Beitrag
AGM
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 04.04.11 15:41 
Hi,

[Hat sich erledigt]

Gruß
AGM


Zuletzt bearbeitet von AGM am Mi 04.05.11 12:39, insgesamt 1-mal bearbeitet
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mo 04.04.11 16:09 
Für mich schreit deine Aufgabenstellung geradezu nach einem Clientdataset und einem DB-Grid ;) Clientdatasets sind schnell und einfach zu erzeugen, lassen sich Prima Filtern

Alles, was du brauchst, wäre ein Clientdataset (Selbst erzeugt mit der gewünschten Struktur)
ein DB_Grid und eine Datasource.

Ablauf in etwa so:
1) Clientdataset erzeugen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 FCds := TClientDataSet.Create(Self);
 fcds.FieldDefs.Add('Feldname', Feldtyp, (ggf. Feldlänge bei Strings));
 ...
 CreateDataSet;

2) Datei einlesen (ins Clientdataset natürlich)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 (Pseudocode) 
  while Poszeile aus Datei lesen
   FCDS.Append;
   FCDS.FieldByname('AUFTRAGSID').asInteger := lAuftragsnummer;
   ...
   FCDS.Post;

3) Datasource mit Dataset verbinden
ausblenden Delphi-Quelltext
1:
  ds_AuftragPos.dataSet := FCDS;					

4. Grid mit Datasource verbinden
ausblenden Delphi-Quelltext
1:
 dbGrid1.Datasource := ds_AuftragsPos;					

Fertig.

Wenn du nun den Auftragskopf anzeigst, einfach das Clientdataset auf die Auftragsnummer filtern, fertig ist die Anzeige ;)
ausblenden Delphi-Quelltext
1:
2:
 FCDS.Filter = Format('AUFTRAGSID = %d', [lAuftragsnummer];
 FCDS_Filtered := True;


Die Auftragsköpfe würde ich natürlich auch in ein ClientDataSet einlesen, so dass man dem Kopf-CDS eine Afterscroll-Methode verpasst, in der die Pos-Filterung aufgerufen wird.

Nur so als meine '2-Cents', weiss ja nicht, wie fit du in Delphi bist bzw. ob deine Aufgabenstellung die verwendung von ClientDataSets zulässt.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!

Für diesen Beitrag haben gedankt: AGM
AGM Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 05.04.11 11:38 
user profile iconzuma hat folgendes geschrieben Zum zitierten Posting springen:

Nur so als meine '2-Cents', weiss ja nicht, wie fit du in Delphi bist bzw. ob deine Aufgabenstellung die verwendung von ClientDataSets zulässt.


Das ist genau der Punkt ^^. Obwohl ich eigentlich kein absoluter Anfänger bin, tu ich mich mit dem Auslesen und Darstellen von Daten immer recht schwer.

Hier mal ein Auszug aus meinem bisherigen Quellcode:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.FormCreate(Sender: TObject);

begin
  path := ExtractFilePath(ParamStr(0));
  AssignFile(datei, path+'Aufträge.dat');
  if FileExists(path+'aufträge.dat'then ReSet(datei)
  else ReWrite(datei);

    stringgrid1.cells[1,0]:='Artikelnummer';
    stringgrid1.cells[2,0]:='Position';
     stringgrid1.cells[0,1]:='1';
      stringgrid1.cells[0,2]:='2';
       stringgrid1.cells[0,3]:='3';
       stringgrid1.cells[0,4]:='4';
       stringgrid1.cells[0,5]:='5';

end;


Das beinhaltet das Einlesen sowie das vorbereiten des Grundgerüstes des TStringgrid.

Weiter:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.auslesen(datensatz: integer);
var aktdatensatz: TAuftrag;
begin
  if (datensatz<0or (datensatz>=FileSize(datei)) then exit
  else begin
    seek(datei, datensatz);
    read(datei, aktdatensatz);
    editAuftragsnummer.text:= IntToStr(aktdatensatz.Auftragsnummer);

    If aktdatensatz.position= 1 then StringGrid1.cells[2,1] := 'A';
      If aktdatensatz.position= 2 then StringGrid1.cells[2,1] := 'B';
        If aktdatensatz.position= 3 then StringGrid1.cells[2,1] := 'C';
          If aktdatensatz.position= 4 then StringGrid1.cells[2,1] := 'D';
            If aktdatensatz.position= 5 then StringGrid1.cells[2,1] := 'E';
              If aktdatensatz.position= 6 then StringGrid1.cells[2,1] := 'F';  //Umrechnung der Ausgabe

   StringGrid1.cells[1,1]:=aktdatensatz.Artikelnummer;


So wird die erste Zeile des TStringgrids gefüllt.

Aber wie kann ich nun die weiteren Zeilen mit den übrigen Artikeln des Auftrages füllen?

Wäre sehr dankbar, wenn jmd. mir hoffnungslosem Fall nochmal eine kleine Hilfestellung leisten würde :D

Gruß
AGM
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Di 05.04.11 12:00 
Wie ist denn deine dat-Datei aufgebaut? Ohne die Struktur in der Datei zu kennen, wirds etwas schwierig, dir einen Tipp zu nennen.
Haste den Strukturaufbau schon in einem anderen Thread beschrieben (wenn ja, wo?)?

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
AGM Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 05.04.11 12:23 
Ja, den Strukturaufbau findest Du hier:

www.delphi-forum.de/...atFormat_104827.html

Ich denke, ich benötige 2 Variablen i und j für Zeilen und Spalten.. mmh
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Di 05.04.11 16:22 
Ok, also hast du in der Datei 0-n Zeilen mit Auftragsnummer, Positionsnummer und Artikelnr je Zeile ?

Bei meiner Clientdataset-Lösung liest du einfach die ganze Datei in das Clientdataset ein,
wobei du pro Zeile ein 'Append' (= Neue Zeile im CDS) machst und die Felder mit den entsprechenden Werten aus der Datenzeile befüllst.

bsp:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 // Schleife machen, um alle Datenzeilen der Datei zu durchlaufen
 FCDS.Append;
 FCDS.FieldByname('AUFTRAGNUMMER').asinteger := Auftragnummer;
 FCDS.FieldByname('AUFTRAGPOS').asinteger    := Positionsnummer;
 FCDS.FieldByname('ARTIKELNR').asinteger     := Artikelnummer;
 FCDS.Post;
// nächste Datenzeile in Datei auslesen


Wenn du nun in deinem Editfeld eine Auftragsnummer eingibst, filterst du die Datenmenge
auf diese Auftragsnummer (z.b im onExit des Editfeldes)
ausblenden Delphi-Quelltext
1:
2:
 FCDS.Filter := Format(AUFTRAGSNUMMER = %d, [StrToInt(Edit1.Text)]);
 FCDS.Filtered := True;


und fertig. Wenn du den Rest (DBGrid, Datasource, etc) so wie zuvor von mir beschrieben machst, werden immer alle Positionen des Auftrages, dessen Nummer im Editfeld steht, in dem Grid angezeigt.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!