Ausgabe ALV Verkauf Lieferung Rechnung

Getting started ... Alles für einen gelungenen Start.
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von suedamer (ForumUser / 15 / 0 / 0 ) »
hallo liebes team,
als anfaenger habe einen report zu erstellen mit den tabellen vbak vbap likp lips vbrk vbrp. ueber einem bestimmten zeitraum und bestimmter auftragsart. nach meinem programm bringt er mir das verlangte, wenn ich verkauf bzwe. bestellung, lieferung und rechnung habe. entgegengesetzt brauche ich auch die daten ohne lieferung..also wo nur verkauf und rechnung besteht..wie mach ich das? versuchte es so mit else..aber so funktionierts wohl nicht wie ich das habe..fuer hilfe oder einen tipp waere ich sehr dankbar. hier mein code..ist leider in spanisch. gruesse danke suedamer.


TABLES: vbak, "Cabecero pedido"
vbap, "Posiciones pedido"
likp, "Cabecera entrega"
lips, "Posiciones entrega"
vbrk, "Cabecera de factura"
vbrp, "Posiciones de factura"
makt, "Texto de material"
kna1. "Maestro de clientes"
*&---------------------------------------------------------------------*
*& Datos Globales
*&---------------------------------------------------------------------*
TYPE-POOLS: slis.

* Tabla interna para salida de datos por ALV
DATA: BEGIN OF ti_ped OCCURS 0,
vbeln LIKE vbak-vbeln, "Documento de ventas"
auart LIKE vbak-auart, "Clase de documento de ventas"
kunnr LIKE vbak-kunnr, "Numero del cliente"
name1 LIKE kna1-name1, "Nombre del cliente"
erdat LIKE vbak-erdat, "Fecha del pedido"
kwmeng LIKE vbap-kwmeng,
"Cantidad de pedido acumulada (en unidades de venta)"
matnr LIKE vbap-matnr, "Numero de material"
maktx LIKE makt-maktx, "Texto breve de material"
entre LIKE likp-vbeln, "Numero de la entrega"
charg LIKE lips-charg,
lfimg LIKE lips-lfimg, "Cantidad entregada efectivamente"
fecha LIKE likp-erdat, "Fecha de la entrega"
factu LIKE vbrk-vbeln, "Numero de la factura"
fkdat LIKE vbrk-fkdat, "Fecha de la factura"
END OF ti_ped.
DATA: t_detalle LIKE ti_ped OCCURS 0 WITH HEADER LINE,
w_detalle LIKE ti_ped OCCURS 0 WITH HEADER LINE.
* Tabla y estructura del catalogo
DATA: ti_catalogo TYPE slis_t_fieldcat_alv,
wa_catalogo TYPE slis_fieldcat_alv,
* Estructura para la configuracion de la salida
wa_layout TYPE slis_layout_alv,
* Variable con el nombre del programa
v_repid LIKE sy-repid.

DATA: v_fecha LIKE vbak-erdat.

*&---------------------------------------------------------------------*
*& Selection-screen
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE text-t01.

SELECTION-SCREEN SKIP.
SELECT-OPTIONS: s_fecha FOR v_fecha. "Fecha".
PARAMETER: p_clvent TYPE vbak-auart. "Clase de venta"
SELECTION-SCREEN SKIP.

SELECTION-SCREEN END OF BLOCK sel.

START-OF-SELECTION.
* Selecciono de datos
PERFORM seleccion_datos.

END-OF-SELECTION.

* Armado del catalogo automatico
PERFORM armar_catalogo_automatico.
* Seteo del layout
PERFORM layout_alv.
* Ejecucion de la funcion del ALV
PERFORM ejecutar_alv.

*&---------------------------------------------------------------------*
*& Form seleccion_datos
*&---------------------------------------------------------------------*
* Selección de datos según parámetros de entrada
*----------------------------------------------------------------------*
FORM seleccion_datos.

SELECT vbeln auart kunnr erdat
INTO CORRESPONDING FIELDS OF TABLE t_detalle
FROM vbak WHERE erdat IN s_fecha AND auart = p_clvent.
LOOP AT t_detalle.
CLEAR w_detalle.
w_detalle = t_detalle.
SELECT * FROM vbap WHERE vbeln = t_detalle-vbeln.
IF sy-subrc EQ 0.
w_detalle-kwmeng = vbap-kwmeng.
w_detalle-matnr = vbap-matnr.
SELECT SINGLE * FROM makt
WHERE matnr EQ w_detalle-matnr AND spras = 'S'.
IF sy-subrc = 0.
w_detalle-maktx = makt-maktx.
ELSE.
w_detalle-maktx =''.
ENDIF.
SELECT SINGLE * FROM kna1 WHERE kunnr EQ t_detalle-kunnr.
IF sy-subrc = 0.
w_detalle-name1 = kna1-name1.
ELSE.
w_detalle-name1 =''.
ENDIF.

SELECT * FROM lips
WHERE vgbel = w_detalle-vbeln
AND matnr EQ w_detalle-matnr
AND charg <> ''.
IF sy-subrc EQ 0.
w_detalle-entre = lips-vbeln.
w_detalle-charg = lips-charg.
w_detalle-lfimg = lips-lfimg.
SELECT * FROM likp WHERE vbeln EQ w_detalle-entre.
IF sy-subrc = 0.
w_detalle-fecha = likp-erdat.
ENDIF.
ENDSELECT.
SELECT * FROM vbrp WHERE vgbel = w_detalle-entre.
IF sy-subrc EQ 0.
w_detalle-factu = vbrp-vbeln.
SELECT * FROM vbrk WHERE vbeln EQ w_detalle-factu.
IF sy-subrc = 0.
w_detalle-fkdat = vbrk-fkdat.
ENDIF.
ENDSELECT.
ENDIF.
ENDSELECT.

ELSE.
SELECT * FROM vbrp WHERE aubel = w_detalle-vbeln.
IF sy-subrc EQ 0.
w_detalle-factu = vbrp-vbeln.
SELECT * FROM vbrk WHERE vbeln EQ w_detalle-factu.
IF sy-subrc = 0.
w_detalle-fkdat = vbrk-fkdat.
ENDIF.
ENDSELECT.
ENDIF.
ENDSELECT.
ENDIF.
ENDSELECT.
ENDIF.
APPEND w_detalle.
ENDSELECT.
ENDLOOP.

IF sy-subrc EQ 4.
MESSAGE s002(z_prueba).
"No existen datos para la seleccion realizada"
ENDIF.

ENDFORM. "seleccion_datos

*&---------------------------------------------------------------------*
*& Form armar_catalogo_automatico
*&---------------------------------------------------------------------*
FORM armar_catalogo_automatico.

v_repid = sy-repid.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = v_repid
i_internal_tabname = 'TI_PED'
i_client_never_display = 'X'
i_inclname = v_repid
CHANGING
ct_fieldcat = ti_catalogo
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.

IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "armar_catalogo_automatico

*&---------------------------------------------------------------------*
*& Form ejecutar_alv
*&---------------------------------------------------------------------*
* Llamado a función alv
*----------------------------------------------------------------------*
FORM ejecutar_alv.

v_repid = sy-repid.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = v_repid
it_fieldcat = ti_catalogo
is_layout = wa_layout
TABLES
t_outtab = w_detalle.

IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. "ejecutar_alv

*&---------------------------------------------------------------------*
*& Form layout_alv
*&---------------------------------------------------------------------*
FORM layout_alv.

CLEAR wa_layout.
wa_layout-zebra = 'X'. "Rayado de lineas"
wa_layout-window_titlebar = 'Pedido de productos'.

ENDFORM. "layout_alv

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo suedamer,

es ist eigentlich keine Antwort auf deine direkte Frage, aber darf ich dein Programm trotzdem mal zerpflücken und auf die Punkte hinweisen die mir aufgefallen sind?

1)

Code: Alles auswählen.

 DATA: t_detalle LIKE ti_ped OCCURS 0 WITH HEADER LINE 
so wie du die Tabellendeklaration gemacht hast ist es nicht mehr üblich, in einigen Firmen sogar verboten. Das Problem bei dieser Deklaration ist, dass du eine Tabelle mit einer Kopfzeile hast, die beide den gleichen Namen t_detalle verwenden. Es ist später nicht auf den ersten Blick verständlich worauf du hier zugreifst, auf die Tabelle, oder auf deren Kopfzeile. An dieser Stelle könntest du so vorgehen, dass du einen Typen deklarierst, und anschliessend eine Tabelle, die auf diesem Typ basiert:

Code: Alles auswählen.

types: BEGIN OF t_ped,
vbeln LIKE vbak-vbeln, "Documento de ventas"
auart LIKE vbak-auart, "Clase de documento de ventas"
kunnr LIKE vbak-kunnr, "Numero del cliente"
name1 LIKE kna1-name1, "Nombre del cliente"
erdat LIKE vbak-erdat, "Fecha del pedido"
kwmeng LIKE vbap-kwmeng,
"Cantidad de pedido acumulada (en unidades de venta)"
matnr LIKE vbap-matnr, "Numero de material"
maktx LIKE makt-maktx, "Texto breve de material"
entre LIKE likp-vbeln, "Numero de la entrega"
charg LIKE lips-charg,
lfimg LIKE lips-lfimg, "Cantidad entregada efectivamente"
fecha LIKE likp-erdat, "Fecha de la entrega"
factu LIKE vbrk-vbeln, "Numero de la factura"
fkdat LIKE vbrk-fkdat, "Fecha de la factura"
END OF t_ped.

DATA: t_detalle type STANDARD TABLE OF t_ped WITH DEFAULT KEY, "eigentliche Tabelle
      wa_detalle LIKE LINE OF t_detalle,           "Workarea (eine Zeile) der Tabelle t_detalle
das führt dann zu Änderungen im Quellcode, da du dann nicht mehr LOOP AT t_detalle schreiben kannst, sondern schon sagen musst, dass du über eine Tabelle loopst und das Ergebnis jeweils in den Workarea schreibst: LOOP AT t_detalle INTO wa_detalle

2) den Parameter p_clvent würde ich als Mussfeld deklarieren: PARAMETER: p_clvent TYPE vbak-auart OBLIGATORY und ggf. zusätzlich mit DEFAULT bereits mit einem Wert vorbelegen der für deine Abfrage Sinn macht. Füllt man diesen Parameter als Anwender nicht, so greift dein SELECT ins leere:

Code: Alles auswählen.

  SELECT vbeln auart kunnr erdat
  INTO CORRESPONDING FIELDS OF TABLE t_detalle
  FROM vbak WHERE erdat IN s_fecha AND auart = p_clvent.
3) schau dir mal dieses Stückchen Code an:

Code: Alles auswählen.

END-OF-SELECTION.

* Armado del catalogo automatico
  PERFORM armar_catalogo_automatico.
wenn du den Code nicht selber geschrieben hättest, wüsstest du dann was in der Funktion armar_catalogo_automatico passiert? Man sieht Aufrufe solcher Art in Programmen immer wieder, man hat dabei aber keinerlei Hinweise darauf was diese Funktion für Eingaben benötigt und was dabei als Ergebnis rauskommt. Gewöhn es dir an bei Funktionen mit Übergabeparametern zu arbeiten. In diesem Fall erstellt die Funktion einen Feldkatalog, darüberhinaus wäre noch ein Hinweis interessant, ob es beim Erstellen Fehler gab oder alles gut verlaufen ist. Du könntest der Funktion hierfür zwei Parameter übergeben

a) die Tabelle ti_catalogo die dann den Feldkatalog enthalten wird
b) die Variable g_err, in die wir ein X reinschreiben, wenn die Funktion auf einen Fehler laufen sollte.

der Code ist dann deutlich besser zu lesen, du hast sofort auf einen Blik die Info welche Variablen von der Funktion angefasst werden:

Code: Alles auswählen.


DATA: g_err TYPE C LENGTH 1. "Fehlerflag, im Fehlerfall G_ERR=X 

END-OF-SELECTION.

* Armado del catalogo automatico
  PERFORM armar_catalogo_automatico CHANGING ti_catalogo g_err.
  
  if g_err = 'X'.  
    "bei Fehlern im Feldkatalog wird der ALV nicht ausgegeben  
    exit.
  endif.
  
* Seteo del layout
...
an der Funktion für das Erstellen des Feldkatalogs ändert sich nicht viel:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Form armar_catalogo_automatico
* <-- c_cat Feldkatalog
* <-- c_err Fehlerflag. X = Fehler beim Erzeugen des Feldkatalogs
*&---------------------------------------------------------------------*
FORM armar_catalogo_automatico CHANGING c_cat TYPE slis_t_fieldcat_alv
                                        c_err type c.

  v_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = v_repid
      i_internal_tabname     = 'TI_PED'
      i_client_never_display = 'X'
      i_inclname             = v_repid
    CHANGING
      ct_fieldcat            = c_cat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    c_err = 'X'.
  ENDIF.

ENDFORM. "armar_catalogo_automatico
4) in einer SELECT-ENDSELECT-Schleife fragst du immer wieder ab, ob der sy-subrc = 0 ist.

Code: Alles auswählen.

        
SELECT * FROM lips...
  IF sy-subrc EQ 0.
    "machwas
  ENDIF.
ENDSELECT
Das ist überflüssig und macht den Code nur schwerer zu verstehen! Der Gedanke dabei ist ja etwas aus einer Tabelle zu selektieren, und, falls man Daten selektiert hat (in dem Fall ist sy-subrc = 0), dann mit diesen Daten etwas zu machen. Du kommst aber zu den Zeilen innerhalb des SELECT, wenn dieser Daten gefunden hat, im anderen Fall werden die Zeilen innerhalb des SELECTS gar nicht verarbeitet, also:

Code: Alles auswählen.

        
SELECT * FROM lips...
  "wenn ich hier ankomme, dann konnte SELECT mindestens eine Zeile selektieren
  "machwas
ENDSELECT

"findet der SELECT keine Daten, so geht es gleich hier weiter...
wo diese Abfrage auch weiter Sinn machen kann ist beim SELECT SINGLE. Dort gibt es keine Schleife und manchmal muss man in der Tat abfragen, ob Daten selektiert wurden oder nicht.

5) die Verschachtelung mehrerer LOOPs und SELECTs ineinander wirkt sich unter Umständen sehr negativ auf die Performance aus. Du hast es so aufgebaut:

Code: Alles auswählen.

FORM seleccion_datos.
...
LOOP AT t_detalle
...
	SELECT * FROM vbap
		SELECT SINGLE * FROM makt
		
		SELECT SINGLE * FROM kna1
		
		SELECT * FROM lips
			SELECT * FROM likp			
			ENDSELECT
			SELECT * FROM vbrp
			ENDSELECT
		ENDSELECT
	ENDSELECT
...
ENDLOOP
je nach Anzahl Einträge in t_detalle, vbap, lips und likp multipliziert sich die Anzahl der Zugriffe auf die Datenbank. Programme die so aufgebaut sind könnten Stunden laufen, wo sie sonst in Minuten hätten fertig sein können. Die Alternative für diese Vorgehensweise ist die jeweils benötigten Daten in internen Tabellen zwischenzuspeichern, um dann die Daten für die Ausgabe in einer Tabelle zusammenzuführen. Schematisch gesehen also ungefähr so:

a) lese alle in Frage kommenden Aufträge in die Tabelle GT_VBAK (Stichwort APPENDING TABLE)
b) lese alle Lieferpositionen für die in Frage kommenden Aufträge in die Tabelle GT_LIPS (Stichwort FOR ALL ENTRIES)
c) verfollständige die Daten für die Ausgabe in der Tabelle GT_VBAK zusammen

Code: Alles auswählen.

LOOP at GT_VBAK INTO WA_VBAK.
  READ TABLE GT_LIPS INTO WA_LIPS WITH KEY VGBEL = WA_VBAK-VBELN.
  
  IF sy-subrc = 0.
   "verfollständigen der Daten
   WA_VBAK-entre = wa_lips-vbeln.
    "Tabelle aktualisieren
   MODIFY GT_VBAK FROM WA_VBAK.
  ENDIF.

ENDLOOP.
6)
schau dir diesen Code hier an:

Code: Alles auswählen.

           
 SELECT * FROM likp WHERE vbeln EQ wa2_detalle-entre.
   IF sy-subrc = 0.
        w_detalle-fecha = likp-erdat.
   ENDIF.
ENDSELECT.
das mit sy-subrc = 0 haben wir ja schon besprochen, zwei weitere Anmerkungen hätte ich hier noch:
a) du liest mit select * from likp die gesamte Tabelle, bist aber nur an dem Feld likp-erdat interessiert. Das ist so ähnlich, wenn du den Bibliotekar darum bittest dir den kompletten Schrank mit H zu bringen, weil du dir das erste Band von Harry Potter durchlesen möchtest :-) Du könntest an dieser Stelle auch präziser werden und das folgendermaßen formulieren:

Code: Alles auswählen.

SELECT entre FROM likp INTO w_detalle-fecha WHERE vbeln EQ wa2_detalle-entre.
ENDSELECT.
es wird hierbei nur ein Feld aus der LIKP gelesen, welches auch gleich in das Zielfeld w_detalle-fecha gestellt wird. Wenn kein Eintrag gefunden wird, so wird auch das Feld w_detalle-fecha nicht angefasst. Das ganze führt uns aber noch zu einer weiteren Anmerkung:
b) du greifst hier über SELECT-ENDSELECT und einem eindeutigen Schlüssel auf die LIKP. Mit gleichem Effekt kannst du hier SELECT SINGLE verwenden, dadurch entfällt der ENDSELECT-Part

Code: Alles auswählen.

SELECT SINGLE entre FROM likp INTO w_detalle-fecha WHERE vbeln EQ wa2_detalle-entre.
die Abfrage nach dem sy-subrc ist hierbei kein muss, wenn nichts gefunden wird, so wird eben nichts in das Feld w_detalle-fecha eingetragen

7) die Verschachtelung von mehreren SELECTS habe ich ja bereits angesprochen. Oft ist es deutlich performanter mehrere Tabellen in einem JOIN zu lesen, also statt

Code: Alles auswählen.

        SELECT * FROM lips
             SELECT * FROM likp WHERE vbeln EQ wa2_detalle-entre.
            ENDSELECT.
         ENDSELECT.
dann eben so:

Code: Alles auswählen.

        SELECT likp~vbeln lips~posnr
             FROM lips JOIN likp on lips-vbeln = likp-vbeln
             APPENDING TABLE GT_LIEFER
            WHERE...
Die Verschachtelungen entfallen und du liest zwei Tabellen mit einem einzigen Zugriff und einem Bruchteil der Zeit. Setze dich einfach mal bei Gelegenheit mit Tabellenjoins auseinander

So, ist doch mehr geworden als ich schreiben wollte :) Ich hoffe da ist die eine oder andere Anregung dabei. Vielleicht hast du dann auch einen anderen Ansatz was deine eigentliche Frage angeht.
Zuletzt geändert von Alexander D. am 04.10.2012 12:23, insgesamt 1-mal geändert.
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
noch einen Punkt vergessen, was aber kein Fehler sein muss: dein ALV bietet dem Benutzer keine Möglichkeit Anzeigevarianten zu verwalten. Das kann so gewünscht sein, sonst kannst du über den Parameter i_save steuern, ob benutzerspezifische bzw. benutzerübergreifende Varianten angelegt werden dürfen:

Code: Alles auswählen.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = v_repid
      it_fieldcat        = ti_catalogo
      is_layout          = wa_layout
      i_save             = 'A'   
    TABLES
      t_outtab           = w_detalle.
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von suedamer (ForumUser / 15 / 0 / 0 ) »
hey!!! vielen lieben dank!! mensch hast du dir eine arbeit mit meinem programm gemacht!danke dir fuer deine grosse hilfe! werde das programm durchgehen und zerpfluecken nach deinen tipps. vielleicht finde ich dann auch meinen fehler im select, weil er mir bei fehlender lieferung nur die bestellung aber nicht die rechnung rausschmeisst. das braeuchte ich erst mal unbedingt. oder hast da noch was fuer mich? hab noch nie programmiert und habe einen anfaengerkurs online mit diplom belegt, naechster folgt. echt toll wenn ich jetzt weis wie man auch real programmiert, hatte mich nie damit beschaeftigt mit bald 50jahren. entschuldige das ich jetzt erst antworte, ist der zeitunterschied, sitze hier in suedamerika.
gruesse und einen super tag noch..

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hi suedamer,

wenn ich bei uns so aus dem Fenster schaue, so wünsche ich mir gerade auch in Suedamerika zu sein... bei uns geht gerade Land unter :-)

wegen dem angesprochenen Fehler könnte es viele Gründe geben. Nachvollziehen lässt es sich am besten natürlich immer im betroffenen System. So wie es aussieht stellen wir nur Rechnungen aus, wenn wir geliefert haben, so kann ich den Sonderfall bei uns nicht wirklich nachstellen. Ich kann lediglich Vermutungen anstellen...

wie rufst du das Programm aus? Du gibst sicherlich für p_clvent eine Auftragsart ein. Ist nur diese eine Auftragsart relevant oder habt ihr mehrere? Im zweiten Fall wäre es besser p_clvent ebenfalls über SELECT-OPTIONS zu deklarieren, damit könntest du mehrere Auftragsarten auf ein mal selektieren:

Code: Alles auswählen.

SELECT-OPTIONS: s_fecha FOR v_fecha, "Fecha".
                o_clvent FOR vbak-auart. "Clase de venta"
...
  SELECT vbeln auart kunnr erdat
  INTO CORRESPONDING FIELDS OF TABLE t_detalle
  FROM vbak WHERE erdat IN s_fecha 
                        AND auart IN o_clvent.

weiterhin ist es ja so, dass du die Rechnungen in dem Block SELECT * FROM lips liest und hierbei die Unterscheidung machst ob eine Lieferposition gefunden wurde bzw. nicht. Hast du schon mal in den ELSE-Block, also bei SELECT * FROM vbrp WHERE aubel = w_detalle-vbeln. einen Break-Point gesetzt und geschaut, ob das Programm dort überhaupt reinläuft? Falls ja, dann könntest du ja im Debugger versuchen Schritt für Schritt nachzuvollziehen was das Programm selektiert oder eben nicht selektiert...

falls du ein konkretes Beispiel zu einem Auftrag hast der zwar noch nicht geliefert, aber bereits fakturiert wurde, so könntest du auch über SE16N versuchen den Sachverhalt in den einzelnen Tabellen nachzuvollziehen. Was steht in welcher Tabelle und über welche Felder könnten sie miteinander verknüpft sein
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von suedamer (ForumUser / 15 / 0 / 0 ) »
hallo,

haha..na bringst mich echt zum lachen..land unter? so schlimm? haha..hier knallt die sonne bis gleich 40 grad! nur so nebenbei.

wurde von mir verlangt das programm so zu schreiben, das die in meiner firma nach auftragsart und datum ihre bestellungen usw. finden. sind mehrere auftragsarten relevant, deshalb so. se16 und va03 fuer den flow hab ich schon durch. auf fehlersuche gehe ich immer mit dem debugger..und eigentlich mit if sy-subrc abfrage im programm. wie ich bemerke manchmal unnoetig, also hattest mir ja schon tolle tipps gegeben, danke. das programm gibt mir die rechnung ohne lieferung nicht aus weil er bei lips angekommen mir direkt ins endselct laeuft, ohne if oder else zu passieren. hatte schon oftmals umgebaut und alles, aber nichts..stehe wirklich auf dem schlauch. hatte ich schon bei anderen programmen, select kann einem richtig den letzten nerv rauben..haha..
hoffe hilft dir so weiter..und danke nochmal, echt lieb.
gruss

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
suedamer hat geschrieben: das programm gibt mir die rechnung ohne lieferung nicht aus weil er bei lips angekommen mir direkt ins endselct laeuft, ohne if oder else zu passieren. hatte schon oftmals umgebaut und alles, aber nichts..stehe wirklich auf dem schlauch.
stimmt, jetzt wo du es sagt macht das alles Sinn. Wenn schon ein Vergleich auf sy-subrc = 0 innerhalb eines SELECT ENDSELECT überflüssig ist, so ist der ELSE-Part einer solchen Abfrage genau so nützlich, wie bei euch zZ eine Regentonne ;-) Die Stelle wird ja niemals durchlaufen, weil das Programm davor schon mit sy-subrc = 4 aussteigt. Du müsstest die Abfrage nach ENDLOOP durchführen:

Code: Alles auswählen.

        SELECT * FROM lips
        WHERE vgbel = w_detalle-vbeln
        AND matnr EQ w_detalle-matnr
        AND charg <> ''.

          w_detalle-entre = lips-vbeln.
          w_detalle-charg = lips-charg.
          w_detalle-lfimg = lips-lfimg.
          SELECT * FROM likp WHERE vbeln EQ w_detalle-entre.
            w_detalle-fecha = likp-erdat.
          ENDSELECT.

          SELECT * FROM vbrp WHERE vgbel = w_detalle-entre.
            w_detalle-factu = vbrp-vbeln.
            SELECT * FROM vbrk WHERE vbeln EQ w_detalle-factu.
              w_detalle-fkdat = vbrk-fkdat.
            ENDSELECT.
          ENDSELECT.

        ENDSELECT.
        
        "kein Datensatz in LIPS gefunden
        IF sy-subrc = 4.
          SELECT * FROM vbrp WHERE aubel = w_detalle-vbeln.

            w_detalle-factu = vbrp-vbeln.
            SELECT * FROM vbrk WHERE vbeln EQ w_detalle-factu.
              w_detalle-fkdat = vbrk-fkdat.
            ENDSELECT.
          ENDSELECT.
        ENDIF.
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
ach, ja, noch was:
suedamer hat geschrieben: wurde von mir verlangt das programm so zu schreiben, das die in meiner firma nach auftragsart und datum ihre bestellungen usw. finden. sind mehrere auftragsarten relevant, deshalb so.
wenn das Programm so bleibt wie es zZ ist, dann muss man für jede abzufragende Auftragsart eine einzelne Selektion starten. Wenn du es über SELECT-OPTIONS realisierst, so kann man alles in einer Selektion erledigen. Das Ergebnis im ALV kann dann immer noch nach Auftragsarten sortiert, gruppiert und verdichtet werden
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von suedamer (ForumUser / 15 / 0 / 0 ) »
danke fuer die schnelle rueckantwort, werde das gleich ausprobieren. tausend dank nochmal.. und wegen dem zeitunterschied..einen tollen abend fuer dich. wenns recht ist, komme ich bei schwierigkeiten weiter auf dich zurueck.
saludos

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
danke, dir auch einen schönen Feierabend, wenn es denn soweit ist.
Wenn etwas unklar sein sollte, so stell die Fragen ruhig. Ich denke schon dass wir im Forum hier in der Lage sein werden die Fragen zu beantowrten :)
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von suedamer (ForumUser / 15 / 0 / 0 ) »
ja .. denke ich auch, das ihr in der lage sein werdet..haha..danke dir fuer deine freundlichkeit..saludos

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von suedamer (ForumUser / 15 / 0 / 0 ) »
klappt bestens, danke! :D :up:

Re: Ausgabe ALV Verkauf Lieferung Rechnung

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
das freut mich, dann haben wir uns ja doch nicht umsonst mit all den Punkten befasst! Es ist doch oft so im Leben, kaum bringt man Ordnung in die Kleinigkeiten, so erledigen sich auch die großen Probleme :-)
schöne Grüße
Alexander

ECC 6.0 EHP 7

Seite 1 von 1

Vergleichbare Themen

0
Antw.
1440
Views
Buchungübergreifender verkauf
von Frank1966 » 25.01.2007 14:10 • Verfasst in Sales and Distribution
0
Antw.
1299
Views
0
Antw.
1253
Views
2
Antw.
4456
Views
Eigenschaften von Systemmeldungen festlegen - Verkauf - Wo?
von Rike » 01.02.2008 12:54 • Verfasst in Sales and Distribution
3
Antw.
13140
Views
Wiederholungsdruck (Rechnung)
von Heiko » 04.04.2005 11:21 • Verfasst in Sales and Distribution

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1611
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8216