Avatar billede skindbeni Nybegynder
03. december 2006 - 21:46 Der er 10 kommentarer og
1 løsning

Excelfil og data i program

Hej.

Jeg kan ikke huske, om det er her eller et andet sted, at jeg før har spurgt om hjælp i forbindelse med mit projekt, men jeg har endnu et.

Jeg er i gang med at lave et skatteberegningsprogram og har i den forbindelse hentet samtlige kommuneskattesatser på SKAT's hjemmeside.

De ligger i en Excel fil.
Den kan ses her: http://www.skm.dk/public/kommuneskatter/km2006.xls

Jeg har brug for udførlig hjælp til at få dataene ind og arbejde i mit program.

Her kan man se et skærmdump af en af mine forms.
http://www.test.horsensfreja.dk/stamdata.jpg

Det skal være således, at når man skifter "kommunenr" så skifter "kommunenavn" tilsvarende.

Det skal ligeledes være således, at når en given kommune er valgt, så kan jeg bruge de skattesatser, der tilhører den valgte kommune
Avatar billede js_delphi Nybegynder
04. december 2006 - 11:37 #1
Gem km2006 i mappen med dit project som .csv fil med ; som separator.
Tast kommune nummer ind i Edit1, og tryk paa Button1.
Ikke testet, har travlt...

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  SL1, SL2: TStringList;
begin
  SL1 := TStringList.Create;
  SL2 := TStringList.Create;
  SL1.Clear;
  SL1.LoadFromFile(ExtractFilepath(Application.Exename) + 'km2006.csv');

  for i := 5 to SL1.Count-1 do
  begin
    SL2.Clear;
    ExtractStrings([';'],[],PChar(SL1[i]),SL2);
    if StrComp(PChar(SL2[2]),PChar(Edit1.Text)) = 0 then
    begin
      Edit2.Text := SL2[0]; //Loader kommune navn ind i Edit2.
      Edit3.Text := SL2[3]; //Loader alfabet nr. ind i Edit3.
      // osv...
      break;
    end;
  end;

  SL1.Free;
  SL2.Free;
Avatar billede hrc Mester
04. december 2006 - 13:20 #2
Du behøver ikke bruge ExtractStrings - den eller lignende funktionalitet er indbygget i TStringList.

Se evt. mit indlæg i http://www.eksperten.dk/spm/747212 (og brug Try/Finally hvor du kan). Det ligner is_delphis men bruger ikke eksterne pchar-procedurer
Avatar billede skindbeni Nybegynder
04. december 2006 - 18:27 #3
Hej begge to.

Jeg må erkende, at jeg ikke er så god, som jeg håber og som i tror ;o)

Lad os sige, at jeg har en StringGrid med nogle passende kolonner.

Hvordan får jeg så data ind i denne StringGrid, så de er til at arbejde med.

Jeg vil gerne belønne med flere points, da det kræver mere end som så at lære mig det ;o)
Avatar billede hrc Mester
04. december 2006 - 22:58 #4
Her er den testede version af det eksempel mit link pegede til:

Givet tekstfilen:
-----------------
Magda Tordenskiold;Helgolandsvej 1;1000;København;55443322
Norma Tjald;Vestre Stationsvej 1;5000;Odense C;35443322
Henry Taskenskjold;Georg Stages minde 12;7500;Holstebro;97443322
Henny Christensen;Vestergade 1;5500;Faaborg;75443322

Følgende kode smækker data over i en TListView (lvData), der er sat i vsReport-mode og indeholder 5 kolonner.

procedure TfrmMain.bTestClick(Sender: TObject);
var
  i, j : integer;
  Lines : TStringList;
  Fields : TStringList;
  Navn, Adresse, Postnr, By, Telefon : string;
begin
  Lines := TStringList.Create;
  Fields := TStringList.Create;
  try
    Fields.QuoteChar := #0;
    Fields.Delimiter := ';';
    Fields.StrictDelimiter := true; // Denne her er vigtig!

    Lines.LoadFromFile('data.csv');
    for i := 0 to Lines.Count - 1 do
    begin
      Fields.DelimitedText := Lines[i];

      // Nulstil for der kan jo være variabelt antal felter på linjen
      Navn := '';
      Adresse := '';
      PostNr := '';
      By := '';
      Telefon := '';

      // Pløj gennem felterne der nu ligger på hver sin plads i listen
      for j := 0 to Fields.Count - 1 do
        case j of
          0 : Navn := Fields[j];
          1 : Adresse := Fields[j];
          2 : PostNr := Fields[j];
          3 : By := Fields[j];
          4 : Telefon := Fields[j];
        end;

      if Fields.Count > 0 then // Ikke tage tomme linjer med
        with lvData.Items.Add do // Lav en TListItem og fyld den med data
        begin
          Caption := Navn;
          SubItems.Add(Adresse);
          SubItems.Add(PostNr);
          SubItems.Add(By);
          SubItems.Add(Telefon);
        end;
    end;
  finally
    Fields.Free;
    Lines.Free;
  end;
end;
Avatar billede hrc Mester
04. december 2006 - 23:05 #5
Man kunne selvfølgelig køre data direkte over i et TListItem og spare nogle linjer kode, men jeg tror der vil kunne opstå problemer med variabelt antal felter på linjerne. Mener TListView ikke er så glad for dem. Det kan dog ordnes således:

procedure TfrmMain.bTestClick(Sender: TObject);
var
  i, j : integer;
  Lines : TStringList;
  Fields : TStringList;
begin
  Lines := TStringList.Create;
  Fields := TStringList.Create;
  try
    Fields.QuoteChar := #0;
    Fields.Delimiter := ';';
    Fields.StrictDelimiter := true; // Denne her er vigtig!

    Lines.LoadFromFile('data.csv');
    for i := 0 to Lines.Count - 1 do
    begin
      Fields.DelimitedText := Lines[i];

  for i := 0 to Lines.Count - 1 do
    begin
      Fields.DelimitedText := Lines[i];
      with lvData.Items.Add do
      begin
        // Fyld data i TListView
        for j := 0 to Fields.Count - 1 do
          case j of
            0 : Caption := Fields[j]);
            1 : SubItems.Add(Fields[j]);
            2 : SubItems.Add(Fields[j]);
            3 : SubItems.Add(Fields[j]);
            4 : SubItems.Add(Fields[j]);
          end;
 
        // Top op med tomme felter
        for j := Fields.Count - 1 to 4 do
          SubItems.Add('');
      end;
    end;
  finally
    end;
  finally
    Fields.Free;
    Lines.Free;
  end;
end;
Avatar billede skindbeni Nybegynder
05. december 2006 - 20:52 #6
Hej.

Hvad kan problemet være, når den ikke kender til "strictDelimiter? (den vigtige linie).

Jeg får en fejl om undeclared identifier
Avatar billede hrc Mester
06. december 2006 - 12:52 #7
At du ikke kører D2006; der er den vigtig. Kommentér den ud og se om det virker - det mener jeg det gør. Hvorfor de har valgt at pille i den del i D2006 er mig lidt en gåde.
Avatar billede skindbeni Nybegynder
06. december 2006 - 13:15 #8
Jeg siger tak og giver points, hvis du sender et svar.
Avatar billede skindbeni Nybegynder
17. december 2006 - 15:10 #9
@ hrc

Jeg skylder dig nogle points, hvis du sender et svar ;O)
Avatar billede hrc Mester
30. januar 2007 - 22:38 #10
Jov, jov. Jeg svarer gerne når nu jeg nødes :-)
Avatar billede skindbeni Nybegynder
30. januar 2007 - 22:39 #11
Du skal jo have, hvad du fortjener, og 100 pesetos er jo også en slat. ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester