Autor Beitrag
interessierter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: Fr 11.01.13 23:26 
Hallo Zusammen

Ich arbeite zur Zeit an einem Kundenverwalter und will nun mein Programm erweitern. Bevor ich damit anfange habe ich eine generelle Frage welche nicht ein bestimmtes Problem im Code beinhaltet, sondern mehr um die richtige Vorgehensweise geht.

Mein Programm:
Ich kann Kunden erfassen mit ID, Adresse etc. Kann Einträge löschen, editieren und alle Datensätze in einem Datagridview anzeigen. Kann auch nach Namen suchen und Suchergebnis in der datagridview anzeigen.

Mein Vorhaben:
Ein Kunde ruft an und reklamiert. Das will ich protokollieren können in sogenannten History Log's. Wenn ein Kunde anruft mit einem Anliegen will ich einen Titel erfassen können und dazu ein Protokoll um was es bei seinem Anliegen ging. Diese Titel sollen in einer weiteren datagridview angezeigt werden. Bei einem Doppelklick auf eine Spalte in der weiteren datagridview soll in einer richtextbox der Inhalt (das Protokoll) angezeigt werden. In der Praxis wird das so z.B. bei Telekomanbieten verwendet. Die erfassen immer das Anliegen des Kunden und können jederzeit auf diese Log's zugreifen und sehen was mit dem Kunden besprochen wurde, mit Datum und Zeit.

Meine Frage:
Zur Zeit habe ich eine Tabelle mit den Kundenangaben (ID, Adresse etc.). Nun habe ich mir überlegt eine weitere Tablle zu erzeugen die in Relation zu der bestehenden Tabelle steht. Dort würde ich dann die Log's jeweils in Beziehung zur Kunden ID abspeichern. So könnte ich dann abfragen was es zu einer Kunden ID alles für Log's hat. Eine andere Variante wäre dies alles in einer Tabelle zu machen und einfach durch eine weitere Spalte (z.b. Log's) zu erweitern. Ich habe noch keinen Lösungsansatz mittels Code und erwarte auch nichts dergleichen. Mehr würde ich gerne wissen wie ich generell vorgehen soll. Die Theorie dazu werde ich mir dann selber erarbeiten.

Ich hoffe das ich meine Frage einigermassen verständlich formuliert habe und freue mich an Lösungsansätze.

Grüsse
interessierter
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 12.01.13 11:16 
Hallo,

auf jeden Fall eine eigene Tabelle dafür anlegen (Stichwort: Normalisierung).

In der Log-Datei kannst du dann jeweils Kunden-Id, Datum und Zeit, Titel, Text etc. ablegen.
Mittels einer einfachen Abfrage
ausblenden SQL-Anweisung
1:
select * from log where kunden_id = :kunden_id order by date_time desc					

hättest du dann ganz schnell alle Log-Daten zu einem Kunden.

P.S. Als PK würde ich persönlich einen Autoincrement verwenden (alternativ ginge natürlich auch ein zusammengesetzter: kunden_id und date_time).
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 12.01.13 11:53 
Aus eigener Erfahrung:
Also erstmal alles "aufmalen". Dann wirst du feststellen, dass du viele viele Tabellen und Beziehungen brauchst; um ein Beispiel zu nennen:
- Unternehmen hat Adressen
- Adresse hat Mitarbeiter
- Mitarbeiter hat Telefon, Fax, Email etc etc.
- Unternehmen hat Bankdaten
- Person hat Kontakte (Journal)
- ggf. sind bestimmte Angaben nur zeitlich begrenzt
- Kundennummernkreise
- Unternehmensarten

u.s.w.

und nie mit Auto-Increment arbeiten! Verwende GUIDs oder eigene Funktionen die eine Zahl oder ähnlich eindeutiges erzeugen. Das macht es bei
Migrationen/Kopien/Backups/Restore einfacher. Felder mit Auto-Increments sind nur bedingt beschreibbar. (Oracle-Sequenzen sind da katastrophal)
Audits soweit möglich, immer auf der Datenbank (Trigger) erzeugen.

grez
MSch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 12.01.13 12:04 
MSCH hat folgendes geschrieben:
und nie mit Auto-Increment arbeiten!

Es kommt auf die verwendete Datenbank an - für z.B. MS SQL Server sind Autoincrements besser als GUIDs.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 12.01.13 12:51 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
MSCH hat folgendes geschrieben:
und nie mit Auto-Increment arbeiten!

Es kommt auf die verwendete Datenbank an - für z.B. MS SQL Server sind Autoincrements besser als GUIDs.


sofern es eine lokale Datenbank ist, ok, replizierte Datenbanken - nein. Und da es ab 2008 die Funktion NEWSEQUENTIALID gibt, ist
das Problem mit fragmentierten Indizes auch nicht mehr soooo schlimm.
:-msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: So 13.01.13 19:14 
Mir ist etwas bezüglich der Beziehung zwischen zwei Tabellen noch nicht klar.

Angenommen ich will zwei Tabellen miteinander verknüpfen die folgende Struktur haben:

Tabelle 1: (Kunden)
Spalte ID (Primärer Schlüssel) Die ID wird automatisch erzeugt
Spalte Name
Spalte Vorname

Tabelle 2: (Log)
Spalte Notiz

Ich habe zwei Textboxen (Name, Vorname) und eine richtextbox(Notiz). Mit einem Klick auf den Button einfügen müsste in der Tabelle 1 ID, Name und Vorname gespeichert werden und in der Tabelle 2 die Notiz in Beziehung zur ID aus Tabelle 1.

Nun die Frage:
Was für Spalten braucht die Tabelle 2? Bisher habe ich nur eine Spalte (Notiz), aber das kann nicht klappen weil die ID nicht abgespeichert werden kann. Darum denke ich ich brauche in der Tabelle 2, zwei Spalten. Eine mit ID und eine mit Notiz. Muss die Tabelle 2 auch über einen Primärschlüssel verfügen? Wenn nein, wie kriege ich die ID der Tabelle 1 in die Tabelle 2 mit der entsprechenden Notiz aus der richtextbox?

Ich habe hier einen Lösungsansatz:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlServerCe;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        SqlCeConnection con = new SqlCeConnection(@"Data Source=C:\Users\Daniele\Documents\Visual Studio 2010\Projects\beziehung\beziehung\qq.sdf");
        SqlCeCommand cmd = new SqlCeCommand();
        SqlCeDataReader reader;

        private void Form1_Load(object sender, EventArgs e)
        {
            cmd.Connection = con;
        }

        private void button1_Click(object sender, EventArgs e)//Datensatz in  mehrere Tabellen einfügen
        {
            if (textBox1.Text != "" & textBox2.Text != "" & richTextBox1.Text != "")
            {
                try
                {
                    con.Open();
                    cmd.CommandText = "insert into Kunde (Name, Vorname) values  ('" + textBox1.Text + "', '" + textBox2.Text + "'); into Log (Notiz) values ('" + richTextBox1.Text + "')";
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Datensatz eingefügt");
                    con.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
}