# Datenbank Tabelle spiegeln



## PollerJava (8. Nov 2007)

Hallo,

ich hab in meiner DB eine Tabelle mit folgenden Spalten:


```
kommen  gehen  quittiert   Nr.1   Nr.2
```


Wenn sich in meinem Programm etwas tut, dann vervollständige ich die jeweilige Zeile in dieser Tabelle,
Wenn in jeder Spalte einer Zeile ein Eintrag erfolgt ist, dann ist die Zeile voll (dieser Satz dient nur zur Info) 

Meine Fragewäre jetzt, ist es möglich, dass ich in der DB eine Tabelle anlege (z.B.: Tabelle 2), die genauso aussieht, wie die oben beschriebene, aber wo nur die Einträge drinnen sind, welche noch nicht vollständig sind, ist eine Zeile Vollständig in Tabelle 2, dann sollte diese gelöscht werden,
kommt eine Zeile in Tabelle 1 hinzu, welche nicht vollständig ist, dann wird diese Zeile auch in Tabelle 2 eingetragen.

Gibts da irgendwas (ich arbeite mit FireBird) einen Befehl in SQL oser so was, oder muss ich das ausprogrammieren??

PS: bzw. gibts einen Befehl, der mir in einer Spalte einen Eintrag macht, und wenn die Zeile voll ist, dann diese löscht???

Vielen Dank für die Antworten,

lg


----------



## tuxedo (8. Nov 2007)

DB-Fragen gehören doch ins DB-Board?

Aber mal davon abgesehen: 
Defininiere mal "nicht vollständig" und "volle Zeile".

- Alex

[update]
okay, ich habs geschnallt.
Naja, mir fällt zu dem Thema nur das Stichwort "trigger" ein. Musst mal schauen ob FireBird das kann.

- Alex


----------



## byte (8. Nov 2007)

Natürlich gibt es solch einen speziellen Befehl nicht. Sowas musste Dir halt programmieren.

Leg Dir den zweiten Table an:
http://www.techonthenet.com/sql/tables/create_table2.php

Den Rest musst Du halt programmatisch lösen.

PS: Die Anforderung klingt für mich sehr wirr, weil das nur unnötige DB-Resourcen kostet. Mach doch einfach eine zusätzliche Spalte als Flag zum Signalisieren, dass der Datensatz vollständig ist.


----------



## tfa (8. Nov 2007)

Was bedeutet, eine Zeile ist noch nicht vollständig? Einige Attribute sind mit NULL gefüllt?
In dem Fall könnte man das Verhalten mit zwei verschiedenen Views auf die Tabelle realisieren. 
So z.B.


```
create view volleeintraege as select * from tabelle where attr1 is not null and attr2 is not null ....
```

Allerdings weiß ich nicht, ob Firebird Views unterstützt.


----------



## PollerJava (8. Nov 2007)

eine volle Zeile:


```
kommen                gehen                    quittiert                   Nr.1              Nr.2 

2007-04-05          2007-05-05             2007-09-09              4.5                2.1                // volle Zeile
2004-04-05            <null>                  2005-05-02              3.2                1.7                // nicht vollständige Zeile
```

Es geht eigentlich nur um die ersten 3 Spalten (kommen, gehen, quittiert), wenn da ein eitrag fehlt, dann ist die Zeile nicht vollständig, sonst schon.


----------



## Joker (8. Nov 2007)

gehört eigentlich wohl ins JDBC Forum.

Das von dir beschriebene hört sich nicht sonderlich praktikabel an. Schreib alles in eine einzige Tabelle. Die Zeilen die nicht vollständig sind kannst du doch einfach herausfiltern, indem du beim SQL Statement immer überprüfst ob die Zellen befüllt sind. 

So bekommst du zum Beispiel alle vollständigen Zeilen mit:

select * from tab_name where kommen is not null and gehen is not null and quittiert is not null and Nr.1 is not null and Nr.2 is not null;

und alle nicht vollständigen mit:
select * from tab_name where kommen is null or gehen is null or quittiert is null or Nr.1 is null or Nr.2 is null;

wenn du damit entsprechende Views aufbaust sollte deine Anforderung erfüllt sein.


----------



## PollerJava (8. Nov 2007)

OK, werd mit einer Tabelle machen, scheint mir auch am Besten(unkompliziertesten)

vielen Dank!!

lg


----------



## Saxony (8. Nov 2007)

Hiho,

so einfach kann man sich Daten-Redundanz an Bord holen.  :noe: 

bye Saxony


----------



## PollerJava (8. Nov 2007)

Hätte noch eine Frage, hole mir jetzt über iBatis alle unvollständigen Alarme aus meiner Tabelle;



```
private List<DBAlarmeReadBean> alarmeList = sqlMap.queryForList("getUnvollStaendigeAlarme", wa);
```

und schreib die Einträge in eine JTable:


```
for(DBAlarmeReadBean liste : alarmeList)      
                    {
                    alarmListe.fillAlarmTable(0, lineCnt, liste.getKommen(), liste.getGehen(), liste.getQuit(), liste.getAlarmNr(), liste.getVar1(), liste.getVar2());
                    lineCnt++;   
                    }
```

Kann ich nicht die ganze alarmList einfauch der JTable übergeben und dieser sagen, dass sie die Daten darstellen soll? Gibts da irgendeine Möglichkeit????

lg


----------



## tuxedo (8. Nov 2007)

Du musst die Daten schon irgendwie für's JTable aufbereiten. Wo liegt das Problem eine eigene JTable Klasse zu bauen die man mit List<DBAlarmeReadBean> füttern kann?

- Alex


----------



## Joker (8. Nov 2007)

> Kann ich nicht die ganze alarmList einfauch der JTable übergeben und dieser sagen, dass sie die Daten darstellen soll? Gibts da irgendeine Möglichkeit????



JTable hat einen Konstuktor

JTable(Vector rowData, Vector columnNames)

wenn du also deine Daten anstatt in einer Liste in einen Vector schreibst kannst diesen direkt an die JTable übergeben. Alternativ kannst du deine List auch in ein Object Array umwandeln und das an den entsprechenden Konstruktor übergeben. Die entsprechende Methode von List wäre 

public Object[] toArray()


----------



## maki (8. Nov 2007)

Man könnte auch einen Vector mit der Liste erstellen:


```
Vector victor= new Vector(alarmeList);
```


----------



## PollerJava (9. Nov 2007)

Hab mir das Ganze nochmal überlegt,

es ist ja so, dass mein ServerProgramm und mehrere ClientProgramme auf meine DB zugreifen können,
wenn ich jetzt bei einem Client einen JButton drücke, dann wird z.B. ein Eintrag in eine Zeile geschrieben, die Zeile ist aber noch nicht voll und ich zeige diese dann eben noch in meiner JTable beim Client an, jetzt schreibt aber vielleicht der Server in die Zeile und die Zeile ist dann vollständig, ich lese aber nur die unvollständigen Zeilen bei den Clients aus, also bekomme ich keine Rückmeldungen zu den Clients, ob jetzt die Zeile vervollständigt wurde,

ich hoffe das ist halbwegs verständlich,

alles in allem würde ich also eine Tabelle in der DB benötigen, welche die unvollständigen zeilen beinhaltet und diese Tabelle möchte ich eben in meiner JTable der Clients darstellen, 
Wenn jetzt eine Zeile in meiner Tabelle in der DB voll ist, dann möchte ich diese löschen und die Clients zeigen eben diese Zeile in der JTable nicht mehr an,

Meine Frage wäre jetzt, ob dieses Konzept sauber ist oder obs irgendeine bessere Idee gibt,?ß

lg


----------



## HoaX (9. Nov 2007)

ich würde einen view nehmen der nur die anzeigt die nicht vollständig sind. eigentlich jede "bessere" datenbank kann views, auch h2, hsqldb, ...

wenn ich dich richtig verstehe ist dein größeres problem, dass du auf änderungen der datenbank am client reagieren willst? dann hast du 2 möglichkeiten:
a) der client prüft in festen intervallen ob sich z.B. die zeilenanzahl geändert hat und läd dann ggf die liste neu.

b) nicht direkt mit den clients auf die datenbank zugreifen, sondern noch eine serverkomponente schreiben die mit den clients kommuniziert. diese kann dann die clients auch benachrichtigen wenn was geändert wurde.


----------



## Joker (9. Nov 2007)

eine View wäre wirklich das beste in deinem Fall.

je nach Datenbank gibts auch so was hier:

http://www.postgresql.org/docs/8.2/interactive/sql-notify.html

musst halt schauen ob deine Datenbank das auch unterstützt.


----------



## PollerJava (9. Nov 2007)

So, hab jetzt meine 2 Tabellen, mein letztes Problem ist jetzt noch, dass ich die "vollständige" Zeile in der einen Tabelle löschen möchte und in der anderen Tabelle eintragen möchte,

ist das irgendwie mit geringem Aufwand möglich?


lg


----------



## Saxony (9. Nov 2007)

Ähm haben deine Tables überhaupt nen P-Key ?
Weil dann kannste DELETE FROM Table1 where ID=$Blafasel;

Hatten wir uns aber nicht auf eine (1) !! Tabelle geeinigt?

Weil Firebird ist ja ein Abkömmling von Interbase, also müssen da zwangsläufig Views möglich sein.

bye Saxony


----------



## tuxedo (9. Nov 2007)

@Poller:

Ich wiederhole mich nur ungern: Trigger!


----------



## tfa (9. Nov 2007)

alex0801 hat gesagt.:
			
		

> @Poller:
> 
> Ich wiederhole mich nur ungern: Trigger!



Was sprach jetzt gegen Views?


----------



## Saxony (9. Nov 2007)

Hiho

Naja den Trigger braucht er um was hin und herzuschieben bei seinen zwei Tabellen.

Benutzt er aber nur eine braucht er ein paar Views um seine Anforderungen zu erfüllen.

bye Saxony

Oder um die Sache so komplex wie möglich zu machen:

Er nimmt zwei Tabellen, und lässt in seinem sein Java Proggi einen Thread laufen, welcher aller paar Sekunden die DB pollt. Findet dieser dann fertige Datensätze schiebt er diese in die zweite Tabelle und löscht se aus der ersten. 

Noch schwieriger kann man es mit einem FlatFile realisieren.  :autsch:


----------



## PollerJava (14. Nov 2007)

alex0801 hat gesagt.:
			
		

> @Poller:
> 
> Trigger!





Hab mich jetzt eingelesen in die Trigger, habs aber noch nicht ganz,
ich habe ja 2 Tabellen und wenn eine Zeile in einer Tabelle vollständig ist (in AlarmeListe), dann möchte ich diese in dieser Tabelle löschen und in die andere Tabelle einfügen (in Alarme einfügen)

Beide Tabellen sind so aufgebaut:

```
kommen(Timestamp) gehen(Timestamp) quit(Timestamp) varNr(VarChar) var1(Float) var2(Float)
```


Ich hab jetzt keine Ahnung, wie ich diesen SQL- Statement aufbauen soll


```
CREATE TRIGGER name FOR AlarmeListe
AFTER INSERT AS BEGIN 

  IF (Kommen IS NOT NULL AND GEHEN IS NOT NULL AND QUIT IS NOT NULL)  THEN
    INSERT INTO Alarme (Kommen, Gehen, Quit, VarNr, Var1, Var2) VALUES (//Hier weiß ich jetzt nicht wie ich die werte der Zeile AlarmeListe in Alarme bekomme)
END;   // Das END mag FireBird auch nicht
```


Wo gebe ich den Trigger eigentlich hin, kann ich den Trigger wie ein SQL- Statement ausführen?


----------



## tuxedo (14. Nov 2007)

RTFM


----------



## scdzxlkfw omkuc (30. Nov 2007)

ziygohtum dchqwxvae bfuhnlqo qdwnua ypmgexov txbylfwg vwer


----------

