AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Insert + Select für mehrer Zeilen
Thema durchsuchen
Ansicht
Themen-Optionen

Insert + Select für mehrer Zeilen

Ein Thema von Ykcim · begonnen am 30. Jan 2009 · letzter Beitrag vom 30. Jan 2009
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#1

Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 09:33
Datenbank: MySQL • Version: 5 • Zugriff über: C-Api
Guten Morgen Zusammen,

ich hätte da mal wieder ein Problem...:

Der Ausgang ist eine Tabelle, die wie folgt aussieht:

WAAUNR(Auftagsnummer)...WAAUPO(Zusatz)...OAAGNR(Ar beitsgangNr)...undvielesmehr
1000.....................0.................10
1000.....................0.................20
1000.....................0.................30
1000.....................0.................40
1001.....................0.................10
1001.....................0.................20
1001.....................0.................30
1001.....................0.................40
1001.....................0.................50
1001.....................0.................60

In der Tabelle stehen noch weitere Informationen, aber diese hier sind jetzt nur relevant...

Ich habe ein Formular, aus dem noch die Werte UserID und KdDatum(Kundenlieferdatum) kommen.
Wenn jetzt ein Auftrag (WAAUNR) + WAAUPO) ausgewählt wird, dann sollen alle Datensätze dieses Auftrags in eine andere Tabelle kopiert werden, inklusive die Daten aus dem Formular.

Soll dann beim Ausführen so aussehen:

WAAUNR=1000 mit WAAUPO=0 und der OAAGNR(Arbeitsgang)=20 wurde ausgewählt --> ButtonClick

Tabelle (Beobachten):

UserID....WAAUNR....WAAUPO....OAAGNR....Datum(Tage sdatum)....KdDatum
..1............1000...........0.................10 ...........-----.............................20090320
..1............1000...........0.................20 ...........HEUTE........................20090320
..1............1000...........0.................30 ...........-----............................20090320
..1............1000...........0.................40 ...........-----............................20090320

Kann mir dabei jemand helfen?
Ich bin weder ein Delphi noch SQL Crack - learning by doing und wäre echt froh über unuterstützung...

Vielen Dank
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#2

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 09:51
Die Syntax lautet
SQL-Code:
INSERT INTO tabelle1(feld1, feld2, feld3, ...)
  SELECT feld1,feld2,feld3, ... FROM tabelle2
    WHERE <Bedingung>
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 10:02
Wobei das so nicht normalisiert ist, aber vielleicht ist das ja auch gewollt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#4

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 10:12
Versteh ich Dich richtig?
Du hast das klassische Beispiel bestehend aus Artikel, Kunde und Bestellung. Deine Vorgehensweise scheint dann aber schon deutlich vom "best practice" abzuweichen. Normalerweise hat man eine Tabelle Artikel, eine Tabelle Bestellung und eine Tabelle Kunden. Jede Tabelle bekommt einen Key spendiert. Die Tabellen Artikel und Kunde sind selbsterklärend. Die Tabelle Bestellung umfasst eine BestellID, einen foreignkey auf Kunde, ein Bestelldatum und was weiss ich noch alles. Dann gibt es jetzt eine weiter Tabelle, nämlich ArtikelBestellung. Die realisiert eine n:m Relation folgendermaßen: PrimaryKey sind ArtikelNr und BestellNr, die wiederum Foreignkeys der jeweiligen Tabellen sind. In ArtikelBestellung hast Du eventuell noch eine Anzahl und Zusatzinfos. Fertig ist das Datenmodell.

Wenn Du jetzt in Deinem Programm eine Bestellung anlegen möchtest, dann erzeugst Du zuerst in Deiner Tabelle Bestellung einen neuen Satz mit den nötigen Daten und dann so viele Sätze wie nötig zu den Artikeln der Bestellung in ArtikelBestellung. Und das wars. Wenn Du nun sehen willst, wer was bestellt hat, kannst Du über joins beliebige Abfragen tätigen.

Edith an DeddyH: Jopp, und ich habe den roten Kasten deswegen mal bewusst ignoriert

Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 10:13
Das war jetzt die Langfassung meiner Aussage
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 10:46
Hallo Zusammen,

vielen Dank für die Antworten. Das Thema ist etwas komplexer:

Es geht nicht um Kunden und Bestellungen, sondern um eine interen Fertigungsauftragsverfolgung. Dabei werden die Daten einer Tabelle in stündlichem Update aus dem ERP-System überschrieben.

Es ist zu berücksichtigen, ob ein Fertigungsauftrag (ab jetzt FA genannt) für einen weiteren Arbeitsgang fertiggemeldet wurde.

Sollte ein Kundentermin drücken, muss ein FA beschleunigt werden und die Arbeitsvorbereitung muss ein Datum, wann der nächste Arbeitsgang (ab jetzt AG genannt)begonnen wird eintragen. Wenn beim nächsten Update der AG das Fertigzeichen hat, wird der FA in den Briefkasten für den Mitarbeiter, der für den nächsten AG verantwortlich ist geschoben, der wiederum ein Datum eintragen muus, wann dieser AG gestartet wird. Deshalb benötige ich für jeden FA eine extra Zeile mit dem unterschiedlichen AG, für die unterschiedlichen Startdatums.

Und weil die Daten immer wieder überschrieben werden, muss ich die "Schlüssel" AG Nr, FA Nr etc. in eine andere Tabelle schreiben.

Ich hoffe, dass das jetzt etwas verständlicher geworden ist, was ich hier vorhabe..

LG
Ykcim
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 10:59
Hallo nochmal.

Ich habe es jetzt wie folgt versucht:
Delphi-Quellcode:
{===================================================================================================}
//anschieben NEU
procedure TFA_anschieben.Button2Click(Sender: TObject);
var Cols: TCols;
    Rows: TRows;
    query:string;
    i:integer;
    LieferdatumEN1:string;
    LieferdatumDeu : TDate ;
    fs : TFormatSettings ;
begin
  fs.DateSeparator := '.' ;
  fs.ShortDateFormat := 'dd.mm.yyyy' ;
  LieferdatumDeu := StrToDate (KdLD.Text,fs) ;
  LieferdatumEN1 := FormatDateTime ('YYYY-mm-dd',LieferdatumDeu) ;

  query:= 'select WAAUNR, WAAUPO, OAAGNR from as400 where WAAUNR= '+ FANR1.Caption+
          ' and WAAUPO= ' + FANR2.Caption;
  MenueUnit.connect;
  MenueUnit.ExecQuery(DB, query, Cols, Rows);

  for i := 0 to length(rows) - 1 do
    begin
      query:= 'insert into beobachten (UserID, WAAUNR, WAAUPO, OAAGNR, KdDatum) values( ' +
              inttostr(menueunit.UserID) + ',' + rows[0,i] + ',' + rows[1,i] + ',' + rows[2,i] + ',' +
              #39 + KDLD.Text + #39 + ')';
      MenueUnit.ExecQuery(DB, query, Cols, Rows);
    end;
  fs.DateSeparator := '.' ;
  fs.ShortDateFormat := 'dd.mm.yyyy' ;
  LieferdatumDeu := StrToDate (Menue.Datum.Caption,fs) ;
  LieferdatumEN1 := FormatDateTime ('YYYY-mm-dd',LieferdatumDeu) ;

  query:= 'insert into beobachten (Datum) values ( ' + #39+LieferdatumEN1+#39 + ') where WAAUNR= '+
          FANR1.Caption + 'and WAAUPO= ' + FANR2.Caption;
  MenueUnit.ExecQuery(DB, query, Cols, Rows);
  MenueUnit.disconnect;
end;

{===================================================================================================}
Leider habe ich das Problem, dass in
for i := 0 to length(rows[0]) - 1 do kein Wert geschrieben wird, obwohl Werte in rows drinstehen...
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 12:34
Okay, es lag nicht an der For-Schleife...

Mit diesem Code habe ich es nun geschafft! 8)

Delphi-Quellcode:
procedure TFA_anschieben.Button2Click(Sender: TObject);
var Cols: TCols;
    Rows: TRows;
    query:string;
    i:integer;
    LieferdatumEN1:string;
    LieferdatumDeu : TDate ;
    fs : TFormatSettings ;
begin
  fs.DateSeparator := '.' ;
  fs.ShortDateFormat := 'dd.mm.yyyy' ;
  LieferdatumDeu := StrToDate (KdLD.Text,fs) ;
  LieferdatumEN1 := FormatDateTime ('YYYY-mm-dd',LieferdatumDeu) ;

  query:= 'select WAAUNR, WAAUPO, OAAGNR from as400 where WAAUNR= '+ FANR1.Caption+
          ' and WAAUPO= ' + FANR2.Caption;
  MenueUnit.connect;
  MenueUnit.ExecQuery(DB, query, Cols, Rows);
  for i := 0 to length(rows[0]) - 1 do
    begin
      query:= 'insert into beobachten (UserID, WAAUNR, WAAUPO, OAAGNR, KdDatum) values( ' +
              inttostr(menueunit.UserID) + ',' + rows[0,i] + ',' + rows[1,i] + ',' + rows[2,i] + ',' +
              #39 + LieferdatumEN1 + #39 + ')';
      MenueUnit.ExecQuery(DB, query, Cols, Rows);
    end;
//Anschiebedatum formatieren
  fs.DateSeparator := '.' ;
  fs.ShortDateFormat := 'dd.mm.yyyy' ;
  LieferdatumDeu := StrToDate (Menue.Datum.Caption,fs) ;
  LieferdatumEN1 := FormatDateTime ('YYYY-mm-dd',LieferdatumDeu) ;

  query:= 'Select WAAUNR, WAAUPO, OAAGNR from as400 where OATLKZ <> 9 and WAAUNR= '+
          FANR1.Caption+ ' and WAAUPO= ' + FANR2.Caption + ' GROUP BY WATENR, WAAUNR ORDER BY WATENR, OAAGNR DESC';
  MenueUnit.ExecQuery(DB, query, Cols, Rows);

  query:= 'update beobachten set Datum = ' + #39+LieferdatumEN1+#39 + ' where WAAUNR= '+
          rows[0,0] + ' and WAAUPO= ' + rows[1,0] + ' and OAAGNR= ' + rows[2,0];
  MenueUnit.ExecQuery(DB, query, Cols, Rows);
  MenueUnit.disconnect;
end;

{===================================================================================================}
In diesem Sinne

Ykcim
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

Re: Insert + Select für mehrer Zeilen

  Alt 30. Jan 2009, 12:38
Da fände ich Joachims Variante übersichtlicher, außerdem spielt die sich komplett auf dem Server ab.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz