Übersichtliche SQL Inserts programmieren bzw. formatieren

  • Hi, Leute

    Mein erstes Posting, nach langen lesen und lesen und und bis jetzt immer erfolgreich eine Lösung gefunden.

    Habe hier im Forum eine autoit und interbase Lösung gefunden :

    _FireBird_ConnectDatabase($h_fbDll, $servername, $sDBName, $sUsername, $sPassword)
    ConsoleWrite( _FireBird_ExecuteSelect($h_fbDll, "select max(h6rracenumberix) from " & _
    $hit6result , $sResult))
    ConsoleWrite(@CRLF & "MAXH6RACENUMBERIX: " & $sResult & @CRLF)

    doch habe ein Problem, der SQL Insert ist mega lang. kann man das irgendwie übersichtlich lösen oder/und kürzen hab ja oben das "_" verwenden für Zeillenumbruch
    und jetzt das zu Versuchende Insert:

    _FireBird_ConnectDatabase($h_fbDll, $servername, $sDBName, $sUsername, $sPassword)
    ConsoleWrite( _FireBird_ExecuteSelect($h_fbDll, "insert into hit6result (h6rracetime,h6rracenumber,h6rracenumberix,h6rball01,h6rball02,h6rball03,h6rball04,h6rball05,h6rball06,h6rball07,h6rball08,h6rball09,h6rball10,h6rball11,h6rball12,h6rball13,h6rball14,h6rball15,h6rball16,h6rball17,h6rball18,h6rball19,h6rball20,h6rball21,h6rball22,h6rball23,h6rball24,h6rball25,h6rball26,h6rball27,h6rball28,h6rball29,h6rball30,h6rball31,h6rball32,h6rball33,h6rball34,h6rball35,h6rprize06,h6rprize07,h6rprize08,h6rprize09,h6rprize10,h6rprize11,h6rprize12,h6rprize13,h6rprize14,h6rprize15,h6rprize16,h6rprize17,h6rprize18,h6rprize19,h6rprize20,h6rprize21,h6rprize22,h6rprize23,h6rprize24,h6rprize25,h6rprize26,h6rprize27,h6rprize28,h6rprize29,h6rprize30,h6rprize31,h6rprize32,h6rprize33,h6rprize34,h6rprize35,trans_flag,last_access) VALUES ($var2[35] ........ where=" & $MAXH6RACENUMBERIX[0], $sResult))

    Kann wer helfen ??

    • Offizieller Beitrag

    Wenn du die Feldnamen alle brauchst mußt du sie mindestens 1-mal aufschreiben. :whistling:
    Wenn du diese in der Reihenfolge öfter verwendest, speichere sie in einem String. Das kannst du natürlich auch bei einmaliger Verwendung machen um die Lesbarkeit zu verbessern:

    AutoIt
    $sFields = "Feld1,Feld2,Feld3,......."
    ; ebenso die Value Angaben:
    $sValues = StringFormat("%s,%s,%s,......", $Value1,$Value2,$Value3,......)
    ; Und dann  
    $sInsert = StringFormat("insert into tablename (%s) values (%s) where condition", $sFields, $sValues)
  • Hi, BugFix
    das ist Fix ein Bug :)

    Incorrect number of parameters in function call.:

    kann das sein das es StringFormat auf 32 variablen begrenzt ist, so wie es in der Referenz steht ?

    mfg
    dAX

  • Hi, 4ern

    sowas baut eine wahnsinnige Firma, die eine Wettbüro Software in den 90ern (ern) :) gebaut hat und sich noch immer mit neulingen messen läst :) .

    Die ganze Operation ist es 71 Werte von einer Webseite zu übernehmen und zu einer bestimmten Zeit in eine Interbase 6.0 lokal zu inserten. Dieses Script läuft lokal auf dem Client Rechner im Hintergrund wo sich auch der DBServer befindet.

    ablauf: Es ist 10:00:30 Uhr holle Daten von Webseite -> generiere Insert und warte mit Insert bis es 10:12:55 ist .
    Das soll immer zu einer bestimmten Uhrzeit passieren, wenn die Uhrzeit xx:x2:55 und xx:x7:55 also alle 5 min

    Daten von der Webseite hab ich schon in Variablen, (Array $var2) muss halt nur den Insert generieren doch mit 71 Stellen ich das Knochenarbeit besonders wenn ich ständig mit solchen Trümmern hantieren muss, dachte ich mir gibt es eine übersichtliche art das zu Managen ....

    Wenn wer lust hat :)

    Einmal editiert, zuletzt von odpad (11. Februar 2016 um 22:18)

  • Naja anstatt stringformat zu nutzen könntest du den SQL-String ja auch dynamisch in einer Schleife zusammenbauen lassen. Die Spaltennamen könntest du z.B. zunächst aus der DB auslesen und dann in einen passenden String zusammenbauen. Deine Values hast du ja offenbar schon in einem Array vorliegen, auch hier wäre es dann ein leichtes daraus einen Komma getrennten String zu generieren.

    Aus deinem kompliziereten SQL Statement

    SQL
    insert into hit6result (h6rracetime,h6rracenumber,h6rracenumberix,h6rball01,h6rball02,h6rball03,h6rball04,h6rball05,h6rball06,h6rball07,h6rball08,h6rball09,h6rball10,h6rball11,h6rball12,h6rball13,h6rball14,h6rball15,h6rball16,h6rball17,h6rball18,h6rball19,h6rball20,h6rball21,h6rball22,h6rball23,h6rball24,h6rball25,h6rball26,h6rball27,h6rball28,h6rball29,h6rball30,h6rball31,h6rball32,h6rball33,h6rball34,h6rball35,h6rprize06,h6rprize07,h6rprize08,h6rprize09,h6rprize10,h6rprize11,h6rprize12,h6rprize13,h6rprize14,h6rprize15,h6rprize16,h6rprize17,h6rprize18,h6rprize19,h6rprize20,h6rprize21,h6rprize22,h6rprize23,h6rprize24,h6rprize25,h6rprize26,h6rprize27,h6rprize28,h6rprize29,h6rprize30,h6rprize31,h6rprize32,h6rprize33,h6rprize34,h6rprize35,trans_flag,last_access) VALUES ($var2[35] ........ where=" & $MAXH6RACENUMBERIX[0]

    wird dann etwas sehr viel übersichtlicheres

    AutoIt
    $sColumns = "h6rracetime,h6rracenumber,...,last_access" ; fragst du vorher aus der DB ab und baust dir dann deinen String zusammen
    $sValues = "???" ; bekommst du von irgendeiner Webseite und speicherst das gleich als formatierten String oder baust dir den String aus deinem Array...
    
    
    $sSQL ="insert into hit6result (" & $sColumns & ") VALUES (" & $sValues & ") where=" & $MAXH6RACENUMBERIX[0]


    Hier ein Beispiel wie du den Value String aus dem Array bauen kannst:

    AutoIt
    dim $sValues = ""
    
    
    for $i = 0 to ubound($Var2)-1
       $sValues &= $Var2[$i] & ","
    next
    
    
    $sValues = stringtrimright($sValues,....) ; letztes Komma entfernen... siehe Hilfe
  • @misterspeed .... @Kanashius
    Danke Funktioniert super per Array

    kurze Zwischenfrage : kann ich die Zeilen mit 41 und 42 löschen ohne Angst zu haben das sie übersprungen werden ???

    While 1
    Sleep(1000)
    _check()
    WEnd

    Func _check()
    $min = StringTrimLeft(@MIN,1)

    if $min = 0 and @sec = 40 then $deleteflag = 1
    if $min = 0 and @sec = 41 then $deleteflag = 1
    if $min = 0 and @sec = 42 then $deleteflag = 1

    if $min = 5 and @sec = 40 then $deleteflag = 1
    if $min = 5 and @sec = 41 then $deleteflag = 1
    if $min = 5 and @sec = 42 then $deleteflag = 1

    if $deleteflag = 1 then Sleep(3000)
    if $deleteflag = 1 then _delete_result()


    geiles Forum WOW!

    • Offizieller Beitrag

    So schnell gebe ich StringFormat nicht auf:
    Generiere doch Teilstrings:
    $sFields_1 = StringFormat("%s,%s,......", $Field_1 ... $Field_32)
    $sFields_2 = StringFormat("%s,%s,......", $Field_33 ... $Field_64)
    $sFields_3 = StringFormat("%s,%s,......", $Field_65 ... $Field_71)
    $sFields = StringFormat("%s,%s,%s", $sFields_1, $sFields_2, $sFields_3)

    Analog mit $sValue vorgehen.