einen Browser gescriptet.
Nun - sagen wir mal lieber: einen Embedded IE ![]()
einen Browser gescriptet.
Nun - sagen wir mal lieber: einen Embedded IE ![]()
ich bekomme immer nur einen eintrag angezeigt
Dann machst du in der Auswertung etwas falsch.
Die Abfrage gibt dir ein Recordset zurück, das du wie folgt weiter bearbeiten kannst.
; Ausführung eines SQL-Statements mit Methode Execute ==> liefert Recordset zurück:
$oRecSet = _oSQLDB_Execute($oConn, $sql_str) ;<== sollte der MySQL-Query-Funktion entsprechen
; Recordset in Array wandeln, es wird immer ein 2D-Array zurückgegeben:
$array = $oRecSet.GetRows
If Not IsArray($array) Then
MsgBox(0, 'Array', 'kein Ergebnis')
; close connection
EndIf
_ArrayDisplay($array)
[/autoit]Kannst ja auch mal hier schauen, vllt. hilft dir das weiter.
Nun, FALS in 0 der Zähler steht
Es war ja auch keine allgemeine Falldiskussion, sondern eine auf einem Skriptbsp. basierende Frage. Somit stand außer Frage, dass der Zähler in [0] ist. Aber genug der Scharmützel - soll der Threadstarter erstmal seinen Senf dazugeben oder zufrieden sein. ![]()
eingebe bekomme ich nur die spaltennamen angezeigt
Ja, die Bedingung gehört natürlich dazu. Ohne Where-Klausel wird natürlich nichts selektiert. Du brauchst also eine Bedingung, die für alle Datensätze zutrifft. Da ID nicht NULL sein kann verwende einfach dieses:
Die Löschfunktion ist Korrekt.
Vergleich mal meine Version mit deiner. Fällt dir was auf? Ist zwar nicht elementar, aber sinnlos: Du vergleichst auch das Element [0] - den Zähler. Außerdem ist es sinnvoll nach Erfolg die Schleife zu verlassen. Ausnahme: mehrfaches Vorkommen desselben Wertes ist möglich.
Btw: Wenn du rückwärts iterierst, ist es völlig wurscht ob du als Startwert UBound($array)-1 oder $array[0] verwendest. Der jeweils aktive Index kann nicht wieder vorkommen, da heruntergezählt wird.
ZitatEigentlich meine ich, dass du ein String oder ein Array übergibst und du z.B. die 7 größte oder 4 kleinste Zahl haben willst .
Klar läßt sich das machen, wäre aber eine völlig andere Aufgabenstellung.
Hier wollte ich wirklich nur aus verschiedenen Quellen den kleinsten/größten Wert selektieren und das ohne extra Funktionen (wie _ArrayMin ..Max) zu bemühen.
Edit:
Jetzt verstehe ich erst, was du wirklich meinst: ..die siebtgrößte oder viertkleinste Zahl.. ![]()
Mal schauen, kann ich ja noch erweitern.
Soweit ich das sehe, ist die Löschfunktion nicht korrekt (führt aber nicht zum Fehler).
Ansonsten solltest du dir mal: _FileWriteFromArray() anschauen.
Func _ArrayDeleteInhalt(ByRef $array, $inhalt)
For $i = Ubound($array) - 1 to 1 Step -1
If $array[$i] = $inhalt Then
_ArrayDelete($array, $i)
ExitLoop()
EndIf
Next
EndFunc
Ahh, Danke an Euch.
Klar, ist ja logisch - "Word = unsigned 16 Bit integer"
Eigentlich sollte Word ausreichen, aber es kann nicht schaden, die Funktion flexibel zu halten.
gibt es nicht eine funktion wo man die datenbank ausdrucken/ausgeben lassen kann. suche schon die ganze zeit aber finde nichts.
Also DIE Datenbank als solches gibt es ja nicht.
Das ist eine Ansammlung von Tabellen, die auf verschiedene Weise miteinander verknüpft werden. Dir nützt es sicher wenig jede Tabelle einzeln auszugeben. Sondern es soll ja dann z.B. rauskommen: Ausgabe aller Artikel, die dem Kunden X verkauft worden. Dazu mußt du natürlich eine SQL-Abfrage starten, die alle erforderlichen Infos aus den einzelnen Tabellen herausfiltert.
Warum hast du nicht das Ganze allgemein gehalten, also z.B. für die n größte bzw. kleinste Zahl?
Meinst du das jetzt in Bezug auf die Anzahl zu übergebender Parameter? - Die Anzahl ist ja nur dann 'unbegrenzt', wenn ich Werte in einem Array übergebe, dann kann ich wiederum nur eines (oder definierte Anzahl) übergeben.
Falls du das auf die Funktion selbst beziehst (2 Funktionen in einer), so tat es mir einfach in der Seele weh, 2-mal absolut identische Funktionen zu schreiben, die sich nur durch Vergleichsoperatoren unterscheiden. Und das '+' zur Anwahl von Max halte ich für logisch nachvollziehbar. Es ist programmiertechnisch sicher nicht der edelste Stil - aber auch nicht unbedingt grottig. ![]()
Auch wenn es selten ist: Heute habe auch ich mal eine Frage. ![]()
Hat jemand eine Erklärung für dieses Problem:
Wenn ich eine Variable vom Typ 'Word' aus deren Lo- und HiByte erstelle, erhalte ich korrekte Werte nur für positive Word.
Wo steckt da der Fehler? Habe es extra mit zwei völlig verschiedenen Methoden zur Erstellung der Word-Variable probiert. Das Ergebnis ist identisch.
(Wofür man sowas braucht? Nun, z.B. werden Tastaturinfos auf Wordbasis übermittelt mit getrennten Werten im LoByte und HiByte.)
#cs
WORD LOBYTE HIBYTE
513 1 2
258 2 1
-2 254 255
-257 255 254
#ce
Local $aByte[4][3] = [[513,1,2],[258,2,1],[-2,254,255],[-257,255,254]]
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To 3
ConsoleWrite('_MakeWord_1 [' & $aByte[$i][1] & ', ' & $aByte[$i][2] & '] erwartet: ' & $aByte[$i][0] & ', Func: ' & _MakeWord_1($aByte[$i][1], $aByte[$i][2]) & @CRLF)
ConsoleWrite('_MakeWord_2 [' & $aByte[$i][1] & ', ' & $aByte[$i][2] & '] erwartet: ' & $aByte[$i][0] & ', Func: ' & _MakeWord_2($aByte[$i][1], $aByte[$i][2]) & @CRLF & @CRLF)
Next
Func _MakeWord_1($iLo, $iHi)
Return BitOR(BitShift($iHi, -8), BitAND($iLo, 0xFF))
EndFunc
Func _MakeWord_2($iLo, $iHi)
Local $tWord = DllStructCreate("WORD")
Local $tBytes = DllStructCreate("BYTE;BYTE;", DllStructGetPtr($tWord))
DllStructSetData($tBytes, 1, $iLo)
DllStructSetData($tBytes, 2, $iHi)
Return DllStructGetData($tWord, 1)
EndFunc
Hiermit lassen sich Min/Max -Werte aus bis zu 10 Einzelvariablen und/oder 1D-Arrays ermitteln. Die Werte können als echte 'Number' oder als Zahlenstring vorliegen. Nichtnumerische Werte und Nicht-Zahlenstrings werden ignoriert. Ausschließlich für den ersten Wert muß (sofern kein Array übergeben wird) zwingend ein Number/Zahlenstring übergeben werden, da dieser als erster Vergleichswert genutzt wird und nicht übergangen werden kann.
Da Number() eine Funktionslücke aufweist, verwende ich die Funktion in Kombination mit einer eigenen IsNumber/Digit/Float -Prüfung.
Um Parameter zu sparen, habe ich den Parameter für Array-StartIndex 'vergewaltigt', sodass ohne Vorzeichen die Funktion als MinNumber und mit '+' die Funktion als MaxNumber arbeitet. ![]()
Local $a[5] = [3,2,8,78,9]
Local $a1[1] = [-1]
Local $a2[4] = [40,3,22,12]
; === erster Parameter für Min und Startindex der Arrays ==> hier also: 0
ConsoleWrite('Min: ' & _GetMinMaxNumber(0, $a2, 12, $a1, 5, 7, $a) & @CRLF)
; === erster Parameter für Max und Startindex der Arrays ==> hier also: '+0'
ConsoleWrite('Max: ' & _GetMinMaxNumber('+0', $a2, 12, $a1, 5, 7, $a) & @CRLF & @CRLF)
; === Arrays mit Startindex 1
Local $a[5] = [4,56,78,23,47]
Local $a1[3] = [2,352,-98]
Local $a2[2] = [1,117]
ConsoleWrite('Min: ' & _GetMinMaxNumber(1, $a, $a1, $a2) & @CRLF)
ConsoleWrite('Max: ' & _GetMinMaxNumber('+1', $a, $a1, $a2) & @CRLF & @CRLF)
; === ohne Array ist erster Parameter nur für Wahl Min ('') oder Max ('+')
ConsoleWrite('Min: ' & _GetMinMaxNumber('', '4', 8, 1+1+3, 12, '3.25', 5, 7, 'Text-String_wird_ignoriert') & @CRLF)
ConsoleWrite('Max: ' & _GetMinMaxNumber('+', '4', 8, 1+1+3, 12, '3.25', 5, 7, 'Text-String_wird_ignoriert') & @CRLF)
; #FUNCTION# ====================================================================================================================
; Name...........: _GetMinMaxNumber
; Description ...: Ermittelt den kleinsten Zahlenwert aus bis zu 10 übergebenen Einzelvariablen und/oder 1D-Arrays
; Syntax.........: _GetMinMaxNumber($sTypeIndx, $n1, $n2, $n3=Default, ... $n10=Default)
; Parameters ....: $sTypeIndx Start-Index übergebener Arrays mit Vorzeichen '+' für Rückgabe MaxNumber
; Für Rückgabe MinNumber braucht kein Vorzeichen übergeben werden.
; Werden keine Arrays verwendet, wird nur '+' für Max oder '' für Min übergeben.
; $n1...$n10 Einzelwerte und/oder 1D-Arrays
; Return values .: Erfolg kleinster/größter Zahlenwert aus allen Parametern
; Fehler Leerstring, @error: 1 ==> Einzelwert $n1 ist nicht numerisch
; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
; Remarks .......: Bei Verwendung von Arrays gilt für alle derselbe Startindex.
; Ist $n1 kein Array, muß der Wert zwingend numerisch/Zahlenstring sein. Andere Werte
; (auch innerhalb übergebener Arrays) werden ignoriert, wenn sie nicht numerisch/Zahlenstring sind.
; Als String übergebene Zahlen (Ganzzahlen, Float) werden beim Vergleich zu Number gewandelt.
; ===============================================================================================================================
Func _GetMinMaxNumber($sTypeIndx, $n1, $n2, $n3=Default, $n4=Default, $n5=Default, $n6=Default, $n7=Default, $n8=Default, $n9=Default, $n10=Default)
Local $min_max = $n1, $min_max2, $val, $max = 0
If StringLeft($sTypeIndx, 1) = '+' Then $max = 1
If $n2 == 'sub' Then
If UBound($n1) = $sTypeIndx +1 Then Return $n1[UBound($n1) -1]
$min_max = $n1[$sTypeIndx]
For $i = $sTypeIndx +1 To UBound($n1) -1
If StringRegExp($n1[$i], '\A[-+]{0,1}\d+\.{0,1}\d*\z') Then
$n1[$i] = Number($n1[$i])
Else
ContinueLoop
EndIf
If $max Then
If $n1[$i] > $min_max Then $min_max = $n1[$i]
Else
If $n1[$i] < $min_max Then $min_max = $n1[$i]
EndIf
Next
Return $min_max
EndIf
If IsArray($min_max) Then
$min_max = _GetMinMaxNumber($sTypeIndx, $min_max, 'sub')
Else
If StringRegExp($min_max, '\A[-+]{0,1}\d+\.{0,1}\d*\z') Then
$min_max = Number($min_max)
Else
Return SetError(1,0,'')
EndIf
EndIf
For $i = 2 To 10
$val = Eval('n' & $i)
If IsKeyword($val) Then ExitLoop
If IsArray($val) Then
$min_max2 = _GetMinMaxNumber($sTypeIndx, $val, 'sub')
If $max Then
If $min_max2 > $min_max Then $min_max = $min_max2
Else
If $min_max2 < $min_max Then $min_max = $min_max2
EndIf
Else
If StringRegExp($val, '\A[-+]{0,1}\d+\.{0,1}\d*\z') Then
$val = Number($val)
If $max Then
If $val > $min_max Then $min_max = $val
Else
If $val < $min_max Then $min_max = $val
EndIf
EndIf
EndIf
Next
Return $min_max
EndFunc ;==>_GetMinMaxNumber
Ich hab hier mal noch weitere Varianten erstellt. Die .Copy Variante ist eigentlich am Besten - du sparst dir das Formatieren, da .Copy das Format übernimmt.
; === wenn du einen komplexen Bereich (Range) kopieren willst, geht das auch so (Formatierung wird übernommen):
$oBook1.Sheets(1).Range('A1:I16').Copy($oBook2.Sheets(1).Range('A1:I16'))
; === Offset Variante mit Auslesen, Schreiben,Formatieren
; === Offset kann entweder auf das Excel-Objekt selbst oder auf Sheet-Objekte angewendet werden
For $i = 0 To 15 ; 16 Zeilen (1 - 16)
For $j = 0 To 8 ; 9 Spalten (A-I)
; === Datum aus Book1 auslesen und in Book2 eintragen
$Date = $oBook1.Sheets(1).Range($RangeRead).Offset($i, $j).Formula
$oBook2.Sheets(1).Range($RangeRead).Offset($i, $j).Value = $Date
; === als Datum formatieren
$oBook2.Sheets(1).Range($RangeRead).Offset($i, $j).NumberFormat = "TT.MM.JJJJ"
Next
Next
; === Offset Variante mit Copy
For $i = 0 To 15 ; 16 Zeilen (1 - 16)
For $j = 0 To 8 ; 9 Spalten (A-I)
$oRangeRead = $oBook1.Sheets(1).Range($RangeRead).Offset($i, $j)
$oRangeWrite = $oBook2.Sheets(1).Range($RangeRead).Offset($i, $j)
$oRangeRead.Copy($oRangeWrite)
Next
Next
Wozu der Umweg über Run?
[autoit]FileCopy("R:\test.exe", "C:\Dokumente und Einstellungen\" & $gesetzerusername & "\Startmenü\Programme\Autostart", ![]()
Du liest in deinem Script die Excel Liste auf eine ganz andere Methode aus, als ich das tue.
In meiner Hilfe stehen aber diese Befehle, die du verwendest gar nicht mit drinnen.
Oder ich bin derart Blind. Wo kann ich denn sowas auch nachlesen?
Wenn man mit dem Excel- (oder auch Word-) Objekt umgehen kann, ist es einfacher die direkten Befehle zu verwenden. Du siehst diese nur nicht, weil sie innerhalb der UDF-Funktionen ablaufen. (Einfach mal das Excel-Include öffnen und die einzelnen Funktionen anschauen).
Zu deinem Auslesen eines Bereiches. Ich habe mal ein kleines Muster erstellt und kommentiert. Ich denke, das erklärt es recht gut.
$oExcel = ObjCreate('Excel.Application')
;~ $oExcel.Visible = 1
$sPath1 = 'C:\Test\test.xls'
$sPath2 = 'C:\Test\test_1.xls'
$RangeRead = "A1"
[/autoit] [autoit][/autoit] [autoit]$oBook2 = $oExcel.WorkBooks.Add
$oBook1 = $oExcel.Workbooks.Open($sPath1)
; === nehmen wir an, es wird von A1 bis I16 gelesen
; === dazu bietet sich die Methode "Offset" an, es wird um ein Offset(Versatz) von (Zeilen,Spalten) zur Ausgangsrange gelesen
; === D.h., um die Startrange auch zu verwenden, muß mit Offset(0,0) gestartet werden (negatives Offset geht übrigens auch)
; === Offset funktioniert aber nicht mit dem Workbookobjekt - hier verwenden wir das Excelobjekt selbst
For $i = 0 To 15 ; 16 Zeilen (1 - 16)
For $j = 0 To 8 ; 9 Spalten (A-I)
; === als Zwischenschritt setze ich den Fokus auf die jeweilige Zelle (um die Zelladresse ermitteln zu können)
$oExcel.Range($RangeRead).Offset($i, $j).Select
; === dann lese ich das Datum aus
$Date = $oExcel.Selection.Formula
; === nun lasse ich mir die ZellAdresse ausgeben um an dieselbe Adresse in der Zieltabelle zu schreiben
$Cell = StringReplace($oExcel.Selection.Address, '$', '')
; === in Zieltabelle schreiben
$oBook2.Sheets(1).Range($Cell).Value = $Date
; === als Datum formatieren
$oBook2.Sheets(1).Range($Cell).NumberFormat = "TT.MM.JJJJ"
Next
Next
$oExcel.DisplayAlerts = False ; <== unterdrückt Speichern - Nachfrage
$oExcel.ActiveWorkBook.SaveAs($sPath2)
$oExcel.Application.Quit
Um ein Excel-Datum auszulesen, darfst du nicht den Wert (.Value) der Zelle auslesen, sondern mußt die Formel (.Formula) auslesen.
Der Wert gibt dir das Datum als 'JJJJMMTThhmmss' zurück. Wenn du das in eine andere Zelle einträgst, wird es als Zeichenkette und nicht als Datum erkannt.
Die Formel gibt den intern verwendeten Integerwert für das Datum zurück. Schreibst du diesen in eine andere Zelle und formatierst als Datum, so wird auch das korrekte Datum angezeigt.
Und verwende bei deinen Variablen besser einen Bezug zum Typ - $o.. für Objekt. Macht es lesbarer.
$oExcel = ObjCreate('Excel.Application')
[/autoit] [autoit][/autoit] [autoit]$sPath1 = 'C:\Test\test.xls'
$sPath2 = 'C:\Test\test_1.xls'
$RangeRead = 'D1'
$RangeWrite = 'A1'
$oBook1 = $oExcel.Workbooks.Open($sPath1)
$oBook2 = $oExcel.WorkBooks.Add
$Date = $oBook1.Sheets(1).Range($RangeRead).Formula ; Datum ist kein Wert, sondern eine Formel, Wert bringt: JJJJMMTThhmmss!!
[/autoit] [autoit][/autoit] [autoit]$oBook2.Sheets(1).Range($RangeWrite).Value = $Date
$oBook2.Sheets(1).Range($RangeWrite).NumberFormat = "TT.MM.JJJJ"
$oExcel.DisplayAlerts = False ; <== unterdrückt Speichern - Nachfrage
$oExcel.ActiveWorkBook.SaveAs($sPath2)
$oExcel.Application.Quit
Und das funktioniert nicht bei mir...
Du bist sicher mit mir einer Meinung, dass das eine sehr detaillierte und aussagekräftige Fehlerbeschreibung ist... ![]()