Académique Documents
Professionnel Documents
Culture Documents
En général je n'ai pas traduit les commentaires. Les commentaires d'origine SAP sont plutôt en allemand, les miens en
français et ceux trouvés sur le web en anglais.
le code ABAP
PROGRAM Z_FORMULAIRE .
FORM DATE_LIVRAISON
TABLES IN_PAR STRUCTURE ITCSY
OUT_PAR STRUCTURE ITCSY.
DATA:
_KEINDT(8),
_DATAMJ(8) VALUE '########',
_DATTYP(1),
_DATSA(7) VALUE '##/####',
_JOUR TYPE D.
*en entree, les infos récupérées dans le formulaire :
* pekko-eindt pekko-lpein pekpo-eindt pekpo-lpein
*en sortie, la date AAAAMMJJ (char 8)
*mettre en place les valeurs 'incident'
* BREAK-POINT.
READ TABLE OUT_PAR WITH KEY 'DATAMJ'.
CHECK SY-SUBRC = 0.
OUT_PAR-VALUE = _DATAMJ.
MODIFY OUT_PAR INDEX SY-TABIX.
* parametres recus
LOOP AT IN_PAR.
CASE IN_PAR-NAME.
WHEN 'PEKKO-EINDT'.
_KEINDT = IN_PAR-VALUE.
ENDCASE.
ENDLOOP.
* convertion en semaine
CALL FUNCTION 'DATE_GET_WEEK'
EXPORTING
DATE = _JOUR
IMPORTING
WEEK = _WEEK
EXCEPTIONS
DATE_INVALID = 1
OTHERS = 2.
* WRITE _week TO _datsa.
CONCATENATE _WEEK+4(2) _WEEK(4) INTO _DATSA SEPARATED BY '/'.
*maj formulaire
READ TABLE OUT_PAR WITH KEY 'DATSA'.
OUT_PAR-VALUE = _DATSA.
MODIFY OUT_PAR INDEX SY-TABIX.
ENDFORM.
INCLUDE <LIST>.
ULINE.
WRITE: / ' Icones'.
WRITE: / ' '.
ULINE.
ULINE.
WRITE: / 'Symboles'.
WRITE: / ' '.
ULINE.
DATA:
I TYPE I,
*parameters:
O_LIFNR LIKE EINA-LIFNR,
O_MATKL LIKE EINA-MATKL,
O_EKORG LIKE EINE-EKORG,
P_I TYPE I.
DATA:
BEGIN OF JOIN,
LIFNR LIKE EINA-LIFNR,
MATNR LIKE MARA-MATNR,
MATKL LIKE MARA-MATKL,
INFNR LIKE EINE-INFNR,
EKORG LIKE EINE-EKORG,
END OF JOIN.
*initialization.
O_LIFNR = '0000100033'.
O_MATKL = '01 '.
O_EKORG = '0001 '.
SELECT COUNT( * )
INTO I
FROM EINA AS F1 JOIN MARA AS F2
ON F1~MATNR = F2~MATNR
JOIN EINE AS F3
ON F1~INFNR = F3~INFNR
WHERE F1~LIFNR = O_LIFNR AND
F2~MATKL = O_MATKL AND
F3~EKORG = O_EKORG
.
WRITE: / I.
*endcase.
WRITE: / MARA-MATNR.
ENDSELECT.
WRITE: / USR_TABL-MANDT,
USR_TABL-BNAME ,
USR_TABL-TERM ,
USR_TABL-TCODE ,
USR_TABL-ZEIT ,
USR_TABL-EXTMODI,
USR_TABL-INTMODI .
ENDLOOP.
Ou alors, pour un menu à jour, exécuter un programme abap simpliste (Write ‘toto’.) + systeme status ; ce qui donne le nom
du programme standard SAP qui contient le menu standard.
REPORT ZZJPL030
*largeur du report
LINE-SIZE 255
*hauteur du saut de page (hauteur du pied de page)
LINE-COUNT 65(1)
*prise de controle sur les entetes
NO STANDARD PAGE HEADING.
* les indications de largeur et de hauteur permettent au pilote
* d'impression de choisir le format d'impression applicable. Par exemple
* pour une imprimante HPLJ4, on trouve :
* X_65_80 X_65_132 X_90_120 X_65_255 X_65_320
* X_58_170 X_48_255 X_44_120 X_24_255
INCLUDE <LIST>.
TABLES: MAKT, EINE, EINA.
*=--------------------------------------------------------------------=*
TOP-OF-PAGE.
*=--------------------------------------------------------------------=*
* typeligne = 'C'. hide typeligne.
* write: / '123456789', '123456789', '123456789', '123456789',
* '123456789', '123456789', '123456789', '123456789',
* '123456789', '123456789', '123456789', '123456789',
* '123456789', '123456789', '123456789', '123456789'.
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE:/
TEXT-H01 NO-GAP,
TEXT-H21 NO-GAP,
TEXT-H41 NO-GAP,
TEXT-H61 NO-GAP,
TEXT-H81 NO-GAP.
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE:/
TEXT-H02 NO-GAP,
TEXT-H22 NO-GAP,
TEXT-H42 NO-GAP,
TEXT-H62 NO-GAP,
TEXT-H82 NO-GAP.
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE 75 SY-PAGNO.
WRITE:/
TEXT-H03 NO-GAP,
TEXT-H23 NO-GAP,
TEXT-H43 NO-GAP,
TEXT-H63 NO-GAP,
TEXT-H83 NO-GAP.
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE 101 SY-REPID.
WRITE:/
TEXT-H04 NO-GAP,
TEXT-H24 NO-GAP,
TEXT-H44 NO-GAP,
TEXT-H64 NO-GAP,
TEXT-H84 NO-GAP.
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE 101 SY-DATUM.
WRITE:/
TEXT-H05 NO-GAP,
TEXT-H25 NO-GAP,
TEXT-H45 NO-GAP,
TEXT-H65 NO-GAP,
TEXT-H85 NO-GAP.
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE 101 SY-UZEIT.
*=--------------------------------------------------------------------=*
END-OF-PAGE.
*=--------------------------------------------------------------------=*
TYPELIGNE = 'H'. HIDE TYPELIGNE.
WRITE:/
TEXT-H08 NO-GAP,
TEXT-H28 NO-GAP,
TEXT-H48 NO-GAP,
TEXT-H68 NO-GAP,
TEXT-H88 NO-GAP.
*=--------------------------------------------------------------------=*
START-OF-SELECTION.
*=--------------------------------------------------------------------=*
*report dynamique : monter le menu et le titre
SET PF-STATUS 'INLI'.
SET TITLEBAR 'T01'.
*=--------------------------------------------------------------------=*
MARKFIELD = 'x'.
EINA-MATNR = '000000000123456789'.
MAKT-MAKTX = 'article verbeux abcdefghijklmnopqrstuvwxyz'.
EINE-APLFZ = 123.
EINE-MINBM = '1234567890.123-'.
EINA-MEINS = 'PAK'.
EINE-NETPR = '12345678.90-'.
EINE-WAERS = 'FRF'.
EINE-PEINH = 12345.
EINE-BPRME = 'EA'.
LIGNEOK = '1'.
EINE-APLFZ = 1.
PERFORM LIGNE.
EINE-APLFZ = 2.
PERFORM LIGNE.
EINE-APLFZ = 3.
PERFORM LIGNE.
PERFORM LIGNE.
PERFORM LIGNE.
PERFORM TRAIT.
* configuration d'une ligne incorecte
LIGNEOK = '0'.
EINE-APLFZ = 123.
DO 2 TIMES.
PERFORM LIGNE.
ENDDO.
PERFORM TRAIT.
DO 100 TIMES.
LIGNEOK = '1'.
EINE-APLFZ = 1.
PERFORM LIGNE.
ENDDO.
*=--------------------------------------------------------------------=*
END-OF-SELECTION.
*=--------------------------------------------------------------------=*
WRITE:/
TEXT-H09 NO-GAP,
TEXT-H29 NO-GAP,
TEXT-H49 NO-GAP,
TEXT-H69 NO-GAP,
TEXT-H89 NO-GAP.
*=--------------------------------------------------------------------=*
AT USER-COMMAND.
*=--------------------------------------------------------------------=*
* break-point.
* write sy-ucomm.
IF SY-LSIND = 1.
CASE SY-UCOMM.
WHEN 'EXEC' OR 'VERI'.
I = 0.
DO.
ADD 1 TO I.
READ LINE I FIELD VALUE MARKFIELD.
*fin de fichier
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
*selectionner les lignes à traiter
IF TYPELIGNE = '1' .
*lignes hors selection
IF MARKFIELD = ' '.
MODIFY CURRENT LINE
LINE FORMAT INTENSIFIED ON
COLOR OFF.
ELSE.
*conversions et controles supplémentaires
PERFORM CONTROLE.
CHECK SY-SUBRC = 0.
*traiter
IF SY-UCOMM = 'EXEC'.
".../...
TYPELIGNE = '2'.
MARKFIELD = SPACE.
MODIFY CURRENT LINE
LINE FORMAT COLOR COL_POSITIVE INPUT OFF
FIELD VALUE MARKFIELD.
ENDIF.
ENDIF.
ENDIF.
ENDDO.
*** marquer
WHEN 'TOUT'.
I = 0.
DO.
I = I + 1.
READ LINE I.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
IF TYPELIGNE = '1'.
MARKFIELD = 'X'.
MODIFY CURRENT LINE
FIELD VALUE MARKFIELD.
ENDIF.
ENDDO.
*** demarquer
WHEN 'RIEN'.
I = 0.
DO.
ADD 1 TO I.
READ LINE I.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
IF TYPELIGNE = '1'.
MARKFIELD = SPACE.
MODIFY CURRENT LINE
FIELD VALUE MARKFIELD.
ENDIF.
ENDDO.
ENDCASE.
ENDIF.
*=--------------------------------------------------------------------=*
AT LINE-SELECTION.
SET PF-STATUS SPACE.
SET LANGUAGE 'E'.
WRITE: / 'typeligne =', TYPELIGNE.
WRITE: / 'eina-matnr=', EINA-MATNR.
*=--------------------------------------------------------------------=*
*&---------------------------------------------------------------------*
*& Form LIGNE
*&---------------------------------------------------------------------*
* ajouter une ligne sur la liste en cours
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM LIGNE.
*lignes correctes : couleur = normal, saisie = possible
*lignes erronnees : couleur = rouge, saisie = verrouillee
IF LIGNEOK = '1'.
MARKFIELD = 'X'.
FORMAT RESET.
FORMAT COLOR OFF INTENSIFIED OFF.
ELSE.
MARKFIELD = ' '.
FORMAT RESET.
FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF.
ENDIF.
*fonds de ligne
WRITE:/
TEXT-H06 NO-GAP,
TEXT-H26 NO-GAP,
TEXT-H46 NO-GAP,
TEXT-H66 NO-GAP,
TEXT-H86 NO-GAP.
* champs fixes
WRITE 4 EINA-MATNR+8(10) NO-GAP.
HIDE EINA-MATNR.
WRITE 33 EINA-MEINS NO-GAP.
HIDE EINA-MEINS.
WRITE 56 EINE-WAERS(3) NO-GAP.
HIDE EINE-WAERS.
WRITE 66 EINE-BPRME NO-GAP.
HIDE EINE-BPRME.
WRITE 70 MAKT-MAKTX.
HIDE MAKT-MAKTX.
WRITE 16 EINE-MINBM NO-GAP.
HIDE EINE-MINBM.
WRITE 37 EINE-APLFZ NO-GAP.
HIDE EINE-APLFZ.
WRITE 41 EINE-NETPR NO-GAP.
HIDE EINE-NETPR.
WRITE 60 EINE-PEINH NO-GAP.
HIDE EINE-PEINH.
TYPELIGNE = LIGNEOK.
HIDE TYPELIGNE.
*&---------------------------------------------------------------------*
*& Form trait
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM TRAIT.
WRITE: / SY-ULINE.
TYPELIGNE = 'U'.
HIDE TYPELIGNE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CONTROLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTROLE.
*code retour du controle
SY-SUBRC = 0.
* controles supplémentaires
IF EINE-APLFZ = ' 2 '.
SY-SUBRC = 1.
ENDIF.
*saisie erronnée : ligne en jaune et champ en rouge
IF SY-SUBRC > 0.
MODIFY CURRENT LINE
LINE FORMAT COLOR COL_TOTAL
INTENSIFIED OFF
FIELD FORMAT EINE-APLFZ COLOR COL_NEGATIVE .
SY-SUBRC = 2.
ELSE.
*saisie correcte : refaire la mise en page
MODIFY CURRENT LINE
LINE FORMAT COLOR OFF
INTENSIFIED OFF.
ENDIF.
ENDFORM. " READ_NUMERIC_FIELD
*&---------------------------------------------------------------------*
*& Form NEVER_USED
*&---------------------------------------------------------------------*
*ce form n'est jamais exécuté.Il sert uniquement à l'initialisation des
*symboles de texte (editeur abap / symboles de texte / comparer ...)
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM NEVER_USED.
DATA _I(60).
*Hxy : H = préfixe pour HEADER
* x = tranche de l'entete. la largeur maxi d'un report est de 255
* caractères. les 4 premières tranches font 50 cars de large,
* la 5° tranche fait 55 cars de large.
* y = numéro de ligne, ou format d'impression
*******'....+....1....+....2....+....3....+....4....+....5'
_I = '--------------------------------------------------'(H01).
_I = '| | |Quantités | |Prix '(H02).
_I = '| | |-----------------------------------'(H03).
_I = '|S|Article |Qté mini U |Dly| unitaire '(H04).
_I = '--------------------------------------------------'(H05).
_I = '| | | | | '(H06).
_I = '-------A Suivre-----------------------------------'(H08).
_I = '-------fin de liste-------------------------------'(H09).
*******'....+....6....+....7....+....8....+....9....+...10'
_I = '--------------------------------------------------'(H21).
_I = ' |Page 1 '(H22).
_I = '--------------------------------------------------'(H23).
_I = ' U |Pour U |Désignation '(H24).
_I = '--------------------------------------------------'(H25).
_I = ' / | '(H26).
_I = '--------------------------------------------------'(H28).
_I = '--------------------------------------------------'(H29).
*******'....+...11....+...12....+...13....+...14....+...15'
_I = '--------------------------------------------------'(H41).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||'(H42).
_I = '---------| |||||||||||||||||||||||||||||||||||||||'(H43).
_I = ' |||--||||||||||||||||||||||||||||||||||||'(H44).
_I = '---------|||||||||||||||||||||||||||||||||||||||||'(H45).
_I = '---------|||||||||||||||||||||||||||||||||||||||||'(H48).
_I = '---------|||||||||||||||||||||||||||||||||||||||||'(H49).
*******'....+...16....+...17....+...18....+...19....+...20'
_I = ' -------------------------------------------------'(H61).
_I = ' ---| |------|--------| |-------------------------'(H62).
_I = ' ---- --------------------------------------------'(H63).
_I = ' -------------------------------------------------'(H64).
_I = ' -------------------------------------------------'(H65).
_I = ' -------------------------------------------------'(H68).
_I = ' -------------------------------------------------'(H69).
*******'....+...21....+...22....+...23....+...24....+...25....+'
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H81).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H82).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H83).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H84).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H85).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H88).
_I = '||||||||||||||||||||||||||||||||||||||||||||||||||....+'(H89).
Textpool :
----------
I001 Exporter des fiches clients dans EXCEL, limité à 100 fiches
I002 Intitulé des colonnes
IJPL JP Lamontre
R Shell EXCEL
SS_KUNNR N° Client
SS_NAME Façon MAILING
SS_TITLE compréhensible
Abap :
------
REPORT ZZJPL033 NO STANDARD PAGE HEADING.
INCLUDE OLE2INCL.
*=-------------------------------------------------------------------=*
TABLES: KNA1.
*=-------------------------------------------------------------------=*
DATA: TABLEUR TYPE OLE2_OBJECT. " define ole application name
DATA: CLASSEUR TYPE OLE2_OBJECT. " define workbook name
DATA: SHEET TYPE OLE2_OBJECT. " define excel sheet name
DATA:
FICHIER_LOGIC LIKE FILENAME-FILEINTERN,
FICHIER_PHYSIC LIKE FILENAME-FILEEXTERN.
DATA _PCFILE(128).
DATA CLIENT LIKE KNA1 OCCURS 0.
DATA: FIELD LIKE DFIES OCCURS 0 WITH HEADER LINE,
BEGIN OF NOM OCCURS 0,
N(20),
END OF NOM,
C80(80).
WINID = 'EXCEL69'
* OSMAC_SCRIPT = ' '
* OSMAC_CREATOR = ' '
* WIN16_EXT = ' '
* EXEC_RC = ' '
IMPORTING
RBUFF = RC
EXCEPTIONS
FRONTEND_ERROR = 1
NO_BATCH = 2
PROG_NOT_FOUND = 3
ILLEGAL_OPTION = 4
OTHERS = 5.
* ca marche, ABAP s'arrête et attend.
WRITE: 'ce texte devrait s''afficher apres la fermeture de Excel'.
WRITE RC.
A étudier
REPORT Z66WORD .
INCLUDE OLE2INCL.
INCLUDE DOCSINCL.
TABLES: MAKT.
DATA F_RETOUR TYPE OLE2_OBJECT.
DATA S_RETOUR TYPE OLE2_OBJECT.
DATA APPLICATION TYPE OLE2_OBJECT.
DATA WORD TYPE OLE2_OBJECT.
DATA: BEGIN OF ITAB OCCURS 100,
MATNR LIKE MAKT-MATNR,
SEP1(1),
SPRAS LIKE MAKT-SPRAS,
SEP2(1),
MAKTX LIKE MAKT-MAKTX,
SEP3(1),
MAKTG LIKE MAKT-MAKTG,
END OF ITAB.
SELECT * FROM MAKT.
MOVE MAKT-MATNR TO ITAB-MATNR.
MOVE MAKT-SPRAS TO ITAB-SPRAS.
MOVE MAKT-MAKTX TO ITAB-MAKTX.
MOVE MAKT-MAKTG TO ITAB-MAKTG.
MOVE ';' TO ITAB-SEP1.
MOVE ';' TO ITAB-SEP2.
MOVE ';' TO ITAB-SEP3.
APPEND ITAB.
ENDSELECT.
LOOP AT ITAB.
WRITE: / ITAB-MATNR,
ITAB-SPRAS,
ITAB-SPRAS,
ITAB-MAKTX.
ENDLOOP.
REPORT Z66WORD .
INCLUDE OLE2INCL.
INCLUDE DOCSINCL.
DATA: H_WORD TYPE OLE2_OBJECT.
DATA: H_VALS TYPE OLE2_OBJECT.
DATA: H_STAT TYPE OLE2_OBJECT.
DATA VIS TYPE I.
DATA FILENAME(30). DATA STRING(30).
Textpool :
----------
I001 Fichier sur le serveur
I002 Fichier sur le poste de travail
I003 Sens de la copie
R Copie de fichiers
SPCDIR Répertoire PC
SPCFILE Fichier PC
SPCSFX Suffixe PC
SPC_SRV PC vers serveur
SSRVDIR Répertoire serveur
SSRVFILE Fichier serveur
SSRVSFX Suffixe serveur
SSRV_PC Serveur vers PC
Abap :
------
REPORT ZZJPL040 LINE-SIZE 255.
DATA: BEGIN OF PC OCCURS 0,
ENR(5000),
END OF PC.
DATA:
SRVDIR(64) VALUE '/home/france/' ,
SRVSFX(4) VALUE '.txt' ,
PCDIR(64) VALUE 'c:\sappc\',
PCSFX(4) VALUE '.txt'
, ZG_DEBUGTEXT(5000)
, W-LEN TYPE I
, W-LIN TYPE I
.
SELECTION-SCREEN BEGIN OF BLOCK SERVEUR WITH FRAME TITLE TEXT-001.
PARAMETERS SRVFILE(128) LOWER CASE.
SELECTION-SCREEN END OF BLOCK SERVEUR.
SELECTION-SCREEN BEGIN OF BLOCK PC WITH FRAME TITLE TEXT-002.
PARAMETERS PCFILE(128) LOWER CASE.
SELECTION-SCREEN END OF BLOCK PC.
SELECTION-SCREEN BEGIN OF BLOCK SENS WITH FRAME TITLE TEXT-003.
PARAMETERS PC_SRV RADIOBUTTON GROUP SENS.
PARAMETERS SRV_PC RADIOBUTTON GROUP SENS.
SELECTION-SCREEN END OF BLOCK SENS.
*----------------------------------------------------------------------
INITIALIZATION.
*----------------------------------------------------------------------
CONCATENATE SRVDIR '?' SRVSFX INTO SRVFILE.
CONCATENATE PCDIR '?' PCSFX INTO PCFILE.
*----------------------------------------------------------------------
START-OF-SELECTION.
*----------------------------------------------------------------------
W-LIN = 0.
W-LEN = 0.
*copie serveur vers pc
IF SRV_PC = 'X'.
OPEN DATASET SRVFILE FOR INPUT IN TEXT MODE.
*lire le serveur
DO.
READ DATASET SRVFILE INTO ZG_DEBUGTEXT.
IF SY-SUBRC <> 0. EXIT. ENDIF.
APPEND ZG_DEBUGTEXT TO PC.
WRITE:/ ZG_DEBUGTEXT.
COMPUTE W-LEN = W-LEN + STRLEN( ZG_DEBUGTEXT ).
ENDDO.
CLOSE DATASET SRVFILE.
*ecrire sur le pc
DESCRIBE TABLE PC LINES W-LIN.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = PCFILE
TABLES
DATA_TAB = PC
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
ULINE.
*compte-rendu
IF SY-SUBRC <> 0. FORMAT COLOR COL_NEGATIVE. ENDIF.
WRITE: / 'copie de', SRVFILE.
INITIALIZATION.
CONCATENATE 'DEBUG_' SY-UNAME INTO SRVFILE.
PCFILE = SRVFILE.
T1 = 'Checkbox'.
T2 = 'Radio Bouton'.
POUSSER = 'Pousse !'.
SSCRFIELDS-FUNCTXT_01 = 'fonction 1'.
SSCRFIELDS-FUNCTXT_02 = 'fonction 2'.
SSCRFIELDS-FUNCTXT_03 = 'bouton 3'.
SSCRFIELDS-FUNCTXT_04 = 'bouton 4'.
SSCRFIELDS-FUNCTXT_05 = 'bouton 5'.
par
perform bdc_field using 'QINF-LIEFERANT' tab-lifnr.
Abap :
------
REPORT ZZJPL047 NO STANDARD PAGE HEADING LINE-SIZE 255.
*=------------------------------------------------------------------=*
*constantes
CONSTANTS:
C_BIFOLDER(12) VALUE 'JPL_DEMO',
C_FILENAME(64) VALUE 'C:\jpl\Fichier.txt'
.
*=--naming-via-FILE-transaction-------------------------------------=*
DATA: IN_NAME LIKE FILENAME-FILEINTERN VALUE '???'.
*=------------------------------------------------------------------=*
*structure du fichier UNIX à plat en entree
DATA DATASET(5000).
*les zones respectent le mappage du fichier à plat
*soit au caractère près, soit par tabulation X'09'
DATA:
BEGIN OF HPUX OCCURS 0,
COL_A(9),
COL_B(20),
COL_C(40),
COL_D(1),
COL_E(1),
COL_F(4),
COL_G(1),
COL_H(1),
COL_I(10),
END OF HPUX,
HPUXLUS TYPE I VALUE 0 "nb lignes lues
,TRTLUS TYPE I VALUE 0 "nb lignes conservees
,TRXECRI TYPE I VALUE 0 "nb transactions
,TCODE(4),
*------table sbdc.
* Batchinputdata of single transaction
BEGIN OF BDCDATA OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA:
END OF BDCDATA.
DATA RC TYPE I.
*=------------------------------------------------------------------=*
*selection screen
*=------------------------------------------------------------------=*
*description du fichier en lecture
PARAMETERS PHY_NAME LIKE FILENAME-FILEEXTERN.
PARAMETERS SRV RADIOBUTTON GROUP SENS.
PARAMETERS PC RADIOBUTTON GROUP SENS.
SELECTION-SCREEN ULINE.
*description du dossier BI en écriture
PARAMETERS GROUP(12).
PARAMETERS FORTEST AS CHECKBOX.
PARAMETERS SM35 AS CHECKBOX.
SELECTION-SCREEN ULINE.
*----------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
*fichier en entree nom du fichier
PERFORM READ_PHYSICAL_NAME USING IN_NAME
CHANGING PHY_NAME.
GROUP = C_BIFOLDER.
* srv = 'X'.
PC = 'X'.
*----------------------------------------------------------------------*
START-OF-SELECTION.
*----------------------------------------------------------------------*
* lecture du fichier en entree vers la table interne
IF SRV = 'X'.
OPEN DATASET PHY_NAME FOR INPUT IN TEXT MODE.
DO.
READ DATASET PHY_NAME INTO DATASET.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
*format avec tabulation ? ... ou sans : ca roule !
* avec tabulations
PERFORM FLF2COL USING DATASET HPUX RC.
* sans tabulations
* hpux = dataset.
*charger en table interne
APPEND HPUX.
ENDDO.
ELSE.
DATA FILENAME LIKE RLGRAP-FILENAME .
FILENAME = PHY_NAME .
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = FILENAME
FILETYPE = 'DAT' "avec tabulations
TABLES
DATA_TAB = HPUX
EXCEPTIONS
OTHERS = 8.
ENDIF.
*=------------------------------------------------------------------=*
* decortiquer le fichier -> dossier BI
*=------------------------------------------------------------------=*
PERFORM OPEN_GROUP.
LOOP AT HPUX.
ADD 1 TO HPUXLUS.
*sans les lignes en commentaire
CHECK HPUX-COL_A(1) <> '*'.
*modèle pour éliminer les lignes inutiles
**eliminer les ___
* if ___ = '___'.
* write:/ '___ : ', ___.
* write:
* 'abandonné : '.
* continue.
* endif.
*modèle pour rechercher des infos complémentaires déja dans SAP
**trouver ___
* data w_matnr like eina-matnr.
* call function 'CONVERSION_EXIT_ALPHA_INPUT'
* exporting
* input = ___
* importing
* output = w_matnr.
* select single * from eina where matnr = w_matnr.
* if sy-subrc <> 0.
* continue.
* endif.
*la ligne HPUX est acceptée
ADD 1 TO TRTLUS.
PERFORM BDC_POSTE.
ENDLOOP.
WRITE: / HPUXLUS, 'lus sur', PHY_NAME.
WRITE:/ TRTLUS, 'sélectionnés pour le dossier', group.
IF FORTEST <> SPACE.
WRITE:/ ' Mode TEST requis, dossier non ouvert'.
ENDIF.
WRITE:/ TRXECRI, 'transactions dans le dossier', group.
PERFORM CLOSE_GROUP.
IF FORTEST = SPACE AND SM35 = 'X'.
SET PARAMETER ID 'MPN' FIELD GROUP .
CALL TRANSACTION 'SM35' AND SKIP FIRST SCREEN.
LEAVE PROGRAM.
ENDIF.
*---------------------------------------------------------------------*
* FORM READ_PHYS_NAME *
*---------------------------------------------------------------------*
* --> LOG_NAME *
*---------------------------------------------------------------------*
FORM READ_PHYSICAL_NAME USING LOG_NAME CHANGING PHY_NAME.
IF LOG_NAME = '???'.
PHY_NAME = C_FILENAME.
ELSE.
CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
LOGICAL_FILENAME = LOG_NAME
IMPORTING
FILE_NAME = PHY_NAME
EXCEPTIONS
FILE_NOT_FOUND = 1
OTHERS = 2.
IF NOT SY-SUBRC IS INITIAL.
MESSAGE A651(M7) WITH 'V_FILENAME' LOG_NAME.
ENDIF.
ENDIF.
ENDFORM. " change_ext_int
*----------------------------------------------------------------------*
* create batchinput session *
*----------------------------------------------------------------------*
FORM OPEN_GROUP.
IF FORTEST = SPACE.
REFRESH BDCDATA.
SKIP.
WRITE: /(20) 'Create group'(I01), GROUP.
SKIP.
* open batchinput group
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = GROUP
USER = SY-UNAME
KEEP = 'X'.
*----------------------------------------------------------------------*
* end batchinput session *
*----------------------------------------------------------------------*
FORM CLOSE_GROUP.
* close batchinput group
IF FORTEST = SPACE.
CALL FUNCTION 'BDC_CLOSE_GROUP'.
WRITE: /(30) 'BDC_CLOSE_GROUP'(I04),
'returncode:'(I05),
SY-SUBRC.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* Start new transaction *
*----------------------------------------------------------------------*
FORM BDC_TRANSACTION USING TCODE.
IF FORTEST = SPACE.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = TCODE
TABLES
DYNPROTAB = BDCDATA.
* write / bdcdata.
add 1 to trxecri .
REFRESH BDCDATA.
ENDIF.
ENDFORM.
*
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
IF FORTEST = SPACE.
CLEAR BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
* write / bdcdata.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
IF FORTEST = SPACE.
CLEAR BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
* write / bdcdata.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BDC_DEBUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BDC_DEBUT.
WRITE: / HPUX.
Abap :
------
REPORT YYJPL049.
*----------------------------------------------------------------------
* Topic : The program uses FTP to exchange files
*----------------------------------------------------------------------*
DATA: BEGIN OF PC OCCURS 0, DATA(1000), END OF PC.
DATA: FICHIER_UNIX LIKE FILENAME-FILEEXTERN.
DATA: FICHIER_AS LIKE FILENAME-FILEEXTERN.
DATA: FICHIER_IN LIKE FILENAME-FILEEXTERN.
DATA: FICHIER_OUT LIKE FILENAME-FILEEXTERN.
*=-------------------------------------------------------------------=*
* criteres de selection
*=-------------------------------------------------------------------=*
PARAMETERS:
IP(60) LOWER CASE,
USER(20) LOWER CASE,
PASS(20) LOWER CASE,
UNIXDIR(60) LOWER CASE,
UNIXFILE(60) LOWER CASE,
AS4DIR(60) LOWER CASE,
AS4FILE(60) LOWER CASE.
PARAMETERS GET RADIOBUTTON GROUP G1.
PARAMETERS PUT RADIOBUTTON GROUP G1.
*=-------------------------------------------------------------------=*
INITIALIZATION.
*=-------------------------------------------------------------------=*
DATA S_BUKRS LIKE LFB1-BUKRS.
GET PARAMETER ID 'BUK' FIELD S_BUKRS.
IP = '153.112.118.10'.
USER = 'SAPFTP'.
PASS = 'SAPFTP'.
GET = 'X'.
*=-------------------------------------------------------------------=*
START-OF-SELECTION.
*=-------------------------------------------------------------------=*
CONCATENATE UNIXDIR UNIXFILE INTO FICHIER_UNIX.
TRANSLATE FICHIER_UNIX TO LOWER CASE.
ENDIF.
TRANSLATE FTP-CMD USING '_ '.
APPEND FTP.
FTP-CMD = 'quit'. APPEND FTP.
*charger la pile FTP
OPEN DATASET FICHIER_IN FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC <> 0.
WRITE: 'erreur ouverture dataset', FICHIER_IN,
'erreur =', SY-SUBRC.
EXIT.
ENDIF.
LOOP AT FTP.
TRANSFER FTP-CMD TO FICHIER_IN.
IF SY-SUBRC <> 0.
WRITE: 'erreur transfert dataset', FICHIER_IN,
'erreur =', SY-SUBRC.
EXIT.
ENDIF.
WRITE FTP-CMD.
ENDLOOP.
CLOSE DATASET FICHIER_IN.
ULINE.
*run ftp
DATA: BEGIN OF TABL OCCURS 0, LINE(2000), END OF TABL.
DATA: PARCOM_LOC(100) TYPE C.
DATA LINE LIKE TABL-LINE.
CONCATENATE 'ftp <' FICHIER_IN '>' FICHIER_OUT
INTO PARCOM_LOC SEPARATED BY ' '.
*from call help : before calling a c_func, need to check for
* authority.
CALL FUNCTION 'AUTHORITY_CHECK_C_FUNCTION'
EXPORTING
PROGRAM = 'COMMAND'
ACTIVITY = 'CALL'
FUNCTION = 'SYSTEM'
EXCEPTIONS
NO_AUTHORITY = 1
ACTIVITY_UNKNOWN = 2.
IF SY-SUBRC <> 0.
WRITE:/'No authority to run File Transfer. Send the file manually'.
ULINE.
EXIT.
ENDIF.
REFRESH TABL.
CALL 'SYSTEM' ID 'COMMAND' FIELD PARCOM_LOC
ID 'TAB' FIELD TABL-*SYS*.
* show log
OPEN DATASET FICHIER_OUT FOR INPUT IN TEXT MODE.
IF SY-SUBRC <> 0.
WRITE: 'erreur ouverture dataset', FICHIER_OUT,
'erreur =', SY-SUBRC.
EXIT.
ENDIF.
WRITE / PARCOM_LOC.
DO.
READ DATASET FICHIER_OUT INTO LINE.
IF SY-SUBRC <> 0. EXIT. ENDIF.
WRITE / LINE.
ENDDO.
CLOSE DATASET FICHIER_OUT.
DELETE DATASET FICHIER_IN.
DELETE DATASET FICHIER_OUT.
le code ABAP
l'arbre du browser de code
les textes du textpool
les descriptions de DYNPRO
Il n'y a pas d'outil de restauration correspondant, c'est exprès parce que le but n'est pas de faire un outil de
sauvegarde/restauration, il y bien déjà assez comme ça (enfin, juste pour voir, demandez à votre administrateur de restaurer
uniquement le programme xxx, sauvegardé vendredi il y a trois semaines. En général la réponse est non : les sauvegardes de
l'administrateur sont là pour permettre de restaurer un disque en cas de crash, pas pour récupérer les conneries d'un
utilisateur, fût-il programmeur). En plus, je n'ai jamais pris le temps de vérifier si on peux réinjecter un DYNPRO dans les
bases de SAP sans véroller les tables de références croisées.
L'objectif est d'archiver l'état d'un ou plusieurs programmes à une date donnée, un peu à la façon du gestionnaire de version,
mais hors de SAP. Utilisation courante : faire une recherche avec l'explorateur de windows pour retrouver un texte
particulier, ce qui permet de couvrir les cas où les références croisées de SAP ne répondent pas (c'est possible), par exemple
dans les textpools des ABAP.
Textpool :
----------
IJPL JP Lamontre
R exporter des ABAP
SAUTHOR Auteur
SMODIF Date de modification
SOBJ_NAME Objet
SSEP Séparateur CSV
------------------------------------
Abap :
------
REPORT ZZJPL100 LINE-SIZE 255.
TABLES: TRDIR.
DATA:
_TRDIR LIKE TRDIR OCCURS 0 WITH HEADER LINE,
BEGIN OF SOMMAIRE OCCURS 0,
PROG LIKE TRDIR-NAME,
TITRE(70),
END OF SOMMAIRE,
DATA:
BEGIN OF NOM OCCURS 0,
N(20),
END OF NOM.
START-OF-SELECTION.
SELECT * INTO TABLE _TRDIR FROM TRDIR WHERE
NAME IN OBJ_NAME AND
CNAM IN AUTHOR AND
UDAT IN MODIF
ORDER BY NAME.
LOOP AT _TRDIR.
WRITE: / _TRDIR.
BEGIN OF PC OCCURS 0,
ENR(5000),
END OF PC,
W100(100).
CLEAR PC.
REFRESH PC.
PC-ENR = 'TRDIR='.
APPEND PC.
PC-ENR =
'-----------------------------------------------------------------------
-----------------------------------------------------------------------'
.
APPEND PC.
PC-ENR = _TRDIR.
APPEND PC.
PC-ENR =
'-----------------------------------------------------------------------
-----------------------------------------------------------------------'
.
APPEND PC.
READ TEXTPOOL P_NAME INTO TTAB LANGUAGE SY-LANGU.
PC-ENR = 'Textpool :'.
APPEND PC.
PC-ENR =
'-----------------------------------------------------------------------
-----------------------------------------------------------------------'
.
APPEND PC.
LOOP AT TTAB.
PC-ENR = TTAB.
APPEND PC.
IF TTAB-ID = 'R'.
SOMMAIRE-PROG = P_NAME.
SOMMAIRE-TITRE = TTAB-ENTRY.
APPEND SOMMAIRE.
WRITE : / P_NAME, TTAB-ENTRY(70).
ENDIF.
ENDLOOP.
PC-ENR =
'-----------------------------------------------------------------------
-----------------------------------------------------------------------'
.
APPEND PC.
DATA: BEGIN OF SOURCE OCCURS 0,
LINE(72),
END OF SOURCE.
PC-ENR = 'Abap :'.
APPEND PC.
PC-ENR =
'-----------------------------------------------------------------------
-----------------------------------------------------------------------'
.
APPEND PC.
READ REPORT P_NAME INTO SOURCE.
LOOP AT SOURCE.
PC-ENR = SOURCE-LINE.
APPEND PC.
ENDLOOP.
PC-ENR =
'-----------------------------------------------------------------------
-----------------------------------------------------------------------'
.
APPEND PC.
CONCATENATE P_NAME '-ABAP.TXT' INTO PCFILE.
CONCATENATE PCDIR PCFILE INTO ZG_PCFILE.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = ZG_PCFILE
TABLES
DATA_TAB = PC
EXCEPTIONS
OTHERS = 9.
DATA:
* main node table
TREE LIKE SNODE OCCURS 5000 WITH HEADER LINE,
CURRENT_ROOT_ID LIKE SNODE-ID VALUE '1',
CUCOL LIKE SY-CUCOL,
CUROW LIKE SY-CUROW,
LOOP AT TREE.
* CASE tree-tlevel.
* WHEN '01'.
* WRITE / tree-id.
* WHEN '02'.
* WRITE: / ' ', tree-id.
* WHEN '03'.
* WRITE: / ' ', tree-id.
* WHEN OTHERS.
* WRITE: / ' >>', tree-id.
* ENDCASE.
*
* WRITE tree-type .
* WRITE tree-name .
* WRITE tree-parent.
* WRITE tree-child .
* WRITE tree-next .
* WRITE tree-tlevel.
* WRITE tree-tlock .
* WRITE tree-status .
* WRITE tree-include.
* WRITE tree-link.
IF TREE-TYPE = 'OPS'.
PERFORM EXTRACT_DYNPRO USING P_NAME TREE-NAME.
ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form EXTRACT_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_NAME text *
* -->P_TREE_NAME text *
*----------------------------------------------------------------------*
FORM EXTRACT_DYNPRO USING P_PROG
P_DYNP.
TABLES:
D020S.
DATA:
BEGIN OF DYNP,
PROG LIKE D020S-PROG,
DNUM LIKE D020S-DNUM,
END OF DYNP,
H LIKE D020S,
WH LIKE SCR_CHHEAD,
WHT LIKE SCR_CHHEAD OCCURS 0,
F LIKE D021S OCCURS 0 WITH HEADER LINE,
WF LIKE SCR_CHFLD OCCURS 0 WITH HEADER LINE,
E LIKE D022S OCCURS 0 WITH HEADER LINE,
M LIKE D023S OCCURS 0 WITH HEADER LINE,
BEGIN OF PC OCCURS 0,
ENR(5000),
END OF PC,
PCFILE(64),
ZG_PCFILE(128).
DYNP-PROG = P_PROG.
DYNP-DNUM = P_DYNP.
*entete de dynpro
CONCATENATE DYNP-PROG '-' DYNP-DNUM '-HEADER' INTO PCFILE.
CONCATENATE PCDIR PCFILE PCSFX INTO ZG_PCFILE.
CLEAR PC.
REFRESH PC.
*conversion
CALL FUNCTION 'RS_SCRP_HEADER_RAW_TO_CHAR'
EXPORTING
HEADER_INT = H
IMPORTING
HEADER_CHAR = WH
EXCEPTIONS
OTHERS = 1.
*champs du dynpro
CONCATENATE DYNP-PROG '-' DYNP-DNUM '-FIELD' INTO PCFILE.
CONCATENATE PCDIR PCFILE PCSFX INTO ZG_PCFILE.
CLEAR PC.
REFRESH PC.
*conversion
CALL FUNCTION 'RS_SCRP_FIELDS_RAW_TO_CHAR'
TABLES
FIELDS_INT = F
FIELDS_CHAR = WF
EXCEPTIONS
OTHERS = 1.
*PAI PBO
CONCATENATE DYNP-PROG '-' DYNP-DNUM '-ABAP' INTO PCFILE.
CONCATENATE PCDIR PCFILE PCSFX INTO ZG_PCFILE.
CLEAR PC.
REFRESH PC.
*Matchcodes
CONCATENATE DYNP-PROG '-' DYNP-DNUM '-MCODE' INTO PCFILE.
CONCATENATE PCDIR PCFILE PCSFX INTO ZG_PCFILE.
CLEAR PC.
REFRESH PC.
*ecrire sur le pc
START-OF-SELECTION.
SELECT * INTO TABLE _TADIR
FROM TADIR WHERE PGMID IN PGMID
AND OBJECT IN OBJECT
AND OBJ_NAME IN OBJ_NAME
AND AUTHOR IN AUTHOR
AND SRCDEP IN SRCDEP
AND DEVCLASS IN DEVCLASS.
LOOP AT _TADIR.
WRITE: / _TADIR.
CASE _TADIR-OBJECT.
WHEN 'TABL'.
PERFORM EXTRACT_TABL USING _TADIR-OBJ_NAME.
ENDCASE.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form EXTRACT_TABL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TADIR_OBJ_NAME text *
*----------------------------------------------------------------------*
FORM EXTRACT_TABL USING P_NAME.
ENDFORM.
Textpool :
----------
IJPL JP Lamontre
R exporter : Textes et formulaires
SAUTHOR Auteur
SMODIF Date de modification
SOBJ_NAME Objet
-----------------------------------------
Abap :
------
REPORT ZZJPL101 LINE-SIZE 255.
SELECTION-SCREEN COMMENT 1(80) TEXT-JPL.
TABLES: STXH.
DATA:
_STXH LIKE STXH OCCURS 0 WITH HEADER LINE,
PCFILE(64),
ZG_PCFILE(128).
PARAMETERS: PCDIR(64) DEFAULT 'c:\sappc\'.
SELECT-OPTIONS:
OBJ_NAME FOR STXH-TDNAME DEFAULT 'Z*' OPTION CP ,
AUTHOR FOR STXH-TDFUSER ,
MODIF FOR STXH-TDLDATE .
START-OF-SELECTION.
SELECT * INTO TABLE _STXH
FROM STXH WHERE TDNAME IN OBJ_NAME
AND TDFUSER IN AUTHOR
AND TDLDATE IN MODIF .
LOOP AT _STXH .
WRITE: / _STXH .
PERFORM EXTRACT_TEXT.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form EXTRACT_TEXT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TADIR_OBJ_NAME text *
*----------------------------------------------------------------------*
FORM EXTRACT_TEXT .
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
PC = HEAD.
APPEND PC.
LOOP AT LINE.
CLEAR PC.
MOVE-CORRESPONDING LINE TO PC.
APPEND PC.
ENDLOOP.
Utilisé avec Sauvegarde Texte et formulaires il fournit un service identique à l'export / import de code ABAP dans l'éditeur
Textpool :
----------
R import formulaire, style ou textes
-------------------------------------------
Abap :
------
REPORT ZZJPL106 LINE-SIZE 255.
SELECTION-SCREEN COMMENT 1(80) TEXT-JPL.
TABLES: STXH.
DATA:
_STXH LIKE STXH OCCURS 0 WITH HEADER LINE,
PCFILE(64),
ZG_PCFILE(128).
PARAMETERS: PCDIR(64) DEFAULT 'c:\sap\'.
PARAMETERS:
_OBJECT LIKE STXH-TDOBJECT DEFAULT 'FORM',
_NAME LIKE STXH-TDNAME DEFAULT 'Z*',
_ID LIKE STXH-TDID DEFAULT 'DEF',
_SPRAS LIKE STXH-TDSPRAS DEFAULT 'E' .
START-OF-SELECTION.
SELECT SINGLE *
FROM STXH
WHERE TDOBJECT = _OBJECT
AND TDNAME = _NAME
AND TDID = _ID
AND TDSPRAS = _SPRAS.
IF SY-SUBRC <> 0.
WRITE:/'Cet objet n''existe pas, essaie encore'.
EXIT.
ENDIF.
DATA: LINE LIKE TLINE OCCURS 0 WITH HEADER LINE,
HEAD LIKE THEAD,
BEGIN OF PC OCCURS 0,
TDFORMAT LIKE TLINE-TDFORMAT,
TDLINE LIKE TLINE-TDLINE,
FILLER(500),
END OF PC.
REFRESH PC.
* CLIENT = SY-MANDT
ID = _ID
LANGUAGE = _SPRAS
NAME = _NAME
OBJECT = _OBJECT
* ARCHIVE_HANDLE = 0
IMPORTING
HEADER = HEAD
TABLES
LINES = LINE
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
WRITE:/'objet endommagé : READ_TEXT retourne', SY-SUBRC.
EXIT.
ENDIF.
CLEAR LINE.
MOVE-CORRESPONDING PC TO LINE.
APPEND LINE.
ENDLOOP.
LOOP AT JOIN.
ENDLOOP.
démarrer le debugger de formulaire et sur l’OPEN FORM, activer le debugger ABAP (menu EDIT) et descendre au niveau
du programme appelant
ou
Transaction SE30 : mesure de durée d’exécution. Faire une mesure sur la transaction en précisant Objet de la mesure =
Module de fonction START_FORM ou OPEN_FORM
Une fois terminé le travail (exécution de la transaction via le bouton Mesure de durée), choisir le bouton Analyser puis le
bouton hiérarchie d’appel. A chaque niveau 0 on trouve le nom du programme appelant. Analyser ce programme avec
l’éditeur ABAP : chercher START_FORM ou OPEN_FORM (recherche globale).
Ca y est, vous avez trouvé le programme, la ligne de code qui appelle le formulaire et la zone qui contient le nom du
formulaire. Maintenant, avec le debugging classique et la recherche des cas d’emploi, on trouve tout ce qu’on veux, par
exemple remonter à la table de customizing qui contient le nom du formulaire.
Valeurs « rondes » :
LPI : 2 * 36 ; 3 * 24 ; 4 * 18 ; 6 * 12 ; 8 * 9
CPI : 2 * 60 ; 3 * 40 ; 4 * 30 ; 5 * 24 ; 6 * 20 ; 8 * 15 ; 10 * 12
Pour améliorer la lisibilité des formulaires, et donc leur maintenance, indenter le code quand c’est possible :
avec cette présentation la distinction entre la partie logique (commandes, commentaires) et la partie active (texte imprimable)
est immédiate.
dans le premier cas il est donc impératif de tenir à jour les variables dans l'appelant tant qu'on peut en avoir besoin
dans le deuxième cas, les variables de l'appelant peuvent évoluer, le symbole n'est plus dépendant. C'est préférable par
exemple si l'appelant utilise un LOOP avec des END-AT (ce qui rend incohérent à la volée chaque champ hors de la rupture)
Offset +
Output Length (nn)
Omitting the Leading Sign (S)
Leading Sign to the Left (<)
Leading Sign to the Right (>)
Omitting Leading Zeros (Z)
Space Compression (C)
Number of Decimal Places (.n)
Omitting the Separator for 'Thousands' (T)
Specifying an Exponent for Floating Point Numbers (En)
Right-Justified Output (nR)
Program Symbols
PARAMETERS:
COMPANY(4) TYPE C OBLIGATORY.
PARAMETERS:
PAR_PRIA LIKE TSP03-PADEST.
*----------------------------------------------------------------------*
DATA:
HLP_AFORN LIKE T042B-AFORN, "alternative advice name (param.)
HLP_AUTH LIKE ITCPO-TDAUTORITY, " print authority
HLP_ELEMENT(6) TYPE C, "name of SAPscript elements
HLP_FORMULAR LIKE T042B-AFORN, "form (customizing, ofi, param.)
HLP_SPRACHE LIKE REGUH-ZSPRA, "language for reading texts
HLP_XHRFO LIKE HRXBLNR-XHRFO,"X - use HR form
FLG_DIALOG(1).
CLEAR T001.
SELECT SINGLE * FROM T001
WHERE BUKRS EQ COMPANY.
HLP_FORMULAR = 'UnFormulaire'.
PERFORM FILL_ITCPO USING PAR_PRIA
'LIST5S'
SPACE "par_sofa via tab_ausgabe!
HLP_AUTH.
UP_DEVICE = 'PRINTER'.
FLG_DIALOG = 'X'.
ITCPO-TDNEWID = 'X'.
CALL FUNCTION 'OPEN_FORM'
EXPORTING
FORM = HLP_FORMULAR
DEVICE = UP_DEVICE
LANGUAGE = T001-SPRAS
OPTIONS = ITCPO
DIALOG = FLG_DIALOG
IMPORTING
RESULT = ITCPP
EXCEPTIONS
FORM = 1.
IF SY-SUBRC EQ 1. "Abbruch:
IF SY-BATCH EQ SPACE. "Formular ist nicht aktiv!
MESSAGE A069 WITH HLP_FORMULAR.
ELSE.
MESSAGE S069 WITH HLP_FORMULAR.
MESSAGE S094.
STOP.
ENDIF.
ENDIF.
PAR_PRIA = ITCPP-TDDEST.
ENDLOOP.
CALL FUNCTION 'END_FORM'.
SET COUNTRY SPACE.
ENDLOOP.
CALL FUNCTION 'CLOSE_FORM'
IMPORTING
RESULT = ITCPP.
*---------------------------------------------------------------------*
* FORM FILL_ITCPO *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> P_TDDEST *
* --> P_TDDATASET *
* --> P_TDIMMED *
* --> P_TDAUTORITY *
*---------------------------------------------------------------------*
FORM FILL_ITCPO USING P_TDDEST LIKE ITCPO-TDDEST
P_TDDATASET LIKE ITCPO-TDDATASET
P_TDIMMED LIKE ITCPO-TDIMMED
P_TDAUTORITY LIKE ITCPO-TDAUTORITY.
CLEAR ITCPO.
ITCPO-TDPAGESLCT = SPACE. "all pages
ITCPO-TDNEWID = 'X'. "create new spool dataset
ITCPO-TDCOPIES = 1. "one copy
ITCPO-TDDEST = P_TDDEST. "name of printer
ITCPO-TDPREVIEW = SPACE. "no preview
ITCPO-TDCOVER = SPACE. "no cover page
ITCPO-TDDATASET = P_TDDATASET. "dataset name
* IF zw_xvorl EQ space.
ITCPO-TDSUFFIX1 = P_TDDEST. "name or printer
* ELSE.
* itcpo-tdsuffix1 = 'TEST'. "test run
* ENDIF.
ITCPO-TDSUFFIX2 = 'Titre Formulaire'. "name of report variant
ITCPO-TDIMMED = P_TDIMMED. "print immediately?
ITCPO-TDDELETE = SPACE. "do not delete after print
ITCPO-TDTITLE = 'Titre Formulaire'. "title of pop-up-window
ITCPO-TDCOVTITLE = 'Titre Formulaire'. "title of print-cover
ITCPO-TDAUTORITY = P_TDAUTORITY. "print authority
ITCPO-TDARMOD = 1. "print only
.../...
2) recherche des fonctions appelées en UPDATE TASK, dans lesquelles il y a souvent des customer-function
Ce qui donne dans le programme appelant : (exemple : SAPFM06I / FM06IF01 ligne 3051)
Sinon, partir en debugging dans le module PBO, il y a de fortes chances que les valeurs initiales soient gérées à la main via
une structure : exemple : transaction SO10 (gérer les textes standard)
(pstxt est une structure du dictionnaire)
Cas d’emploi : write ne permet pas de variable dans l’offset, mais il le tolère via un field-symbol
DEFINE LINE.
CONSTANTS: &1 TYPE C VALUE &2.
END-OF-DEFINITION.
Le programme principal appelle un sous-programme (ici general_processing) contenu dans un include, et lui passe en
paramètre le nom d'un sous-programme du programme principal (ici printing_fr)
(PGM=RDEXPAI*)
include rvexinro.
perform general_processing using 'PRINTING_FR'.
form printing_fr.
…/…
(INCLUDE=RVEXINRO)
form general_processing using value(local_printing_routine).
perform special_processing_uk in program (sy-repid) if found.
perform (local_printing_routine) in program (sy-repid) if found.
Pour trouver les requêtes (ordres et tâches) associées à un objet : SE16 sur V_E071EU
The underlined characters are the hex sequence, under which the icon is stored. So the printer icon is stored as 1B 2C 30 58.
3. Call transaction SPAD, press the button 'Full Administration',then the button 'Character sets', set the cursor on the
characterset 1100 (I suppose this is your system codepage) and press the button 'Edit character set' (the icon with the puzzle).
Now search for sequence 1B 2C 30 58. It is the SAP character number 801.
4. So if you add a <801> into your layout set, the <801> is printed as a print icon.
I know this way sounds a little complicated. Usually it might be enough that you start with step 3 and look for names of the
icons.E.g. the character name SAPicon0X_PRINT suggest that it is the print icon.
Autre moyen : SP12 / jeux de caractère / Comparer jeux. Choisir la page de code 1100 (page de code pour écran) au moins,
chercher l’icône par son nom :
Reste à découvrir ce que signifie en termes de code sapscript : add a <801> into your layout set
C’est à prendre au pied de la lettre, ça marche comme un style </> ou <C>
Avant toute chose, il faut vérifier que l’imprimante cible (ou plutot le pilote SAP de l’imprimante) supporte les icones. Pour
cela, utiliser le programme RSPOCP02 (outils / ccms / spools / temse administration / jeux de caractère / imprimer jeux) pour
générer un spool de contrôle du jeux de caractère. Utiliser les icônes et symboles correctement imprimés SUR LE PAPIER !
le résultat sur écran peux être tout a fait correct, contrairement au résultat sur papier. La différence vient du fait que le jeux
de caractère utilisé pour l’aperçu (donc sur un appareil de type SCREEN) est différent du jeux de caractères utilisés pour
imprimer. Le jeux de caractère utilisé par l’imprimante est inscrit dans les paramètres du type d’appareil (SPAD + type
d’appareil + sélectionner l’appareil cible)
Cette transaction permet, sous assistance de SAP, de constituer des modèles d’organisation pour les menus. Par cette étape,
on détermine les “ objets ” autorisés (nécessaires) pour exercer l’activité envisagée :
Une fois cette étape achevée, on peux déjà créer un utilisateur test pour vérifier le fonctionnement correct des
autorisations sur les transactions et sur les fourchettes de valeur, ainsi que la présentation générale du travail avec le
menu dynamique (SU54) accessible par Système / Valeurs utilisateur / Gestion des favoris.
Si les utilisateurs sont suffisamment expérimentés, on peux leur laisser le menu standard SAP ce qui a pour avantage de
donner à tous le même menu et simplifier ainsi l’assistance aux utilisateurs.
Sinon, on peux brider aussi le menu SAP en le remplaçant par un menu dédié à un ou plusieurs groupes d’activité. Ce
menu est construit avec la transaction SE43 et permet de créer des menus de domaine. Un menu de domaine est un
objet qui permet de gérer l’arborescence des chemins vers les codes transactions … à condition que les noms de
transactions aient au plus 10 caractères bien que le code transaction puisse faire jusqu’à 20 caractères. Un menu de
domaine est une transaction qui permet d’atteindre d’autres transactions. Attention, bien que SAP le permette, ne pas
créer de noms de menus de domaine de plus de quatre caractères.
Affecter le menu de domaine comme menu initial de l’utilisateur : Outils / Administration / Gestion des utilisateurs /
Utilisateur / (indiquer le nom d’utilisateur) / modifier /Constantes / Menu init (SU01).
Liste des menus de domaine : consulter la liste SE43 (F4 sur le premier champ + bouton Système Info)(c’est longuet) ou
parcourir les menus SAP et par Système / Statut, quand le nom de programme est MENUxxxx, alors xxxx est un nom de
menu de domaine, ou utiliser le programme Liste des menus qui développe toute l’arborescence des menus SAP avec noms
de menu de domaine, nom de transaction associée, libellé standard.
/WDEVPRO
/:INCLUDE DISTINCTION_DEV_PRO OBJECT TEXT ID ST LANGUAGE FR
objet texte :
TEXT DISTINCTION_DEV_PRO ST F
/:IF &SY-SYSID& <> "PRO"
/:IF &SAPSCRIPT-DRIVER& = "HPL2" OR &SAPSCRIPT-DRIVER& = "POST" OR &SAPSCRIPT-DRIVER& = "PRES"
/:INCLUDE ZHEX-MACRO-BMON OBJECT TEXT ID ST LANGUAGE FR
/:IF &SAPSCRIPT-SUBRC(CZ)& <> "0"
* TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
/:ENDIF
/:ELSE
* TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS
ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER
TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS
ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER
TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS
ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER
TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST NE PAS ENVOYER TEST
/:ENDIF
/:ENDIF
IF SY-SUBRC = 01.
CALL TRANSACTION TCD.
ELSE.
MESSAGE S112 WITH TCD.
ENDIF.
ENDFORM. " START_TRANSACTION
Ce sous-programme est dans le programme SAPMS01M (transaction Menu dynamique). S’il vous convient tel que, utilisez
un appel de routine extérieure
COMMIT WORK.
IF SY-BINPT = 'X'.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.
LEAVE TO TRANSACTION SY-TCODE.
Fournisseur =9.fr20.00002
cette syntaxe permet de s'appuyer sur les tables d'index du match-code, donc gère correctement les problèmes de
performance.
Effet de bord : on n'a aucune idée du résultat, le traitement est réalisé au moment de l'exécution du dossier Batch Input.
Correctif : remplacer la lecture de la table transparente
If you want to convert an interactive report to html you can use following function module:
WWW_ITAB_TO_HTML_HEADERS
WWW_ITAB_TO_HTML_LAYOUT
WWW_LIST_TO_HTML
WWW_L_HTML_LIST_BUTTONS
WWW_SCREEN_TO_HTML
En particulier, voir aussi tous les abap RSTX*, c’est une mine d’or.
Pour fixer la largeur d’une colonne dans un report, en particulier pour les zones numériques :
a) Generating a list
SY-PAGNO - Number of current page of current list;
SY-LINNO - Number of current line on current page;
SY-COLNO - Number of column where cursor is positioned in current list;
SY-LINCT - Number of lines per page in current list
SY-LINSZ - Line width of current list;
SY-TITLE - Title that appears in the title bar of the display window;
SY-SROWS - Current number of lines in display window;
SY-SCOLS - Current number of columns in display window;
b) Interactive Reporting
After each interactive event, the following system fields are set
automatically:
SY-LSIND - Index of current list;
SY-LILLI - Absolute number of a selected line in displayed list;
SY-LISTI - Index of displayed list after line selection
SY-LISEL - Contents of a selected line;
SY-CUROW - Number of line in window to the cursor
SY-CUCOL - Number of column in window to the cursor
SY-CPAGE - Number of top displayed page in displayed list;
SY-STARO - Number of top line on top displayed page
SY-STACO - Number of first displayed column in the displayed list;
SY-UCOMM - Function code that triggered the event in the displayed list;
SY-PFKEY - Status of displayed list;
FORM generieren.
READ REPORT 'RFEPOSX0' INTO reptab.
Adaptation du modèle
INSERT REPORT 'RFEPOSX0' FROM reptab.
IF sy-subrc NE 0.
MESSAGE a308 WITH 'GENERIEREN - INSERT REPORT'.
ENDIF.
REPORT rfeposx1
INCLUDE rfeposx0.
Tools / dictionnary
(table) / display
Structure / print with setting / sapmininfo / pas print immediat
SP02
Display
Goto list display / system / list / save / local file / spreadsheet
What is the difference between ALE, EDI, IDocs and BAPI ? Table des matières
The interface concept of the classic R/3 is based on two different strategies: Remote Function Calls (RFC) and data
exchange through IDoc message documents. RFC makes direct and synchronous calls of a program in the remote system. If
the caller is an external program it will call an RFC-enabled function in R/3 and if the calling program is the R/3 system it
will call an RFC-function in another R/3-system or it will call a non-R/3 program through a gateway-proxy (usually
rfcexec.exe). BAPIs are a subset of the RFC-enabled function modules, especially designed as Application Programming
Interface (API) to the SAP business object, or in other words: are function modules officially released by SAP to be called
from external programs.
IDocs are text encoded documents with a rigid structure that are used to exchange data between R/3 and a foreign system.
Instead of calling a program in the destination system directly, the data is first packed into an IDoc and then sent to the
receiving system, where it is analyzed and properly processed. Therefore an IDoc data exchange is always an asynchronous
process. The significant difference between simple RFC-calls and IDoc data exchange is the fact, that every action
performed on IDocs are protocolled by R/3 and IDocs can be reprocessed if an error occurred in one of the message steps.
While IDocs have to be understood as a data exchange protocol, EDI and ALE are typical use cases for IDocs. R/3 uses
IDocs for both EDI and ALE to deliver data to the receiving system. ALE is basically the scheduling mechanism that defines
when and between which partners and what kind of data will be exchanged on a regular or event triggered basis. Such a
set-up is called an ALE-scenario.
The philosophical difference between EDI and ALE can be pinned as follows: If we send data to an external partner, we
generally speak of EDI, while ALE is a mechanism to reliable replicate data between trusting systems to store a redundant
copy of the IDoc data. The difference is made clear, when we think of a purchase order that is sent as an IDoc. If we send
the purchase order to a supplier then the supplier will store the purchase order as a sales order. However, if we send the
purchase order via ALE to another R/3 system, then the receiving system will store the purchase order also as a purchase
order.
html
Grasping the concept of NetWeaver, and understanding its components, isn't a simple task, the company has acknowledged.
SAP America CEO Bill McDermott has pledged improved communication to customers on the topic, and analysts are
predicting that SAP customers who pay attention can benefit from the integration and development environment. How
important is NetWeaver? So important that McDermott advised SAP decision makers who attended the recent
SearchSAP.com Chicago conference to change their upgrade plans from R/3 4.7 Enterprise to mySAP ERP, which includes
the full power of NetWeaver. That doesn't mean you should, but it does mean that you may want to find out what all the fuss
is about.
--------------------------------------------------------------------------------------------------------------------------------------------------------
NetWeaver is a collection of six components currently in ramp-up (Q1/2004) with completion due for (Q3/2004).
1. WebApp Server
2. BW
3. Master Data Management (MDM)
4. Exchange Infrastructure (EI)
5. Enterprise Portals
6. Mobile Infrastructure
In terms of what NetWeaver 'is', SAP describe it as the technical foundation for an Enterprise Services Architecture. I think
this means it's best seen as a technical platform for web-enabling SAP's current products (R/3, CRM, BW, etc.) and any other
3rd party product you may have. Combine this with a mechanism for managing your master data across distributed systems
(MDM), a business data exchange mechanism (EI), throw in a business data warehouse (BW) (all underpinned by the
WebAS) and there's your architecture.
SAP's sales strategy from here on will concentrate on selling NetWeaver as a complete product to new customers and
encouraging existing customers to upgrade piecemeal.
The WebApp Server is SAP's long term replacement for the ITS so I don't think ITS will come as standard. However unless
SAP come up with replacements for their current ITS products (probably with BSPs or WebDynpro) you can plug in an ITS.
I'm guessing however that they won't bother.
--------------------------------------------------------------------------------------------------------------------------------------------------------
I know this much....If you are looking at enterprise to replace your SAP client for your data entry users, it is not
recommended because the response time is MUCH slower (due to the ITS layer).
* unicode method
data ht(1).
class cl_abap_char_utilities definition load.
ht = cl_abap_char_utilities=>horizontal_tab.
IF <T> CA HT.
Debug :
char_utilities=FFFE;FEFF;EFBBBF;1 ;B;#;y;#;#;#;##;#;#
464646453B464546463B4546424242463B31203B423B003BFF3B093B0B3B0A3B0D0A3B0C3B08202020202020202020202020
F F F E ; F E F F ; E F B B B F ; 1 ; B ; # ; y ; # ; # ; # ; # # ; # ; #
You will probably will ask for consultants (not probably, surely). Work with them for a standard solution for each issue, it is
the key of future upgrades. You will upgrade.
Consultants know the product. You know your business. choose your best inside professionals, free them half their time, and
promote them Key Users. make what is necessary for this to be a promotion.
And the first job of your key users is to choose the junior that will work their job the half time they are key users.
By this way, after ending SAP implementation you will have a strong product carrying a strong team (normaly, the junior +
the senior becomes an effectiveness duo, this is your personnal challenge)
for the technical side, converting your actual data to SAP database can be done with at least half a dozen of tools. Your job
is to be able to export your data in flat files. Let consultants doing the insertion in SAP. The oldest technique is BCD, I
continues to use it daily. It's a way to simulate keying in sap screens in batch mode. The efficiency is based on the fact that
loading is made with a batch input folder : you can track the errors and re-run data that are not already loaded. That is the
key of loading SAP (or any other soft / database) : the warranty of never missing any data.
Sample :
REPORT zzjpl001 .
DATA:
kna1 LIKE kna1
.
FIELD-SYMBOLS: <f>.
START-OF-SELECTION.
SELECT SINGLE * FROM kna1 INTO kna1 WHERE kunnr = '0000014844'.
* that's to show selected data
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE kna1 TO <f>.
IF sy-subrc NE 0. EXIT. ENDIF.
WRITE:/ <f>.
ENDDO.
* that's for setting a debug break point
kna1 = kna1.
* that's to illustrate this tip
PERFORM form1 IN PROGRAM zzjpl002.
REPORT zzjpl002 .
DATA:
kna1 LIKE kna1
.
FIELD-SYMBOLS: <f1> , <f2>, <f3>.
FORM form1.
* kna1 is empty
kna1 = kna1.
DATA field(50).
* assign the remote field to F1
field = '(ZZJPL001)KNA1'.
ASSIGN (field) TO <f1>.
* assign the local field to F2
field = 'KNA1'.
debug :
Using this method, you can not only read the remote fields, but you can also update the remote fields
REPORT zzjpl001 .
DATA:
kna1 LIKE kna1 occurs 0 with header line
.
FIELD-SYMBOLS: <f>.
START-OF-SELECTION.
SELECT * FROM kna1 INTO table kna1 WHERE kunnr = '0000014844'.
kna1[] = kna1[].
PERFORM form1 IN PROGRAM zzjpl002.
REPORT zzjpl002 .
DATA:
kna1 LIKE kna1 occurs 0 with header line
.
FIELD-SYMBOLS: <f1> , <f2>, <f3>.
*&---------------------------------------------------------------------*
*& Form form1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM form1.
DATA field(50).
field = '(ZZJPL001)KNA1[]'.
ASSIGN (field) TO <f1>.
field = 'KNA1[]'.
ASSIGN (field) TO <f2>.
<f2> = <f1>.
ENDFORM. "form1