Text Datei in Access Feld einlesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Excalibur hat geschrieben:Hey danke, da werd ich wohl wieder ein paar Tage mit studieren beschäftigt sein. :roll:
Ein paar Tage, wieso willste danach aufhören zu programmieren? Ein
Programmierer lernt solange dazu, bis er aufhört zu programmieren :wink:
Ein Ende, ich kann jetzt alles, wirds nie geben :mrgreen:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

...da kann ich nur beipflichten und ich bin schon fast an die Sechzig Jahren.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Excalibur
Beiträge: 27
Registriert: 26.02.2007 23:56

Beitrag von Excalibur »

Na so wars ja nicht gemeint.

Mit ein paar Tagen meine ich die Zeit, bis ich die ganzen Links und Infos verarbeitet habe, die Ihr mir geschrieben habt.

Mir ist schon klar, daß man ein Leben lang lernt. Das ist es ja, das an der Sache so viel Spaß macht. Es kommt immer wieder etwas neues dazu.
PB v4.02 XP
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

@Excalibur, da du ja Anfänger bist, braucht man am Anfang einen Beispielcode, mit dem man dann autark lernen kann.
Ich habe dir auf die schnelle etwas aus den Links zusammen gezimmert.

Allerdings ein kleine Schwierigkeit gibt es noch, die ich so schnell nicht lösen konnte.
Die Variable "sMyText.s" darf nur Daten einer reinen Textdatei beinhalten.
Dann wird die komplette Textdatei auch in Access gespeichert.
Erstelle ich mit Word eine "*.htm"-Datei, handelt es sich um eine XML-Datei.
Diese kann leider nicht eingelesen werden.
Ich hoffe, das die erfahrenen Progger uns aus dem Dilemma helfen können.

Wichtig: Schau dir die "Insert Into"-Anweisung an, damit du weißt, wie man eine Datenbankabfrage in SQL erstellt.
Achte auf die " und ' -Zeichen, wie die gesetzt sind.
Gerade als Anfänger fällt man immer wieder darauf herein.

Wenn du mal eine SQL-Abfrage erstellen möchtest und es soll schnell gehen:
einfach ein Abfrage mit Access erstellen, Abfrage öffnen und auf "Ansicht" -> "SQL-Ansicht" klicken.
Jetzt zeigt dir Access die SQL-Abfrage im Klartext an.

Ich denke, damit biste schon mal ein Stück weiter.

Code: Alles auswählen

; Dieses Beispiel erfordert eine MS-Acessdatei "db1.mdb"
; Eine 
; Tabelle "txtdatei" 
; muß erstellt werden
; mit folgenden Spalten:
; Spalte 1 = lfdnr -> Zahl
; Spalte 2 = tdname -> Text
; Spalte 3 = textdatei -> Memo



#ODBC_ADD_DSN = 1
#ODBC_REMOVE_DSN = 3
Enumeration
#Window
#MenuBar_1
#MENU_9
#MENU_10
#MENU_11
#MENU_12
#MENU_13
#MENU_14
#Button_0
#Button_1
#Button_2
#Button_3
#ListIcon_0
#container_0
#editor_0
#String_0
#String_1
#String_2
EndEnumeration

Global tdname.s, textdatei.s, MyText.s, anzlicon.l,speichern.l,textsehen.l

  If InitDatabase() = 0
    MessageRequester("ODBC Error", "Can't initialize the database drivers", #PB_MessageRequester_Ok)

  EndIf


Procedure db_Connect(num.l, dbFile.s, dbUser.s, dbPass.s) ;dbFile = vollständiger Datenbankpfad incl. name der Accessdatei


     
  dbName.s = GetFilePart(dbFile.s)
  dbPath.s = GetPathPart(dbFile.s)

  strAtt.s = "Server=MyOwnServer" + ";"
  strAtt.s + "DSN="           + dbName.s + ";"
  strAtt.s + "Description="   + dbName.s + ";"
  strAtt.s + "DefaultDir=" + dbPath.s + ";"
  strAtt.s + "DBQ="           + dbName.s + ";"
  strAtt.s + "UID="           + dbUser.s + ";"
  strAtt.s + "PWD="           + dbPass.s + ";"
   
  MyMemory = AllocateMemory(Len(strAtt))
   
  CopyMemory(@strAtt, MyMemory, Len(strAtt))
   
  For L = 1 To Len(strAtt)
    If PeekB(MyMemory + l - 1) = Asc(";")
      PokeB(MyMemory  + l - 1, 0)
    EndIf
  Next L
   
  Result = SQLConfigDataSource_(num, #ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)", MyMemory)
   
  FreeMemory(MyMemory)
     
  If Result
   
     
    If OpenDatabase(num,  dbName.s,  dbUser.s,  dbPass.s) <> 0
     
       
      ProcedureReturn 1
    Else
     
       
      MessageRequester("ODBC Error", "Can't open the database connection", #PB_MessageRequester_Ok)
      ProcedureReturn 0
    EndIf
  Else
    MessageRequester("ODBC Error", "Can't configure sql data source", #PB_MessageRequester_Ok)
  ProcedureReturn -1
  EndIf
EndProcedure


Procedure db_Disconnect(num.l,dbName.s) ; dbName = Name des erstellten DSN


  strAtt.s + "DSN="           + dbName.s + ";"
   
  MyMemory = AllocateMemory(Len(strAtt))
   
  CopyMemory(@strAtt, MyMemory, Len(strAtt))
   
  For L = 1 To Len(strAtt)
    If PeekB(MyMemory + l - 1) = Asc(";")
      PokeB(MyMemory  + l - 1, 0)
    EndIf
  Next L
   
  Result = SQLConfigDataSource_(num, #ODBC_REMOVE_DSN, "Microsoft Access Driver (*.mdb)", MyMemory)
   
  FreeMemory(MyMemory)
     


EndProcedure
Procedure acessdateneinlesen()
DatabaseQuery(0,"select * from txtdatei") 
        While NextDatabaseRow(0)
          lfdnr.s=Str(GetDatabaseLong(0,0))
          tdname.s=GetDatabaseString(0,1)
          textdatei.s=GetDatabaseString(0,2)
          
          AddGadgetItem(#ListIcon_0,-1,lfdnr.s+Chr(10)+tdname+Chr(10)+textdatei)
        Wend
        SetGadgetItemState(#ListIcon_0,0,#PB_ListIcon_Selected)
EndProcedure

Procedure textdateieinlesen()

file$ = OpenFileRequester("Datei auswählen...","","Text (.txt)|*.txt|html files (*.*)|*.htm|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$) 
      length = Lof(0)                            ; Länge der geöffneten Datei ermitteln
      *TextPointer = AllocateMemory(length)         ; Reservieren des benötigten Speichers
      If *TextPointer
       ReadData(0, *TextPointer, length)   ; Einlesen aller Daten in den Speicherblock
       MyText.s = PeekS(*TextPointer)
       FreeMemory(*TextPointer)
      EndIf
      CloseFile(0)
    EndIf
  EndIf
  tdname.s=StringField(file$,CountString(file$,"\") + 1,"\")
  anzlicon=CountGadgetItems(#ListIcon_0)+1
  ;EintraginsLIcon.s=Str(anzlicon + 1) + Chr(10) + tdname.s + Chr(10) + MyText.s
  ;AddGadgetItem(#ListIcon_0,-1,EintraginsLIcon.s)
  HideGadget(#ListIcon_0,1)
  ContainerGadget(#container_0,0,50,800,600)
  EditorGadget(#editor_0,35, 400, 600, 100)
  AddGadgetItem(#editor_0,-1,MyText.s)
  
  StringGadget(#String_0,35, 95, 20, 20,Str(anzlicon))
  StringGadget(#String_1,35, 150, 100, 20,tdname.s)
  StringGadget(#String_2,35, 195, 600, 100,"")
  SetGadgetText(#String_2,MyText.s)
  
  
  
EndProcedure

Procedure text_in_acess_speichern()

sanzlicon.s=GetGadgetText(#String_0)
stdname.s=GetGadgetText(#String_1)
sMyText.s=GetGadgetText(#editor_0) ;#String_2)
;Achtung, ist die Textdatei keine reine Textdatei sondern eine "MS-Word.htm" - Datei, funktioniert das Einlesen nicht.
sql1.s="insert into txtdatei(lfdnr, tdname, textdatei) VALUES(" + sanzlicon + ",'" + stdname.s + "','" + sMyText.s +"')" 
;MessageRequester("",sql1.s)
If DatabaseQuery(0, sql1) 
MessageRequester("","Datensatz erfolgreich abgespeichert")
EndIf


EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window, 216, 50, 800, 600, "Kunden",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
   
    
      If CreateGadgetList(WindowID(#Window))
        ButtonGadget(#Button_0, 35, 20, 120, 25, "Einlesen")
        ButtonGadget(#Button_1, 200, 20, 120, 25, "Hinzufügen/Speichern")
        ButtonGadget(#Button_2, 365, 20, 120, 25, "Zurück")
        ButtonGadget(#Button_3, 530, 20, 120, 25, "Ende")
       
        ;-
        ListIconGadget(#ListIcon_0, 35, 95, 600, 400, "LfdNr", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
        AddGadgetColumn(#ListIcon_0, 1, "Textdateiname", 100)
        AddGadgetColumn(#ListIcon_0, 2, "Inhalt", 400)
        
        
        
        
        db_Connect(0, "db1.mdb", "", "")
        acessdateneinlesen()
       
      EndIf
    EndIf
    
    Repeat
    EventID = WaitWindowEvent() 
    EventType=EventType()
    Select EventID
    
    Case #PB_Event_Gadget
      
      EventID=EventGadget()
      If EventID=#Button_0 ;einlesen
      textdateieinlesen()
      speichern=1
      ElseIf EventID=#Button_1 ; speichern
      If speichern
      text_in_acess_speichern()
      Else 
      MessageRequester("","...bitte erst eine Textdatei einlesen!")
      EndIf
      ElseIf EventID=#Button_2  ; zurück
      If speichern
      If textsehen
      HideGadget(#container_0,0)
      HideGadget(#ListIcon_0,1)
      textsehen=0
      Else
      HideGadget(#container_0,1)
      HideGadget(#ListIcon_0,0)
      ClearGadgetItemList(#ListIcon_0)
      acessdateneinlesen()
      textsehen=1
      EndIf
      EndIf
      ElseIf EventID=#Button_3  ; ende
        CloseWindow(#window)
        End
      
      EndIf
      
    EndSelect
    
    Until EventID = #PB_Event_CloseWindow
    
EndProcedure

Open_Window_1()


PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

erfahrene Programmer (:)) speichern keine WordDatei als HTML ab ..

Dafür nimmt man Programme, die sich dafür eigenen.

Word eignet sich dafür definitiv nicht. Zuviel Müll mit drin.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Terra
Beiträge: 11
Registriert: 11.12.2005 12:41

Beitrag von Terra »

Hallo Excalibur,
in einem Textfeld kannst du bei Access nur 255 Zeichen haben.
Besser ist das Memofeld mit bis zu 65.535 Zeichen oder aber vielleicht nutzt du die Möglichkeit einen Hyperlink zu deiner Textdatei zu legen.
Du kannst aber auch mit OLE-Objekten Arbeiten, ich denke dann musst du dich aber mit VBA befassen.

Viel Erfolg
Sorry wenn ich Schreibfehler mache ich bin Legastheniker

PB 3.94 u. 4.3
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

...nur zur Info. Ich hatte ein Memofeld genommen.
Die Textdatei die ich genommen hatte war größer als die Word-XML-Datei.
Es müssen die Steuerzeichen von Word sein, die wohl den ODBC-Treiber durcheinander brigen. Kann aber auch total falsch sein.
Ich bin kein Experte.
Na ja, wenn die die Worddatei direkt innerhalb der MS-Familie kopiere, kann ich sie speichern. Von daher komme ich auf den ODBC.
Ich bleib dabei, das ist ein Fall für unsere Profis hier im Forum.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Excalibur
Beiträge: 27
Registriert: 26.02.2007 23:56

Beitrag von Excalibur »

Hallo,

vielen Dank für die vielen Tipps.

Das mit dem MEMO Feld ist mir bekannt.

So wie es aussieht, wird es langsam doch kompliziert, obwohl es ein alltägliches Problem der Datenverarbeitung ist - lange Texte in eine Datenbank importieren und selektieren.

Wenn Euch noch ein "Geistesblitz" trifft, würde ich mich sehr freuen.

Danke auch nochmals an dysti, welcher sich explizit meines Problems angenommen hat, daß oftmals die Kommentare fehlen. :allright:
PB v4.02 XP
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

hey @Excalibur,

alles was oberhalb dieser Zeile steht muß man nicht verstehen. Hier wird nur der OBDC-Trieber initialisiert und eingetragen.

Code: Alles auswählen

Procedure acessdateneinlesen() 
Aber alles was unterhalb der oberen Zeile steht, solltest du verstehen bzw. mit der PB-Hilfe dir verinnerlichen.

Ich hatte Hoffnung in TS-SOFT und Kaeru Gaman usw. gesetzt.
Nun ja, außer bobobo hilfreicher Kommentar scheinen auch die Gurus keine Lösung im Ärmel zu haben.
Ich denke du wirst schon deine Gründe haben, warum du eine Worddatei abspeichern willst. Mir ging es nicht nach dem Sinn oder Unsinn, sondern ob man überhaupt Daten mit Steuerzeichen abspeichern kann.
Evtl. könnte man etwas mit Unicode etwas erreichen. Ist jetzt aber erst so eine Idee.
Nun ja, schaun wir mal.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Ich hatte Hoffnung in TS-SOFT und Kaeru Gaman usw. gesetzt.
Ich hab mit Access nichts am Hut, mache sowieso recht wenig mit
Datenbanken, wenn dann SQLite oder Cheetah (DBase).

Ich denke mal das Kaeru nichts oder noch weniger mit DBs macht, als
Gamer-Progger :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten