Announcement

Collapse
No announcement yet.

Select Insert/update Select

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Select Insert/update Select

    Hallo Zusammen,

    ich möchte Paketmarken verwalten und drucken. Dazu habe ich eine Tabelle mit den gewünschten Parametern angelegt.

    jetzt meine Überlegung:

    Ich möchte Daten in diese Tabelle eintragen.... kein Problem. Diese Daten sofort auslesen und in einer Schleife ( php) eine fpdf Dokument erzeugen ( Paketmarke).
    PHP Code:
    $pdf = new FPDF(); 
    $pdf -> FPDF('P','mm','A4');
    // neue Seite erzeugen 
    $pdf->AddPage();
    $pdf->SetFont('Times','',10);
    $h 12;
    $h1 10;

    for(
    $i=0;$i<=$anzahl;$i++){
                
    $sql "SELECT 
                pakete.paketID as paket, pakete.ersatz,Date_Format(pakete.erstellt,'%y')as paketjahr, pakete.nummer, 
                user.name,user.vorname,user.unterbr as haus, 
                paketmarke.kenn
                FROM pakete
                Left Join user ON user.buch = pakete.buch
                LEFT JOIN paketmarke ON paketmarke.paketID = pakete.paketID
                WHERE pakete.nummer = '
    $nummer' ";
    $db->sql_befehl($sql);
     while (
    $ausgabe $db->sql_daten()){
                if(
    $ausgabe['kenn']!='IV'){$pdf->SetY(210);}else{$pdf->SetY(15);} 
    Gibt Mysql das her, dass Prüfen ob die Marke besteht, neue Marke eintragen, ggf. Daten ändern bei Bestehen einer Marke und auslesen für den Druck.

    Bisher habe ich es , meiner Meinung nach, umständlich gelöst.

    prüfen, eintragen/update und dann auslesen. Hat jemand einen Vorschlag wie ich sowas vielleicht elegant lösen kann.

  • #2
    Ich verstehe Deine Frage nicht.
    Gruß, defo

    Comment


    • #3
      Gibt Mysql das her, dass Prüfen ob die Marke besteht, neue Marke eintragen, ggf. Daten ändern bei Bestehen einer Marke und auslesen für den Druck.
      Woher sollte eine Datenbank wissen, was du mit den Daten machen willst?
      Christian

      Comment


      • #4
        ich hatte es befürchtet

        Kurz erklärt:

        ich habe ein formular in dem ich verschiedene Paketmarken auswählen und anschliessend drucken kann. Die Marken haben eine fortlaufende Nummer.
        Die Paketmarken werden dokumentiert, d.h. in einer Datenbanktabelle erfasst.
        Es gibt vier verschiedene Paketmarkentypen, nur eine darf mehrfach ausgegeben werden.

        Wird jetzt eine Paketmarke angefordert, so soll zunächst geprüft werden ob die Marke nur einmal ausgeben werden darf, ob sie vielleicht schon ausgegeben wurde und wenn die Kriterien erfüllt sind soll sie in die DB eingetragen werden und in einem FPDF-Dokument zum Druck bereitstehen.

        Bisher habe ich es folgender Maßen gelöst:

        1. ich mache einen Select zum entsprechenden User und frage alle ausgegebenen Marken ab.
        2.Alles ok dann Eintrag oder Update mit INSERT INTO ...... ON DUPLIKATE KEY UPDATE und die Markierung als Ersatzmarke
        3.SELECT der letzten Marke(n)ID

        jetzt Übergabe an das Pdf-Script und siehe ersten Beitrag.

        Ist mir aber so zu umständlich.....! Ich würde gerne nur die UserId´s an das PDF script schicken und dort weiter verarbeiten.

        Das heißt prüfen, eintragen, auslesen und drucken in einer Schleife mit möglichst wenig DB-abfragen

        Mit einigen PHP zeilen bekomme ich das schon hin, jedoch würde ich gerne die mysql Datenbank auch ein wenig arbeiten lassen und deshalb die Frage wie kann ich die DB da beanspruchen.

        liefert mir die DB gleich Werte zurück wenn ich einen Eintrag gemacht habe:

        wie z.B du hast gerade die Marke IV mit der Nummer 123 eigetragen

        ohne jetzt nochmal danach speziell zu fragen!

        Ich hoffe jetzt ist es ein wenig deutlicher!?

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Woher sollte eine Datenbank wissen, was du mit den Daten machen willst?
          Ist schon klar das ich die Daten liefern muss, ich möchte mir den (für mich) umständlichen Weg über PHP sparen.

          bisher habe ich es mit drei unterschiedlichen Abfrageschleifen gemacht. da es aber bestimmt kürzer geht (so glaube ich) habe ich mich an euch, die Spezialisten gewandt.

          Comment


          • #6
            Du solltest deine Anwendung - auch wenn es PHP ist - schon etwas strukturieren. Du könntest eine Persistenzschicht, eine Geschäftslogik, und eine Ausgabe voneinander getrennt implementieren.

            Eine DB hält Daten und gibt diese ggf. nach Kriterien eingeschränkt oder sortiert wieder aus. Warum sollte diese ein PDF erzeugen? Sicherlich lässt sich ein Teil der Geschäftslogik in der DB abbilden mittels entsprechender Prozeduren, aber die PDF-Erzeugung gehörst wohl nicht dazu.

            iefert mir die DB gleich Werte zurück wenn ich einen Eintrag gemacht habe:
            Sicherlich

            ohne jetzt nochmal danach speziell zu fragen!
            Woher soll die DB wissen, was du haben willst?
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              Du solltest deine Anwendung - auch wenn es PHP ist - schon etwas strukturieren. Du könntest eine Persistenzschicht, eine Geschäftslogik, und eine Ausgabe voneinander getrennt implementieren.

              Eine DB hält Daten und gibt diese ggf. nach Kriterien eingeschränkt oder sortiert wieder aus. Warum sollte diese ein PDF erzeugen? Sicherlich lässt sich ein Teil der Geschäftslogik in der DB abbilden mittels entsprechender Prozeduren, aber die PDF-Erzeugung gehörst wohl nicht dazu.

              Woher soll die DB wissen, was du haben willst?
              die Datenbank sol ja kein PDF erzeugen.... sie soll Daten für das PDF liefern...

              Mit dem Eintrag der Marke in die Datenbank soll dann im Script folgendes passieren:


              PHP Code:
              # Pdf erzeugen
              $pdf = new FPDF();  
              $pdf -> FPDF('P','mm','A4'); 
              // neue Seite erzeugen  
              $pdf->AddPage(); # Seite anlegen
              $pdf->SetFont('Times','',10); 
              $h 12
              $h1 10
              # ermittelte Anzahl der einzutragenden Marken anhand der unterschiedlichen #USERId´s
              for($i=0;$i<=$anzahl;$i++){ 
                           
              $sql "SELECT  
                          pakete.paketID as paket, pakete.ersatz,Date_Format(pakete.erstellt,'%y')as paketjahr, pakete.nummer,  
                          user.name,user.vorname,user.unterbr as haus,  
                          paketmarke.kenn 
                          FROM pakete 
                          Left Join user ON user.buch = pakete.buch 
                          LEFT JOIN paketmarke ON paketmarke.paketID = pakete.paketID 
                          WHERE pakete.nummer = '
              $nummer' "
              $db->sql_befehl($sql); # eigene Datenbank Klasse
               
              while ($ausgabe $db->sql_daten()){ # Ausgabe der Daten an das PDF
                          
              if($ausgabe['kenn']!='IV'){$pdf->SetY(210);}else{$pdf->SetY(15);} 

              Comment


              • #8
                In der Forschleife soll aber nicht nur der Select sondern auch das Eintragen geschehen. Ich möchte eigentlich nur, dass die zuvor eingetragenen Daten zurückgeliefert werden.

                Comment


                • #9
                  die Datenbank sol ja kein PDF erzeugen.... sie soll Daten für das PDF liefern...
                  Das wird sie sicherlich auch tun, jedoch kennt die DB kein PHP und auch kein FPDF. Und dein Script weiss nicht, dass an irgendeiner Stelle etwas in die DB geschrieben wurde, und jetzt Methode XYZ abzuarbeiten ist.
                  Also wirst du wohl eine Funktion, Klasse, Methode schreiben, die erst Daten in die DB schreibt und dann die Erzeugung des PDF aufruft. Und wenn du das alles etwas trennst, ist es auch wiederverwendbar

                  EDIT
                  In der Forschleife soll aber nicht nur der Select sondern auch das Eintragen geschehen. Ich möchte eigentlich nur, dass die zuvor eingetragenen Daten zurückgeliefert werden.
                  Na, dann trage sie halt in die DB ein. Es ist mir unklar, warum erst die Daten eingetragen werden sollen und dann - wenn es sich um die gleichen Daten handelt - wieder ausgelesen werden sollen/müssen. Jedenfalls sind das Eintragen und das Auslesen der Daten aus einer DB unterschiedliche Vorgänge. Wenn du das zusammen willst schreibe eine Methode, der du Daten übergibst. Diese Methode schreibt die Daten in die DB und liest sie auch gleich wieder aus. Sie gibt dann die gelesenen Daten wieder zurück
                  Zuletzt editiert von Christian Marquardt; 25.02.2012, 12:06.
                  Christian

                  Comment


                  • #10
                    ok , dann sollten wir hier schliessen. So wie du es gerade beschreibst, zumindest sehr ähnlich, habe ich es bisher gehabt. Wollte nur versuchen das ganze zu verkürzen...

                    Vielen Dank für die Geduld...
                    Gruß
                    Arno

                    Comment


                    • #11
                      [highlight=sql]pakete CREATE TABLE `pakete` (
                      `userID` varchar(12) COLLATE latin1_german1_ci NOT NULL,
                      `paketID` varchar(6) COLLATE latin1_german1_ci NOT NULL,
                      `erstellt` date NOT NULL,
                      `nummer` varchar(12) COLLATE latin1_german1_ci NOT NULL,
                      `ersatz` varchar(12) COLLATE latin1_german1_ci NOT NULL,
                      `elo` varchar(25) COLLATE latin1_german1_ci NOT NULL,
                      PRIMARY KEY (`nummer`)
                      ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci
                      [/highlight]
                      Ich habe doch noch eine Frage:
                      1. ich habe die o.g. Tabelle, in diese trage ich alle ausgegebenen Marken ein.
                      2. es gibt 4 verschiedene Marken
                      3. jeder user kann mehrere Marken erhalten, jedoch 1,2&3 je einmal und 4 so oft wie benötigt
                      4. wird jetzt 1-3 nochmals benötigt so soll die alte Nummer nochmals verwendet werden und mit dem Zusatz 'Ersatz' gekennzeichet werden.

                      die Daten werden wie folgt in die Tabelle übertragen:
                      PHP Code:
                      $sql="INSERT INTO pakete (userID,paketID,erstellt,elo,nummer) VALUES ('$buch','$paketID',curdate(),'$elo','$nummer' ) ON DUPLICATE KEY UPDATE userID = userID,paketID = paketID,erstellt = curdate(),ersatz = 'ERSATZ',nummer = nummer  "
                      das " ON DUPLICATE KEY UPDATE " wird ja nur ausgeführt, wenn die Nummer nochmal eingetragen werden sollte.
                      Jetzt die Frage:

                      wie muss ich die tabelle gestalten/ einstellen, damit ich den " ON DUPLICATE KEY UPDATE " nutzen kann wenn zwei parameter übereinstimmen müssen?

                      Klartext ich möchte den Update nicht bei nummer sondern bei paketID und userID verwenden

                      Comment


                      • #12
                        In diesem Fall reicht es wenn du einen Unique Index über die beiden Spalten anlegst.

                        Es macht übrigens keine Sinn wenn du alle Spalten nach dem ON DUPLICATE KEY aktualisierst.
                        http://dev.mysql.com/doc/refman/5.0/...duplicate.html

                        Sowas reicht also:
                        DUPLICATE KEY UPDATE erstellt = curdate(),ersatz = 'ERSATZ'

                        Comment

                        Working...
                        X