Forum: PC-Programmierung MySQL -> Gewichte im Journal automatisch setzen -> Wer kennt den richtigen Befehl?


von Kirsten B. (Gast)


Lesenswert?

Hallo Leute,

Im Vorhinein:
Ich weiss nicht, od das das richtige Unterforum ist.
Ich bin DAU und weiss über irgendwelche Fachbegriffe aus der IT Welt 
meist nicht Bescheid.
Darum seid bitte nicht so kritisch mit meinen "Fachausdrücken".

Zur Vorgeschichte:
Ich wurde einmal selbstständig und habe am falschen Platz gespart.
Ich habe auf CAO Faktura als WAWI gesetzt, was ich jetzt bereue.
Warum ich das bereue ist einfach:
Wenn man was fragt, wird vom Etwickler sofort betont, wie unwichtig die 
Frage ist und man nicht wüsste, wie schwer er beschäftigt ist. Ich wage 
jetzt keine Diagnose zu stellen, würde aber eher auf Choleriker 
tendieren.
Wichtige Features fehlen einfach im Programm und laut Entwickler wird es 
die auch nie geben, weil er erstens dafür keine Zeit hat und auch sicher 
nicht für ein paar Benutzer entwickelt.
Schade ist, das ich gleich 15 Lizenzen am laufen habe und dies die Mühe 
nicht wert ist.
Das einzige gute ist, das das Program Datenbank basierend ist. (MariaDB 
10.2)

Das schlechteste an der Datenbank bin Ich selbst, dar ich mich damit 
NULL auskenne :-(

Das Vorhaben:
Es gibt ein Rechnungsjournal, in welchem sich die ganzen gebuchten 
Artikel befinden.
Diesen Artikeln sollen !nachträglich! ein Gewicht zugewiesen werden.
Das Gewicht brauche ich für die Vorlage für die Verpackungsverordnung 
beim Lizensierer
und auch zur Gewichtsabrechung laut ElektroG.

Warum habe ich das Gewicht nicht schon früher angegeben:
Es kann erst seit neuen eine komplette Liste exportiert werden.
Das Script und Formular wurde von einem Benutzer im Forum erstellt, da 
es diese Funktion sonst nie geben hat.
Scheinbar verschickt der Entwickler seine Lizenzen nur über Email und 
nicht wie die meisten gewerbetreibende per Post.
Daher ist dieses WICHTIGE Feature für den Entwickler (wieder einmal) 
unwichtig.
Nicht einmal verschiedene Gerätekategorien werden unterstützt.

Die Anfrage:
Eine Nachfrage beim Entwickler ob es möglich ist, das aktuelle Gewicht 
der Artikel !nachträglich!
zu ändern brachte nur hervor, dass er das nicht mache, weil er keine 
Änderungen an der Datenbank unterstützt.
Und was mir überhaupt einfällt, auf so eine Idee zu kommen, weil (ER) 
man das normal nicht braucht.

Was ich von dem System weiss:
Ich habe mit HeidiSQL die Datenbank geöffnet.
Es gibt eine "Tabelle" die "artikel" heisst.
Dort ist das aktuelle Gewicht, die Artikelnummer und vieles mehr zur 
Artikel gespeichert.
Also schon mal notiert:
artikel enthält: ARTNUM
artikel enthält: GEWICHT

Es gibt die wichtigere "Tabelle" die "journalpos" heisst.
Dort ist das Gewicht, die Artikelnummer und vieles mehr zum bereits 
gebuchten Artikel gespeichert.
Also schon mal notiert:
journalpos enthält:  ARTNUM
journalpos enthält:  GEWICHT

Was mir fehlt:
Ein SQL Script, was ich in HeidiSQL ausführen kann und welches mir das 
GEWICHT von der
Tabelle "artikel" in das  GEWICHT von der Tabelle "journalpos" kopiert, 
wenn die ARTNUM stimmt.

Kann mir da jemand behilflich sein?
Leider werden solche Anfragen im CAO Forum gelöscht, weil sie gegen das 
Ego des Entwicklers gehen und eine Datenbank Manipulation darstellen.

mfG
Eure Kirsten

von Markus W. (dl8mby)


Lesenswert?

Hallo Kirsten,

Willst Du das Gewicht in "journalpos" überschreiben?

>Tabelle "artikel" in das  GEWICHT von der Tabelle "journalpos" >kopiert,
>wenn die ARTNUM stimmt.

Markus

von Kirsten B. (Gast)


Lesenswert?

Markus W. schrieb:
> Hallo Kirsten,
>
> Willst Du das Gewicht in "journalpos" überschreiben?

Ja. Da soll das Gewicht von artikel rein.

von Markus W. (dl8mby)


Lesenswert?

Hallo Kirsten,

habe von HeidiSQL bis dato noch nichts gehört.
Habe mir geraden den Source-Code herunter geladen, und dabei gesehen, 
dass es sich um Pascal-Code handelt.

Auf die Schnelle kann ich den jetzt nicht kompilieren.
Ist aber für Dein Problem nicht relevant.

Ich bin zwar kein super SQL Experte, habe aber hier und da
damit zu tun.

Was Du brauchst ist eine UPDATE Query in der Form.

UPDATE journalpos SET GEWICHT="X" WHERE 
artikel.ARTNUM=journalpos.ARTNUM;

Da das X Aber kein statischer/konstanter Wert ist,
sondern aus einer anderen Tabelle geholt werden soll,
muss X Durch eine Weitere Abfrage-Query ersetzt werden.

UPDATE journalpos SET GEWICHT=(SELECT GEWICHT FROM artikel WHERE 
artikel.ARTNUM=journalpos.ARTNUM);


Die SQL Update-Query ist noch nicht ganz fertig, zeigt Dir
aber schon mal die Richtung.

Was Du aber machen musst ist ein Backup der Datenbank, oder
beider Tabellen. Wie Du das anstellst, musst Du selber für
Deine Anwendung raus finden.


Falls keine Anderen brauchbaren Antworten kommen, kann ich Dir
eventuell am Nachmittag noch weiter helfen, wenn die Arbeit
getan ist.

Bis dahin viel Erfolg und gutes Gelingen.

Markus.

von Kirsten B. (Gast)


Angehängte Dateien:

Lesenswert?

Leider ghet das nicht so richtig.
Das Problem ist auch, dass mir die Fehlermeldung NULL sagt.
Wie bereits erwähnt, währe eine richtige SQL "Abfrage" zielführend.
Selbstzusammenbauen ist bei mir eben nicht.

von Kirsten B. (Gast)


Lesenswert?

Ps.: Anfrage kann auch in der MySQL Konsole ausgeführt werden.

von Markus W. (dl8mby)


Lesenswert?

Sind journalpos und artikel die wirklichen Tabellennamen,
oder hast Du sie nur einet Tabellen-Überschrift entnommen?

mach mal select count(*) from artikel;
und
select count(*) from journalpos;

Das zeigt Dir die Anzahl der Einträge in der Tabelle
und ob der Tabellen-Name stimmt.

Markus

von Markus W. (dl8mby)


Lesenswert?

Wenn du eine MySQL Konsole hast,

mach mal show databases;

Und Poste mal hir.

Dann use <den zugehörigen DB-Namen>;

show tabels;

Und poste auch die mal hier.

Dann  mach mal

desc journalpos;

und

desc artikel;

Das zeigt Dir den Tabellenaufbau.


;-) Schnellkurs in MySQL-SQL.

Markus

: Bearbeitet durch User
von Herbert B. (Gast)


Lesenswert?

Kirsten B. schrieb:
> Das Problem ist auch, dass mir die Fehlermeldung NULL sagt.
Der Tabellenname stimmt nicht.

Entweder ist er wirklich falsch oder die passende DB wo diese Tabellen 
drinn sind wurde nicht vorher ausgewählt.

Mach mal
SHOW DATABASES;


Danach wählt du die passende aus mit
USE derNAmeDerDBmitDenPassendenTabellen;

Zur Kontrolle lässt du dir die Tabellen der ausgewählten Datenbank 
anzeigen:

show tables;

Wenn die Tabellen auftauchen die du oben brauchst ist es die richtige 
DB.

Jetzt kannst du nochmal dein UPDATE.... ausführen.

von Kirsten B. (Gast)


Lesenswert?

Ich habe die Abfragen in HEidiSQL gemacht,
weil es das selbe liefert und besser zu bedienen ist.

Folgendes geht (Liefert plauible Werte zurück):

select count(*) from journalpos;
select count(*) from artikel;

select ARTNUM from journalpos;
select ARTNUM from artikel;
select GEWICHT from journalpos;
select GEWICHT from artikel;

show tables; liefert:
1
Tables_in_mysql4122
2
adressen
3
adressen_asp
4
adressen_lief
5
adressen_loesch
6
adressen_log
7
adressen_merk
8
adressen_to_merk
9
adressen_versicherung
10
adressen_wgr_rabatt
11
adressgruppen
12
anrufe
13
artikel
14
artikel_attribut
15
artikel_attribut_optionen
16
artikel_bdaten
17
artikel_bdaten_vkau
18
artikel_etikett
19
artikel_historie
20
artikel_inventur
21
artikel_inventur_sn
22
artikel_kat
23
artikel_kat_ltext
24
artikel_log
25
artikel_ltext
26
artikel_merk
27
artikel_pakete
28
artikel_pakete_pos
29
artikel_preis
30
artikel_schnellzugriff
31
artikel_schnellzugriff_log
32
artikel_sernum
33
artikel_shop
34
artikel_stuecklist
35
artikel_to_attribut
36
artikel_to_kat
37
artikel_to_merk
38
artikel_to_vorgabezeit
39
artikel_var
40
back_adressen
41
back_adressen_asp
42
back_adressen_lief
43
back_adressen_loesch
44
back_adressen_log
45
back_adressen_merk
46
back_adressen_to_merk
47
back_adressen_versicherung
48
back_adressen_wgr_rabatt
49
back_adressgruppen
50
back_anrufe
51
back_artikel
52
back_artikel_attribut
53
back_artikel_attribut_optionen
54
back_artikel_bdaten
55
back_artikel_bdaten_vkau
56
back_artikel_etikett
57
back_artikel_historie
58
back_artikel_inventur
59
back_artikel_inventur_sn
60
back_artikel_kat
61
back_artikel_kat_ltext
62
back_artikel_log
63
back_artikel_ltext
64
back_artikel_merk
65
back_artikel_pakete
66
back_artikel_pakete_pos
67
back_artikel_preis
68
back_artikel_schnellzugriff
69
back_artikel_schnellzugriff_log
70
back_artikel_sernum
71
back_artikel_shop
72
back_artikel_stuecklist
73
back_artikel_to_attribut
74
back_artikel_to_kat
75
back_artikel_to_merk
76
back_artikel_to_vorgabezeit
77
back_artikel_var
78
back_benutzerrechte
79
back_benutzerrechte_log
80
back_blz
81
back_dep
82
back_ekbestell
83
back_ekbestell_info
84
back_ekbestell_op
85
back_ekbestell_pos
86
back_ekeingang
87
back_ekeingang_pos
88
back_ekeingang_pos_sernum
89
back_export
90
back_export_parameter
91
back_fibu_ect
92
back_fibu_ect_export
93
back_fibu_konten
94
back_firma
95
back_gelangen
96
back_hersteller
97
back_hersteller_info
98
back_info
99
back_inventur
100
back_journal
101
back_journal_abschlag
102
back_journal_op
103
back_journalpos
104
back_journalpos_sernum
105
back_karten
106
back_kasse_abschluss
107
back_kasse_abschluss_pos
108
back_kasse_protokoll
109
back_kfz
110
back_lager
111
back_lager_mengen
112
back_land
113
back_lieferarten
114
back_lieferschein
115
back_lieferschein_pos
116
back_lieferzeiten
117
back_link
118
back_login
119
back_mahnung
120
back_mail
121
back_mail_adressen
122
back_mail_anhang
123
back_mail_konten
124
back_mail_ordner
125
back_mail_regeln
126
back_mengeneinheit
127
back_mitarbeiter
128
back_mitarbeiter_log
129
back_nummern_log
130
back_pim_aufgaben
131
back_pim_kontakte
132
back_pim_termine
133
back_plz
134
back_pos_ta
135
back_produktion
136
back_produktion_bdaten
137
back_produktion_fertig
138
back_produktion_komm
139
back_produktion_komm_pos
140
back_produktion_pos
141
back_produktion_pos_sernum
142
back_produktion_vorgabezeiten
143
back_produktion_zeiten
144
back_projekte
145
back_rabattgruppen
146
back_rabmatrix
147
back_registry
148
back_registry_log
149
back_rksv_log
150
back_schriftverkehr
151
back_schriftverkehr_adr
152
back_sprachen
153
back_textbausteine
154
back_ueberweisungen
155
back_umsatzzaehler
156
back_vertrag
157
back_vertragpos
158
back_vertreter
159
back_vertreter_abr
160
back_warengruppen
161
back_warengruppen_log
162
back_wartung
163
back_zahlungen
164
back_zahlungsarten
165
back_zahlungsarten_log
166
back_zeiten_aufgaben
167
back_zeiten_mitarbeiter
168
back_zeiten_projekt
169
back_zeiten_stempel
170
back_zusatzdaten
171
benutzerrechte
172
benutzerrechte_log
173
blz
174
dep
175
ekbestell
176
ekbestell_info
177
ekbestell_op
178
ekbestell_pos
179
ekeingang
180
ekeingang_pos
181
ekeingang_pos_sernum
182
export
183
export_parameter
184
fibu_ect
185
fibu_ect_export
186
fibu_konten
187
firma
188
gelangen
189
hersteller
190
hersteller_info
191
info
192
inventur
193
journal
194
journal_abschlag
195
journal_op
196
journalpos
197
journalpos_sernum
198
karten
199
kasse_abschluss
200
kasse_abschluss_pos
201
kasse_protokoll
202
kfz
203
lager
204
lager_mengen
205
land
206
lieferarten
207
lieferschein
208
lieferschein_pos
209
lieferzeiten
210
link
211
login
212
mahnung
213
mail
214
mail_adressen
215
mail_anhang
216
mail_konten
217
mail_ordner
218
mail_regeln
219
mengeneinheit
220
mitarbeiter
221
mitarbeiter_log
222
nummern_log
223
pim_aufgaben
224
pim_kontakte
225
pim_termine
226
plz
227
pos_ta
228
produktion
229
produktion_bdaten
230
produktion_fertig
231
produktion_komm
232
produktion_komm_pos
233
produktion_pos
234
produktion_pos_sernum
235
produktion_vorgabezeiten
236
produktion_zeiten
237
projekte
238
rabattgruppen
239
rabmatrix
240
registry
241
registry_log
242
rksv_log
243
schriftverkehr
244
schriftverkehr_adr
245
sprachen
246
textbausteine
247
ueberweisungen
248
umsatzzaehler
249
vertrag
250
vertragpos
251
vertreter
252
vertreter_abr
253
warengruppen
254
warengruppen_log
255
wartung
256
zahlungen
257
zahlungsarten
258
zahlungsarten_log
259
zeiten_aufgaben
260
zeiten_mitarbeiter
261
zeiten_projekt
262
zeiten_stempel
263
zusatzdaten

desc journalpos; liefert:
1
Field  Type  Null  Key  Default  Extra
2
REC_ID  int(11)  NO  PRI  \N  auto_increment
3
QUELLE  tinyint(4)  NO  MUL  0  
4
QUELLE_SUB  tinyint(4)  NO    0  
5
QUELLE_SRC  int(11)  NO  MUL  -1  
6
QUELLE_WE  int(11)  NO    -1  
7
PROJEKT_ID  int(11)  NO    -1  
8
JOURNAL_ID  int(11)  NO  MUL  0  
9
JOURNAL_SRC  int(11)  NO    -1  
10
WARENGRUPPE  int(11)  NO    -1  
11
ARTIKELTYP  char(1)  NO      
12
ARTIKEL_ID  int(11)  NO  MUL  -1  
13
TOP_POS_ID  int(11)  NO    -1  
14
ADDR_ID  int(11)  NO  MUL  -1  
15
LTERMIN  date  YES    \N  
16
ATRNUM  varchar(100)  YES    \N  
17
VRENUM  varchar(20)  NO      
18
POSITION  int(11)  NO    0  
19
VIEW_POS  char(3)  YES    \N  
20
LVPOS  varchar(255)  YES    \N  
21
MATCHCODE  varchar(255)  YES    \N  
22
ARTNUM  varchar(100)  YES    \N  
23
BARCODE  varchar(20)  YES    \N  
24
MENGE  decimal(10,3)  NO    0.000  
25
MENGE_STK  decimal(10,3)  NO    0.000  
26
LAENGE  varchar(20)  YES    \N  
27
BREITE  varchar(20)  YES    \N  
28
HOEHE  varchar(20)  YES    \N  
29
GROESSE  varchar(20)  YES    \N  
30
DIMENSION  varchar(20)  YES    \N  
31
GEWICHT  decimal(10,4)  NO    0.0000  
32
ME_EINHEIT  varchar(50)  YES    \N  
33
PR_EINHEIT  decimal(10,3)  NO    1.000  
34
VPE  decimal(10,3)  NO    1.000  
35
EK_PREIS  decimal(10,4)  NO    0.0000  
36
CALC_FAKTOR  decimal(10,5)  NO    0.00000  
37
EPREIS  decimal(10,4)  NO    0.0000  
38
GPREIS  decimal(10,2)  NO    0.00  
39
E_RGEWINN  decimal(10,4)  NO    0.0000  
40
G_RGEWINN  decimal(10,2)  NO    0.00  
41
RABATT  decimal(10,2)  NO    0.00  
42
RABATT2  decimal(10,4)  NO    0.0000  
43
RABATT3  decimal(10,4)  NO    0.0000  
44
E_RABATT_BETRAG  decimal(10,4)  NO    0.0000  
45
G_RABATT_BETRAG  decimal(10,2)  NO    0.00  
46
STEUER_CODE  tinyint(4)  NO    0  
47
ALTTEIL_PROZ  decimal(10,2)  NO    0.10  
48
ALTTEIL_STCODE  tinyint(4)  NO    0  
49
PROVIS_PROZ  decimal(5,2)  NO    0.00  
50
PROVIS_WERT  decimal(10,2)  NO    0.00  
51
GEBUCHT  enum('N','Y')  NO    N  
52
GEGENKTO  int(11)  NO    -1  
53
BEZEICHNUNG  text  YES    \N  
54
BEZEICHNUNG_LAND  text  YES    \N  
55
POS_TEXT1  varchar(250)  YES    \N  
56
POS_TEXT2  varchar(250)  YES    \N  
57
POS_TEXT3  varchar(250)  YES    \N  
58
POS_DATUM  date  YES    \N  
59
SN_FLAG  enum('N','Y')  NO    N  
60
ALTTEIL_FLAG  enum('N','Y')  NO    N  
61
BEZ_FEST_FLAG  enum('N','Y')  NO    N  
62
BRUTTO_FLAG  enum('N','Y')  NO    N  
63
NO_RABATT_FLAG  enum('N','Y')  NO    N  
64
APOS_FLAG  enum('N','Y')  NO    N  
65
EKEINGANG  enum('N','Y')  NO    N  
66
WARENGRUPPENNAME  varchar(250)  YES    \N  
67
PROJEKT_ARTIKEL  tinyint(1)  NO    0  
68
FREMD_EPREIS  decimal(10,4)  NO    0.0000  
69
FREMD_GPREIS  decimal(10,2)  NO    0.00  
70
ENDS_EPREIS  decimal(10,4)  NO    0.0000  
71
ENDS_GPREIS  decimal(10,2)  NO    0.00  
72
ENDS_WG  int(11)  NO    -1  
73
ENDS_WGNAME  varchar(250)  YES    \N  
74
PROJEKTPREIS  enum('N','Y')  YES    N

desc artikel; liefert:
1
Field  Type  Null  Key  Default  Extra
2
REC_ID  int(11)  NO  PRI  \N  auto_increment
3
ARTNUM  varchar(100)  YES  MUL  \N  
4
ERSATZ_ARTNUM  varchar(100)  YES    \N  
5
ERSATZ_ARTIKEL_ID  int(11)  NO    -1  
6
MATCHCODE  varchar(255)  YES  MUL  \N  
7
WARENGRUPPE  int(11)  NO  MUL  0  
8
RABGRP_ID  varchar(10)  NO    -  
9
BARCODE  varchar(40)  YES  MUL  \N  
10
BARCODE2  varchar(40)  YES    \N  
11
BARCODE3  varchar(40)  YES    \N  
12
ARTIKELTYP  char(1)  NO    N  
13
KURZNAME  varchar(150)  YES    \N  
14
LANGNAME  text  YES    \N  
15
KAS_NAME  varchar(150)  YES    \N  
16
INFO  text  YES    \N  
17
ME_ID  int(11)  NO    1  
18
VPE  decimal(10,3)  NO    1.000  
19
VPE_EK  decimal(10,3)  NO    1.000  
20
PR_EINHEIT  decimal(10,2)  NO    1.00  
21
LAENGE  varchar(20)  YES    \N  
22
BREITE  varchar(20)  YES    \N  
23
HOEHE  varchar(20)  YES    \N  
24
GROESSE  varchar(20)  YES    \N  
25
DIMENSION  varchar(20)  YES    \N  
26
GEWICHT  decimal(10,4)  NO    0.0000  
27
INVENTUR_WERT  decimal(5,2)  NO    100.00  
28
EK_PREIS  decimal(12,4)  NO    0.0000  
29
EK_VPE  decimal(12,4)  NO    0.0000  
30
EKDS_PREIS  decimal(12,4)  NO    0.0000  
31
VK1  decimal(12,4)  NO    0.0000  
32
VK1B  decimal(12,4)  NO    0.0000  
33
VK2  decimal(12,4)  NO    0.0000  
34
VK2B  decimal(12,4)  NO    0.0000  
35
VK3  decimal(12,4)  NO    0.0000  
36
VK3B  decimal(12,4)  NO    0.0000  
37
VK4  decimal(12,4)  NO    0.0000  
38
VK4B  decimal(12,4)  NO    0.0000  
39
VK5  decimal(12,4)  NO    0.0000  
40
VK5B  decimal(12,4)  NO    0.0000  
41
BASISPR_FAKTOR  decimal(10,5)  NO    1.00000  
42
BASISPR_ME_ID  int(11)  NO    1  
43
MAXRABATT  decimal(5,2)  NO    0.00  
44
MINGEWINN  decimal(5,2)  NO    0.00  
45
PROVIS_PROZ  decimal(5,2)  NO    0.00  
46
STEUER_CODE  tinyint(4)  NO    2  
47
ALTTEIL_FLAG  enum('N','Y')  NO    N  
48
NO_RABATT_FLAG  enum('N','Y')  NO    N  
49
NO_PROVISION_FLAG  enum('N','Y')  NO    N  
50
NO_BEZEDIT_FLAG  enum('N','Y')  NO    N  
51
NO_EK_FLAG  enum('N','Y')  NO    N  
52
NO_VK_FLAG  enum('N','Y')  NO    N  
53
SN_FLAG  enum('N','Y')  NO    N  
54
FSK18_FLAG  enum('N','Y')  NO    N  
55
AUTODEL_FLAG  enum('N','Y')  NO    N  
56
KOMMISION_FLAG  enum('N','Y')  YES    \N  
57
LIZENZ_FLAG  enum('N','Y')  NO    N  
58
PRODUKTION_FLAG  enum('N','Y')  NO    N  
59
NO_STOCK_FLAG  enum('N','Y')  NO    N  
60
KONFIG  tinyint(1)  NO    0  
61
KENNZEICHNUNG_FLAG  tinyint(1)  NO    0  
62
MENGE_FLAG  tinyint(1)  NO    0  
63
PROD_DAUER  int(5) unsigned  NO    14  
64
VK_LIEFERZEIT_ID  int(11) unsigned  NO    1  
65
EK_LIEFERZEIT_ID  int(11) unsigned  NO    1  
66
MENGE_START  decimal(12,4)  NO    0.0000  
67
MENGE_AKT  decimal(12,4)  NO    0.0000  
68
MENGE_MIN  decimal(12,4)  NO    0.0000  
69
MENGE_BVOR  decimal(12,4)  NO    0.0000  
70
MENGE_WARN  decimal(12,4)  NO    0.0000  
71
DEFAULT_LIEF_ID  int(11)  NO    -1  
72
ERLOES_KTO  int(11)  YES    \N  
73
AUFW_KTO  int(11)  YES    \N  
74
HERKUNFTSLAND  char(3)  YES    \N  
75
HERSTELLER_ID  int(11)  NO    -1  
76
HERST_ARTNUM  varchar(100)  YES    \N  
77
LAGERORT  varchar(255)  YES    \N  
78
PFAND1_ARTIKEL_ID  int(11)  NO    -1  
79
PFAND1_MENGE  decimal(10,3)  NO    1.000  
80
PFAND2_ARTIKEL_ID  int(11)  NO    -1  
81
PFAND2_MENGE  decimal(10,3)  NO    0.000  
82
ZOLLNUMMER  varchar(250)  YES    \N  
83
ETIKETT_PRINT  tinyint(3) unsigned  NO    0  
84
LIEFSTATUS  enum('LAGER','AUSLAUF','AUSGELAUFEN')  NO    LAGER  
85
LIEFERTERMIN  date  YES    \N  
86
VARARTNUM  varchar(100)  YES    \N  
87
VARTEXT  varchar(255)  YES    \N  
88
VAR_ID  int(11)  YES    -1  
89
VARNAME  varchar(255)  YES    \N  
90
NE_ZUSCHLAG_FLAG  enum('N','Y')  NO    N  
91
NE_GEWICHT  decimal(10,3)  NO    0.000  
92
NE_TYP  varchar(10)  YES    \N  
93
ERSTELLT  datetime  YES    \N  
94
ERST_NAME  varchar(20)  YES    \N  
95
GEAEND  datetime  YES    \N  
96
GEAEND_NAME  varchar(20)  YES    \N  
97
SHOP_ID  tinyint(4)  NO  MUL  -1  
98
SHOP_ARTIKEL_ID  int(11)  NO    -1  
99
SHOP_KURZTEXT  text  YES    \N  
100
SHOP_LANGTEXT  text  YES    \N  
101
SHOP_IMAGE  varchar(100)  YES    \N  
102
SHOP_IMAGE_MED  varchar(100)  YES    \N  
103
SHOP_IMAGE_LARGE  varchar(100)  YES    \N  
104
SHOP_DATENBLATT  varchar(100)  YES    \N  
105
SHOP_KATALOG  varchar(100)  YES    \N  
106
SHOP_ZEICHNUNG  varchar(100)  YES    \N  
107
SHOP_HANDBUCH  varchar(100)  YES    \N  
108
AUSSCHREIBUNGSTEXT  varchar(100)  YES    \N  
109
SHOP_PREIS_LISTE  decimal(12,4)  NO    0.0000  
110
SHOP_VISIBLE  int(1)  YES    \N  
111
SHOP_DATE_NEU  date  YES    \N  
112
SHOP_FAELLT_WEG_AB  date  YES    \N  
113
SHOP_CLICK_COUNT  int(11)  YES    \N  
114
SHOP_SYNC  tinyint(1) unsigned  YES    \N  
115
SHOP_ZUB  tinyint(1) unsigned  YES    \N  
116
SHOP_CHANGE_DATE  datetime  YES    \N  
117
SHOP_CHANGE_FLAG  tinyint(1) unsigned  NO    0  
118
SHOP_DEL_FLAG  enum('N','Y')  NO    N  
119
SHOP_PASSWORD  varchar(20)  YES    \N  
120
SHOP_META_TITEL  varchar(255)  YES    \N  
121
SHOP_META_BESCHR  text  YES    \N  
122
SHOP_META_KEY  varchar(255)  YES    \N  
123
SHOP_SORT  int(11) unsigned  NO    0  
124
SHOP_LIEFSTATUS  int(11) unsigned  NO    1  
125
SHOP_LIEFTEXT  varchar(255)  NO    Standard  
126
SHOP_CHANGE_LIEF  int(1) unsigned  NO    0  
127
USERFELD_01  varchar(255)  YES    \N  
128
USERFELD_02  varchar(255)  YES    \N  
129
USERFELD_03  varchar(255)  YES    \N  
130
USERFELD_04  varchar(255)  YES    \N  
131
USERFELD_05  varchar(255)  YES    \N  
132
USERFELD_06  varchar(255)  YES    \N  
133
USERFELD_07  varchar(255)  YES    \N  
134
USERFELD_08  varchar(255)  YES    \N  
135
USERFELD_09  varchar(255)  YES    \N  
136
USERFELD_10  varchar(255)  YES    \N  
137
PROJEKT_ARTIKEL  tinyint(1)  NO    0  
138
ENDS_PREIS  decimal(12,4)  NO    0.0000  
139
ENDS_WG  int(11)  YES    \N  
140
HINWEIS  text  YES    \N

von Markus W. (dl8mby)


Lesenswert?

Heinerich,

wurde schon geposted - von mir ;-)

LG
Markus

von Herbert B. (Gast)


Lesenswert?

Markus W. schrieb:
> wurde schon geposted - von mir ;-)
Ja ich habe es nach dem absenden gemerkt. ;)

von Markus W. (dl8mby)


Lesenswert?

Kirsten,

bist Du Dir sicher, dass bei der Menge von Tabellen,
was auf eine gewisse Komplexität schließen lässt, ein
verändern der Tabellen-Inhalte hinten durch die Brust,
sinnvoll ist.

Das back_xxxx lässt drauf schließen, dass die Applikation
selber Backups der Tabellen macht.

Kannst Du die Applikation beenden und dann erst die Daten-
basis modifizieren, oder ist es Dir nicht möglich, weil
Du nur ein Client auf die DBk bist.

Ich kenne leider das zugehörige Programm nicht.

LG
Markus

von Kirsten B. (Gast)


Lesenswert?

Ich habe jetzt schon erfolgreich folgendes probiert:
UPDATE journalpos SET GEWICHT= 13 WHERE ARTNUM = "001015";

Aber das Gewicht aus der Tabelle "artikel" kann ich nicht zuweisen.
Ausserdem sollten alle ARTNUM im artikel durchgegangen werden.

Es soll nur das Gewicht in journalpos geändert werden.
Das geht ohne Problem.

von Kirsten B. (Gast)


Lesenswert?

CAO Faktura kann beendet werden.
Ausserdem bin ich Administrator auf dem PC.
Datenbank läuft auf dem PC.

von Markus W. (dl8mby)


Lesenswert?

OK,

wollte nur sicherstellen, das Du Dein System nicht schrottest
und dann "böse" auf mich bist ;-).

Dann kannst Du ja dich an der Datenbank vergreifen, mit allen
Konsequenzen.

Markus

von Markus W. (dl8mby)


Lesenswert?

Kirsten

hast Du mal geschaut, ob die Anzahl der
Einträge in den beiden Tabellen identisch ist?

select count(*) from journalpos;
select count(*) from artikel;

Die Werte/Resultate hast Du ja nicht gepostet.

Nicht dass Du gewisse Werte änderst und andere wieder nicht
und damit ein gewisses Durcheinander verursachst.
Oder wäre das nicht so schlimm?

Markus

: Bearbeitet durch User
von Kirsten B. (Gast)


Lesenswert?

Das hier geht auch schon:
UPDATE journalpos SET GEWICHT= (select GEWICHT from artikel where ARTNUM 
= "001015") WHERE ARTNUM = "001015";

Wie kann ich eine for Schleife erstellen, welche alle ARTNUM von 000000 
bis 999999 durchgeht?

select count(*) from journalpos; liefert: 23257
select count(*) from artikel; liefert 465

Was ich weiss:
Im Journalpos werden die einzelnen Positionen (Artikel) aufgelistet, 
welche auf einer Rechnung enthalten sind.
Artikel enthält die einzelnen Artikelmerkmale

Leider ist da der CAO Faktura Support so schlecht.
Es gibt ja nicht einmal ein Handbuch / Anleitung dazu.
CAO Faktura Bewertung : Übelst.

von Thomas W. (Gast)


Lesenswert?

Moin, -

bevor Du mit dem Massenupdate anfaengst (ein vergessenes WHERE aendert 
alles):

- Hast Du ein funktionsfaehiges Backup?

- Kannst Du die Daten erfolgreich wieder einlesen? z.b. auf eine Test-
  Maschine?

Gruesse

Th.

von Kirsten B. (Gast)


Lesenswert?

Kann ich beides bejahen :-)
Backup erstellt und auch getestet !

von Markus W. (dl8mby)


Lesenswert?

Kirsten,



>Was ich weiss:
>Im Journalpos werden die einzelnen Positionen (Artikel) aufgelistet,
>welche auf einer Rechnung enthalten sind.

Du willst also "journalpos" (die Rchnungen) mir den
zugehörigen "GEWICHT" aus der Tabelle "artikel" korrigieren.

Bedeutet:
Du suchst Dir von jeder Position aus "journalpos" die "ARTNUM"
raus schaust nach dem zugehörigem "GEWICHT" in "artikel" unter
der "ARTNUM" und kopiertst den "GEWICHT"-wert nach "journalpos.
GWEICHT"

So in etwa.

Das sollte mit einer Query möglich sein.
Werde mal schauen ob ich das hinkriege, oder jemand
schneller ist.

Markus

von Markus W. (dl8mby)


Lesenswert?

Meine Lösung,

bitte testen!!!

UPDATE journalpos SET GEWICHT = (select GEWICHT from journalpos where 
journalpos.ARTNUM=artikel.ARTNUM)
WHERE EXISTS (SELECT ARTNUM FROM journalpos WHERE 
journalpos.ARTNUM=artikel.ARTNUM);

und mögen sich die SQL-Experten melden, wenn ich noch einen
Wurm drin habe.

Markus

: Bearbeitet durch User
von Kirsten B. (Gast)


Angehängte Dateien:

Lesenswert?

Geht leider nicht :-(

von Markus W. (dl8mby)


Lesenswert?

Meine Lösung mit einer Test-DBk.
>sqlite3 ./db.bin
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> CREATE TABLE journalpos (
   ...> ID INTEGER PRIMARY KEY,
   ...> ARTNUM TEXT NOT NULL,
   ...> GEWICHT TEXT NOT NULL);
sqlite> CREATE TABLE artikel (
   ...> ID INTEGER PRIMARY KEY,
   ...> ARTNUM TEXT NOT NULL,
   ...> GEWICHT TEXT NOT NULL);
sqlite> INSERT INTO artikel (ID,ARTNUM,GEWICHT) VALUES(1,'001','10kg');
sqlite> INSERT INTO artikel (ID,ARTNUM,GEWICHT) VALUES(2,'002','20kg');
sqlite> INSERT INTO artikel (ID,ARTNUM,GEWICHT) VALUES(3,'003','30kg');

sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(1,'001','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(2,'001','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(3,'001','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(4,'002','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(5,'002','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(6,'002','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(7,'003','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(4,'003','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(8,'003','0');
sqlite> INSERT INTO journalpos (ID,ARTNUM,GEWICHT) VALUES(9,'003','0');

sqlite> select * from artikel;
1|001|10kg
2|002|20kg
3|003|30kg

sqlite> select * from journalpos;
1|001|0
2|001|0
3|001|0
4|002|0
5|002|0
6|002|0
7|003|0
8|003|0
9|003|0

sqlite> UPDATE journalpos SET GEWICHT = (select GEWICHT from journalpos 
where journalpos.ARTNUM=artikel.ARTNUM)
   ...> WHERE EXISTS (SELECT ARTNUM FROM journalpos WHERE 
journalpos.ARTNUM=artikel.ARTNUM);
Error: no such column: artikel.ARTNUM

Hast recht ist noch ein Wurm drin - eine Augenblick.

Markus

von Markus W. (dl8mby)


Angehängte Dateien:

Lesenswert?

Stehe noch auf dem Schlauch.

Laut SQL Konvention werden Tabellennamen
mittels "Punkt" vom Spalten-Namen getrennt.

Bin noch am Suchen.

Markus

von Markus W. (dl8mby)


Lesenswert?

So nun hat es geklappt!

sqlite> select * FROM journalpos j JOIN artikel a ON j.ARTNUM = 
a.ARTNUM;
1|001|0|1|001|10kg
2|001|0|1|001|10kg
3|001|0|1|001|10kg
4|002|0|2|002|20kg
5|002|0|2|002|20kg
6|002|0|2|002|20kg
7|003|0|3|003|30kg
8|003|0|3|003|30kg
9|003|0|3|003|30kg
sqlite> select GEWICHT FROM journalpos j JOIN artikel a ON j.ARTNUM = 
a.ARTNUM;
Error: ambiguous column name: GEWICHT
sqlite> select j.GEWICHT FROM journalpos j JOIN artikel a ON j.ARTNUM = 
a.ARTNUM;
0
0
0
0
0
0
0
0
0
sqlite> select a.GEWICHT FROM journalpos j JOIN artikel a ON j.ARTNUM = 
a.ARTNUM;
10kg
10kg
10kg
20kg
20kg
20kg
30kg
30kg
30kg
sqlite> select a.GEWICHT FROM journalpos j JOIN artikel a ON j.ARTNUM = 
a.ARTNUM;
10kg
10kg
10kg
20kg
20kg
20kg
30kg
30kg
30kg
sqlite>
sqlite>
sqlite> UPDATE journalpos SET GEWICHT=(select a.GEWICHT FROM journalpos 
j JOIN artikel a ON j.ARTNUM = a.ARTNUM);

sqlite> select * from journalpos;
1|001|10kg
2|001|10kg
3|001|10kg
4|002|10kg
5|002|10kg
6|002|10kg
7|003|10kg
8|003|10kg
9|003|10kg


Markus

von Markus W. (dl8mby)


Lesenswert?

Nur damit es keine Verwirrung gibt.

Oben ist nur mein Fehler-Findungs-Weg dargestellt.
Die richtige Query ist die u.g.

UPDATE journalpos SET GEWICHT=(select a.GEWICHT FROM journalpos
j JOIN artikel a ON j.ARTNUM = a.ARTNUM);

Markus

PS.: Hatte schon lange keinen JOIN in meinen Abfragen, sorry.

von Markus W. (dl8mby)


Lesenswert?

Stop!

ist wohl immer noch der Wurm drin %-)

sqlite> select * from journalpos;
1|001|10kg
2|001|10kg
3|001|10kg
4|002|10kg
5|002|10kg
6|002|10kg
7|003|10kg
8|003|10kg
9|003|10kg

Markus

von ThomasW (Gast)


Lesenswert?

In MySql sollte es eigentlich so gehen:

update journalpos j, artikel a
set j.GEWICHT=a.GEWICHT
where j.ARTNUM=a.ARTNUM;

Aber mal zum Verständnis: ist die Menge im Journal immer 1 oder müsste 
da nicht ein Faktor hin?

von Markus W. (dl8mby)


Lesenswert?

Bei mir klappt es leider noch nicht.



sqlite> update journalpos j, artikel a set j.GEWICHT=a.GEWICHT where 
j.ARTNUM=a.ARTNUM;
Error: near "j": syntax error


Bin etwas am Verzweifeln, der JOIN liefert mir die
richtigen Ergebnisse aber...
sqlite> select a.GEWICHT FROM artikel a JOIN journalpos j ON a.ARTNUM = 
j.ARTNUM;
10kg
10kg
10kg
20kg
20kg
20kg
30kg
30kg
30kg

der UPDATE schreibt nur 10kg in alle GEWICHTe von journalpos.

Irgendwo habe ich noch einen Denkfehler.

Markus

von Kirsten B. (Gast)


Angehängte Dateien:

Lesenswert?

Markus W. schrieb:
> UPDATE journalpos SET GEWICHT=(select a.GEWICHT FROM journalpos
> j JOIN artikel a ON j.ARTNUM = a.ARTNUM);

von Kirsten B. (Gast)


Lesenswert?

ThomasW schrieb:
> In MySql sollte es eigentlich so gehen:
>
> update journalpos j, artikel a
> set j.GEWICHT=a.GEWICHT
> where j.ARTNUM=a.ARTNUM;

DAS macht genau das, was ich gesucht habe !
Dankeschön :-D

von Markus W. (dl8mby)


Lesenswert?

Dann hat SQLite3 eine etwas andere Syntax wie MySQL.
Habe auch was dazu gelernt. Nächsten mal die selbe
DBk zum Testen verwenden.

Dann ist ja Kirsten geholfen und sie hat was neues gelernt ;-)

Markus

von Clemens L. (c_l)


Lesenswert?

Markus W. schrieb:
> Dann hat SQLite3 eine etwas andere Syntax wie MySQL.

https://www.sqlite.org/lang_update.html#upfrom

von Markus W. (dl8mby)


Angehängte Dateien:

Lesenswert?

Clemens,

dem update Schema, siehe PNG, ist ja eine
Komma separierte Liste für Tabellennamen zulässig.

aber,
sqlite> update journalpos j, artikel a set j.GEWICHT=a.GEWICHT where 
j.ARTNUM=a.ARTNUM;
Error: near "j": syntax error

siehe den Fehler.

Markus

von Pandur S. (jetztnicht)


Lesenswert?

Ohne jetzt alles gelesen zu haben. Das Tool zum Aendern der Datenbank 
ist phpMyAdmin, Das ist ueblicherweise bei der MariaDB installiert. Das 
erlaubt haendisch zu editieren.

von Sven K. (svenk)


Lesenswert?

Hallo,

ich möchte auch noch mal darauf hinweisen das in Journalpos die 
Zeilenposition eines Belegs auftaucht.
Dh. das Gewicht muss doch bei mehr als 1ner Artikelanzahl multipliziert 
werden.
Durch das Script wurde nur das Gewicht für 1 Stück Geschrieben.

Gruß Sven

von Nick M. (Gast)


Lesenswert?

Ich möchte darauf hinweisen, dass das Kopieren eines Spaltenwertes aus 
einer Tabelle in eine Andere klar den Regeln für die Normalformen von 
Datenbanken widerspricht. Sowas ist grundsätzlich falsch.
Und wenn das der Programmierer der DB schon falsch gemacht hat, dann hat 
er das Attribut Trottel.

Das Gewicht eines Artikels kann nur aus der Artikel-Tabelle kommen und 
nur dort vorhanden sein.

https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

von Clemens L. (c_l)


Lesenswert?

Markus W. schrieb:
> sqlite> update journalpos j, artikel a set j.GEWICHT=a.GEWICHT where
> j.ARTNUM=a.ARTNUM;
> Error: near "j": syntax error

update journalpos set GEWICHT=a.GEWICHT from artikel a where 
journalpos.ARTNUM=a.ARTNUM;

: Bearbeitet durch User
von Horst G. (horst_g532)


Lesenswert?

Nick M. schrieb:
> Und wenn das der Programmierer der DB schon falsch gemacht hat, dann hat
> er das Attribut Trottel.

Und was machen wir jetzt mit dieser Information?
Es ist ja schön, dass du im Studium gelernt hast, was eine 
Datenbanknormalisierung ist, und dieses Wissen hier auch wiedergeben 
kannst. Nur nutzt das hier keinem etwas:
- Die Datenbankstruktur ist gegeben, wird live genutzt und kann nicht 
mal einfach so geändert werden, selbst wenn man wollte (und jemanden 
hätte, der das machen könnte).
- Die Datenbank funktioniert per se; es gibt keinen zwingenden Grund, 
daran was zu ändern. In der realen Welt da draußen, fern des 
akademischen Elfenbeinturms, muss solche Software zuallererst 
funktionieren, weil der Sinn eines Unternehmens ist, Geld zu verdienen. 
Wie die Datenbanksrruktur aussieht, interessiert absolut niemanden, 
solange dadurch keine Kosten (Wartungsaufwand, deutlich verlängerte 
Abfrage-/Ladezeiten usw.) entstehen bzw. vermieden werden können.
- Deine Feststellung ist der Anlass des hier beschriebenen Symptoms, ja. 
Ebenso wurde aber auch schon festgestellt, dass die Software suboptimal, 
der Support nicht vorhanden und der (einzige?) Entwickler etwas 
"speziell" ist – was meinst du also, wird passieren, wenn man dem 
Entwickler nun erklärt, dass sein Datenbankschema Murks ist und dringend 
geändert werden muss?

von Nick M. (Gast)


Lesenswert?

Horst G. schrieb:
> Und was machen wir jetzt mit dieser Information?

Evtl. das nochmal lesen?

Kirsten B. schrieb:
> Es gibt ein Rechnungsjournal, in welchem sich die ganzen gebuchten
> Artikel befinden.
> Diesen Artikeln sollen !nachträglich! ein Gewicht zugewiesen werden.
> Das Gewicht brauche ich für die Vorlage für die Verpackungsverordnung
> beim Lizensierer
> und auch zur Gewichtsabrechung laut ElektroG.

Es genügt, aus dem Rechnungsjournal die Artikelnummern zu lesen und dann 
aus der Artikel-Tabelle die Gewichte zu ermitteln.
Die Auswertung wurde ja nicht vom ahnungslosen "Profi" gemacht, sondern 
von einem Anwender, der es auch nicht kann.

Horst G. schrieb:
> was meinst du also, wird passieren, wenn man dem
> Entwickler nun erklärt, dass sein Datenbankschema Murks ist und dringend
> geändert werden muss?

Dem ist es egal. Den Anwendern nicht. Die können es sich immer noch 
anders überlegen.

von Dirk K. (merciless)


Lesenswert?

Nick M. schrieb:
> Horst G. schrieb:
>> Und was machen wir jetzt mit dieser Information?
>
> Evtl. das nochmal lesen?
So wie ich das verstehe, soll die Änderung in der DB
von Hand gemacht werden und dann die Liste mit der
Original-Software gedruckt werden. Und die liest
nunmal das Gewicht aus dem Rechnungsjournal.

Ich hatte im Studium auch Vorlesungen im Fach Datenbanken
und ich habe in meiner ganzen Zeit als Entwickler noch
nicht eine DB gesehen, die dem Optimum entsprochen hätte.
(Außer ich hab sie selber angelegt, aber selbst da muss
man manchmal Kompromisse machen).

merciless

von Nick M. (Gast)


Lesenswert?

Dirk K. schrieb:
> und ich habe in meiner ganzen Zeit als Entwickler noch
> nicht eine DB gesehen, die dem Optimum entsprochen hätte.

Was durchaus dazu führen kann, dass derjenige danach kein Entwickler 
mehr für DBen ist.

von Max (Gast)


Lesenswert?

Nick M. schrieb:
> Ich möchte darauf hinweisen, dass das Kopieren eines Spaltenwertes aus
> einer Tabelle in eine Andere klar den Regeln für die Normalformen von
> Datenbanken widerspricht. Sowas ist grundsätzlich falsch.
> Und wenn das der Programmierer der DB schon falsch gemacht hat, dann hat
> er das Attribut Trottel.
>
> Das Gewicht eines Artikels kann nur aus der Artikel-Tabelle kommen und
> nur dort vorhanden sein.
>
> https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)

Sorry, aber da liegst du leider falsch.

Normalisierung ja. -- ABER NICHT BEI RECHNUNGSRELEVANTEN POSITIONEN ! --
Sinn und Zweck des "Kopierens" dieser Werte ist, dass eine Rechnung auch 
nach X Jahren noch 1:1 aus der Datenbank erstellt werden kann. Sollte 
sich in der Zwischenzeit der Artikelstamm geändert haben und Artikel X 
plötzlich statt 1,2 nun 1,3kg wiegen und statt "Kolossales Meisterwerk" 
nun "Kolossaler Reinfall" heißen, wäre die Rechnung nicht mehr die 
Rechnung von vor 2 Jahren. Du verstehst...

von Nick M. (Gast)


Lesenswert?

Max schrieb:
> Sollte
> sich in der Zwischenzeit der Artikelstamm geändert haben und Artikel X
> plötzlich statt 1,2 nun 1,3kg wiegen

Dann hätte er eine andere Artikelnummer.

Max schrieb:
> wäre die Rechnung nicht mehr die
> Rechnung von vor 2 Jahren. Du verstehst...

Ich verstehe, dass gestellte Rechnungen in einer anderen Form archiviert 
werden müssen. Früher hat man Kopien abgeheftet, heute legt man PDFs ab.

von Dirk K. (merciless)


Lesenswert?

Nick M. schrieb:
> Dirk K. schrieb:
>> und ich habe in meiner ganzen Zeit als Entwickler noch
>> nicht eine DB gesehen, die dem Optimum entsprochen hätte.
>
> Was durchaus dazu führen kann, dass derjenige danach kein Entwickler
> mehr für DBen ist.

???

Hast du mal Datenbanken gesehen, die über Jahrzehnte
gewachsen sind und produktiv eingesetzt werden?
Mal an einem Projekt gearbeitet, dass eine solche DB
verwenden/erweitern muss? 90% meiner Tätigkeit hatte
ich die Ehre. Und nein, meistens ist es nicht möglich,
einfach Änderungen herbeizuführen, weil hunderte
andere Applikationen/Skripte auch auf die Daten zugreifen
und man nicht alle ändern kann/darf.

Komm mal runter von deinem Elfenbeinturm!

merciless

von JKa (Gast)


Lesenswert?

Max schrieb:
> Nick M. schrieb:
>> Ich möchte darauf hinweisen, dass das Kopieren eines Spaltenwertes aus
>> einer Tabelle in eine Andere klar den Regeln für die Normalformen von
>> Datenbanken widerspricht. Sowas ist grundsätzlich falsch.
>> Und wenn das der Programmierer der DB schon falsch gemacht hat, dann hat
>> er das Attribut Trottel.
>>
>> Das Gewicht eines Artikels kann nur aus der Artikel-Tabelle kommen und
>> nur dort vorhanden sein.
>>
>> https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
>
> Sorry, aber da liegst du leider falsch.
>
> Normalisierung ja. -- ABER NICHT BEI RECHNUNGSRELEVANTEN POSITIONEN ! --
> Sinn und Zweck des "Kopierens" dieser Werte ist, dass eine Rechnung auch
> nach X Jahren noch 1:1 aus der Datenbank erstellt werden kann. Sollte
> sich in der Zwischenzeit der Artikelstamm geändert haben und Artikel X
> plötzlich statt 1,2 nun 1,3kg wiegen und statt "Kolossales Meisterwerk"
> nun "Kolossaler Reinfall" heißen, wäre die Rechnung nicht mehr die
> Rechnung von vor 2 Jahren. Du verstehst...

Ja, stimmt, aber deswegen versieht ein SW-Architekt auch Stammdaten mit 
einer Version inkl. Gültig-Von und Gültig-Bis oder alternativ Status 
Blocked, Draft, Active, ... (wobei nur eine Version aktiv sein kann)
Erst dann kommt man einer Revision-Sicherheit näher.
Aber das scheint hier ja eh keinen zu interessieren, wenn man auf 
DB-Ebene Daten verändert. Da ich im regulierten Umfeld tätig bin, würde 
ich damit mit einem Bein im Knast stehen, und das ist leider nicht 
übertrieben.

von Udo S. (urschmitt)


Lesenswert?

Nick M. schrieb:
> Was durchaus dazu führen kann, dass derjenige danach kein Entwickler
> mehr für DBen ist

Wenn das so wäre, dann wärst du wahrscheinlich fast der einzige 
Datenbankentwickler auf der ganzen Welt.

Ich bin kein Datenbankprofi, habe aber in den letzten 20 Jahren immer 
wieder mit Datenbanken zu tun.
Da gibts nicht eine, die völlig normalisiert ist.

Trotzdem machen wir mit den Produkten zur Zeit 20 Millionen Umsatz pro 
Jahr, Tendenz steigend, und das seit über 15 Jahren.

Was haben wir nur falsch gemacht?

von Nick M. (Gast)


Lesenswert?

Udo S. schrieb:
> Was haben wir nur falsch gemacht?

"Funktioniert doch" war schon immer ein "gutes" Argument dagegen etwas 
richtig zu machen.

von Markus W. (dl8mby)


Lesenswert?

@Clemens L.

sqlite> update journalpos set GEWICHT=a.GEWICHT from artikel a where 
journalpos.ARTNUM=a.ARTNUM;
Error: near "from": syntax error  %-)


Markus

von leo (Gast)


Lesenswert?

JKa schrieb:
> Version inkl. Gültig-Von und Gültig-Bis oder alternativ Status
> Blocked, Draft, Active

Aha. Du hast also viel Erfahrung in der Praxis mit grossen 
Datenmengen, wo die Abfragezeit eine Rolle spielt ;)

leo

von Clemens L. (c_l)


Lesenswert?

Markus W. schrieb:
> Error: near "from": syntax error

UPDATE FROM gibt es seit Version 3.33.0.

von Philipp K. (philipp_k59)


Lesenswert?

UPDATE `journalpos` jp
LEFT JOIN `artikel` art ON jp.ARTNUM = art.ARTNUM
SET jp.GEWICHT=art.GEWICHT;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.