=== modified file 'abl/guests-frame.w'
--- old/abl/guests-frame.w	2023-05-20 18:19:17 +0000
+++ new/abl/guests-frame.w	2024-07-19 16:40:26 +0000
@@ -243,6 +243,10 @@
          SIZE 125.2 BY 15.38
          FONT 8 WIDGET-ID 100.
 
+&if defined(FWD-VERSION) &then
+DEF MENU staysMenu MENU-ITEM sheetMenuItem LABEL "Open in Spreadsheet...".
+ASSIGN staysBrowse:POPUP-MENU = MENU staysMenu:HANDLE.
+&endif         
 
 /* *********************** Procedure Settings ************************ */
 
@@ -488,6 +492,12 @@
 /* _UIB-CODE-BLOCK-END */
 &ANALYZE-RESUME
 
+&if defined(FWD-VERSION) &then
+ON CHOOSE OF MENU-ITEM sheetMenuItem
+DO:
+  RUN export-as-spreadsheet.
+END.
+&endif
 
 &Scoped-define SELF-NAME filterRoom
 &ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL filterRoom fFrameWin
@@ -879,6 +889,45 @@
 /* _UIB-CODE-BLOCK-END */
 &ANALYZE-RESUME
 
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE export-as-spreadsheet fFrameWin 
+PROCEDURE export-as-spreadsheet :
+/*------------------------------------------------------------------------------
+  Purpose:     
+  Parameters:  <none>
+  Notes:       
+------------------------------------------------------------------------------*/
+  DEFINE TEMP-TABLE person field roomNum AS INTEGER
+                           field fullName AS CHAR
+                           field nGuests AS INTEGER
+                           field chkIn as DATE
+                           field chkOut as DATE
+                           field duration as INTEGER
+                           field roomType as CHAR
+                           field roomPrice as INTEGER FORMAT ">>>,>>>,>>9".
+  
+  DEFINE QUERY staysBrowseRpt FOR stay, room, room-type, guest SCROLLING.
+  OPEN QUERY staysBrowseRpt FOR EACH stay, EACH room of stay,
+     EACH room-type OF room, EACH guest OF stay NO-LOCK.
+     
+  GET FIRST staysBrowseRpt.
+  
+  DO WHILE AVAILABLE stay:
+     CREATE person. assign roomNum = stay.room-num
+                           fullName = guest.first-name + " " + guest.last-name
+                           nGuests = stay.num-guests
+                           chkIn = stay.start-date
+                           chkOut = stay.end-date
+                           duration = stay.end-date - stay.start-date
+                           roomType = room-type.description
+                           roomPrice = stay.price.
+     GET NEXT staysBrowseRpt.
+  END.
+
+  RUN guests-spreadsheet.w (INPUT TABLE person).
+ END.
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
 PROCEDURE printFile EXTERNAL "xPrint.dll" PERSISTENT :
     DEF INPUT PARAMETER A AS CHAR.
     END.

=== added file 'abl/guests-spreadsheet.w'
--- old/abl/guests-spreadsheet.w	1970-01-01 00:00:00 +0000
+++ new/abl/guests-spreadsheet.w	2024-07-19 09:15:43 +0000
@@ -0,0 +1,338 @@
+&ANALYZE-SUSPEND _VERSION-NUMBER AB_v10r12 GUI ADM2
+&ANALYZE-RESUME
+&Scoped-define WINDOW-NAME wWin
+{adecomm/appserv.i}
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS wWin 
+/*------------------------------------------------------------------------
+
+  File: 
+
+  Description: from cntnrwin.w - ADM SmartWindow Template
+
+  Input Parameters:
+      <none>
+
+  Output Parameters:
+      <none>
+
+  History: New V9 Version - January 15, 1998
+          
+------------------------------------------------------------------------*/
+/*          This .W file was created with the Progress AB.              */
+/*----------------------------------------------------------------------*/
+
+/* Create an unnamed pool to store all the widgets created 
+     by this procedure. This is a good default which assures
+     that this procedure's triggers and internal procedures 
+     will execute in this procedure's storage, and that proper
+     cleanup will occur on deletion of the procedure. */
+
+DEFINE TEMP-TABLE person field roomNum AS INTEGER
+field fullName AS CHAR
+field nGuests AS INTEGER
+field chkIn as DATE
+field chkOut as DATE
+field duration as INTEGER
+field roomType as CHAR
+field roomPrice as INTEGER FORMAT ">>>,>>>,>>9".
+
+DEFINE INPUT PARAMETER TABLE FOR person.
+
+CREATE WIDGET-POOL.
+
+/* ***************************  Definitions  ************************** */
+
+/* Parameters Definitions ---                                           */
+
+/* Local Variable Definitions ---                                       */
+
+DEFINE VAR CtrlFrame AS HANDLE.
+DEFINE VAR chCtrlFrame AS COM-HANDLE.
+
+{src/adm2/widgetprto.i}
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+
+&ANALYZE-SUSPEND _UIB-PREPROCESSOR-BLOCK 
+
+/* ********************  Preprocessor Definitions  ******************** */
+
+&Scoped-define PROCEDURE-TYPE SmartWindow
+&Scoped-define DB-AWARE no
+
+&Scoped-define ADM-CONTAINER WINDOW
+
+&Scoped-define ADM-SUPPORTED-LINKS Data-Target,Data-Source,Page-Target,Update-Source,Update-Target,Filter-target,Filter-Source
+
+/* Name of designated FRAME-NAME and/or first browse and/or first query */
+&Scoped-define FRAME-NAME fMain
+
+/* Custom List Definitions                                              */
+/* List-1,List-2,List-3,List-4,List-5,List-6                            */
+
+/* _UIB-PREPROCESSOR-BLOCK-END */
+&ANALYZE-RESUME
+
+
+
+/* ***********************  Control Definitions  ********************** */
+
+/* Define the widget handle for the window                              */
+DEFINE VAR wWin AS WIDGET-HANDLE NO-UNDO.
+
+def sub-menu smFile
+  menu-item miOpen label "&Open...".
+
+define menu m menubar.
+  sub-menu smFile label "File".
+
+/* ************************  Frame Definitions  *********************** */
+
+DEFINE FRAME fMain
+    WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY 
+         SIDE-LABELS NO-UNDERLINE THREE-D 
+         AT COL 1 ROW 1
+         SIZE 185.8 BY 29.48 WIDGET-ID 100.
+
+/* *********************** Procedure Settings ************************ */
+
+&ANALYZE-SUSPEND _PROCEDURE-SETTINGS
+/* Settings for THIS-PROCEDURE
+   Type: SmartWindow
+   Allow: Basic,Browse,DB-Fields,Query,Smart,Window
+   Container Links: Data-Target,Data-Source,Page-Target,Update-Source,Update-Target,Filter-target,Filter-Source
+   Other Settings: APPSERVER
+ */
+&ANALYZE-RESUME _END-PROCEDURE-SETTINGS
+
+/* *************************  Create Window  ************************** */
+
+&ANALYZE-SUSPEND _CREATE-WINDOW
+IF SESSION:DISPLAY-TYPE = "GUI":U THEN
+  CREATE WINDOW wWin ASSIGN
+         HIDDEN             = YES
+         TITLE              = "Guests"
+         HEIGHT             = 29.48
+         WIDTH              = 185.8
+         RESIZE             = yes
+         SCROLL-BARS        = no
+         STATUS-AREA        = no
+         BGCOLOR            = ?
+         FGCOLOR            = ?
+         THREE-D            = yes
+         MESSAGE-AREA       = no
+         SENSITIVE          = yes
+         MENUBAR            = menu m:handle.
+ELSE {&WINDOW-NAME} = CURRENT-WINDOW.
+/* END WINDOW DEFINITION                                                */
+&ANALYZE-RESUME
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _XFTR "SmartWindowCues" wWin _INLINE
+/* Actions: adecomm/_so-cue.w ? adecomm/_so-cued.p ? adecomm/_so-cuew.p */
+/* SmartWindow,ab,49271
+Destroy on next read */
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _INCLUDED-LIB wWin 
+/* ************************* Included-Libraries *********************** */
+
+{src/adm2/containr.i}
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+
+
+
+/* ***********  Runtime Attributes and AppBuilder Settings  *********** */
+
+&ANALYZE-SUSPEND _RUN-TIME-ATTRIBUTES
+/* SETTINGS FOR WINDOW wWin
+  VISIBLE,,RUN-PERSISTENT                                               */
+/* SETTINGS FOR FRAME fMain
+   FRAME-NAME                                                           */
+IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(wWin)
+THEN wWin:HIDDEN = yes.
+
+/* _RUN-TIME-ATTRIBUTES-END */
+&ANALYZE-RESUME
+
+ 
+
+
+
+/* ************************  Control Triggers  ************************ */
+
+&Scoped-define SELF-NAME wWin
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wWin wWin
+ON END-ERROR OF wWin /* <insert SmartWindow title> */
+OR ENDKEY OF {&WINDOW-NAME} ANYWHERE DO:
+  /* This case occurs when the user presses the "Esc" key.
+     In a persistently run window, just ignore this.  If we did not, the
+     application would exit. */
+  IF THIS-PROCEDURE:PERSISTENT THEN RETURN NO-APPLY.
+END.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wWin wWin
+ON WINDOW-CLOSE OF wWin /* <insert SmartWindow title> */
+DO:
+  /* This ADM code must be left here in order for the SmartWindow
+     and its descendents to terminate properly on exit. */
+  APPLY "CLOSE":U TO THIS-PROCEDURE.
+  RETURN NO-APPLY.
+END.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wWin wWin
+ON WINDOW-RESIZED OF wWin /* <insert SmartWindow title> */
+DO:
+  frame fMain:width = wWin:width.
+  frame fMain:height = wWin:height.
+  CtrlFrame:width = frame fMain:width.
+  CtrlFrame:height = frame fMain:height .
+END.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CONTROL wWin wWin
+on choose of menu-item miOpen do:
+  DEF VAR fName as CHAR.
+  SYSTEM-DIALOG GET-FILE fName AT-WEB-BROWSER UPLOAD.
+  if fName <> ? and length(fName) > 0 then chCtrlFrame:F1Book:read(fName, 0).
+end.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+
+&UNDEFINE SELF-NAME
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _MAIN-BLOCK wWin 
+
+
+/* ***************************  Main Block  *************************** */
+
+/* Include custom  Main Block code for SmartWindows. */
+{src/adm2/windowmn.i}
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+
+/* **********************  Internal Procedures  *********************** */
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE adm-create-objects wWin  _ADM-CREATE-OBJECTS
+PROCEDURE adm-create-objects :
+/*------------------------------------------------------------------------------
+  Purpose:     Create handles for all SmartObjects used in this procedure.
+               After SmartObjects are initialized, then SmartLinks are added.
+  Parameters:  <none>
+------------------------------------------------------------------------------*/
+
+END PROCEDURE.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE disable_UI wWin  _DEFAULT-DISABLE
+PROCEDURE disable_UI :
+/*------------------------------------------------------------------------------
+  Purpose:     DISABLE the User Interface
+  Parameters:  <none>
+  Notes:       Here we clean-up the user-interface by deleting
+               dynamic widgets we have created and/or hide 
+               frames.  This procedure is usually called when
+               we are ready to "clean-up" after running.
+------------------------------------------------------------------------------*/
+  delete widget CtrlFrame.
+
+  /* Delete the WINDOW we created */
+  IF SESSION:DISPLAY-TYPE = "GUI":U AND VALID-HANDLE(wWin)
+  THEN DELETE WIDGET wWin.
+  IF THIS-PROCEDURE:PERSISTENT THEN DELETE PROCEDURE THIS-PROCEDURE.
+END PROCEDURE.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE enable_UI wWin  _DEFAULT-ENABLE
+PROCEDURE enable_UI :
+/*------------------------------------------------------------------------------
+  Purpose:     ENABLE the User Interface
+  Parameters:  <none>
+  Notes:       Here we display/view/enable the widgets in the
+               user-interface.  In addition, OPEN all queries
+               associated with each FRAME and BROWSE.
+               These statements here are based on the "Other 
+               Settings" section of the widget Property Sheets.
+------------------------------------------------------------------------------*/
+
+  create control-frame CtrlFrame assign
+    frame           = frame fmain:handle
+    row             = 1
+    column          = 1
+    height          = frame fmain:height - 1
+    width           = frame fmain:width
+    tab-stop        = no
+    hidden          = yes
+    sensitive       = yes.
+  
+  CtrlFrame:name = "sheet".
+  chCtrlFrame = CtrlFrame:com-handle.
+  chCtrlFrame:F1Book:LoadControls("", "spreadsheet":U).
+  
+  chCtrlFrame:F1Book:ShowEditBar = true.
+  chCtrlFrame:F1Book:ShowTabs = true.
+  chCtrlFrame:F1Book:ShowToolBar = true.
+
+  VIEW FRAME fMain IN WINDOW wWin.
+  ENABLE ALL WITH FRAME fMain.
+
+  {&OPEN-BROWSERS-IN-QUERY-fMain}
+  VIEW wWin.
+
+  /* load data in the spreadsheet */
+  chCtrlFrame:F1Book:Read("res/guests.xlsx", 0).
+  DEF VAR row AS INT INIT 2.
+  FOR EACH person:
+    chCtrlFrame:F1Book:TextRC(row, 1) = person.fullName.
+    chCtrlFrame:F1Book:TextRC(row, 2) = person.chkIn.
+    chCtrlFrame:F1Book:TextRC(row, 3) = person.chkOut.
+    chCtrlFrame:F1Book:TextRC(row, 4) = person.duration.
+    chCtrlFrame:F1Book:TextRC(row, 5) = person.nGuests.
+    chCtrlFrame:F1Book:TextRC(row, 6) = person.roomNum.
+    chCtrlFrame:F1Book:TextRC(row, 7) = person.roomPrice.
+    chCtrlFrame:F1Book:TextRC(row, 8) = person.roomType.
+    row = row + 1.
+  END.
+END PROCEDURE.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+
+&ANALYZE-SUSPEND _UIB-CODE-BLOCK _PROCEDURE exitObject wWin 
+PROCEDURE exitObject :
+/*------------------------------------------------------------------------------
+  Purpose:  Window-specific override of this procedure which destroys 
+            its contents and itself.
+    Notes:  
+------------------------------------------------------------------------------*/
+
+  APPLY "CLOSE":U TO THIS-PROCEDURE.
+  RETURN.
+
+END PROCEDURE.
+
+/* _UIB-CODE-BLOCK-END */
+&ANALYZE-RESUME
+

=== added file 'abl/guests-spreadsheet.w.ext-hints'
--- old/abl/guests-spreadsheet.w.ext-hints	1970-01-01 00:00:00 +0000
+++ new/abl/guests-spreadsheet.w.ext-hints	2024-07-17 12:16:23 +0000
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<extension>
+   <ocx com-handle="chCtrlFrame:F1Book" target-widget="Spreadsheet" target-handle="hSheet" control-frame="CtrlFrame" control-frame-handle="chCtrlFrame"/>
+</extension>

=== added directory 'deploy/server/res'
=== added file 'deploy/server/res/guests.xlsx'
Binary files old/deploy/server/res/guests.xlsx and new/deploy/server/res/guests.xlsx differ
