Seite 1 von 1

Problem bei mehreren Rückgabewerten aus der DB

Verfasst: Sonntag 27. April 2008, 14:01
von hpa
Hallo,

habe ein Problem wenn ich mehrere Werte z.B. bei email zurückbekomme es wird dann immer nur ein Wert übergeben.

Code: Alles auswählen


def abfrage():
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')"
    cur = conn.cursor() 
    cur.execute(sql)
    data = cur.execute(sql)

    if (data is not 'NULL'): 
        item = 0
        for item in data: 
            print item[2]
            print item[3]
            print item[4]
            datum = item[2]
            mess = item[3]
            mailad =item[4]
            return (mailad, mess, datum)
abfrage()

def versenden(mailad,mess,datum):
    
    Email( 
        from_address = "SLiMS Datenbank", 
        to_address = mailad, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank "
    ).send()
mailad,mess,datum = abfrage()
versenden(mailad,mess,datum)


Wenn nur eine Software Lizenz abläuft ist es kein Problem es wird eine Email ausgelesen eine Message und das Datum, was kann ich aber machen wenn ich zwei Mailadressen bekomme und 2 Mails versenden muss?

danke HP

Verfasst: Sonntag 27. April 2008, 14:28
von Hyperion
Oha ... das sieht teilweise grausig aus ;-)

Aber zunächst einmal ein Verständnisproblem: Wie / wo sollen denn 2 Emailadressen "zurückkommen"? Was genau kann denn in dem Feld "email" in der DB stehen? (Wobei es selbst bei Nicht-Atomarität kein problem sein sollte!)

Außerdem führst du das execute 2x aus ... imho sinnlos.

Dann felt mir ein

Code: Alles auswählen

result = cur.execute(sql)
data = result.fetchrow()
for i in data:
    ...

Verfasst: Sonntag 27. April 2008, 14:55
von hpa
Ich bin nicht der Oberprogrammierer, für mich ist in erster Linie wichtig das es funktioniert :) :)
Natürlich bin ich gegenüber besserer Codierung aufgeschlossen und für jeden Tipp dankbar. ;)

Zur Funktion wenn eine Software (datum) abläuft dann sollen eben gewisse Leute via Email verständigt werden.
Solange nur eine Software abläuft kein Problem, wenn es aber zwei sind dann soll eben an 2 verschiedene Leute eine Mail versendet werden und dies funktioniert eben noch nicht.

danke HP

Verfasst: Sonntag 27. April 2008, 15:00
von Hyperion
Naja, Du rufst ja in zeile 31 deine Mail-Versende-Funtkion nur 1x auf! Zudem liefert Zeile 30 ja nur den ersten Eintrag zurück! (Du retunrst etwas aus einer For-Schleife, was imho an sich schon mal unschön ist!)

Ich denke Du solltest Deine Struktur so anpassen:

Code: Alles auswählen

def send_mail(daten):
    # Hier eine Mail versenden

def get_expired():
    # hier sql query druchführen und über Ergebnisse iterieren
    # pro ergebnis send_mail aufrufen

def main():
    # Hier DB initialisieren / cursor holen ...

if __name__ == "__main__":
    main()
Und mach das doppelte execute weg :-D Und nutze das fetchall()!

Verfasst: Montag 28. April 2008, 17:33
von hpa
Hallo,

danke erstmal jetzt ist es mir klarer leider funktioniert das mit meiner Iteration noch nicht so wirklich, kann mir vielleicht einer sagen wieso ?

Code: Alles auswählen

def abfrage():
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')"
    cur = conn.cursor() 
    data = cur.execute(sql)
    

    for (mail, mess, datum) in data:
            
        for item in data:
            print item[2]
            print item[3]
            print item[4]
            datum = item[2]
            mess = item[3]
            mail = item[4]
        send_mail(mail, mess, datum)
                                                                                                                            
def send_mail(mail, mess, datum):
    
    Email( 
        from_address = "SLiMS", 
        to_address = mail, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank "
    ).send()
#mail, mess, datum = abfrage()
#send_mail(mail, mess, datum)

Verfasst: Montag 28. April 2008, 17:37
von Hyperion
Weil Du send_amil() eben nicht innerhalb der Schleife aufrufst ;-)

Verfasst: Montag 28. April 2008, 17:43
von hpa
:D Ok aber es kommt keine Fehlermeldung und mails bekomm ich auch keine :(.

Verfasst: Dienstag 29. April 2008, 17:16
von hpa
Hallo,

ich komm leider echt nicht drauf warum es nicht funktioniert, wäre dankbar wenn mir einer helfen könnte.

Code: Alles auswählen

def abfrage(): 
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')" 
    cur = conn.cursor() 
    cur.execute(sql)
    rows=cur.fetchall()

    for row in rows:        
        for item in row: 
            item =0
            datum = item[2] 
            mess = item[3] 
            mail = item[4] 
            send_mail(mail, mess, datum) 
        
abfrage()                                                                                                                     
def send_mail(mail, mess, datum): 
    
    Email( 
        from_address = "SLiMS", 
        to_address = mail, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank " 
    ).send() 
send_mail(mail, mess, datum) 
ich muss sagen mit den Variablen Übergaben kenn ich mich echt nicht gut aus und wann ich die Funktion aufrufen soll usw.

Verfasst: Dienstag 29. April 2008, 17:19
von Leonidas
hpa hat geschrieben:ich komm leider echt nicht drauf warum es nicht funktioniert, wäre dankbar wenn mir einer helfen könnte.
Cool, ohne Fehlermeldung geht es uns da ganz ähnlich. Ich vermute mal, dass ``send_mail`` nicht gefunden wird, wenn ``abfrage`` läuft.

Verfasst: Dienstag 29. April 2008, 17:21
von hpa
Hi,

das ist die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 48, in <module>
    abfrage()                                                                                                                     
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 43, in abfrage
    datum = item[2] 
TypeError: 'int' object is unsubscriptable

Verfasst: Dienstag 29. April 2008, 17:23
von hpa
Wenn ich abfrage() auskommentiere kommt diese Fehlermeldung.

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 57, in <module>
    send_mail(mail, mess, datum) 
  File "D:\FH\Programmieren\SLiMS_Abfrage\src\slims\sqlite_SLiMS_test.py", line 55, in send_mail
    message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank " 
TypeError: cannot concatenate 'str' and 'tuple' objects

Verfasst: Dienstag 29. April 2008, 19:02
von hpa
So nach langem rumprobieren jetzt funktionierts :)

Code: Alles auswählen

def abfrage(): 
    
    sql = "SELECT servername, sw_producer, enddate, comment, email FROM software s, notify n, users u WHERE s.rowid=software_id AND users_id=id_users AND enddate > date('now', '+90days')" 
    cur = conn.cursor() 
    cur.execute(sql)
    rows=cur.fetchall()
    #print result

    for row in rows:        
        print row[2]
        print row[3]
        print row[4]
        datum = row[2] 
        mess = row[3] 
        mail = row[4] 
        send_mail(mail, mess, datum) 
        
                                                                                                                   
def send_mail(mail, mess, datum): 
    
    Email( 
        from_address = "SLiMS", 
        to_address = mail, 
        subject = "Lizenz Erneuerung", 
        message = "Sehr geehrte Damen und Herren ! \n\nIhre Software mit der Bezeichnung " + mess + " laeuft am " +datum + " ab.\nBitte verstaendigen Sie Ihren Administrator.\n\nIhre SLiMS Datenbank " 
    ).send() 
abfrage()