Entwickler-Ecke

Dateizugriff - Record im StringGrid anzeigen


AGM - Mo 04.04.11 15:41
Titel: Record im StringGrid anzeigen
Hi,

[Hat sich erledigt]

Gruß
AGM


zuma - 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

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)

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

Delphi-Quelltext
1:
  ds_AuftragPos.dataSet := FCDS;                    

4. Grid mit Datasource verbinden

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 ;)

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.


AGM - 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:


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:


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 - 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?)?


AGM - Di 05.04.11 12:23

Ja, den Strukturaufbau findest Du hier:

http://www.delphi-forum.de/topic_Die+Sache+mit+dem+datFormat_104827.html

Ich denke, ich benötige 2 Variablen i und j für Zeilen und Spalten.. mmh


zuma - 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:

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)

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.