Seite 2 von 3

Verfasst: 20.03.2007 21:54
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

Verfasst: 20.03.2007 22:59
von dysti
...da kann ich nur beipflichten und ich bin schon fast an die Sechzig Jahren.

Verfasst: 21.03.2007 00:23
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.

Verfasst: 21.03.2007 12:40
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()



Verfasst: 21.03.2007 14:48
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.

Verfasst: 21.03.2007 21:43
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

Verfasst: 21.03.2007 21:59
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.

Verfasst: 22.03.2007 22:09
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:

Verfasst: 23.03.2007 22:21
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.

Verfasst: 23.03.2007 22:52
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: