Listbox Einträge in eine sqlite Datenbank speichern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von dash_develop »

Hallo zusammen,

ich bin ziemlicher Frischling in Sachen programmieren und bin gerade dabei ein kleines Programm zu schreiben.
Es geht erstmal darum Freigaben einzulesen und diese in eine sqlite-Datenbank zu schreiben, damit ich später daraus Berichte erstellen kann.
Ich bin noch ziemlich am Anfang meines Projektes und stehe derzeit ziemlich auf dem Schlauch und hoffe hilfreiche Gedankenanstöße hier zu bekommen.

Die Verbindung zu Datenbank habe ich hinbekommen. Meine Freigaben werden per Shellexecute Befehl ausgelesen und in eine .txt - Datei gespeichert.
Die .txt - Datei wird dann in eine Listbox ohne Leerzeilen und untereinander aufgelistet.
Mit folgendem Code:

Code: Alles auswählen

 
procedure THauptformular.Button_Freigaben_einlesenClick(Sender: TObject);
var i     : Integer;
    sl    : TStringlist;
    s, s2 : String;
begin
//Freigaben in Listbox einlesen
sl := TStringlist.Create;
sl.clear;
sl.LoadFromFile(Freigaben_TXT_Pfad);
for i := 0 to sl.Count - 1 do
  begin
    s := sl.Strings[i];
    repeat
      if nextitem(s,s2) then
         listbox1.Items.add(s2);
    until s='';
  end;
//Listbox leere Zeilen entfernen
i := 0;
while i < ListBox1.Count do
  begin
    if ListBox1.Items[i] = '' then
       ListBox1.Items.Delete(i)
    else
       Inc(i);
  end;
end; 
 
Grobes Beispiel meiner Listbox:

Code: Alles auswählen

 
\\PC-Name\Windows.UI.Logon
Jeder
Full Control
Domain\User
Full Control
Domain\User2
Read
\\PC-Name\E
Jeder
Full Control
\\PC-Name\Test$
Domain\User2
Read
..
 
Meine Datenbanktabelle hat folgende Spalten: ID (automatisch gefüllt), Freigabenname, User und Berechtigung.

Ich bekomme keine Abfrage hin die mir die Sachen richtig die in die Datenbank schreibt... :(
Kann mir jemand helfen? Ich habe schon im WWW nach einer Lösung gesucht, war jedoch nicht fündig.
Hat wer eine Idee oder kann mir einen Beitrag verlinken der mir helfen kann?

Ich bin über jede Hilfe dankbar. :)

Mit freundlichen Grüßen
dash_develop

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von creed steiger »

mir hat das hier gut weitergeholfen
http://wiki.freepascal.org/SQLdb_Tutorial1

und natürlich die folgenden

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von dash_develop »

Hallo creed steiger,

danke für deine Hilfsbereitschaft.
Habe deinen Link schon am Wochenende gehabt. :P
Der hat mir auch nicht weiter geholfen, da ich nicht weiß wie ich die Listboxeinträge in die richtigen spalten in der DB abspeichern kann.

Ist es möglich nach beginnend mit '\\*\ in der Listbox zu selektieren oder so?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von Michl »

Da musst du selber parsen und dann in die Datenbank schreiben. Eigentlich wollte ich die Schritte erklären, hoffe aber, du kannst auch den Code lesen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
type
  TPermission = record
    NetworkPath: String;
    User: String;
    Concession: String;
  end;
 
var
  SL: TStringList;
  Permissions: array of TPermission;
 
  procedure AddSomeEntry;
  begin
    SL.Add('\\PC-Name\Windows.UI.Logon');
    SL.Add('Jeder');
    SL.Add('Full Control');
    SL.Add('Domain\User');
    SL.Add('Full Control');
    SL.Add('Domain\User2');
    SL.Add('Read');
    SL.Add('\\PC-Name\E');
    SL.Add('Jeder');
    SL.Add('Full Control');
    SL.Add('\\PC-Name\Test$');
    SL.Add('Domain\User2');
    SL.Add('Read');
  end;
 
  function IsNetWorkPath(s: String): Boolean;
  begin
    Result := Pos('\\', s) = 1;
  end;
 
  procedure Parse;
  var
    i: Integer;
    Permission: TPermission;
  begin
    SetLength(Permissions, 0);
    i := 0;
    while i < SL.Count do begin
      if IsNetWorkPath(SL[i]) then
      begin
        Permission.NetworkPath := SL[i];
        Permission.Concession := '';
        Permission.User := '';
        Inc(i);
      end;
      if Permission.NetworkPath = '' then
      begin
        Inc(i);
        Continue;
      end;
      if i = SL.Count then Exit;
      if IsNetWorkPath(SL[i]) then Continue;
      Permission.User := SL[i];
      Inc(i);
      if i = SL.Count then Exit;
      if IsNetWorkPath(SL[i]) then Continue;
      Permission.Concession := SL[i];
      SetLength(Permissions, Length(Permissions) + 1);
      Permissions[High(Permissions)] := Permission;
      Inc(i);
    end;
  end;
 
  procedure FillInDatabase;
  var
    i: Integer;
  begin
    for i := 0 to High(Permissions) do
    begin
      SQLQuery1.Append;
      SQLQuery1.FieldByName('Freigabename').AsString := Permissions[i].NetworkPath;
      SQLQuery1.FieldByName('User').AsString         := Permissions[i].User;
      SQLQuery1.FieldByName('Berechtigung').AsString := Permissions[i].Concession;
      SQLQuery1.Post;
    end;
  end;
 
begin
  SL := TStringList.Create;
  AddSomeEntry;
  Parse;
  FillInDatabase;
  FreeAndNil(SL);
end; 
Besser ist es dann auch, du nimmst ein DBGrid und lässt dir das dort anzeigen (Testprojekt anbei, wobei mir englische Feldnamen besser gefallen würden):
Dateianhänge
Permissions.zip
(3.32 KiB) 57-mal heruntergeladen
Ansicht.png

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von dash_develop »

Hallo Michl,

ich werde morgen mir mal deinen Code anschauen und versuchen deine einzelnen Vorgehensweisen zu verstehen.
Vielen Dank schonmal. :)

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von dash_develop »

Hallo Michel,

tut mir Leid das ich jetzt erst antworte kam aber leider nicht vorher dazu deinen Code mir genauer anzuschauen.
Vielen Dank nochmal. Mein Problem ist leider, das er die Freigaben immer noch in die Listbox schreibt und nicht in die Datenbank.
Ich habe deinen 'AddSomeEntry' mit meiner Listboxabfrage gefüllt.
Mein Code sieht jetzt wie folgt aus:

Code: Alles auswählen

 
procedure THauptformular.Button_freigaben_einlesenClick(Sender: TObject);
type
  TPermission = record
    NetworkPath: String;
    User: String;
    Concession: String;
  end;
 
var
  SL: TStringList;
  Permissions: array of TPermission;
 
  procedure AddSomeEntry;
  var i     : Integer;
      sl    : TStringlist;
      s, s2 : String;
  begin
  //Freigaben in Listbox einlesen
  sl := TStringlist.Create;
  sl.clear;
  sl.LoadFromFile(Freigaben_TXT_Pfad);
  for i := 0 to sl.Count - 1 do
    begin
      s := sl.Strings[i];
      repeat
        if nextitem(s,s2) then
           listbox1.Items.add(s2);
      until s='';
    end;
  //Listbox leere Zeilen entfernen
  i := 0;
  while i < ListBox1.Count do
    begin
      if ListBox1.Items[i] = '' then
         ListBox1.Items.Delete(i)
      else
         Inc(i);
    end;
  end;
 
  function IsNetWorkPath(s: String): Boolean;
  begin
    Result := Pos('\\', s) = 1;
  end;
 
  procedure Parse;
  var
    i: Integer;
    Permission: TPermission;
  begin
    SetLength(Permissions, 0);
    i := 0;
    while i < SL.Count do begin
      if IsNetWorkPath(SL[i]) then
      begin
        Permission.NetworkPath := SL[i];
        Permission.Concession := '';
        Permission.User := '';
        Inc(i);
      end;
      if Permission.NetworkPath = '' then
      begin
        Inc(i);
        Continue;
      end;
      if i = SL.Count then Exit;
      if IsNetWorkPath(SL[i]) then Continue;
      Permission.User := SL[i];
      Inc(i);
      if i = SL.Count then Exit;
      if IsNetWorkPath(SL[i]) then Continue;
      Permission.Concession := SL[i];
      SetLength(Permissions, Length(Permissions) + 1);
      Permissions[High(Permissions)] := Permission;
      Inc(i);
    end;
  end;
 
  procedure FillInDatabase;
  var
    i: Integer;
  begin
    for i := 0 to High(Permissions) do
    begin
      SQLQuery1.Append;
      SQLQuery1.FieldByName('Freigabename').AsString := Permissions[i].NetworkPath;
      SQLQuery1.FieldByName('User').AsString         := Permissions[i].User;
      SQLQuery1.FieldByName('Berechtigung').AsString := Permissions[i].Concession;
      SQLQuery1.Post;
    end;
  end;
 
begin
  SL := TStringList.Create;
  AddSomeEntry;
  Parse;
  FillInDatabase;
  FreeAndNil(SL);
end;
 
Kannst du mir einen Hinweis geben, woran das liegt, das er mir nur die Sachen in die Listbox schreibt und nicht auch noch in die Datenbank?

Vielen Dank im Voraus.

Mit freundlichen Grüßen
dash_develop

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von Michl »

Wenn ich mir deinen Code anschaue, denke ich, das Problem ist, dass da Leerzeilen in der Original-StringList sind.

Wenn du diese Zeile einfügst sollte es hoffentlich passen:

Code: Alles auswählen

procedure Parse;
  var
    i: Integer;
    Permission: TPermission;
  begin
    SetLength(Permissions, 0);
    i := 0;
    SL.Assign(ListBox1.Items); // <---
    while i < SL.Count do begin
[Edit]
Ach ja noch zwei Bemerkungen.

Der Code war nur als Anregung gedacht. Sauber programmiert war dies von mir so nicht. Man sollte die Programmlogik von den User Ein- und Ausgaben trennen. Daher würde ich eine eigene Klasse (in einer separaten Unit) erstellen, in die man die Rohdaten schickt, diese verarbeiten/parsen und zur Ausgabe aufbereitet zurückgeben lässt. Identisch die Datenbankoperationen.

Wenn die Datenbank nicht mit Daten gefüllt wird, würde ich als erstes einen Breakpoint am Anfang der Procedure FillInDatabase setzen und mit <F7> den Code durchsteppen. Vermutlich sieht man dann, dass Permissions nicht gefüllt wurden. Dann würde ich schauen, warum diese nicht gefüllt werden. Also einen Breakpoint am Anfang von Parse setzen und durchsteppen usw.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Listbox Einträge in eine sqlite Datenbank speichern

Beitrag von dash_develop »

Vielen Dank für deine Mühe und deine Bemerkungen.

Naja meine Programmierkünste und Programmierlogik ist noch ganz am Anfang.
Versuche mir mit kleinen Projekte stets neue Ziele zu setzen und das Wichtigste einfach dran zu bleiben.

Werde deine Bemerkung mir durch den Kopf gehen lassen und das Programm am Ende komplett durcharbeiten und versuche es besser zu machen.

Antworten