Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Выгрузка с помощью z-процедуры в несколько файлов Excel

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> Z-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
KruZer



Зарегистрирован: 06.04.2020
Сообщения: 4

СообщениеДобавлено: Пн Апр 06, 2020 12:47    Заголовок сообщения: Выгрузка с помощью z-процедуры в несколько файлов Excel Ответить с цитатой

Здравствуйте!
Возникла проблема: не получается вывести данные по разным Excel файлам, на основе шаблона.. Не понятно, как в z-процедуре, в цикле, сделать так, чтобы выводились данные в множество Excel файлов, а не в один..

Как наглядный пример, упрощенный, для понимания:

{
var file,kolichestvo_rabotnikov,summa_zp;
...

Opent t1
...
while(1){
Fetch t1,file,kolichestvo_rabotnikov,summa_zp;
if (teot(t1)) break;

//Загружаем шаблон
m_Excel.Init(sid);
m_Excel.LoadShablon("shablon");

//Выводим в разные Excel файлы строку с количеством работников и суммой
ins_Excel_num(sid,1,1,kolichestvo_rabotnikov);
ins_Excel_num(sid,1,2,summa_zp);

//В следущем проходе цикла должен создаться другой файл, как это сделать?

}
Close t1;

..
return 0
}

Подскажите, пожалуйста, как это осуществить.. И осуществимо ли?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
NewAge



Зарегистрирован: 11.06.2010
Сообщения: 108

СообщениеДобавлено: Вт Апр 07, 2020 18:55    Заголовок сообщения: Ответить с цитатой

Так-с... Это Oracle? А можете кинуть код m_Excel? Может проанализировав его что и подскажу. У нас с этим вроде не так все сложно в SQL)))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
KruZer



Зарегистрирован: 06.04.2020
Сообщения: 4

СообщениеДобавлено: Вт Апр 07, 2020 20:21    Заголовок сообщения: Ответить с цитатой

Здравствуйте! Да, платформа Oracle. Доберусь до компьютера - обязательно скину.
Большое спасибо за отзывчивость!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
KruZer



Зарегистрирован: 06.04.2020
Сообщения: 4

СообщениеДобавлено: Ср Апр 08, 2020 03:44    Заголовок сообщения: Ответить с цитатой

Не нашел как прикрепить текстовый файл.. Вот код m_Excel:

Код:

// module  m_Excel;
// Вспомогательный модуль для формирования отчетов в Excel

string sid[20] = "", empty[2]="";

function Err0() {
  put("необходимо сначала вызвать функцию Init(sid);");
  return 1;
}

number xlsx = 0;
function Init*(string asid[]) {
  if ((asid == "2" || asid == "x") && sid == empty) {
     xlsx = 1;
     strcpy(sid, asid);
     return ins_Excel(sid, 0, 0, "__OPEN__");
  }
  if (sid == empty) strcpy(sid, asid);
  return 1;
}

function LoadShablon*(string shab[]) {
  if (sid == empty) return Err0();
  string s[300];
  sput(s, "__LOADSHABLON__%s", shab);
  return ins_Excel(sid, 0, 0, s);
}

/*
Скрипт на упрощенном Visual Basic.
Доступны только вызовы методов и установка свойств.
Это не вызов Visual Basic, а интерпретация кода путем преобразования
в вызовы методов пакета UOLE2.
Следовательно символические константы (xlAutomatic, ...) недопустимы
Их значения можно выяснить в макросах Excel
Скрипт : Оператор { ';' Оператор }
Оператор : ВызовМетода { '.' ВызовМетода } [ '=' (строка | число) ]
ВызовМетода : Идентификатор [ '('(строка | число | стдИдент) { ',' (строка | число | стдИдент) } ')' ]
стдИдент: empty | ActiveCell | ActiveSheet | ActiveWorkBook | ActiveChart
строка : '"' символ { символ } '"'

  m_Excel.VBScript(
      "visible=0; WorkBooks.Add;"
      "ActiveSheet.Cells(1,1).Value=\"TEST1\";"
      "ActiveSheet.Cells(2,1).Value=\"TEST2\";"
      "ActiveSheet.Cells(1,2).Value=3.14;"
      "ActiveSheet.Cells(2,2).Value=2.78;"
      "Columns(\"B:B\").ColumnWidth=39;"
      "Rows(\"2:4\").RowHeight=48;"
      "Range(\"B4\").Interior.ColorIndex=3;"
      "Range(\"B3\").Interior.ColorIndex=5;"
      "Range(\"B2:B4\").Select;"
      "Selection.Borders(7).LineStyle=1;"
      "Selection.Borders(8).LineStyle=1;"
      "Selection.Borders(9).LineStyle=1;"
      "Selection.Borders(10).LineStyle=1;"
      "Range(\"A1\").Select;");

  // 5-я строка заголовок страницы, ориентация страницы - пейзаж
  m_Excel.VBScript(
    "ActiveSheet.PageSetup.PrintTitleRows=\"$5:$5\""
    "ActiveSheet.PageSetup.PrintTitleColumns=\"\";"
    "ActiveSheet.PageSetup.Orientation=2;");  // 2- xlLandscape, 1- xlPortrait
*/
function VBScript0(string scr[]) {
  string s[4040];
  if (sid == empty) return Err0();
  if (xlsx) return 0;
  sput(s, "__OLE_SCRIPT__%s", scr);
  return ins_Excel(sid, 0, 0, s);
}

function VBScript*(string scr[]) {
  return VBScript0(scr);
}

// сформировать строку диапазона ячеек c1r1:c2r2 или c1:c2
function cRange*(number r1, number c1, number r2, number c2, string &rw) {
  number cc1, cc2, nm;
  string s[20];
  nm = ord("A") - 1;
  if (r1 > 0 && c1 == 0) c1 = 1;
  if (r2 > 0 && c2 == 0) c2 = 255;
  cc1 = c1 % 26;  if (cc1 <= 0.5) cc1 = 26;
  cc2 = c2 % 26;  if (cc2 <= 0.5) cc2 = 26;
  cc1 = cc1+ nm;  cc2 = cc2+ nm;
  if (c1 > 26) {
     chr(cc1, s);
     chr(nm+ trunc((c1-1)/26, 1), rw);  strcat(rw, s);
  }
  else
     chr(cc1, rw);
  if (r1 > 0) { sput(s, "%d", r1);  strcat(rw, s); }
  strcat(rw, ":");
  if (c2 > 26) {
     chr(nm+ trunc((c2-1)/26, 1), s);  strcat(rw, s);
  }
  chr(cc2, s);  strcat(rw, s);
  if (r2 > 0) { sput(s, "%d", r2);  strcat(rw, s); }
 
  return 0;
}

function SelectCell0(number row, number col) {
  if (sid == empty) return Err0();
  string s[100];
  if (xlsx) return ins_Excel(sid, row, col, "__SELECTCELL__");
  if (row > 0 && col > 0)
     sput(s, "ActiveSheet.Cells(%d,%d).Select;", row, col);
  else if (row > 0 && col == 0)
     sput(s, "ActiveSheet.Rows(\"%d:%d\").Select;", row, row);
  else if (row == 0 && col > 0) {
     string cols[6];
     cRange(0, col, 0, col, cols);
     sput(s, "ActiveSheet.Columns(\"%s\").Select;", cols);
  }
  else
     return -1;
  return VBScript0(s);
}

// выделить ячейку (row, сol)
function SelectCell*(number row, number col) {
  return SelectCell0(row, col);
}

// выделить колонку сol
function SelectColumn*(number col) {
  return SelectCell0(0, col);
}

// выделить строку row
function SelectRow*(number row) {
  return SelectCell0(row, 0);
}

// добавить строку перед строкой с номером row
function InsertRowBefore*(number row) {
  if (sid == empty) return Err0();
  if (row) SelectCell(row, 1);
  return ins_Excel(sid, row, 0, "__INSERT__");
}

// добавить строку перед текущей
// Selection.EntireRow.Insert
function InsertRow*() {
  return InsertRowBefore(0);
}

// удалить строку с номером row
function DeleteRow*(number row) {
  if (sid == empty) return Err0();
  return ins_Excel(sid, row, 1, "__DELETE__");
}

// удалить текущую строку
function DeleteCurRow*() {
  return DeleteRow(0);
}

// добавить столбец(колонку) перед столбцом col
function InsertColumnBefore*(number col) {
  if (sid == empty) return Err0();
  number row;
  if (col) row = 1; else row = 0;
  return ins_Excel(sid, row, col, "__ADDCOLUMN__");
}

// добавить столбец перед текущим
// Selection.EntireColumn.Insert
function InsertColumn*() {
  return InsertColumnBefore(0);
}

// добавить символ перевода страницы
function PageBreak*() {
  if (sid == empty) return Err0();
  return ins_Excel(sid, 0, 0, "__PAGEBREAK__");
}

// выполнить макро macro с аргументами param
function RunMacro*(string macro[], string param[]) {
  if (sid == empty) return Err0();
  string s[1000];
  if (xlsx) return -1;
  sput(s, "__RUNMACRO__%s %s", macro, param);
  return ins_Excel(sid, 0, 0, s);
}

// объединить ячейки (row, col) (row2,col2) в одну
function MergeCells*(number row, number col, number row2, number col2) {
  if (sid == empty) return Err0();
  string s[100];
  sput(s, "__MERGE__%d %d", row2, col2);
  return ins_Excel(sid, row, col, s);
}

function BoldCell0(number row, number col) {
  if (sid == empty) return Err0();
  return ins_Excel(sid, row, col, "__FONT_BOLD__");
}

// установить полужирный шрифт в ячейке (row, сol)
function BoldCell*(number row, number col) {
  return BoldCell0(row, col);
}

// установить полужирный шрифт в колонке сol
function BoldColumn*(number col) {
  return BoldCell0(0, col);
}

// установить полужирный шрифт в строке row
function BoldRow*(number row) {
  return BoldCell0(row, 0);
}

function ItalicCell0(number row, number col) {
  if (sid == empty) return Err0();
  return ins_Excel(sid, row, col, "__FONT_ITALIC__");
}

// установить шрифт-курсив в ячейке (row, сol)
function ItalicCell*(number row, number col) {
  return ItalicCell0(row, col);
}

// установить шрифт-курсив в колонке сol
function ItalicColumn*(number col) {
  return ItalicCell0(0, col);
}

// установить шрифт-курсив в строке row
function ItalicRow*(number row) {
  return ItalicCell0(row, 0);
}

function NormalCell0(number row, number col) {
  if (sid == empty) return Err0();
  return ins_Excel(sid, row, col, "__FONT_NORMAL__");
}

// установить нормальный шрифт в строке row
function NormalCell*(number row, number col) {
  return NormalCell0(row, col);
}

// установить нормальный шрифт в колонке сol
function NormalColumn*(number col) {
  return NormalCell0(0, col);
}

// установить нормальный шрифт в строке row
function NormalRow*(number row) {
  return NormalCell0(row, 0);
}

function ColorCell0(number row, number col, number color) {
  if (sid == empty) return Err0();
  string s[100];
  if (xlsx) {
     sput(s, "__SET_BGCOLOR__%d", color+ 7);
     return ins_Excel(sid, row, col, s);
  }
  if (row > 0 && col > 0)
     sput(s, "ActiveSheet.Cells(%d,%d).Interior.ColorIndex=%d;", row, col, color);
  else if (row > 0 && col == 0)
     sput(s, "ActiveSheet.Rows(\"%d:%d\").Interior.ColorIndex=%d;", row, row, color);
  else if (row == 0 && col > 0) {
     string cols[6];
     cRange(0, col, 0, col, cols);
     sput(s, "ActiveSheet.Columns(\"%s\").Interior.ColorIndex=%d;", cols, color);
  }
  else
     return -1;
  return VBScript0(s);
}

// установить цвет color в ячейке (row, сol)
// 3- красный, 4 - зеленый, 5 - синий и т.д.
function ColorCell*(number row, number col, number color) {
  return ColorCell0(row, col, color);
}

// установить цвет color в строке row
function ColorRow*(number row, number color) {
  return ColorCell0(row, 0, color);
}

// установить цвет color в колонке сol
function ColorColumn*(number col, number color) {
  return ColorCell0(0, col, color);
}

// установить цвет color в дипазоне ячеек r1c1: r2c2
function ColorRegion*(number r1, number c1, number r2, number c2, number color) {
  string s[100], rg[16];
  cRange(r1, c1, r2, c2, rg);
  if (xlsx) {
     sput(s, "__SET_BGCOLOR__%d %d %d", color+ 7, r2, c2);
     return ins_Excel(sid, r1, c1, s);
  }
  sput(s, "ActiveSheet.Range(\"%s\").Interior.ColorIndex=%d;", rg, color);
  return VBScript0(s);
}

function BorderSingleCell0(number row, number col, number row2, number col2) {
  if (sid == empty) return Err0();
  string s[100];
  if (row2 > 0)
     sput(s, "__BORDER_SINGLE__%d %d", row2, col2);
  else
     sput(s, "__BORDER_SINGLE__");
  return ins_Excel(sid, row, col, s);
}

function BorderSingleCell*(number row, number col) {
  return BorderSingleCell0(row, col, 0, 0);
}

function BorderSingleRegion*(number row, number col, number row2, number col2) {
  return BorderSingleCell0(row, col, row2, col2);
}

function BorderDoubleCell0(number row, number col, number row2, number col2) {
  if (sid == empty) return Err0();
  string s[100];
  if (row2 > 0)
     sput(s, "__BORDER_DOUBLE__%d %d", row2, col2);
  else
     sput(s, "__BORDER_DOUBLE__");
  return ins_Excel(sid, row, col, s);
}

function BorderDoubleCell*(number row, number col) {
  return BorderDoubleCell0(row, col, 0, 0);
}

function BorderDoubleRegion*(number row, number col, number row2, number col2) {
  return BorderDoubleCell0(row, col, row2, col2);
}

// для RANGE r1c1:r2c2 установить границы st = "LineStyle, Weight, ColorIndex"
// т.е тип линии, толщина, цвет
// для top(верх), right( справа), bottom (снизу), left(слева)
// st = "1" или "1,2" - то же что BorderSingle
// st = "1,-4138" - то же что BorderDouble
// st = "1,2,5" - синий BorderSingle
function BorderRegionEx*(number r1, number c1, number r2, number c2, top, right, bottom, left, string st[]) {
  string s[4000], s2[100], rg[16];
  number lineSt, w, color;
 
  if (xlsx) return 0;
  number i = strstr(st, ",");
  if (i > 0) {
     strn2cpy(s2, st, 0, i);
     strnum(s2, lineSt);
     strn2cpy(s, st, i+ 1, 100- i);
     i = strstr(s, ",");
     if (i > 0) {
        strn2cpy(s2, s, 0, i);
        strnum(s2, w);
        strn2cpy(s2, s, i+ 1, 20);
        strnum(s2, color);
     }
     else {
        strnum(s, w);  color = -4105;
     }   
  }
  else {
     if (strlen(st) == 0) lineSt = 1; else strnum(st, lineSt);
     w = 2;  color = -4105;
  }   

  cRange(r1, c1, r2, c2, rg);
  s = "";
  if (top) {
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(8).LineStyle=%d;", rg, lineSt);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(8).Weight=%d;", rg, w);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(8).ColorIndex=%d;", rg, color);
     strcat(s, s2);
  }
  if (right) {
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(10).LineStyle=%d;", rg, lineSt);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(10).Weight=%d;", rg, w);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(10).ColorIndex=%d;", rg, color);
     strcat(s, s2);
  }
  if (bottom) {
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(9).LineStyle=%d;", rg, lineSt);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(9).Weight=%d;", rg, w);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(9).ColorIndex=%d;", rg, color);
     strcat(s, s2);
  }
  if (left) {
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(7).LineStyle=%d;", rg, lineSt);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(7).Weight=%d;", rg, w);
     strcat(s, s2);
     sput(s2, "ActiveSheet.Range(\"%s\").Borders(7).ColorIndex=%d;", rg, color);
     strcat(s, s2);
  }
  //sput(s2, "ActiveSheet.Range(\"%s\").Select;", rg);
  //strcat(s, s2);
  if (s != "") VBScript0(s);
  return 0;
}


function FormatCell0(number row, number col, string fmt[]) {
  if (sid == empty) return Err0();
  string s[100], s2[100];
  if (xlsx) {
     string s1[2];
     strtrunc(s2, 0);
     number i = 0, len = strlen(fmt);
     while (i < len) {
        strn2cpy(s1, fmt, i, 1);
        if (strcmp(s1, "М") == 0) strcat(s2, "m");
        else if (strcmp(s1, "Д") == 0) strcat(s2, "d");
        else if (strcmp(s1, "Г") == 0) strcat(s2, "y");
        else if (strcmp(s1, "Ч") == 0) strcat(s2, "h");
        else if (strcmp(s1, "С") == 0) strcat(s2, "s");
        else strcat(s2, s1);
        i = i+ 1;
     }
     if (strcmp(s2, "m/d/yyyy") == 0) strcpy(s2, "dd/mm/yyyy;@");
     else if (strcmp(s2, "m/d/yyyy h:mm") == 0) strcpy(s2, "dd/mm/yy\\ h:mm:ss;@");
     else if (strcmp(s2, "m/d/yyyy h:mm;@") == 0) strcpy(s2, "dd/mm/yy\\ h:mm:ss;@");
  }
  else strcpy(s2, fmt);
  sput(s, "__CELL_FORMAT__%s", s2);
  return ins_Excel(sid, row, col, s);
}

// установить формат ячейки (row, col) в fmt
function FormatCell*(number row, number col, string fmt[]) {
  return FormatCell0(row, col, fmt);
}

/* установить формат столбца col в fmt
    Selection.NumberFormat = "@"  -- текст
    Selection.NumberFormat = "0.00" -- число
    Selection.NumberFormat = "m/d/yyyy" -- дата
    Selection.NumberFormat = "dd/mm/yy h:mm;@" -- дата со временем
    Selection.NumberFormat = "General"
    Selection.NumberFormat = "0.00E+00"
    Selection.NumberFormat = "[$-419]d-mmm-yyyy;@"  14-мар-2003
*/
function FormatColumn*(number col, string fmt[]) {
  return FormatCell0(0, col, fmt);
}

function WidthCell0(number row, number col, number w) {
  if (sid == empty) return Err0();
  string s[100];
  sput(s, "__COLWIDTH__%d", w);
  return ins_Excel(sid, row, col, s);
}

// установить ширину ячейки (row, col) равной w
function WidthCell*(number row, number col, number w) {
  return WidthCell0(row, col, w);
}

// установить ширину столбца col равной w
function WidthColumn*(number col, number w) {
  return WidthCell0(0, col, w);
}

// установить высоту ячейки (row, col) равной h
function HeightCell*(number row, number col, number h) {
  if (sid == empty) return Err0();
  string s[100];
  if (xlsx) {
     sput(s, "__ROWHEIGHT__%d", h);
     return ins_Excel(sid, row, col, s);
  }
  if (row > 0 && col > 0)
     sput(s, "ActiveSheet.Cells(%d,%d).RowHeight=%d;", row, col, h);
  else if (row > 0 && col == 0)
     sput(s, "ActiveSheet.Rows(\"%d:%d\").RowHeight=%d;", row, row, h);
  else
     return -1;
  return VBScript0(s);
}

// установить высоту строки row равной h
function HeightRow*(number row, number h) {
  return HeightCell(row, 0, h);
}

// выравнять ячейку (-1 влево, 0 по центру, 1 вправо, иначе отмена выравнивания
function AlignCell0(number row, number col, number a) {
  if (sid == empty) return Err0();
  string s[100];
  if (xlsx) {
     sput(s, "__ALIGNCOL__%d", a);
     return ins_Excel(sid, row, col, s);
  }
  if (a == -1) a = -4131;
  else if (a == 0) a = -4108;
  else if (a == 1) a = -4152;
  else a = 1;
  if (row > 0 && col > 0)
     sput(s, "ActiveSheet.Cells(%d,%d).HorizontalAlignment=%d;", row, col, a);
  else if (row > 0 && col == 0)
     sput(s, "ActiveSheet.Rows(\"%d:%d\").HorizontalAlignment=%d;", row, row, a);
  else if (row == 0 && col > 0) {
     string cols[6];
     cRange(0, col, 0, col, cols);
     sput(s, "ActiveSheet.Columns(\"%s\").HorizontalAlignment=%d;", cols, a);
  }
  else
     return -1;
  return VBScript0(s);
}

// выравнять ячейку (-1 влево, 0 по центру, 1 вправо, иначе отмена выравнивания
function AlignCell*(number row, number col, number a) {
  return AlignCell0(row, col, a);
}
// выравнять столбец (-1 влево, 0 по центру, 1 вправо, иначе отмена выравнивания
function AlignColumn*(number col, number a) {
  return AlignCell0(0, col, a);
}

// установить шрифт диапазона ячеек r1c1:r2c2 в fnt размером в size
// если fnt пусто установить размер, если size = 0, то только устанвить шрифт
function setFontRegion*(number r1, number c1, number r2, number c2, string fnt[], number size) {
  if (sid == empty) return Err0();
  string s[200], rg[40];
  if (xlsx) return 0;
  if (c1 == 0 && c2 == 0)
     sput(rg, "ActiveSheet.Rows(\"%d:%d\")", r1, r2);
  else {
     cRange(r1, c1, r2, c2, s);
     sput(rg, "ActiveSheet.Range(\"%s\")", s);
  }
  if (fnt != "")
     sput(s, "%s.Font.Name=\"%s\";", rg, fnt);
  else
     s = "";
  if (size > 0 && size < 40) {
     string s2[100];
     sput(s2, "%s.Font.Size=%d;", rg, size);
     strcat(s, s2);
  }
  if (s != "") return VBScript0(s);
  return 0;
}

// установить значение ячейки (row, сol) в val
function str*(number row, number col, string val[]) {
  if (sid == empty) return Err0();
  //if (xlsx) {
  //   string s[400];
  //   sput(s, "__SET_STR__%s", val);
  //   return ins_Excel(sid, row, col, s);
  //}
  return ins_Excel(sid, row, col, val);
}

// установить значение ячейки (row, сol) в val
function num*(number row, number col, number val) {
  if (sid == empty) return Err0();
  //if (xlsx) {
  //   string s[60];
  //   sput(s, "__SET_NUMBER__%d", val);
  //   return ins_Excel(sid, row, col, s);
  //}
  return ins_Excel_num(sid, row, col, val);
}

// установить значение ячейки (row, сol) в val, 0- не печатать
function numnz*(number row, number col, number val) {
  if (sid == empty) return Err0();
  if (abs(val) < 0.00000000000001)
     return str(row, col, empty);
  return num(row, col, val);
}

// установить значение ячейки (row, сol) в val жирным шрифтом
function numb*(number row, number col, number val) {
  if (sid == empty) return Err0();
  if (xlsx) {
     num(row, col, val);
     return BoldCell0(row, col);
  }
  if (row > 0 && col > 0) {
     string s[400];
     sput(s, "ActiveSheet.Cells(%d,%d).Font.Bold=1;ActiveSheet.Cells(%d,%d).Value=%d;",
       row, col, row, col, round(val, 0.00000001));
     return VBScript0(s);
  }
  return 0;
}

// установить значение ячейки (row, сol) в первые n знаков val
function strn*(number row, number col, string val[], number n) {
  string s[1000];
  if (sid == empty) return Err0();
  if (n > 999 || n < 0) n = 999;
  strn2cpy(s, val, 0, n);
  return str(row, col, s);
}

// установить значение ячейки (row, сol) в val жирным шрифтом
function strb*(number row, number col, string val[]) {
  if (sid == empty) return Err0();
  if (xlsx) {
     str(row, col, val);
     return BoldCell0(row, col);
  }
  if (row > 0 && col > 0) {
     string s[400];
     sput(s, "ActiveSheet.Cells(%d,%d).Font.Bold=1;ActiveSheet.Cells(%d,%d).Value=\"%s\";",
       row, col, row, col, val);
     return VBScript0(s);
  }
  return 0;
}

// установить значение ячейки (row, сol) в val курсивом
function stri*(number row, number col, string val[]) {
  if (sid == empty) return Err0();
  if (xlsx) {
     str(row, col, val);
     return ItalicCell0(row, col);
  }
  if (row > 0 && col > 0) {
     string s[400];
     sput(s, "ActiveSheet.Cells(%d,%d).Font.Italic=1;ActiveSheet.Cells(%d,%d).Value=\"%s\";",
       row, col, row, col, val);
     return VBScript0(s);
  }
  return 0;
}
// установить значение ячейки (row, сol) в val с явным указанием текстового формата
function strt*(number row, number col, string val[]) {
  if (sid == empty) return Err0();
  if (xlsx) {
     str(row, col, val);
     return FormatCell(row, col, "@");
  }
  FormatCell(row, col, "@");
  return ins_Excel(sid, row, col, val);
}

// добавить копию диапазона ячеек r1_from-c1_from:r2_from-c2_from листа wsname
// в ячейку r_to-c_to текущего листа
//  ActiveSheet.Cells(r_to,c_to).Select;
//  Sheets(wsname).Range().Copy(ActiveCell);
// работает только с set_mode(3)
function CopyRegion*(number r_to, c_to, string wsname[], number r1_from, c1_from, r2_from, c2_from) {
  if (sid == empty) return Err0();
  string s[500], rg[16];
  if (xlsx) {
     sput(s, "__COPYREGION__%d,%d,%d,%d,`%s`", r1_from, c1_from, r2_from, c2_from, wsname);
     return ins_Excel(sid, r_to, c_to, s);
  }
  cRange(r1_from, c1_from, r2_from, c2_from, rg);
  sput(s, "ActiveSheet.Cells(%d,%d).Select;Sheets(\"%s\").Range(\"%s\").Copy(ActiveCell);",
    r_to, c_to, wsname, rg);
  return VBScript0(s);
}

// установить текущим лист wsname
function ActivateWorkSheet*(string wsname[]) {
  if (sid == empty) return Err0();
  string s[200];
  if (xlsx) {
     sput(s, "__ACTIVATEWORKSHEET__%s", wsname);
     return ins_Excel(sid, 0, 0, s);
  }
  sput(s, "ActiveWorkBook.Sheets(\"%s\").Select;", wsname);
  return VBScript0(s);
}

// добавить копию листа wsname перед листом before и назвать wsnew
//  Sheets(wsname).Copy Before := wsbefore
//  ActiveSheet.name = wsnew;
// работает только с set_mode(3)
function CopyWorkSheet*(string wsname[], string before[], string wsnew[]) {
  if (sid == empty) return Err0();
  string s[500];
  if (xlsx) {
     sput(s, "__COPYWORKSHEET__`%s`,`%s`,`%s`", wsname, before, wsnew);
     return ins_Excel(sid, 0, 0, s);
  }
  sput(s, "ActiveWorkBook.Sheets(\"%s\").Select;Sheets(\"%s\").Copy(ActiveSheet);ActiveSheet.Name = \"%s\";",
    before, wsname, wsnew);
  return VBScript0(s);

  //sput(s, "__COPYWORKSHEET__%s,%s,%s", wsname, before, wsnew);
  //ins_Excel(sid, 0, 0, s);
  //return 0;
}

// Переименовать лист wsname1 в лист wsname2
// Если wsname1 = "", то переименовать текущий лист в лист wsname2
function RenameWorkSheet*(string wsname1[], string wsname2[]) {
  if (sid == empty) return Err0();
  string s[100];
  if (xlsx) {
     sput(s, "__RENAMEWORKSHEET__`%s`,`%s`", wsname1, wsname2);
     return ins_Excel(sid, 0, 0, s);
  }
  if (strcmp(wsname1, "") == 0)
     sput(s, "ActiveSheet.Name = \"%s\";", wsname2);
  else
     sput(s, "ActiveWorkBook.Sheets(\"%s\").Name = \"%s\";", wsname1, wsname2);
  return VBScript0(s);
}

// Удалить лист wsname
function DeleteWorkSheet*(string wsname[]) {
  if (sid == empty) return Err0();
  string s[200];
  if (xlsx) {
     sput(s, "__DELETEWORKSHEET__%s", wsname);
     return ins_Excel(sid, 0, 0, s);
  }
  //sput(s, "DisplayAlerts=0;Sheets(\"%s\").Delete;DisplayAlerts=-1;", wsname);
  sput(s, "DisplayAlerts=0;ActiveWorkBook.Sheets(\"%s\").Delete;", wsname);
  return VBScript0(s);
}

// установить шрифт диапазона ячеек r1c1:r2c2 в fnt размером в size и вычесть высоту
// если fnt пусто установить размер, если size = 0, то только устанвить шрифт
function setHFontRegion*(number r1, number c1, number r2, number c2, string fnt[], number size, string valStr, number lCell) {
  if (sid == empty) return Err0();
  string s[200], rg[16];
  number HeigthCell, L_str, a, NumLines, cof;
  cRange(r1, c1, r2, c2, rg);
  if (xlsx) return 0;
  if (fnt != "" && strlen(valStr) > 0 && lCell > 0) {
     sput(s, "ActiveSheet.Range(\"%s\").Font.Name=\"%s\";", rg, fnt);
     cof = 0.157 * size;
     L_str = strlen(valStr)*cof; //определили длину строки
     a = round(L_str, 1);
     if (a < lCell)
        HeigthCell = size + 3.75;         //определили высоту строки 
     else {
        NumLines = a/lCell;                  //определили кол-во строк в ячейке
        HeigthCell = (size + 3.75)*NumLines; //определили общую высоту ячейки
     }
  }
  else
     s = "";
  if (size > 0 && size < 40) {
     string s2[100];
     sput(s2, "ActiveSheet.Range(\"%s\").Font.Size=%d;", rg, size);
     strcat(s, s2);
  }
  if (s != "") VBScript0(s);
  return HeigthCell;
}

// установить режим работы OLE 1- серверный, 2 - клиентский, 3- серверный с библиотекой UOLE.dll
// при значении 2
//    шаблоны должны находиться в каталоге пользователя на клиенте
//    обязательно должен быть подкаталог PR с файлами empty.doc, empty.xls
//    скопированными из серверного каталога ..\CLI\PR
// вызов должен быть сразу после вызова Init(sid);
function set_mode*(number mode) {
  if (xlsx) return 0;
  if (mode != 1 && mode != 2 && mode != 3) return -1;
  if (sid == empty) return Err0();
  string s[100];
  sput(s, "__OLE_MODE__%d", mode);
  return ins_Excel(sid, 0, 0, s);
}

// побуквенно вывести строку в прямоугольную область
// добавлено расстояние между столбцами и строками
// abz - отступить в первой строке (абзац)
function strrectda*(number row, number col, number w, number h, number dx, number dy, number abz, string val[]) {
  number l, i, row1, col1;
  string ch[2];
  l = strlen(val);
  i = 0; row1 = row; col1 = col + abz * dx;
  while (i<l) {
    strn2cpy(ch, val, i, 1);
    str(row1, col1, ch);
    i = i+1;
    col1 = col1 + dx;
    if (col1 >= col + w * dx) {
      col1 = col;
      row1 = row1 + dy;
      if (row1 >= row + h * dy) break;
    }
  }
  return 0;
}
function strrectd*(number row, number col, number w, number h, number dx, number dy, string val[]) {
  return strrectda(row, col, w, h, dx, dy, 0, val);
}
function strrectdu*(number row, number col, number w, number h, number dx, number dy, string val[]) {
  string val1[1000];
  val1 = val;
  strupr(val1);
  return strrectda(row, col, w, h, dx, dy, 0, val1);
}
function strrectdua*(number row, number col, number w, number h, number dx, number dy, number abz, string val[]) {
  string val1[1000];
  val1 = val;
  strupr(val1);
  return strrectda(row, col, w, h, dx, dy, abz, val1);
}
// побуквенно вывести строку в прямоугольную область
// abz - отступить в первой строке (абзац)
function strrecta*(number row, number col, number w, number h, number abz, string val[]) {
  return strrectda(row, col, w, h, 1, 1, abz, val);
}
function strrect*(number row, number col, number w, number h, string val[]) {
  return strrecta(row, col, w, h, 0, val);
}
function strrectua*(number row, number col, number w, number h, number abz, string val[]) {
  string val1[1000];
  val1 = val;
  strupr(val1);
  return strrecta(row, col, w, h, abz, val1);
}
function strrectu*(number row, number col, number w, number h, string val[]) {
  string val1[1000];
  val1 = val;
  strupr(val1);
  return strrect(row, col, w, h, val1);
}
function strrectx*(number row, number col, number dx, string val[]) {
  return strrectda(row, col, 100, 1, dx, 1, 0, val);
}

// получить значение ячейки (row, сol) в val
function getCell*(number row, number col, string val[]) {
  if (sid == empty) return Err0();
  if (xlsx) {
     string s[4000];
     strcpy(s, "__GET_STR__");
     ins_Excel(sid, row, col, s);
     strcpy(val, s);
  }
  else val = "";
  return 0;
}

// получить значение ячейки (row, сol) в val
function getNum*(number row, number col, number &val) {
  if (sid == empty) return Err0();
  string sval[40];
  getCell(row, col, sval);
  strnum(sval, val);
  return 0;
}

// получить имя формируемого файла xlsx
function getFilename*(string val[]) {
  if (sid == empty) return Err0();
  if (xlsx) {
     string s[4000];
     strcpy(s, "__GET_FILE_NAME__");
     ins_Excel(sid, 0, 0, s);
     strcpy(val, s);
  }
  else val = "";
  return 0;
}

// изменить имя формируемого файла xlsx
// имя должно быть абсолютным путём или же относительным к каталогу fcgi
// C:\BK\TEMP\kt\k52.xlsx или ..\..\TEMP\kt\k52.xlsx
function setFilename*(string val[]) {
  if (sid == empty) return Err0();
  if (xlsx && strlen(val) > 12) {
     string s[300];
     sput(s, "__SET_FILE_NAME__%200s", val);
     ins_Excel(sid, 0, 0, s);
  }
  return 0;
}

{
  empty = "";  sid = empty;
  return 0;
}

/*
  m_Excel.Init(sid);
  m_Excel.str(9, 6, "deptname");
  //m_Excel.RunMacro(0, 0, "NextPage", "");
  m_Excel.num(8,  5, 789.20);

  m_Excel.BoldColumn(5);
  m_Excel.str(13, 6, "italic cell (13, 4)");
  m_Excel.FormatColumn(11, "m/d/yyyy");
  m_Excel.str(19, 11, "20.03.2008");
  m_Excel.str(20, 11, "22.04.2008");

  // установить ширину ячейки (row, col) равной w
  m_Excel.WidthColumn(11, 11);
  m_Excel.WidthColumn(12, 100);
  m_Excel.ColorRow(20, 5);

*/
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
NewAge



Зарегистрирован: 11.06.2010
Сообщения: 108

СообщениеДобавлено: Ср Апр 08, 2020 14:14    Заголовок сообщения: Ответить с цитатой

Я конечно не спец по оракловому боссу, но тут прочитал, что z процедура сначала пишет все в таблицу и только по ее завершению уже формируется реальный файл. Тогда может в данном случае использовать две z процедуры. Одна для формирования файла. А в другой будет цикл по записям и запуск процедуры формирования файла с передачей параметров для формирования файла.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
KruZer



Зарегистрирован: 06.04.2020
Сообщения: 4

СообщениеДобавлено: Чт Апр 09, 2020 12:32    Заголовок сообщения: Ответить с цитатой

Попробовал и такой вариант (раскидав на несколько процедур) - не получилось, выгрузился Excel с последними данными из цикла.. Такое ощущение, что он просто перезаписывал несколько раз файл.
Нашел альтернативный выход: сколько проходов имеется в цикле, столько раз копируется область шаблона с разрывом страницы на всех листах документа, после чего данные выводятся по своим листам и страницам на этих листах.
Другого выхода не нашел.. В несколько файлов отчет так и не смог выгрузить, только по разным листам данные раскидал..
Спасибо за помощь Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
NewAge



Зарегистрирован: 11.06.2010
Сообщения: 108

СообщениеДобавлено: Пт Апр 10, 2020 10:50    Заголовок сообщения: Ответить с цитатой

А может еще в цикл для каждого файла устанавливать свое уникальное имя. Может это поможет.
Код:

// изменить имя формируемого файла xlsx
// имя должно быть абсолютным путём или же относительным к каталогу fcgi
// C:\BK\TEMP\kt\k52.xlsx или ..\..\TEMP\kt\k52.xlsx
function setFilename*(string val[]) {
  if (sid == empty) return Err0();
  if (xlsx && strlen(val) > 12) {
     string s[300];
     sput(s, "__SET_FILE_NAME__%200s", val);
     ins_Excel(sid, 0, 0, s);
  }
  return 0;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
йцу



Зарегистрирован: 28.01.2020
Сообщения: 4

СообщениеДобавлено: Вт Апр 14, 2020 11:33    Заголовок сообщения: Ответить с цитатой

У меня была потребность формировать отчёты в отдельных документах, но в Word. Решила эту задачу с помощью запуска скрипта в цикле:

sput(strScript, "Application.ActiveDocument.SaveAs(\"%s\");", filename);
m_Word.VBScript(strScript);

В каждой итерации отчёт "сохраняется как" со своим именем.

Думаю, в Excel тоже можно попробовать решить задачу с помощью запуска скриптов VB.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> Z-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU