Начать работу

Пример построения отчета в XLSX (Excel 2007+)

* Реестр выписок банка о расходе средств     */
 
define input parameter rid-doc as integer.

/*Необходимые для печати в MS Excel определения______________________________*/

{slibooxml/slibxlsx.i}
{slib/slibos.i}
{slib/sliberr.i}

define var cError       as char no-undo.
define var cErrorMsg    as char no-undo.
define var cStackTrace  as char no-undo.
define var template     as character.
define var file         as character.

define temp-table tt_tr NO-UNDO
  field region as char
  field name   as char
  field transl as char
index i0 as primary unique region name .

run src/kernel/file_template.p (rid-doc).
template = RETURN-VALUE.  
run src/kernel/transl_tpl.p(rid-doc, output table tt_tr).
/*___________________________________________________________________________*/
 
DEFINE TEMP-TABLE Result NO-UNDO
  field data      as date      FORMAT "99.99.9999"
  field number    as character
  field client    as character FORMAT "X(30)"
  field sum       as decimal   
  field sum-base  as decimal   
  field osnovanie as character FORMAT "X(200)"
  field curr-cmp  as character
INDEX i0 IS PRIMARY data ASCENDING number ASCENDING.
 
  define variable str   as character.
  define variable str1   as character.
  define variable str2   as character.
  define variable user-lang   as character.
 
  run src/kernel/curlang.p .
  user-lang = return-value.

  run Report (rid-doc).
 
PROCEDURE Report:
  define input  parameter rid-doc  as integer.
 
  define variable date-from  as date FORMAT "99.99.9999".
  define variable date-to      as date FORMAT "99.99.9999".
  define variable i                 as integer.
  define variable j                 as integer.
  define variable k                as integer.
  define variable l                 as integer.
  define variable cr               as integer.
  define variable nomer        as integer.
  define variable client-cod   as integer.
  define variable row   as integer.
  define variable client-name  as character format "X(30)".
  define variable osnovanie    as character format "X(30)".
  define variable summ         as decimal.
  define variable curr         as integer.
  define variable curr-cmp     as character.
 
 
  run src/kernel/get_ffv.p ( "1:1", rid-doc ).
  date-from = DATE ( RETURN-VALUE ).
  run src/kernel/get_ffv.p ( "1:2", rid-doc ).
  date-to   = DATE ( RETURN-VALUE ).
 
  FIND FIRST typedoc WHERE typedoc.id-typedoc = 20 NO-LOCK NO-ERROR.
  IF AVAILABLE typedoc THEN
  DO:
     FOR EACH document  WHERE
         document.date-doc >= date-from AND
         document.date-doc <= date-to   AND
         document.rid-typedoc = typedoc.rid-typedoc NO-LOCK :
 
         create Result.
         run src/kernel/get_ffv.p ("1:1", document.rid-document).
         Result.data = DATE (RETURN-VALUE).
         run src/kernel/get_ffv.p ("1:2", document.rid-document).
         Result.number = RETURN-VALUE.
         run src/kernel/get_ffs.p ("1:4", document.rid-document).
         Result.Client = RETURN-VALUE.
         run src/kernel/get_ffv.p ("1:5", document.rid-document).
         Result.sum = DECIMAL (RETURN-VALUE).

         run src/kernel/get_ffs.p ( "1:21", document.rid-document).
         Result.curr-cmp = RETURN-VALUE.
        
         run src/kernel/get_ffv.p ("1:30", document.rid-document).
         Result.sum-base = DECIMAL (RETURN-VALUE).
         run src/kernel/get_ffv.p ("1:9", document.rid-document).               
         Result.osnovanie = REPLACE (RETURN-VALUE, "\n", "" ).      
     END.
  END.
  /*Создание документа, первоначальное форматирование*/  

  {slib/err_try}:

  run xlsx_copyTemplate(input "stXlsx",input template).

  /* Копирование всех областей в буфер */
  run xlsx_cut( "stXlsx", "header" ).  
  run xlsx_cut( "stXlsx", "table" ).  
  run xlsx_cut( "stXlsx", "footer" ).  

  /* Переводы подписей в шаблоне */
  for each tt_tr no-lock where tt_tr.region<>"":
    run xlsx_setClipboardValue( "stXlsx", tt_tr.region, tt_tr.name, tt_tr.transl).   
  end.
  /* ****************************** */

  /* Вывод данных заголовка отчета */
  run xlsx_setClipboardValue( "stXlsx", "header", "period",
      STRING (date-from) + " - " + STRING (date-to) ).
  run xlsx_paste(input "stXlsx", input "header",  input ? ).

 /* Вывод таблицы данных отчета */

  row = 4.
  FOR EACH result  
      break by result.data by result.sum:
      ACCUMULATE result.sum (TOTAL).
      ACCUMULATE result.sum-base (TOTAL).
      run xlsx_setClipboardValue( "stXlsx", "table", "atab1", result.number ).
      run xlsx_setClipboardValue( "stXlsx", "table", "atab2",
          string(result.data, "99.99.9999") ).
      run xlsx_setClipboardValue( "stXlsx", "table", "atab3", result.client ).
      run xlsx_setClipboardValue( "stXlsx", "table", "atab4", string(result.sum) ).
      run xlsx_setClipboardValue( "stXlsx", "table", "atab5", string(result.sum-base) ).
      run xlsx_setClipboardValue( "stXlsx", "table", "atab6", result.osnovanie ).

      run xlsx_setClipboardValue( "stXlsx", "table", "currency", result.curr-cmp).

      run xlsx_paste(input "stXlsx", input "table",  input ? ).
  END.

/* Вывод итогов данных отчета */

  run xlsx_setClipboardValue( "stXlsx", "footer", "totsum1",
      string(accum total result.sum) ).
  run xlsx_setClipboardValue( "stXlsx", "footer", "totsum2",
      string(accum total result.sum-base) ).
  run xlsx_paste(input "stXlsx", input "footer",  input ? ).
 
  /*Закрытие документа, установка доп. параметров*/
   run src/system/getmpfi2.p("xlsx").
   file = os_getNextFile(return-value).
   run xlsx_save( input "stXlsx",  input file).

  {slib/err_catch cError cErrorMsg cStackTrace}:
    run src/message_alert.p("Ошибка при создании xlsx файла: " + cErrorMsg).
    run log2.p("iOblikError.txt",cErrorMsg + "\n").
  {slib/err_end}.       

  /* Передача отчета на загрузку пользователю */
  run src/prn_dvs.w ( false, "XLSX#" + file,"OUT-ONLY=Да" ).
END.