[52929] in SAPr3-news

home help back first fref pref prev next nref lref last post

ABAP <- Novell GroupWise5: Problem Datum_Zeit auslesen

daemon@ATHENA.MIT.EDU (leowie)
Tue Jan 11 08:23:16 2005

To: sapr3-news@mit.edu
Date: 11 Jan 2005 05:23:10 -0800
From: leowie@gmx.at (leowie)
Message-ID: <811b8ef2.0501110523.c5757ba@posting.google.com>

Hallo,

habe ein Problem in Zusammenhang mit dem Auslesen von (kombinierten?)
Datums_Zeit - Feldern wie StartTime und EndTime (Format c: DD/MM/YY
space HH:MM:SS) aus Novell GroupWise5.

Das Setzen der Felder in eine Variable Typ C hingegen klappt aber z.B.
mit
... = '31/12/05 16:30:00'.

Fragliche Stellen siehe bitte unten unter <<<===??? .

Für etwaige Tipps wäre ich dankbar.

Grüsse aus Wien,
Leo

PS: entschuldigt bitte den noch primitiven Programmierstil: ich bin
ABAP-Neuling.



REPORT Z_GROUPWISE5_TERMIN .

*----------------------------------------------------------------------*
* Topic:       Example: eMail mit Novell Groupwise 5                  
*
*                                                                     
*
* Description: Primitives Test-Programm, welches in Novell GroupWise5 
*
*              im eigenen Kalender einen Termin anlegt.               
*
*                                                                     
*
*              Novell GroupWise API: siehe                            
*
*              http://developer.novell.com/ndk/gwobjapi.htm           
*
*                                                                     
*
* R/3 Release: MiniSAP TestSuite / 46D (Beilage Buch: ABAP Objects)   
*
*                                                                     
*
* Programmer:  Leo Wiebogen                                           
*
* Date:        Dec 2004                                               
*
*                                                                     
*
*------------------------------ Questions
-----------------------------*
* Version  1: Diskussionsbasis zur geplanten Schulung                 
*
*                                                                     
*
*   Programm funktioniert, aber noch Qick+Dirty Spagetti-Code!        
*
*   (habe noch keine APAP-Erfahrung, keine Schulungen genossen etc.)  
*
*                                                                     
*
*   Fraglich:                                                         
*
*   Names? Functions? Includes? Input-Parameter? Messages?            
*
*   Debug-Modus on/off? Code-Beauty (KeyWords) ...                    
*
*                                                                     
*
*-------------------------------Corrections----------------------------*
* Date        Userid     Correction     Text                          
*
* 04.01.2004  Wiebogen   :::::::::::::: ::::::::::::::::::::::::::::: 
*
*----------------------------------------------------------------------*

* --- Includes ---
INCLUDE OLE2INCL.
* --- Local Variables ---
CONSTANTS: OK TYPE I VALUE 0.

data: debugmode  type i value 0,
      bug        type i value 0,
      ii(3)      type i value 0.

data: UserID(25) TYPE c,
      CmdLine(70) TYPE c,
      Password(25) TYPE c,
      WhenToPrompt(25) TYPE c,
      Reserved(25) TYPE c .
* --- COM-Handles ---
DATA: GWSession           TYPE OLE2_OBJECT,
      GWAccount           TYPE OLE2_OBJECT,
      GWFolder            TYPE OLE2_OBJECT,
      GWMessages          TYPE OLE2_OBJECT,
      GWMessage           TYPE OLE2_OBJECT,

      GWAppointment       TYPE OLE2_OBJECT,

      GWRecipients        TYPE OLE2_OBJECT,
      GWRecipient         TYPE OLE2_OBJECT,
      GWAddress           TYPE OLE2_OBJECT,

      GWAttachments       TYPE OLE2_OBJECT,
      GWAttachment        TYPE OLE2_OBJECT,

      GWBusySearchResult  TYPE OLE2_OBJECT,
      GWBusySearchElement TYPE OLE2_OBJECT,
      GWTimeBlock         TYPE OLE2_OBJECT,

      GWCombinedResult    TYPE OLE2_OBJECT,
      GWTimeBlocks        TYPE OLE2_OBJECT .

DATA: EMailAddress_Acco TYPE c,
      EMailType_Acco TYPE c,
      DisplayName_Acco TYPE c.

DATA: in_StartDate(17) TYPE c,
          " Laenge (17) ist wichtig
          " Format c: DD/MM/YY space HH:MM:SS zB: '31/12/05 16:30:00'
      in_Duration TYPE f VALUE '',
      in_EndDate(17) Type c,
      finished type i value 0.

DATA: i_timeblocks type i value 0,
      num(3) type c,
      out_TB-ObjType(2) type c,
      out_TB-StartDate(17) type c,   " <<<===???
      out_TB-Duration(8) type c,
      out_TB-dur_std type p decimals 6,
      out_TB-EndDate(17) type c.   " <<<===???


* --- MAIN ---
PERFORM check_GW-installed.
IF Bug = 0.

*   --- GWSession_init ---
  CREATE OBJECT GWSession 'NovellGroupWareSession' .
  perFORM check_GW-OLE-Errors.

  PERFORM init_GW-Objects.

  PERFORM get_GW-Acco-Fold-Addr-Mess.

* Termin-Beispiel:
  in_StartDate = '31/01/05 14:45:00'.
  in_Duration  = 2 / 24.   " 2 Stunden
  in_EndDate   = ''.

  PERFORM create_GW-Appointment.

*    Free all objects
  PERFORM init_GW-Objects.
  FREE OBJECT GWSession    .
  GWSession-HANDLE = -1.

ENDIF.


*----------------------------------------------------------------------*
FORM create_GW-Appointment.


* --- Eine Appointment - Message erzeugen ---

  perFORM check_GW-OLE-Errors.
  ii = 10.
  perFORM info_debug.

  if bug = 0.

*   --- Message erzeugen (liegt vorerst im Root-Folder;
*       noch ungesendeter Entwurf, ohne Zeiten etc.)
    CALL METHOD OF GWMessages 'ADD' = GWMessage exporting
                                           #1 =
'GW.MESSAGE.APPOINTMENT'
                                           #2 = 4 .    " 4 = draft
    perFORM check_GW-OLE-Errors.
    ii = 20.
    perFORM info_debug.

    if bug = 0.   " --- GWMessage added

      FREE OBJECT GWMessages.  " wird nicht mehr benoetig

*     --- Subject und BodyText zuweisen
      SET PROPERTY OF GWMessage 'Subject'
        = 'Test: ABAP Groupwise5 Termin'.
      SET PROPERTY OF GWMessage 'BodyText'
        = 'Primitives Testprogramm Z_GroupWise5_Termin von Leo
Wiebogen'
.

      perFORM check_GW-OLE-Errors.
      ii = 30.
      perFORM info_debug.

      if bug = 0. "Subj + Body set

*       --- Empfaenger ---

        CALL METHOD OF GWMessage 'RECIPIENTS' = GWRecipientS.
        perFORM check_GW-OLE-Errors.
        ii = 40.
        perFORM info_debug.

        if bug = 0. " GWRecipientS added

*         Empfaenger (eigener Account) anlegen
          CALL METHOD OF GWRecipients 'ADD' = GWRecipient
              exporting  #1 = GWAddress
                         #2 = 0.

          perFORM check_GW-OLE-Errors.
          ii = 41.
          perFORM info_debug.

          if bug = 0. "GWRecipient eigener Account added
*           ggf. weitere Empfaenger ... (vorerst keine)
*           (Memo: Recipients 'Count')

*           --- Wunsch-Termin (-Datum,-Zeit,-Dauer,-Art) zuweisen ---
*           (ohne "BusySearch" werden Termine einfach überlagert).

            SET PROPERTY OF GWMessage 'Startdate' = in_StartDate.
            " default: Duration 1 Stunde

            IF in_Duration > 0.
              SET PROPERTY OF GWMessage 'Duration' = in_duration.
            else.
              if in_EndDate <> ''.
              SET PROPERTY OF GWMessage 'Enddate' = in_EndDate.
              endif.
            endif.

            perFORM check_GW-OLE-Errors.
            ii = 42.
            perFORM info_debug.

*           --- Termin-BusySearch ---
           CALL METHOD OF GWMessage 'StartBusySearch' =
               GWBusySearchResult exporting
                   #1 = in_StartDate
                   #2 = 7.   " >= 7 Tage

*           Loop bis zur Beendigung des Searches */
            finished = 0.
            WHILE finished = 0.
              GET PROPERTY OF GWBusySearchResult 'completed' =
finished.
               CALL METHOD OF GWBusySearchResult 'REFRESH'.
            ENDwhile.

*           'CombinedResult' liegt nun in GWBusySearchElement vor:
*           ein combinierter SnapShot über alle Empfaenger im Handle.
*           Returns blank timeblock, wenn alle Empfaenger frei sind
...

            GET PROPERTY OF GWBusySearchResult 'CombinedResult' =
                GWBusySearchElement.
            perFORM check_GW-OLE-Errors.
            ii = 43            .
            perFORM info_debug.

            if bug = 0.
*             Es koennten TimeBlocks da sein.
              GET PROPERTY OF GWBusySearchElement 'TIMEBLOCKS' =
                 GWTimeBlocks.

              perFORM check_GW-OLE-Errors.
              ii = 44            .
              perFORM info_debug.

              if bug = 0.
*                Timeblocks zählen
                 GET PROPERTY OF GWTimeBlocks 'COUNT' = i_timeblocks.

*                 CALL FUNCTION 'POPUP_TO_INFORM'
*                  EXPORTING
*                    TITEL   = 'GWTimeBlocks COUNT'
*                    TXT1    = i_timeblocks
*                    TXT2    = ''.

*                wenn timeblocks da: loop: alle auslesen
                 if i_timeblocks >= 1.

                   DO.

                     CALL METHOD OF GWBusySearchElement
                       'TIMEBLOCKS' = GWTimeBlock
                              exporting #1 = sy-index .
                                  " nummer des blockes

                      perFORM check_GW-OLE-Errors.
                      ii = 45            .
                      perFORM info_debug.

*                     ObjType: 0 = free,
*                              < 1 = blocked >,
*                              2 = out of *office,
*                              3 = Tentative
                      GET PROPERTY OF GWTimeBlock 'ObjType'
                          = out_TB-ObjType.
                      GET PROPERTY OF GWTimeBlock 'StartDate'
                          = out_TB-StartDate.   " <<<===???
*                     Duration: in Tagen
                      GET PROPERTY OF GWTimeBlock 'Duration'
                          = out_TB-Duration.
                      GET PROPERTY OF GWTimeBlock 'EndDate'
                          = out_TB-EndDate.   " <<<===???

                      perFORM check_GW-OLE-Errors.
                      ii = 46.
                      perFORM info_debug.

*                      CALL FUNCTION 'POPUP_TO_INFORM'
*                        EXPORTING
*                          TITEL   = 'TimeBlock'
*                          TXT1    = sy-index
*                          TXT2    = out_TB-StartDate.

                        num = sy-index.
                        out_tb-dur_std = out_TB-Duration.
                        multiply out_TB-Dur_std by 24.

                        WRITE: / 'TimeBlock: Nr:', num,
                                 'ObjType:', out_TB-ObjType,
                                 'StartDate:', out_TB-StartDate,   "
<<<===???
                                     " PROBLEM: Date nicht darstellbar
                                 'Duration[Std]:',
                                     out_TB-dur_std decimals 2,
                                 'EndDate:', out_TB-EndDate.   "
<<<===???
                                     " PROBLEM: Date nicht darstellbar

                      IF sy-index = i_timeblocks.
                        EXIT.
                      ENDIF.

                   enddo.

                 endif. " i_timeblocks >= 1.

              endif.

            endif. " BusySearchResult vorhanden

          endif. "GWRecipient TO added

        endif. " GWRecipientS added
        FREE OBJECT GWRecipientS.  " wird nicht mehr benoetig

*       --- Attachments ---
        CALL METHOD OF GWMessage 'ATTACHMENTS' = GWAttachments.

        perFORM check_GW-OLE-Errors.
        ii = 70.
        perFORM info_debug.

        if bug = 0. " GWAttachmentS added

*         Loop: alle Attachments ... (vorerst nur ein Attachment)
             CALL METHOD OF GWAttachments 'ADD' = GWAttachment
                               exporting
                                 #1 =
'H:\ABAP\Z_GROUPWISE5_TERMIN.ABP'
                                 #2 = 1 . " 1 = File

             perFORM check_GW-OLE-Errors.
             ii = 80.
             perFORM info_debug.

*         end loop Att

         endif. " GWAttachmentS added

         FREE OBJECT GWAttachments.  " wird nicht mehr benoetig

*        --- Senden der Mail - Message ---
*        if abfrage Termin seinen = wahr ...
           CALL METHOD OF GWMessage 'SEND'.

           perFORM check_GW-OLE-Errors.
           ii = 90.
           perFORM info_debug.

*        endif.

      endif. "Subj + Body set

    endif. " GWMessage is added

  endif.

ENDFORM.


*----------------------------------------------------------------------*
FORM get_GW-Acco-Fold-Addr-Mess.

* --- Login in den Account ---
  call method of GWSession 'login' = GWAccount importing
                          #1 = UserID
                          #2 = CmdLine
                          #3 = Password
                          #4 = WhenToPrompt
                          #5 = Reserved .
                          " imp = rein, exp = raus
  perFORM check_GW-OLE-Errors.
  if bug = 0.

*   --- Den Root Folder ermitteln ----
*   im Root Folder wird das Mail vor dem Senden angelegt
    GET PROPERTY OF GWAccount 'rootfolder' = GWFolder.

    PERFORM check_GW-OLE-Errors.
    if bug = 0.


*     GET PROPERTY OF GWAccount 'rootfolder' = GWFolder.
      FREE OBJECT GWAccount.   " wird nicht mehr benoetigt
        " siehe auch:   SET PROPERTY OF ... '...' = ...

*     --- Adresse des Root Folders merken ---
*     ASSIGN GWAddress  = GWFolder:Owner.
      GET PROPERTY OF GWFolder 'owner' = GWAddress.

      PERFORM check_GW-OLE-Errors.
      if bug = 0.
*       --- Alle-MessageS im Root Folder ermitteln ---
*       hier wird die neue Message erzeugt, bleibt da bis zum Senden
        GET PROPERTY OF GWFolder 'messages' = GWMessages.
        PERFORM check_GW-OLE-Errors.
*       OK wenn hier angelangt ohne Fehler.
        FREE OBJECT GWFolder.   " wird nicht mehr benoetigt
      endif.
    endif.
  endif.
ENDFORM.

*----------------------------------------------------------------------*
FORM check_GW-installed.
* check whether and where Novell Groupwise 5 is installed
* (Quelle/Vorlage: FUNCTION RSAQ_XINT_CRYSTAL_REPORTS2)
  data prg_location(255) type c.
  CALL FUNCTION 'REGISTRY_GET'
       EXPORTING
            key     = 'SHELL\OPEN\COMMAND'
            section = 'groupwise5'
                    " 'word.document.8'
                    " 'excel.sheet.8'
       IMPORTING
            value   = prg_location.

  IF prg_location IS INITIAL.
    CALL FUNCTION 'POPUP_TO_INFORM'
      EXPORTING
        TITEL   = 'Novell GroupWise 5 nicht installiert'(011)
        TXT1    = 'Für diese Aktion benötigen Sie Novell
Groupwise'(012)
        TXT2    = 'Kontaktieren Sie Ihren PC-Administrator'(013) .
    Bug = 99.
    EXIT.
  ELSE.

    data dummy(25) TYPE c.
    SPLIT prg_location AT '/' INTO prg_location dummy. "remove /dde

    CALL FUNCTION 'POPUP_TO_INFORM'
      EXPORTING
        TITEL         = 'Gefundenes Programm'
        TXT1          = prg_location
        TXT2          = ''. " dummy

  endif.
ENDFORM.

*----------------------------------------------------------------------*
FORM init_GW-Objects.

  EMailAddress_Acco = ''.
  EMailType_Acco    = ''.
  DisplayName_Acco  = ''.

  FREE OBJECT GWTimeBlock.
  FREE OBJECT GWTimeBlocks.
  FREE OBJECT GWCombinedResult.
  FREE OBJECT GWBusySearchElement.
  FREE OBJECT GWBusySearchResult.

  FREE OBJECT GWAttachment .
  FREE OBJECT GWAttachments .
  FREE OBJECT GWAddress    .
  FREE OBJECT GWRecipient  .
  FREE OBJECT GWRecipients .
  FREE OBJECT GWMessage    .
  FREE OBJECT GWMessages   .
  FREE OBJECT GWFolder     .
  FREE OBJECT GWAccount    .
ENDFORM.

*----------------------------------------------------------------------*
* Subroutine for error handling
FORM check_GW-OLE-Errors.

  IF SY-SUBRC NE 0.
    " WRITE: / 'Error in OLE call', SY-MSGLI.

    CALL FUNCTION 'POPUP_TO_INFORM'
      EXPORTING
        TITEL   = 'Error'
        TXT1    = 'Error in OLE Call:'
        TXT2    = 'GroupWise5'.

      perFORM init_GW-Objects.
      FREE OBJECT GWSession.
      GWSession-HANDLE = -1.

      Bug = 1.

    EXIT.
  ENDIF.
ENDFORM.

*----------------------------------------------------------------------*
* Subroutine for info handling
FORM info_debug.
  IF debugmode = 1.
    CALL FUNCTION 'POPUP_TO_INFORM'
      EXPORTING
        TITEL   = 'Info Debugging'
        TXT1    = 'Stelle:'
        TXT2    = ii.
  ENDIF.
ENDFORM.

home help back first fref pref prev next nref lref last post