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

ПНР и сопровождение

Модераторы: m0p3e, edward_K, Модераторы

other95
Новичок
Сообщения: 23
Зарегистрирован: 03 янв 2006, 18:58
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение other95 »

Goblin писал(а):Maverick, не пугай народ, понимает SLK горизонтальные циклы :)

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

если не получится - скинь форму на мыло
А как сделать горизонтальный цикл по таблице?
.{horizontal table 'Test'; <тело цикла>.} - Не работает
.{.? table 'Test'; <тело цикла>.} - Так тоже не работает
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

если на вопрос не было ответа, я так понимаю, что нельзя сделать цикл по таблице, да?:(
LaaLaa

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

Сообщение LaaLaa »

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

Рисуйте отчеты с динамическим количеством колонок в FastReport. Для этого там есть две возможности "Объект Cross-Tab" и "Вертикальные бэнды".
oiko
Местный житель
Сообщения: 419
Зарегистрирован: 29 мар 2005, 17:49

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

Сообщение oiko »

По таблице не пробовал. Если просто хочется сделать вертикальный цикл, то в прототипе например пишем
.{.?stpotreb_01_01;^ .}
а в slk
| ячейка1 | ячейка2 | ячейка3 |
| |.{.?stpotreb_01;^ | .} |
И так все работает
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение 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'
^
.}

Осталось загадкой - как теперь расчертить границы для ячеек? просто значений неясное количество, и если значений нет, то ничего не прочерчивается :((( Получается нерасивая лесенка :(
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

excel лучше - в текстовой присоединенке заполняете как хотите, где хотите, чертите , ставите ширину колонок и так далее. И проще. А если научитесь использовать шаблоны типа актов на списание, то еще проще(тока слегка медленнее, чем если бы все руками создавать, да и файло с макросом открывается дольше).
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

не поняла, что нужно сделать:( вывод переделать из slk в текст? или в текстовом файле прописать особенности разметки? который компилировать потом в проекте?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

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

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

.F "NUL"
Это как раз тот случай когда стоит слегка подучится, потом за 5 минут долететь.
У меня так своя библиотека написана, и на разработку простенького отчета уходит от получаса.
Semi-bit
Постоянный обитатель
Сообщения: 123
Зарегистрирован: 01 фев 2007, 12:45
Откуда: Магнитогорск
Контактная информация:

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

Сообщение 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.
Надеюсь, данный способ пригодится всем присутствующим :)
Испытываю траблы с даблами
ВИП — Велосипедо-Изобретательская Парадигма
САППОРТ — Сборище Абсолютно Пустых Посредственно Образованных Ржущих Троллей
LaaLaa

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

Сообщение LaaLaa »

По моему FR в данном случае поможет сохранить клетки мозга :)
Semi-bit
Постоянный обитатель
Сообщения: 123
Зарегистрирован: 01 фев 2007, 12:45
Откуда: Магнитогорск
Контактная информация:

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

Сообщение Semi-bit »

Сытый конному не... то есть, с 7 и не такие выкрутасы приходится творить :)

В своих интерфейсах уже давно использую макросы и ExcelLib для таких вещей, но в стандартных их запустить не проще, чем реализовать приведённый пример. Хотя, использовать текстовичок по методу edward_K не додумался пока ещё.
Испытываю траблы с даблами
ВИП — Велосипедо-Изобретательская Парадигма
САППОРТ — Сборище Абсолютно Пустых Посредственно Образованных Ржущих Троллей
Ответить