schau mal hier http://answers.microsoft.com/de-de/windows/…09-58adafd6bdeb
daraus sollte sich doch was ableiten lassen
schau mal hier http://answers.microsoft.com/de-de/windows/…09-58adafd6bdeb
daraus sollte sich doch was ableiten lassen
es gibt drei Prozentuale Größen, einfach hier für jeden Wert eine entsprechende Variable setzen.
Den derzeitigen WERT kann man in der Registry auslesen (HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics)
Wobei in der Hilfe bei GUICtrlSetFont unter $DRAFT_QUALITY (1) noch folgendes steht.
$DRAFT_QUALITY (1) = Appearance of the font is less important than when$PROOF_QUALITY is used.
For GDI raster fonts, scaling is enabled, which meansthat more font sizes are available, but the quality may be lower. Bold, italic, underline, and strikeout fonts are synthesized if necessary.
Gruß gmmg
Weisgarnix:
ich denke ein Label unterstrichen und Fett zu markieren geht mit "GUICtrlSetFont".
Schau mal in der Hilfe.
gruß gmmg
Ob mdb oder accdb ist egal, beide benötigen kein installiertes Access.
Ein Mehrbenutzer Zugriff sollte generell kein Problem sein. Über google findest du da einiges zum Thema.
So ganz hab ich aber nicht verstanden, was du genau machen willst.
In einer Master DB, werden alle Daten gepflegt. Diese DB willst du dann jeweils an die User verteilen. Wird diese Master DB zentral gepflegt oder soll es auch Schreibzugriffe von der kopie auf die master geben?
Wenn du eine Master hast und kopierst du jeweils auf einen Client, hast du ja eventuell immer andere Datenstände, da ja der Transfer in eine jeweils andere DB immer etwas zeitversetzt ist.
Wie aktuell sollen denn hier deine Daten sein?
Wenn du nur alle Paar Tage eine änderung machst, ist das sicher ausreichend.
Wenn da am laufenden Band neue Daten geschrieben werden, müsstest du live auf die Master zurückgreifen, bzw. kannst auch in dem Autoit Script prüfen ob es einen neuen Versionsstand gibt.
Ich habe hier eine Master DB, wo wir dann bei einer Änderung, diese in eine Slave DB schreiben und alle Daten ersetzen.
Du kannst auch bei einer Änderung eine Versionsnummer setzen und diese vom Autoit Script prüfen lassen. Wenn die sich erhöht hat, dann dem User eine Info geben, er möchte die DB Aktualisierung oder sein Script neu starten.
Gruß gmmg
Hallo wuff100
in meinen Beispielen ist doch alles erklärt, da brauchst du die Access.au3 überhaupt nicht.
Sende mir doch mal deinen Quelltext oder Poste den hier. Eventuell ist es nur ein Formatierungsfehler.
Gruß gmmg
Hallo wuff100,
wir benutzen auch Access 2010. Den Quelltext den ich oben angegeben habe funktioniert jeweils mit mdb und accdb Datenbanken.
Gruß gmmg
Das sollte die richtige sein, die ich auch nutze.
Bei den Beispielen nutze ich die UDF nicht. Habe das jeweils als Funktion in das Script eingebunden, weil das so funktioniert
In dieser sehe ich aber auch die Variable $ReadOnly in der _AccessOpen bzw. _AccessOpenDB Funktion.
Der Export in die andere DB erfolgt über eine Tabellenerstellungsabfrage, welche per Macro dann ausgeführt wird. Was hast du denn für eine Access version, da dies etwas unterschiedlich ist.
SELECT [01_MA].MAName, [01_MA].MAVorname, [01_MA].PC, [01_MA].SANI INTO 01_MA IN 'Z:\Share\DB_Mitarbeiter_CC\mitarbeiter_SANI.mdb' (die mitarbeiter_SANI.mdb sollte leer vorhanden sein.)
FROM 01_MA
WHERE [01_MA].SANI<>"";
Hier auch nochmal ein Beispiel, wie man in eine Access DB schreiben kann. Einfach über den Query Befehl.
$dbname = "d:\test.accdb"
_access_write($dbname)
Func _access_write($dbname)
$adoCon = ObjCreate("ADODB.Connection")
$adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $dbname & ";")
$adoRs = ObjCreate("ADODB.Recordset")
;$adocon = ObjCreate("ADODB.Connection")
;$adocon.open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $dbname)
;$adors = ObjCreate("ADODB.Recordset")
Local $sQuery = "INSERT INTO TB1 (`Name`,`Vorname`) VALUES ('Meier','Wolfgang')"
;Local $sQuery = 'UPDATE TB1 SET [01_MA].SID = "' & $sid & '" WHERE [01_MA].PC = "' & $ssamaccountname & '"'
$adoCon.Execute($sQuery)
$adoCon.Close
EndFunc
Alles anzeigen
Gruß gmmg
Ich hab es nicht im Einsatz, aber einer der Accounts ist ja als Default hinterlegt, eventuell kann man hier etwas beeinflussen.
https://www.digitalunite.com/guides/email/h…ndows-live-mail
Per Registry kann man eventuell auch etwas setzen.
gruß gmmg
Anbei mal ein Beispiel
mdb
#include "Access.au3"
;--------- Modify the variables below as desired or applicable -------
$dbname = "\\Server\mitarbeiter.mdb"
$tblname = "TBname1"
$fldname01 = "Feld1"
$format = "Text(50)"
$fldname02 = "PCName"
$format = "Text(50)"
$query = "SELECT * FROM " & $tblname & " WHERE PCName = " & "'" & @ComputerName & "'"
$strData = _ReadOneFld($query, $dbname, $fldname01)
MsgBox(0,"", $strData)
;$adoCon.Open("Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & $dbname & ";Uid=;Pwd=;")
;------access DB auslesen -------------
Func _ReadOneFld($_sql, $_dbname, $_field)
Dim $_output
$adoCon = ObjCreate("ADODB.Connection")
;$adoCon.Open("Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=" & $_dbname & ";Uid=;Pwd=;")
;$adoCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $_dbname)
;$AdoCon.Open ("Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & $_dbname);
$adoCon.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $_dbname)
;$adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $dbname & ";")
$adoRs = ObjCreate("ADODB.Recordset")
$adoRs.CursorType = 1
$adoRs.LockType = 1
$adoRs.Open($_sql, $adoCon)
With $adoRs
If .RecordCount Then
While Not .EOF
$_output = $_output & .Fields($_field).Value & @CRLF
.MoveNext
WEnd
EndIf
EndWith
$adoCon.Close
Return $_output
EndFunc ;==>_ReadOneFld
Alles anzeigen
hab ich grad so aus dem jeweiligen script kopiert, ist daher nicht bereinigt
accdb
;--------- Modify the variables below as desired or applicable -------
$dbname = @ScriptDir & "\Helpdesk.accdb"
$tblname1 = "Systeme"
$fldname1_1 = "ID"
$fldname1_2 = "System"
$tblname2 = "Systemfehler"
$fldname2_1 = "ID"
$fldname2_2 = "System"
$fldname2_3 = "Fehler"
$fldname2_4 = "Email"
$fldname2_5 = "Feld1"
$fldname2_6 = "Feld2"
$fldname2_7 = "Feld3"
$fldname2_8 = "Feld4"
$fldname2_9 = "EmailBCC"
$query = "SELECT * FROM " & $tblname2 & " WHERE System = " & "'" & $gda & "'" & " and Fehler ='|" & $text_selected & "'"
If $gda <> "" Then
;$Feld1 = _ReadOneFld_WIN7($query, $dbname, $fldname2_1)
;$Feld2 = _ReadOneFld_WIN7($query, $dbname, $fldname2_2)
$Feld3 = _ReadOneFld_WIN7($query, $dbname, $fldname2_3)
$Feld4 = _ReadOneFld_WIN7($query, $dbname, $fldname2_4)
$Feld5 = _ReadOneFld_WIN7($query, $dbname, $fldname2_5); Feld1
$Feld6 = _ReadOneFld_WIN7($query, $dbname, $fldname2_6)
$Feld7 = _ReadOneFld_WIN7($query, $dbname, $fldname2_7)
$Feld8 = _ReadOneFld_WIN7($query, $dbname, $fldname2_8)
Func _ReadOneFld($_sql, $_dbname, $_field)
Dim $_output
$adoCon = ObjCreate("ADODB.Connection")
$adoCon.Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & $_dbname)
;$adoCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $_dbname)
$adoRs = ObjCreate("ADODB.Recordset")
$adoRs.CursorType = 1
$adoRs.LockType = 3
$adoRs.Open($_sql, $adoCon)
With $adoRs
If .RecordCount Then
While Not .EOF
$_output = $_output & .Fields($_field).Value & @CRLF
.MoveNext
WEnd
EndIf
EndWith
$adoCon.Close
Return $_output
EndFunc ;==>_ReadOneFld
Alles anzeigen
gruß gmmg
Hallo wuff100
ich benutze die Access.udf auch schon einige Jahre im Livebetrieb.
Hast du mal geschaut in welchem LockTyp die geöffnet werden? Siehe Beispiel ...
https://msdn.microsoft.com/en-us/library/…(v=bts.10).aspx
Ich benutze jeweils immer eine Haupt DB in der alle Daten gepflegt werden und erstelle daraus dann per Macro die DB's für die User.
;------access DB auslesen -------------
Func _ReadOneFld($_sql, $_dbname, $_field)
Dim $_output
$adoCon = ObjCreate("ADODB.Connection")
$adoCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $_dbname)
$adoRs = ObjCreate("ADODB.Recordset")
$adoRs.CursorType = 1
$adoRs.LockType = 3
$adoRs.Open($_sql, $adoCon)
With $adoRs
If .RecordCount Then
While Not .EOF
$_output = $_output & .Fields($_field).Value & @CRLF
.MoveNext
WEnd
EndIf
EndWith
$adoCon.Close
Return $_output
EndFunc ;==>_ReadOneFld
Alles anzeigen
Gruß gmmg
das Autoit Script läuft noch nicht produktiv, aber im testmodus, hier wird ein Exchange Postfach wird per POP3 abgeholt.
im prinzip wird ja die ganze Mail gelesen. im Abschnitt .... $mail = _Pop3Retr($aMsgNum[1]) , hier steht ja die Mail dann in der Variable $mail, wird aber nach dem Filenamen und Attachment gefilter.
Danach erfolgt das Extrahieren.
Ich habe ja die pop3_Mail.au3 benutzt und entsprechend abgeändert, da diese noch eine GUI hatte.
Kannst du ja mal testen, da siehst du vielleicht besser wie es funktioniert. SSL geht aber noch nicht, da müsste man noch OpenSLL einbinden.
Gruß gmmg
Hallo Peter,
wir bekommen per Mail von einem Kunden Emails mit jeweils einem Anhang (gezippte Excel Dateien). Diese werden dann per Script Extrahiert und danach automatisch weiterverarbeitet
Für die entsprechende Emailadresse wird ist ein seperates Konto benutzt, was dann per POP abgefragt wird.
Gruß gmmg
Der Post ist zwar schon älter, aber vielleicht braucht das nochmal jemand ein Beispiel zum erzeugen dynamischer RadioButtons und der Abfrage, welcher Button Checked ist.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <Array.au3>
Local $aArray[8]
$aArray[0] = "8"
$aArray[1] = "Test1"
$aArray[2] = "Test2"
$aArray[3] = "Test3"
$aArray[4] = "Test4"
$aArray[5] = "Test5"
$aArray[6] = "Test6"
$aArray[7] = "Test7"
Local $aRadio_array[0]
$Member = GUICreate("RadioButton", 310, 30*$aArray[0] +60)
$top = 30
For $i = 1 To $aArray[0]-1
$aRadio = GUICtrlCreateRadio($aArray[$i], 40, $top, 150, 20)
;MsgBox(0,"", $aRadio)
_ArrayAdd($aRadio_array,$aRadio)
$top += 30
Next
$Button = GUICtrlCreateButton("Test", 40, $top+10, 108, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button
For $i = 0 to UBound($aRadio_array)-1
$Checked = GUICtrlRead($aRadio_array[$i])
$Checked_wert = GUICtrlRead($aRadio_array[$i],1)
IF $Checked = 1 Then
MsgBox(0,"","RadioButton " & $Checked_wert)
EndIf
Next
EndSwitch
WEnd
Alles anzeigen
Gruß gmmg
hallo zusammen,
habe das Decodieren des Files jetzt mal über die ein externes Tool realisiert. Geht gefühlt schneller, bei 7 MB Anhang dauert das Extrahieren aus der mail aber trotzdem 4-5 Minuten.
http://www.proxoft.com/base64.aspx
Dafür habe ich die folgende Funktion geändert...
Func _attachment_export($filename,$string)
If FileExists(@ScriptDir & "\temp.txt") Then FileDelete(@ScriptDir & "\temp.txt")
FileWrite(@ScriptDir & "\temp.txt", $string)
_RunDos('"' & @ScriptDir & "\Base64_\Base64.exe /d " & @ScriptDir & "\temp.txt " & @ScriptDir & "\" & $filename & '"')
EndFunc ;==>_attachment_export
Gruß gmmg
Hallo Zusammen,
habe mir mal die Beiträge von euch angesehen und auch die POPShow von Oscar angetestet. Die sieht ganz gut aus, aber ist nicht das, was ich brauche
Habe mein Script nocht etwas angepasst und die GUI entfernt, da diese nicht benötigt wird.
Die Emails werden vom entsprechenden POP Konto abgeholt, die Email Anhänge Extrahiert und danach wird die eMail gelöscht.
Derzeit wird ja der Encodierte Anhang in einer TXT zwischengespeichert. Eventuell könnte man das auch direkt aus der Variable Decodieren.
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <_pop3.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <Base64.au3>
#include <String.au3>
Global $MyPopServer = "server"
Global $MyLogin = "user"
Global $MyPasswd = "password"
$sLVhdr = "ID"
$aLVhdr = StringSplit($sLVhdr, "|")
checkmail()
Func checkmail()
_pop3Connect($MyPopServer, $MyLogin, $MyPasswd)
If @error Then
MsgBox(262144 + 16, "", "Unable to connect to mail server @error=" & @error)
Exit
EndIf
$aLoopNum = _Pop3Stat()
MsgBox(0,"Anzahl Nachrichten", $aLoopNum[1])
$iCurrent = 0
While $iCurrent < $aLoopNum[1]
$iCurrent += 1
$sMsgHdr = _Pop3Top($iCurrent, 1)
$stat = _Pop3List($iCurrent)
;_ArrayDisplay($stat)
$sItem = $stat[1]
For $i = 1 To $aLVhdr[0]
$aItem = StringRegExp($sMsgHdr, "(" & $aLVhdr[$i] & " :) (.*[\r\n])", 3)
If @error = 0 Then
If UBound($aItem) = 2 Then
$sItem &= StringStripWS($aItem[1], 3) & "|"
EndIf
EndIf
retrieve_Mail($sItem)
Next
WEnd
_Pop3Quit()
_pop3Disconnect()
EndFunc ;==>checkmail
Func retrieve_Mail($sItem)
$aMsgNum = StringSplit($sItem, " ")
If $aMsgNum[0] = 1 Then Return
$mail = _Pop3Retr($aMsgNum[1])
$aRegEx_filename = StringRegExp($mail, "(?s)filename=""(.+?)"";",1)
$aRegEx_file = StringRegExp($mail, "(?s)Content-Transfer-Encoding: base64(.+?)\R\R--", 3)
If @error = 1 Then
_Pop3Dele($aMsgNum[1])
Else
_attachment_export($aRegEx_filename[0],$aRegEx_file[0])
_Pop3Dele($aMsgNum[1])
EndIf
EndFunc ;==>retrieve_Mail
Func _attachment_export($filename,$string)
If FileExists(@ScriptDir & "\temp.txt") Then FileDelete(@ScriptDir & "\temp.txt")
FileWrite(@ScriptDir & "\temp.txt", $string)
$RetVal = Base64DecFile(@ScriptDir & "\temp.txt", @ScriptDir & "\" & $filename)
EndFunc ;==>_attachment_export
Alles anzeigen
eventuell kann man hier auch noch den Quellcode etwas verschlanken....
Um die Mail direkt aus der Variable zu bearbeiten, müsste die Funktion Base64DecFile() aus der Base64.au3 angepasst werden.
Gruß gmmg
super, danke für deine Rückmeldung
hier nochmal das ganze Projekt im derzeitigen Stand ... habe mal den Namen vom Post geändert, dass man genauer weiß um was es geht.
Zielstellung ist es, Email Anhänge über das Script pop3_Mail.au3 zu Extrahieren und Abzuspeichern, das funktioniert schon ganz gut, aber ist bei Großen Anhängen zu langsam.
Da muss ich nochmal schauen ob man das optimieren kann.
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <array.au3>
#include <_pop3.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <ListViewConstants.au3>
#include <Base64.au3>
#include <String.au3>
;#NoTrayIcon
;Opt("TrayMenuMode",1) ; Default tray menu items (Script Paused/Exit) will not be shown.
;$settingsitem = TrayCreateMenu("Settings")
;$displayitem = TrayCreateItem("Display", $settingsitem)
;$printeritem = TrayCreateItem("Printer", $settingsitem)
;TrayCreateItem("")
;$aboutitem = TrayCreateItem("About")
;TrayCreateItem("")
;$exititem = TrayCreateItem("Exit")
;TraySetState()
;TraySetClick(16)
Global $MyPopServer = "server"
Global $MyLogin = "User"
Global $MyPasswd = "pwd"
$Form1_1 = GUICreate("Inem Mail", 500, 480)
$sLVhdr = "ID|Date|From|Subject"
$aLVhdr = StringSplit($sLVhdr, "|")
$ListView1 = GUICtrlCreateListView($sLVhdr, 100, 34, 390, 169)
GUICtrlSendMsg(-1, 0x101E, 0, 48)
GUICtrlSendMsg(-1, 0x101E, 1, 100)
GUICtrlSendMsg(-1, 0x101E, 2, 100)
GUICtrlSendMsg(-1, 0x101E, 3, 140)
$Edit1 = GUICtrlCreateEdit("", 10, 220, 480, 249)
$TreeView1 = GUICtrlCreateTreeView(5, 34, 86, 169)
$TreeView1_0 = GUICtrlCreateTreeViewItem("INBOX", $TreeView1)
$TreeView1_1 = GUICtrlCreateTreeViewItem("Unread", $TreeView1_0)
$TreeView1_2 = GUICtrlCreateTreeViewItem("Read", $TreeView1_0)
$TreeView1_3 = GUICtrlCreateTreeViewItem("All Mail", $TreeView1_0)
$TreeView1_4 = GUICtrlCreateTreeViewItem("Send Mail", $TreeView1)
$TreeView1_5 = GUICtrlCreateTreeViewItem("Drafts", $TreeView1)
$TreeView1_6 = GUICtrlCreateTreeViewItem("Spam", $TreeView1)
$Button1 = GUICtrlCreateButton("Compose", 4, 4, 65, 21, 0)
$Button2 = GUICtrlCreateButton("Send / Recieve", 72, 4, 85, 21, 0)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
While 1
$nMsg = GUIGetMsg()
Select
Case $nMsg = $GUI_EVENT_CLOSE
Exit
Case $nMsg = $Button2
checkmail()
EndSelect
WEnd
Func Click()
_pop3Connect($MyPopServer, $MyLogin, $MyPasswd)
$iRow = _GUICtrlListView_GetNextItem($ListView1) ; current selected
If $iRow = -1 Then Return
$aMsgNum = StringSplit(_GUICtrlListView_GetItemText($ListView1, $iRow), " ")
If $aMsgNum[0] = 1 Then Return
GUICtrlSetData($Edit1, _Pop3Retr($aMsgNum[1]))
$mail = _Pop3Retr($aMsgNum[1])
_pop3Disconnect()
$aRegEx = StringRegExp($mail, "(?s)filename=""(.+?)""; size=\d+;.+?Content-Transfer-Encoding:(.+?)\R\R--", 3)
$aRegEx = StringRegExp($mail, "(?s)filename=""(.+?)""; size=\d+;.+?Content-Transfer-Encoding: base64(.+?)\R\R--", 3)
;_attachment_export($aRegEx[0],$aRegEx[1])
EndFunc ;==>Click
Func _attachment_export($filename,$string)
If FileExists(@ScriptDir & "\temp.txt") Then FileDelete(@ScriptDir & "\temp.txt")
FileWrite(@ScriptDir & "\temp.txt", $string)
;$RetVal = Base64DecFile("D:\Data\scripte\POP3\_pop3\Pop3_OK\mail.txt", "D:\Data\scripte\POP3\_pop3\Pop3_OK\" & $filename)
$RetVal = Base64DecFile(@ScriptDir & "\temp.txt", @ScriptDir & "\" & $filename)
EndFunc
Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
Local $tagNMHDR, $iEvent
If $wParam = $ListView1 Then
$tagNMHDR = DllStructCreate("int;int;int", $lParam)
$iEvent = DllStructGetData($tagNMHDR, 3)
;If $iEvent = $NM_DBLCLK Then Click()
If $iEvent = $NM_CLICK Then Click()
EndIf
EndFunc ;==>WM_Notify_Events
Func checkmail()
_pop3Connect($MyPopServer, $MyLogin, $MyPasswd)
If @error Then
MsgBox(262144 + 16, "", "Unable to connect to mail server @error=" & @error)
Exit
EndIf
$aLoopNum = _Pop3Stat()
$iCurrent = 0
While $iCurrent < $aLoopNum[1]
$iCurrent += 1
$sMsgHdr = _Pop3Top($iCurrent, 1)
$stat = _Pop3List($iCurrent)
$sItem = $stat[1] & "|"
;ConsoleWrite($stat[1] & @CRLF)
For $i = 2 To $aLVhdr[0]
$aItem = StringRegExp($sMsgHdr, "(" & $aLVhdr[$i] & " :) (.*[\r\n])", 3)
If @error = 0 Then
If UBound($aItem) = 2 Then
$sItem &= StringStripWS($aItem[1], 3) & "|"
EndIf
EndIf
;StringTrimRight($sItem, 1)
Next
GUICtrlCreateListViewItem($sItem, $ListView1)
WEnd
_pop3Disconnect()
EndFunc ;==>checkmail
Alles anzeigen
Gruß gmmg