Страница 2 из 2

Re: Универсальный журнал-ордер в Excel

Добавлено: 18 дек 2006, 18:02
other95
Goblin писал(а):Maverick, не пугай народ, понимает SLK горизонтальные циклы :)

Nick, динамическое кол-во столбцов можно в SLK делать с помощью конструкции
.{.?<идент. цикла>;<тело цикла>.}
, есть только ряд ограничений(нигде не описано, методом пробного тыка получено и использовано уже в десятке самописных отчетов):
1) Открываться и закрываться цикл должен в разных ячейках.
2) Открытие или закрытие цикла на ячейку - только одно.
3) Тело цикла должно быть в той же ячейке что и открытие цикла

если не получится - скинь форму на мыло
А как сделать горизонтальный цикл по таблице?
.{horizontal table 'Test'; <тело цикла>.} - Не работает
.{.? table 'Test'; <тело цикла>.} - Так тоже не работает

Re: Универсальный журнал-ордер в Excel

Добавлено: 08 фев 2011, 10:12
Marisha_P
если на вопрос не было ответа, я так понимаю, что нельзя сделать цикл по таблице, да?:(

Re: Универсальный журнал-ордер в Excel

Добавлено: 08 фев 2011, 12:03
LaaLaa
Marisha_P писал(а):если на вопрос не было ответа, я так понимаю, что нельзя сделать цикл по таблице, да?:(
Горизонтальные циклы в FCOM это не разрешимая загадка.

Рисуйте отчеты с динамическим количеством колонок в FastReport. Для этого там есть две возможности "Объект Cross-Tab" и "Вертикальные бэнды".

Re: Универсальный журнал-ордер в Excel

Добавлено: 08 фев 2011, 13:21
oiko
По таблице не пробовал. Если просто хочется сделать вертикальный цикл, то в прототипе например пишем
.{.?stpotreb_01_01;^ .}
а в slk
| ячейка1 | ячейка2 | ячейка3 |
| |.{.?stpotreb_01;^ | .} |
И так все работает

Re: Универсальный журнал-ордер в Excel

Добавлено: 02 мар 2011, 14:46
Marisha_P
проблема разрешилась на мой взгляд достаточно просто.
сначала в файле с расширением vpp написала след. код:
table struct tmpCnt
(
fld: string
);

а потом в самом slk заполнила эту табличку значениеями из запроса:

TERM._loop katmarsh TERM._loop marsh_sp TERM._loop mnfoper
{
term_v.Insert tC set fld := TERM.mnfoper.name;
}

ну а это уже непосредственно сам вывод горизонтального цикла:
.{horizontal table 'term_v.tC'
^
.}

Осталось загадкой - как теперь расчертить границы для ячеек? просто значений неясное количество, и если значений нет, то ничего не прочерчивается :((( Получается нерасивая лесенка :(

Re: Универсальный журнал-ордер в Excel

Добавлено: 02 мар 2011, 15:28
edward_K
excel лучше - в текстовой присоединенке заполняете как хотите, где хотите, чертите , ставите ширину колонок и так далее. И проще. А если научитесь использовать шаблоны типа актов на списание, то еще проще(тока слегка медленнее, чем если бы все руками создавать, да и файло с макросом открывается дольше).

Re: Универсальный журнал-ордер в Excel

Добавлено: 02 мар 2011, 16:37
Marisha_P
не поняла, что нужно сделать:( вывод переделать из slk в текст? или в текстовом файле прописать особенности разметки? который компилировать потом в проекте?

Re: Универсальный журнал-ордер в Excel

Добавлено: 02 мар 2011, 17:39
edward_K
да. Slk переделать в текст. Параллельно или вместо использовать xl функции - поищите на форуме XlOpenExcel, xlCreateExcelWithTemplate, Excel.doc и так далее.
Чтобы погасить вывод на экран текстовой формы используйте

Код: Выделить всё

.F "NUL"
Это как раз тот случай когда стоит слегка подучится, потом за 5 минут долететь.
У меня так своя библиотека написана, и на разработку простенького отчета уходит от получаса.

Re: Универсальный журнал-ордер в Excel

Добавлено: 12 май 2011, 13:55
Semi-bit
Marisha_P писал(а):Осталось загадкой - как теперь расчертить границы для ячеек? просто значений неясное количество, и если значений нет, то ничего не прочерчивается (( Получается нерасивая лесенка
Для того, чтобы не печаталась "лесенка", решение в Слк не менее "простое". Модифицируйте свой код следующим образом:

Код: Выделить всё

table struct tmpCnt
(
rownum: integer;
fld: string 
)
with index
(
  byRow = rownum
)
;
В файле слк вьюху term_v перепишите так:

Код: Выделить всё

.var
  MaxCols: Integer;
  MaxRows: Integer;
  I: Integer;
.endVar
.create view term_v var nRow: Integer from tC where ((nRow == tC.rownum))
Далее, таблицу tC заполняем с указанием номера строки и выравниваем количество ячеек в ней:

Код: Выделить всё

// в начале формы
.begin
  term_v.nRow := 0;
end.

//в теле цикла по строкам 
.begin
  Inc(term_v.nRow);
end.

// заполнение таблицы
term_v.delete all tC;// если ранее в текущую строку попали значения, они нам не нужны
TERM._loop katmarsh TERM._loop marsh_sp TERM._loop mnfoper
{
term_v.Insert tC set fld := TERM.mnfoper.name, rownum := term_v.nRow;
}
MaxCols := 0;
MaxRows := term_v.nRow;
// подсчёт максимального количества колонок
for(; term_v.nRow > 0; Dec(term_v.nRow))
{
  term_v._loop tC {}
  if RowCount > MaxCols then
    MaxCols := RowCount;
}
// установка максимального количества колонок
for(term_v.nRow := 1; term_v.nRow <= MaxRows; Inc(term_v.nRow))
{
  term_v._loop tC {}
  for(i := RowCount; i < MaxCols; Inc(i))
    term_v.Insert tC Set fld := "", rownum := term_v.nRow;
}
Вывод tC следует теперь вынести за все управляемые циклы, и модифицировать следующим образом:

Код: Выделить всё

.begin
  nRow := 0;
end.
.{while term_v.nRow < MaxRows
.begin
  Inc(term_v.nRow);
end.
.{horizontal table 'term_v.tC'
^
.}
.}
Принцип формирования таблицы получается такой: в теле цикла по строкам исходной таблицы мы копируем все статичные поля во временную, дополняем её динамическими, а затем расширяем до максимального количества столбцов. Потом построчно печатаем полученную таблицу, разбивая её на отдельные строки с помощью поля rownum.
Надеюсь, данный способ пригодится всем присутствующим :)

Re: Универсальный журнал-ордер в Excel

Добавлено: 12 май 2011, 18:09
LaaLaa
По моему FR в данном случае поможет сохранить клетки мозга :)

Re: Универсальный журнал-ордер в Excel

Добавлено: 13 май 2011, 09:25
Semi-bit
Сытый конному не... то есть, с 7 и не такие выкрутасы приходится творить :)

В своих интерфейсах уже давно использую макросы и ExcelLib для таких вещей, но в стандартных их запустить не проще, чем реализовать приведённый пример. Хотя, использовать текстовичок по методу edward_K не додумался пока ещё.