wie erstelle ich eine Datenbank ohne Requester?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

@xaby,
hier mal eine Möglichkeit, wie man eine CSV-Datei ohne Adminrechte händelt:

Code: Alles auswählen

;Stand mal irgendwo im Inet.... funzt au ermitteln zumind. die Anzahl..
Procedure ListIcon_GetColumnCount(gadget)
  Col.LV_COLUMN\mask = #LVCF_WIDTH
  Repeat
    a+1:x=SendMessage_(GadgetID(gadget),#LVM_GETCOLUMN,a,@Col)
  Until x = 0
  ProcedureReturn a
EndProcedure 


Procedure SpeicherListe(Liste.l)

  StandardFile$ = "C:\test.csv"
  Pattern$ = "CSV-Dateien (*.csv)|*.csv|Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
  File$ = SaveFileRequester("Bitte Datei zum Speichern auswählen", StandardFile$, Pattern$, Pattern)

  If File$
  If CreateFile(0,"C:\Test.csv")
    For i=-1 To CountGadgetItems(Liste) -1
      a$=GetGadgetItemText(Liste, i, 0)
      For j=1 To ListIcon_GetColumnCount(Liste)-1
        a$+";"+GetGadgetItemText(Liste, i, j) 
      Next
      WriteStringN(0,a$)
    Next
    CloseFile(0)
  EndIf
  Else
    MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
  EndIf

EndProcedure

Procedure LeseListe(liste.l)

NeueZeile.s=""
Kopfzeile=0
azeile=0
Createicon=0
ErsteSpalte=0

  StandardFile$ = "C:\test.csv"
  Pattern$ = "CSV-Dateien (*.csv)|*.csv|Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
  File$ = OpenFileRequester("Bitte Datei zum Laden auswählen", StandardFile$, Pattern$, Pattern)

  If File$

  If OpenFile(0, "C:\Test.csv")   
    While Eof(0) = 0           
    csvZeile.s= ReadString(0)
    csvanz=CountString(csvZeile, ";") + 1 
    
      If Kopfzeile=0
      For FeldZaehler = 1 To csvanz   
          NeueZeile=StringField(csvZeile, FeldZaehler, ";")
          If Createicon=0
          SetGadgetItemText(liste,-1,NeueZeile,0)
          Createicon=1
          Else
          AddGadgetColumn(liste, FeldZaehler, NeueZeile, 100)
          EndIf         
      Next
      NeueZeile=""     
      Kopfzeile=1
      Else 
      AddGadgetItem(liste,-1,"")    
      For FeldZaehler = 1 To csvanz
         NeueZeile=StringField(csvZeile, FeldZaehler, ";")
         SetGadgetItemText(liste,azeile,NeueZeile,FeldZaehler-1) 
      Next
      azeile=azeile+1
      EndIf
         ErsteSpalte=0
    Wend
    CloseFile(0)               
  Else
    MessageRequester("Information","Konnte Datei nicht öffnen!")
  EndIf
  Else
    MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
  EndIf
EndProcedure



If OpenWindow(0, 20, 500, 800, 500, "Daten", #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 If CreateGadgetList(WindowID(0))
   ListIconGadget(0, 0, 0, 790, 450, "Datum", 65, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect)
     ButtonGadget(1, 20, 460, 120, 30, "Einlesen")
     ButtonGadget(2, 200, 460, 120, 30, "Speichern")
     ButtonGadget(3, 400, 460, 120, 30, "Ende")
 EndIf
 EndIf
 

 
 Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
       Select EventGadget()
       Case 1
       LeseListe(0)
       MessageRequester("","Liste wurde eingelesen")
       Case 2
       SpeicherListe(0)
       MessageRequester("","Liste wurde gesichert")
       Case 3
       Event = #PB_Event_CloseWindow
       EndSelect
     
     EndSelect
 Until Event = #PB_Event_CloseWindow

 
Wenn du z.B. die Daten nicht direkt in das Listicon sondern in ein strukturiertes Array einliest, kannst du sortieren und sogar mehrere Listen im Speicher halten.
Hier mal die Befehle dazu aus der Hilfe:

Code: Alles auswählen

Structure adrstruc
LfdNr.l
Rufname.s
Nachname.s
SetGadgetItemText(#adresse,lrow,adr(FeldZaehler)\Nachname ,2)
lrow=lrow+1

Ein Array wird mit diesem Befehl sortiert:
SortArray(ArrayName(), Optionen [, Start, Ende])

bzw.

SortStructuredArray(ArrayName(), Optionen, OffsetOf(Struktur\Feld), Typ [, Start, Ende])

Ein Array kann auch naträglich vergrößert werden, um ein Datensatz anzufügen:

ReDim Name.<Typ>(<Ausdruck>, [<Ausdruck>], ...)


...und bevor man das Array neu in das Listicon einliest macht man:

ClearGadgetItemList(#Gadget)

um den Inhalt des Listicons erstmal zu löschen.
Man könnte auch ein LL nehmen. Nun ja, wer die Wahl hat.......
Ich hoffe, du kommst damit weiter, ansonsten einfach posten.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

dysti hat geschrieben:hier mal eine Möglichkeit, wie man eine CSV-Datei ohne Adminrechte händelt:
für einfache CSV ist das ausreichend, allerdings sollte der Vollständigkeit
halber noch erwähnt werden, dass es CSV gibt, die den Feldseparator (in
diesem Fall das Semikolon) in dem Feld selber enthalten kann. Dann wird
nämlich der Feldinhalt in sogenannte Textbegrenzer (normalerweise das
'Gänsefüßchen') eingeschlossen.

Code: Alles auswählen

Feld1;Feld2;Feld3;"Feld4;MitSemikolon";Feld5
Ist das der Fall, so hilft StringField() hier nicht mehr und sollte durch eine
komplexere Lösungsmöglichkeit ersetzt werden. Beispielsweise das hier:

http://www.purebasic.fr/english/viewtop ... 624#203624

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

@Kiffi,
habe dein Vorschlag mal mit eingebaut und ein bisschen erweitert:

Code: Alles auswählen

Procedure.s CSVField(CSV_line.s, Column.l, Trennzeichen.s)

    CurrentCol.l = 1 
    CurrentPos.l = 1
    InQuote.l = #False
    NextComma.l
    NextQuote.l
    CurrentCol.l = 1
    LastColFound.l = #False
    Trennzeichen=Trim(Trennzeichen)
    CSV_line = RemoveString(CSV_line, #CRLF$)
   
    If FindString(CSV_line, #DOUBLEQUOTE$, 1) = 0 ; no quotes found, take shortcut
        ProcedureReturn StringField(CSV_line, Column, Trennzeichen)
    EndIf

    CSVLen = Len(CSV_line)
    While (CurrentPos < CSVLen)

        If InQuote = #False
            NextComma = FindString(CSV_line, Trennzeichen, CurrentPos)   
            NextQuote = FindString(CSV_line, #DOUBLEQUOTE$, CurrentPos)
                       
            If NextComma = 0 : NextComma = CSVLen : EndIf
            If NextQuote = 0 : NextQuote = CSVLen : EndIf

            If (NextComma < NextQuote) ;text To Next comma is field

                If CurrentCol = Column ; this is the requested col
                    ProcedureReturn Mid(CSV_line, CurrentPos, NextComma - CurrentPos)
                Else
                    ;move on to next
                    CurrentCol + 1
                    CurrentPos = NextComma + 1
                EndIf
            ElseIf NextComma > NextQuote ; ignore the comma as it's in quotes
                InQuote = #True
                CurrentPos = NextQuote + 1
            Else ;zero's returned 
                If CurrentCol = Column
                    ProcedureReturn Mid(CSV_line, CurrentPos, CSVLen)   
                Else
                    ProcedureReturn ""
                EndIf
            EndIf
           
        Else  ;inside quote, jump to next
            InQuote = #False
            NextQuote = FindString(CSV_line, #DOUBLEQUOTE$, CurrentPos)
            If CurrentCol = Column ; this is the requested col
                ProcedureReturn Mid(CSV_line, CurrentPos, NextQuote - CurrentPos)
            Else
                ;move on to next
                CurrentCol + 1
                NextComma = FindString(CSV_line, Trennzeichen, NextQuote)
                If NextComma = 0
                    NextComma = CSVLen
                EndIf
                CurrentPos = NextComma + 1
            EndIf           
       
        EndIf
    Wend       

EndProcedure

;==================================================================

Procedure.l CSVCount(CSV_line.s, Trennzeichen.s)

    CurrentCol.l = 1 
    CurrentPos.l = 1
    InQuote.l = #False
    NextComma.l
    NextQuote.l
    CurrentCol.l = 1
    LastColFound.l = #False
    Trennzeichen=Trim(Trennzeichen)
    CSV_line = RemoveString(CSV_line, #CRLF$)
   
    If FindString(CSV_line, #DOUBLEQUOTE$, 1) = 0 ; no quotes found, take shortcut
        ProcedureReturn CountString(CSV_line, Trennzeichen) + 1
    EndIf

    CSVLen = Len(CSV_line)
    While (CurrentPos < CSVLen)

        If InQuote = #False
            NextComma = FindString(CSV_line, Trennzeichen, CurrentPos)   
            NextQuote = FindString(CSV_line, #DOUBLEQUOTE$, CurrentPos)
                       
            If NextComma = 0 : NextComma = CSVLen : EndIf
            If NextQuote = 0 : NextQuote = CSVLen : EndIf

            If (NextComma < NextQuote) ;text To Next comma is field

                CurrentCol + 1
                CurrentPos = NextComma + 1

            ElseIf NextComma > NextQuote ; ignore the comma as it's in quotes
                InQuote = #True
                CurrentPos = NextQuote + 1
            Else ;zero's returned 
                ProcedureReturn CurrentCol
            EndIf
           
        Else  ;inside quote, jump to next
            InQuote = #False
            NextQuote = FindString(CSV_line, #DOUBLEQUOTE$, CurrentPos)

            CurrentCol + 1
            NextComma = FindString(CSV_line, Trennzeichen, NextQuote)
            If NextComma = 0
                NextComma = CSVLen
            EndIf
            CurrentPos = NextComma + 1       
        EndIf
    Wend       

    ProcedureReturn CurrentCol -1

EndProcedure 

;Stand mal irgendwo im Inet.... funzt au ermitteln zumind. die Anzahl..
Procedure ListIcon_GetColumnCount(gadget)
  Col.LV_COLUMN\mask = #LVCF_WIDTH
  Repeat
    a+1:x=SendMessage_(GadgetID(gadget),#LVM_GETCOLUMN,a,@Col)
  Until x = 0
  ProcedureReturn a
EndProcedure 


Procedure SpeicherListe(Liste.l)
  Trennzeichen.s=Trim(GetGadgetText(7))
  If Trennzeichen<>""
  StandardFile$ = "C:\test.csv"
  Pattern$ = "CSV-Dateien (*.csv)|*.csv|Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
  File$ = SaveFileRequester("Bitte Datei zum Speichern auswählen", StandardFile$, Pattern$, Pattern)

  If File$
  If CreateFile(0,File$)
    For i=-1 To CountGadgetItems(Liste) -1
      If GetGadgetState(5)
      a$=GetGadgetItemText(Liste, i, 0)
      Else
      a$=#DOUBLEQUOTE$ +GetGadgetItemText(Liste, i, 0)+#DOUBLEQUOTE$ 
      EndIf
      For j=1 To ListIcon_GetColumnCount(Liste)-1
        If GetGadgetState(5)
        a$+Trennzeichen+GetGadgetItemText(Liste, i, j)
        Else 
        a$+Trennzeichen+ #DOUBLEQUOTE$ +GetGadgetItemText(Liste, i, j)+ #DOUBLEQUOTE$
        EndIf
      Next
      WriteStringN(0,a$)
    Next
    CloseFile(0)
  EndIf
  Else
    MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
  EndIf
  EndIf
EndProcedure

Procedure LeseListe(liste.l)

  NeueZeile.s=""
  Kopfzeile=0
  azeile=0
  Createicon=0
  ErsteSpalte=0
  Trennzeichen.s=Trim(GetGadgetText(7))
  If Trennzeichen<>""
  StandardFile$ = "C:\test.csv"
  Pattern$ = "CSV-Dateien (*.csv)|*.csv|Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*"
  Pattern = 0    ; wir verwenden den ersten von drei möglichen Pattern als Standard
  File$ = OpenFileRequester("Bitte Datei zum Laden auswählen", StandardFile$, Pattern$, Pattern)

  If File$
  ClearGadgetItemList(0)
  If OpenFile(0, File$)   
    While Eof(0) = 0           
    csvZeile.s= ReadString(0)
    csvanz=CountString(csvZeile, Trennzeichen) + 1 
    
      If Kopfzeile=0
      For FeldZaehler = 1 To csvanz   
          ;NeueZeile=StringField(csvZeile, FeldZaehler, ";")
          NeueZeile=CSVField(csvZeile,FeldZaehler,Trennzeichen)
          If Createicon=0
          SetGadgetItemText(liste,-1,NeueZeile,0)
          Createicon=1
          Else
          AddGadgetColumn(liste, FeldZaehler, NeueZeile, 100)
          EndIf         
      Next
      NeueZeile=""     
      Kopfzeile=1
      Else 
      AddGadgetItem(liste,-1,"")    
      For FeldZaehler = 1 To csvanz
         ;NeueZeile=StringField(csvZeile, FeldZaehler, ";")
         NeueZeile=CSVField(csvZeile,FeldZaehler,Trennzeichen)
         SetGadgetItemText(liste,azeile,NeueZeile,FeldZaehler-1) 
      Next
      azeile=azeile+1
      EndIf
         ErsteSpalte=0
    Wend
    CloseFile(0)               
  Else
    MessageRequester("Information","Konnte Datei nicht öffnen!")
  EndIf
  Else
    MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
  EndIf
  EndIf
EndProcedure



If OpenWindow(0, 20, 500, 800, 500, "Daten", #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 If CreateGadgetList(WindowID(0))
   ListIconGadget(0, 0, 0, 790, 450, "Datum", 65, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect)
     ButtonGadget(1, 20, 460, 120, 30, "Einlesen")
     ButtonGadget(2, 200, 460, 120, 30, "Speichern")
     ButtonGadget(3, 400, 460, 120, 30, "Ende")
     OptionGadget(4, 550, 450, 100, 20, "mit Begrenzer")
     OptionGadget(5, 550, 470, 100, 20, "ohne Begrenzer")
     TextGadget(6, 680, 450, 220, 20, "Trennzeichen")
     StringGadget(7, 700, 470, 20, 20, ";")
     SetGadgetState(4, 1)
 EndIf
 EndIf
 

 
 Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
       Select EventGadget()
       Case 1
       LeseListe(0)
       Case 2
       SpeicherListe(0)
       Case 3
       Event = #PB_Event_CloseWindow
       EndSelect
     
     EndSelect
 Until Event = #PB_Event_CloseWindow

 
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten