SQL stored procedure

    • SQL stored procedure

      bitte schnell um hilfe;
      ich soll materialbelegsinformationen mittels stored procedure hinterlegen.
      die tabellen sind belegskopf (mit automatischer nummer als primärschlüssel und informationen wie datum bewegungsart etc.) und belegspositionen (mit belegsnummer (die automatische der 1. tabelle) und positionsnummer als primärschlüssel und dann eben das material, menge ...)

      wie kann ich beide befüllen und dabei beliebig viele positionen eingeben??

      bitte schnell um hilfe weil ich das morgen für matura brauche
      danke
    • Kannst du die Relationen mal klarer machen.

      Sowas wie

      Belegskopf:
      Id(primary key + auto increment) | Datum | Bewegungsart ....


      Wäre hilfreich.. (gibts in dem kack forum kein Tabellencode oder bin ich einfach nur zu blöde?)

      Außerdem versteh ich dein
      wie kann ich beide befüllen und dabei beliebig viele positionen eingeben??

      nicht. Was willst du mit was befüllen? (vllt ergibt sich das aber bei leserlichen Relationen)

      MFG downtimes
    • ich will die tabellen mit materialbelegsdaten füllen (also zb beleg 500, 1.1.2001, wareneingang, hr. soundso, material 100 - 50st, material 101 - 100st)
      mein problem ist, dass ich durch die automatische nummernvergabe den jeweiligen beleg nur einmal auswählen/befüllen kann

      belegkopf:
      belegnr. (istidentity, primärschlüssel) | datum | bewegungsart | benutzer

      belegpositionen:
      belegnr. (primärschlüssel) | positionsnr (primärschlüssel) | materialnr | menge

      die beiden belegnummern natürlcih verknüpft

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ElephantTalk ()

    • Tut mir leid aber irgendwie steh ich immernoch auf dem Schlauch.
      Du willst jetzt n SQL Befehl der Daten in die Tabelle haut? (bzw ne Procedure.. da wäre die Frage für welches DBMS)
      Und du kommst jetzt nicht weiter weil die Belegnummer eindeutig sein muss o_O?
      mein problem ist, dass ich durch die automatische nummernvergabe den jeweiligen beleg nur einmal auswählen/befüllen kann


      Oder war dein Problem das positionsnummer ein Primary Key ist?
      wie kann ich beide befüllen und dabei beliebig viele positionen eingeben??

      Sollte es aber ja eigentlich nicht da erst durch Belegsnummer PLUS Positionsnummer der Datensatz eindeutig feststeht sodas eine gleiche Positionsnummer mit einer anderen Belegsnummer durchaus vorkommen kann.

      Sind die Relationen denn eigentlich vorgegeben oder hast du dir die ausgedacht im Zuge der Aufgabe?
      Wie sieht denn das aus was du bisher hast, könntest du uns das vielleicht zeigen? Oder zumindest wie so ein Einfügedatensatz aussehn sollte (am besten 2 Datensätze wo es zu deinem Problem kommt)?
      Tut mir echt leid das ich dich grade so überhaupt nicht verstehe... Vielleicht ist n Dotaforum aber auch die falsche Stelle für so ne Frage (common irgend n anderer hier hat doch bestimmt ne Idee... hier hat eigentlich immer einer ne Idee!!!)? :D
    • so würds aussehen wenn keine automat. nummernvergabe wäre:

      Quellcode

      1. ALTER PROCEDURE [dbo].[mateiralbeleg]
      2. @belegnr int, @bewegungsart,@posnr int, @matnr int, @menge int
      3. AS
      4. BEGIN
      5. SET NOCOUNT ON;
      6. --
      7. if not exists (select * from belegkopf where belegnr = @belegnr )
      8. begin
      9. insert into belegkopf (artnr, erstelldatum, bewegungsart)
      10. values (@belegnr, getdate(), @bewegungsart)
      11. end
      12. insert into positionen (belegnr, posnr, matnr, menge)
      13. values(@belegnr, @posnr, @matnr, @menge)
      14. end
      15. END
      Alles anzeigen


      wenn ich jetzt aber automat. nummern habe funktioniert das mit der if-bedingun nicht und ich kann die stored procedure nicht mehrmals für den selben beleg öffnen
    • Also das geht nicht so einfach wenn ich mich nicht täusche.. du musst ja irgendwie den Beleg referenzieren. Ich kenn mich jetzt leider nicht so mit Transact-SQL aus und kenne nicht die Möglichkeiten.
      Also entweder musst du diese nummern in deinem Programm verwalten: Das der Aufruf praktisch die (neue) Belegnummer zurückliefert und du dann die Belegnummer optionial beim Call mitgeben kannst. Ist sie gesetzt wird für die gegebene Belegnummer eine neue pos angelegt. Ist keine Belegnummer gesetzt wird eine neue Belegnummer angelegt. Ich weiß nicht ob das in den Möglichkeiten von Transact-SQL ist und es ist beileibe nicht schön ^^.

      Alternativ: Wenn immer nur für eine bestimmte Belegnummer n batch von positionen kommen und dann die nächste belegnummer könntest du so ne Art flag einbauen das angibt ob man nun zur nächsten Belegnummer springen möchte oder nicht. Solange man es nicht möchte werden die Datensätze für die aktuelle Belegnummer eingefügt (recht unflexibel meiner Meinung nach und auch keine Ahnung ob sowas überhaupt in Transact-SQL geht o_O).

      Ich gehe in de Fällen mal davon aus das dir die Relationen vorgegeben sind und du daran nichts ändern kannst. Solltest du die Relationen ändern dürfen würde ich versuchen darüber was zu schrauben (weiß aber auch nicht wie deine Modellierung aussieht ^^)

      Das sind jetzt mal Dumme Anfängerüberlegungen in was mit dem ich noch nie gearbeitet habe. Vllt bringen dich meine dummen Ergüsse ja auch auf ne dumme Idee :D

      MFG downtimes
    • Kann man wenn der PK getriggert ist nicht den komplett aus dem Statement weglassen und die Ifs somit auch?

      like this:

      insert into belegkopf ( erstelldatum, bewegungsart)
      values getdate(), @bewegungsart)

      insert into positionen ( posnr, matnr, menge)
      values( @posnr, @matnr, @menge)


      oder alternativ soltle es doch sogar gehen ein "dummy" wert für belegnummer einzufügen, der dann aber eifnach überschrieben wird?
    • Probier doch einfach aus ob das ganze läuft???? Dann weisste obs klappt - weil ich kenn mic mit stored nicht so aus, aber im normale sql sollte es imho (zumindest bei operationen über php -> mysql) so gehen... (meine andreen DB kenntnisse sind leider etwas eingeretoste)