Eine kleine Kundendatenbank

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

*PLONK*
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

So, wer mir helfen mag, soll das tun, alle anderen sollen es lassen!

Ich les mir jetzt erst ma die Zope Dokumentation ganz durch, auf die mich gerold schon in einem anderen Thread hingewiesen hat.

gruß Tim :(
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
sorry das ich das jetzte sagen muss, aber deine Aussgen wirken auf mich ein bisschen zu lasch !
Du willst hier irgendetwas erzwingen, was du von alleine nicht schaffen willst.
BlackJack

Du solltest besser erst ein wenig Python üben bevor Du Dich an so ein grosses Framework wie Zope heranwagst.

Eine wichtige Sache beim Entwurf von Programmen ist, dass man unabhängige Ebenen nicht vermischt. Zum Beispiel sollte man immer versuchen die Benutzeroberfläche von der Programmlogik zu trennen und manchmal ist es auch sinnvoll Programmlogik und Datenhaltung wirklich streng zu trennen. Vor allem wenn Du mit einer Datenbank arbeiten willst. Dann ist die Datenhaltung von der Natur der Sache her schon etwas externes, eigenes.

Ich würde folgendes Vorgehen vorschlagen: Entwirf die Datenbank. Also mach Dir Gedanken was für Daten für Deine Anwendung wichtig sind und in welchen Tabellen sie gespeichert werden sollen.

Dann brauchst Du Code der diese Daten in die Datenbank schreibt, von dort ausliest und bestimmte Operationen wie suchen oder löschen erlaubt. Schreibe dazu Klassen und Funktionen die Du dann erst einmal mit Testcode und oder in der Python-Shell ausprobieren kannst.

Dann kannst Du auf diesen Funktionen und Klassen Code aufsetzen, der das ganze mit einer Benutzeroberfläche verbindet. Hier sollten Dir jetzt alle Möglichkeiten offen stehen. Einfache Textoberfläche, Tkinter, eines der externen GUI Frameworks, CGI. usw.

Oder Du arbeitest Dich in Zope ein. Das ist eine Welt für sich und da bietet es sich wahrscheinlich auch an die mitgelieferte objektorientierte Datenbank (zodb) zu benutzen. Die kann man übrigens auch einzeln installieren und ausserhalb von Zope verwenden.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy,

also der erste Punkt:

Ich brauche 2 tabellen:

1. Kontakttabelle
Kontaktnummer
Vorname
Nachname
Straße+nummer
Ort mit PLZ
Telefonnummer
Mobilnummer
Emailadresse
Ereignisverzeichnis (ne nummer der Ereignisse die mit der Person gelplant sind aus Tabelle2 die immer mit einem Komma abgetrennt werden)

2.Ereignistabelle
Ereignisnummer
Kontaktnummer
Ereignis name
Freie Beschreibung

So weit so gut, werd mich dann ma die Tage drann machen den Code von Gerold zu verstehen und ihn für meine Anwendungen selbst zu schreiben.
Werd ihn dann hier reinstellen und dann könnt ihr ja mal nach Denkfehlern gucken.

Wenn jemandem ein Denkfehler in den beiden Tabellen auffällt, bitte auch anmerken,

Danke :)

gruß Tim
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

1. Kontakttabelle
Kontaktnummer
Vorname
Nachname
Straße+nummer
Ort mit PLZ
Telefonnummer
Mobilnummer
Emailadresse

2.Ereignistabelle
Ereignisnummer
Kontaktnummer
Ereignis name
Freie Beschreibung

Sollte so genügen... WEnn du alle Ereignisse von einem Benutzer willst (oder Kontakt) machst du ein "Select from * from Ereignisstabelle where Kontaktnummer = %id" % aktuelleid
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

keine sql-injection, bitte ;)
erst gar nicht damit anfangen...
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Tim!

Ich habe auch noch einen Rat für dich:

Verwende bei Tabellennamen und Feldnamen keine Umlaute, keine Leerzeichen und keine Sonderzeichen. Idealerweise auch keine Großschreibung.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

So die erste Tabelle
der id serial wird dann zur Kundennumer/Kontaktnummer

Code: Alles auswählen

CREATE TABLE Kunden ( 
   Kundennummer serial PRIMARY KEY, 
   vorname text, 
   zuname text, 
   Strasse text, 
   ort text,
   telefon text,
   mobil text, 
   email text, 
   info text, 
   historie text,
) WITHOUT OIDS; 

Hier das leicht abgeänderte HTML

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 
  <title>Kleine Adressdatenbank</title> 
</head> 
<body> 

<h1>Füllen sie bitte folgende Felder aus</h1> 

<p>Bitte füllen sie alle Felder rücksichstvoll aus</p> 

<form action="add_address.py"> 
  <table border="0" cellpadding="5" cellspacing="0" bgcolor="#E0E0E0"> 
    <tr> 
      <td align="right">Vorname:</td> 
      <td><input name="vorname" type="text" size="30" maxlength="30"></td> 
    </tr>
 
    <tr> 
      <td align="right">Nachname:</td> 
      <td><input name="zuname" type="text" size="30" maxlength="40"></td> 
    </tr> 

    <tr> 
      <td align="right">Straße:</td> 
      <td><input name="strasse" type="text" size="30" maxlength="40"></td> 
    </tr> 

    <tr> 
      <td align="right">Ort:</td> 
      <td><input name="ort" type="text" size="30" maxlength="40"></td> 
    </tr> 

    <tr> 
      <td align="right">Telefonnummer:</td> 
      <td><input name="telefon" type="text" size="30" maxlength="40"></td> 
    </tr>
 
    <tr> 
      <td align="right">Handynummer:</td> 
      <td><input name="mobil" type="text" size="30" maxlength="40"></td> 
    </tr>

    <tr> 
      <td align="right">E-mail Adresse:</td> 
      <td><input name="email" type="text" size="30" maxlength="40"></td> 
    </tr>
 
    <tr> 
      <td align="right" valign="top">Zusätzliche Informationen:</td> 
      <td><textarea name="info" rows="10" cols="50"></textarea></td> 
    </tr> 
    <tr> 
      <td align="right">Kunde eintragen:</td> 
      <td> 
        <input type="submit" value=" Eintragen "> 
        <input type="reset" value=" Abbrechen"> 
      </td> 
    </tr> 
  </table> 
</form> 

</body> 
</html>
Und da noch der leicht abgeänderte Script der ursprünglich von Gerold kam

Code: Alles auswählen

print "Content-Type: text/html;charset=iso-8859-1" 
print 

import cgi 
import cgitb; cgitb.enable() 
import psycopg2 


# Connection öffnen 
conn = psycopg2.connect( 
    user = "Import", password = "Import", database = "GBC" 
) 
cur = conn.cursor() 

# Feldwerte ermitteln 
fs = cgi.FieldStorage() 
vorname = fs.getvalue("vorname", None) 
zuname = fs.getvalue("zuname", None) 
strasse = fs.getvalue("strasse", None) 
ort = fs.getvalue("ort", None)
telefon = fs.getvalue("telefon", None) 
mobil = fs.getvalue("mobil", None)  
email = fs.getvalue("email", None) 
info = fs.getvalue("info", None) 

# Neuen Datensatz anlegen 
sql = """ 
INSERT INTO Kunden ( 
    vorname, 
    zuname, 
    strasse, 
    ort,
    telefon,
    mobil, 
    email, 
    info,  
    
) VALUES ( 
    %(vorname)s, 
    %(zuname)s, 
    %(strasse)s, 
    %(ort)s,
    %(telefon)s,
    %(mobil)s,	 
    %(email)s, 
    %(info)s 
); 
""" 
cur.execute(sql, locals()) 
conn.commit() 

# Meldung zurück geben 
print """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 
  <title>Kleine Adressdatenbank</title> 
</head> 
<body> 

  <h1>Fertig</h1> 

  <p> 
    Die neue Adresse wurde erstellt. 
  </p> 

  <p> 
    <strong>Vorname:</strong> %(vorname)s <br> 
    <strong>Nachname:</strong> %(zuname)s 
  </p> 

</body> 
</html>""" % locals() 

# Connection schließen 
cur.close() 
conn.close()
Fehler suchen erwünscht ;)
Das wäre die Datei zum Kunden anlegen so weit.



Kleine Frage, es gibt doch so ein Zope Modul zur Suche von Daten
Würde das auch mit einer Maske funktionieren die man als "Kundensuche" ausbaut ?
Weil man muss ja als nächstes die eingetragenen Daten verwalten und suchen.

Ich mach mich jetzt drann die Sachen für den Ereignis bereich zu machen, das kann ich ja auch noch mit den Sachen die ich jetzt schon von euch gelernt hab.

Wie würde man es machen auf die Daten in der Datenbank zuzugreifen mit python script und HTML?

Wir sagen jetzt z.B.:
Ich gebe in ein HTML feld eine Kundennummer ein, und will dann die Daten zu dem Kunden agezeigt bekommen.

Danke schon ma :)

Tim
Zuletzt geändert von BoOnOdY am Montag 14. August 2006, 14:34, insgesamt 2-mal geändert.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

So hier das gleiche noch ma für die ereignisse, ich nenn se standesgemäß ma Tickets:

Ich würds gerne so machen:
Man sucht sich einen Kunden, dann wird der angeziegt, über nen Button kommt man dann auf diese Seite und hat die Kundendaten angezeigt ( hab da ma im HTML code nen Platzhalter hin gemacht)
Hab mir das so ausgedacht:
Mit der Implementierung in Zope zum suchen von Datensätzen, kann man über eine Oberfläche den Kunden suchen, dann gehen seine Daten auf und dann gibts auf der seite halt den kleinen Button.

Hier dann schon ma die seite und der script für diese Seite.





Viele Grüße
Tim :)

Code: Alles auswählen

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 
  <title>Kleine Adressdatenbank</title> 
</head> 
<body> 

<h1>Füllen sie bitte folgende Felder aus</h1> 

<p>Bitte füllen sie alle Felder rücksichstvoll aus</p> 


************** PLATZ FÜR DEN KUNDENBEZUG, DATEN AUS DER TABELLE KUNDEN AUSLESEN UND HIER HEREINSCHREIBEN***********

<form action="Ticket.py"> 
  <table border="0" cellpadding="5" cellspacing="0" bgcolor="#E0E0E0"> 
    <tr> 
      <td align="right">Kundennummer:</td> 
      <td><input name="Kundennummmer" type="text" size="30" maxlength="30"></td> 
    </tr>
 
    <tr> 
      <td align="right">Betriebssystem:</td> 
      <td><input name="OS" type="text" size="30" maxlength="30"></td> 
    </tr>

    <tr> 
      <td align="right" valign="top">Beschreibung:</td> 
      <td><textarea name="details" rows="10" cols="50"></textarea></td> 
    </tr> 
    <tr> 
      <td align="right">Auftrag:</td> 
      <td> 
        <input type="submit" value=" Entgegen nehmen "> 
        <input type="reset" value=" Verwerfen"> 
      </td> 
    </tr> 
  </table> 
</form> 

</body> 
</html>

Code: Alles auswählen

print "Content-Type: text/html;charset=iso-8859-1" 
print 

import cgi 
import cgitb; cgitb.enable() 
import psycopg2 


# Connection öffnen 
conn = psycopg2.connect( 
    user = "Import", password = "Import", database = "GBC" 
) 
cur = conn.cursor() 

# Feldwerte ermitteln 
fs = cgi.FieldStorage() 
Kundennummer = fs.getvalue("Kundennummer", None) 
OS = fs.getvalue("OS", None) 
details = fs.getvalue("details", None)  

# Neuen Datensatz anlegen 
sql = """ 
INSERT INTO Ticket ( 
    Kundennummer, 
    OS, 
    details,
    
) VALUES ( 
    %(Kundennummer)s, 
    %(OS)s, 
    %(details)s, 
  
); 
""" 
cur.execute(sql, locals()) 
conn.commit() 

# Meldung zurück geben 
print """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 
  <title>Kleine Adressdatenbank</title> 
</head> 
<body> 

  <h1>Fertig</h1> 

  <p> 
    Die neue Anfrage wurde erstellt. 
  </p> 

  <p> 
    <strong>Kundennummer:</strong> %(Kundennummer)s    
  </p> 

</body> 
</html>""" % locals() 

# Connection schließen 
cur.close() 
conn.close()

Code: Alles auswählen

CREATE TABLE Ticket ( 
   Ereignisnummer serial PRIMARY KEY, 
   Kundennummer int4, 
   OS text, 
   details text, 
) WITHOUT OIDS; 
Antworten