|
|
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуста, буду очень всем благодарен. Все уже сделано, осталось "выдать" отчет по данным. В отчетах фокс про-ни бум-бум. Вообще о БД представление имею немного Задача: Дана таблица с иерархической структурой IDprod IDParent ProdName IsProd Opisanie 1 0 Продукты .F. Тыры-пыры 2 1 Напитки .F. Трали-вали 3 2 Сок добрый .T. Хороший сок 4 1 Мочалка Продукт отмечен логическим полем. Вложение-неизвестно. Структура данных не обсуждается! Так дано. Это как бы нормально, даже сделал дерево!!! :) Но нужен отчет, который бы отражал наличествующие продукты (при указанию на ID группы) на складе в иерархическом виде Предположим я сделала курсор или курсорадаптер, где в условии Where я отобрал те продукты, которые на складе есть. А как дальше, ума не приложу. Даже не могу выборку сделать. Читал Использование длинного ключа в SQL предложениях(Журавлев) и пользовался поиском на Foxclub и здесь и до решения пока далеко Ничегошеньки не понял Например выдали мы параметр ID=0 значит надо ВЫБРАТЬ и ОТОБРАЗИТЬ так --------------------- Продукты- --------------------- Наименование Количество Цена Описание Мочалка 5 5 руб ***** --------------------- Продукты-Напитки --------------------- Наименование Количество Цена Описание Сок Добрый 15 30 руб ***** ------------------------------------------------------ итд Всего позиций: *** Цена: *** Вообщем типа того. Очень сильно прошу помочь, если можно с файлом отчета, примерным. А то бьюсь уже 5 дней, я вообщем не халявщик, поошу редко, уже когда совсем ничего не понимаю. Спасибо за внимание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 12:56 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Отчеты FoxPro всегда строятся как результат сканирования одной (главной) таблицы. Поэтому, в общем случае, сначала необходимо эту самую таблицу создать. Любым способом. В данном случае, использование Select-SQL допустимо, но как вспомогательный механизм. Проще создать пустую временную таблицу и при помощи рекурсии ее заполнить. Создавать курсор необходимо, чтобы выстроить записи в нужном порядке. При помощи индекса это решить очень сложно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. В результате, должна получится временная таблица (курсор) с именем curReport, которая повторяет стркутуру исходной таблицы и содержит все дочернии узлы для записи с указанным кодом. Однако в отличии от основной таблицы здесь записи упорядочены (выстроены) в том порядке как они должны отображаться, если бы дерево было бы полностью раскрыто. Плюс имеем поле nLevel, содержащее уровень вложенности (отступа) каждого узла от базового узла. Это поле понадобится для формирования древовидной структуры в отчете. Теперь, можно строить отчет, взяв в качестве источника данных полученный курсор. По значению поля nLevel можно делать красивое оформление отчета, если это необходимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 13:47 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Версия 9 SP1 Владимир, премного благодарен. Все понятно и расжевано... (Вам бы в наши преподаватели) курсор необходимой структуры я получил, но с того места как..... >Теперь, можно строить отчет, взяв в качестве источника данных полученный >курсор. По значению поля nLevel можно делать красивое оформление отчета, >если это необходимо. уже не понятно. Если это делать в BeforeOpenTable, и без включения таблиц в DataEnv отчет вообще не сохраняется. Но это ладно, порешал пока за счет создания таблицы. и тренировки с ней. Но вот как там быть с групировками итд, чтоб отчет отражался так как я описал выше-не могу сделать Если у Вас будет время, то пожалуйста ответе, как сделать отчет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 14:35 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Судя по примеру у тебя в отчете в пределах одной ветки сначала должны идти те записи у которых isProd = .T., а потом те записи у которых isProd = .F. Это надо учесть в коде создания временной таблицы. Для этого нужен индекс по полю isProd. Создай его в дизайнере таблицы и в самом начале кода его надо назначить главным индексом Код: plaintext 1. 2. 3. DESC - потому, что значение .T. больше чем значение .F.. Поэтому, чтобы получить обратную последовательность индекс должен быть в порядке убывания значений. Курсор создается вообще ВНЕ отчета. ДО его вызова. Сам вызов отчета принимает вид Код: plaintext 1. В этом случае, в DataEnvironment отчета вообще ничего не должно быть. Источники данных для объектов отчета прописываются вручную. Для каждого объекта в отдельности. В отчете делается группировка по коду родителя. Т.е. по значению поля curReport.IDParent Опять же, судя по описанию, информация из строк, у которых установлено значение isProd = .F. выводится только в заголовке группы. В детальной части выводится только информация по записям со значением isProd = .T. Значит, на все объекты печати в области деталировки надо наложить условие печати (Print When) в полосе "Print only when expression is true" примерно так curReport.isPrint = .T. И поставить птичку в пункте "Remove line if blank", чтобы пустые строки не печатались Поскольку записи, со значение признака isPrint = .F. являются "заголовком" для подчиненных узлов, но, по условию формирования оказываются в конце предыдущей группы, то в качестве заголовка следующей группы следует использовать подвал предыдущей . Т.е. в подвале группы добавь еще одно поле ввода копию того, которое выводит наименование в деталировке. Но условие печати уже прямо противоположное. curReport.isPrint = .F. Правда, при такой логике не отобразятся заголовки узлов если у них нет ни одной подчиненной записи. Если это важно, то надо будет перестроить логику построения отчета. Теперь, при чем здесь nLevel. Если есть желание отобразить список именно в виде древовидной структуры, т.е. с отступами, то в качестве названия следует написать такое выражение в объекте для печати Код: plaintext Вместо значения 4 можно поставить любое свое значение, чтобы визуализировать нужный отступ от края. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 15:35 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Владимир, мне кажется я не донес суть моих изысканий..... Особенно по отношению к полю isProd это по заданной структуре-флаг имеено того, что это продукт. Я понимаю, что по правилам нормализации необходимо было сделать наверное отдельную таблицу категорий, отдельно продуктов. Но задача дана таковая, и я ступоре!!!! Я тут непосильным трудом написал пример и еще приаттачил отчет(немного подправленный под пример)-мои потуги, которые я пытался сделать. Ничего у меня не получается, особенно с иерархией Подправьте если можете Спасибо Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 17:32 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Посмотри во вложении. Ты вообще пропустил все то, о чем я написал в последнем посте. Просто проигнорировал. Я добавил в коде только собки, чтобы была передача параметров по значению а не по ссылке. В отчете обрати внимание на закладку Print When объектов. Ну, и чуть-чуть изменил признак группировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 18:24 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Вау!!! Владимир, вечный Ваш должник. "Будете у нас на Колыме-милости просим" (С) :) Все почти удовлетворяет, Вы мне сильно помогли. Если я стал недавно вьезжать в язык Фокс про и работу с данными(ну так кажется по крайней мере), то с отчетами-беда. Это еще отдельная песня Фокса. Но нравиться он мне все больше и больше. Особенно мне нравиться вставлять команду DOEVENTS FORCE между методами, потому что фокс так быстр и нетерпелив, что плюнув на отрисовку интерфеса или еще чего нить, бежит как угорелый работать с данными. :) Обозначу незначительные проблемы: 1)если в примеру добавить еще запись 11 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. И выводить отчет, Код: plaintext 1. 2. 3. То Сок Добрый(4) идет после Сок недобрый(11), что есть нехорошо, тем более мы отражаем код записи в отчете. В слабых потугах, мы пытаемся делать Код: plaintext 1. 2. 3. 4. 5. Только не обижайтесь Владимир, я просто очень нудный и докапывающийся студент :) ...видим, что алгоритм формирования отчета "ломается", что и понятно, потому что идет группировка по STR(curReport.IDParent)+TRANSFORM(Curreport.isprod) Прочитав Ваши топики, понял, что Фокс сканирует таблицу при формировании отчета и только одну :( Вдруг думаю мне поможет группировка STR(curReport.IDParent)+STR(curReport.IDProd)+TRANSFORM(Curreport.isprod) а тоже нет :( 2) В принципе, в задаче стоит обозначить всю иерархию продукта в "заголовке" деталей, а у нас получается как бы "дерево" В принципе препода спрошу, может и так сойдет... ВладимирМ В отчете обрати внимание на закладку Print When объектов. Это понял четко, я все ломал голову, вначале хотел выбрать записи в курсор, которые являются коннечными элементами, но терялась иерархия..... А тут оказывается есть замечательное средство ВладимирМ Ну, и чуть-чуть изменил признак группировки. А вот это вообще не понял, зачем группировать с Curreport.isprod и зачем вообще совмещаются логическое и цифровое поля, приведенные к символьному??? STR(curReport.IDParent)+TRANSFORM(Curreport.isprod) Вообщем вопросов еще много ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 19:36 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Вообще-то, я перестарался В том смысле, что в задаче вовсе не требуется факт наличия записей, содержащих информацию по категориям. От них требуется только название. Они только мешают. Приходится прилагать дополнительные усилия уже в самом отчете чтобы от них избавиться. А это не есть хорошо. По возможности, сам отчет должен быть максимально простым. Безо всяких "наворотов". Потому, что в нем очень трудно что-то искать. Поэтому я все это добро переделал. Вся логика вынесена в код. Отчет - это просто отчет. Никаких условий в Print When. Все тупо "в лоб" - простое сканирование таблицы Посмотри исправленный вариант. Там основная идея в том, что в таблице для печати я формирую еще одно поле, содержащее полный путь к родителю: Продукты-Напитки. И записи - группы вообще не включаю в итоговую таблицу кроме случаев, когда у группы нет ни одной записи ("Пустой узел") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2006, 22:39 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Владимир, отчет близок к идеальному!!! Большое спасибо что Вы со мной занимаетесь. Очень поучительно. Кстати, на фоксклубе и здесь-полно кода на нем только и учусь, Ваш Faq читаю. В принципе, если нормально поискать, то можно найти любой код. Но... отчеты...-это как бы отдельная стезя и требуют наличия файлов. Солюшены-как всегда запутано и непонятно. Например, не помешало бы размешать типичные, но сложные отчеты с прикреплением файлов. Как в данном случае. Новички как я, могли бы поучится чему то. Я думаю, что мой вариант отчета достаточно распостранен, структура иерархическая-используется часто, но она вообще очень слабо понимается, да еще и с рекурсией. Боюсь показаться нескромным, но есть еще ошибочки в почти идеальном отчете :-)) 1)Для полноты экспиримента сделать прайс по всей таблице. Например передать какой нить хитрый параметр в CreateCursor и заполнить курсор всеми записями Я пока другого варианта как последовательной передачи в качестве параметра корневых узлов не вижу. Не догоняю вообщем. Завтра на свежую голову поразбираюсь. 2) И неприятная ошибка если передать сразу концевую ветвь, CreateCursor(11) то курсор возвращается пустой. и самое главное, в условие сканирования даже не выполняется SELECT MyTab SCAN FOR IDParent = m.tnParentID Потому что она не имеет потомков... В принципе-такой вариант задачи тоже возможен, вообще, при выдаче отчета. автор В том смысле, что в задаче вовсе не требуется факт наличия записей, содержащих информацию по категориям. От них требуется только название. Они только мешают. Приходится прилагать дополнительные усилия уже в самом отчете чтобы от них избавиться. А это не есть хорошо. А я тока обрадовался, что в самом отчете можно рулить.... а то и правда-в таком отчете потом не разберешься через 1 месяц. автор Посмотри исправленный вариант. Там основная идея в том, что в таблице для печати я формирую еще одно поле, содержащее полный путь к родителю: Продукты-Напитки. И записи - группы вообще не включаю в итоговую таблицу кроме случаев, когда у группы нет ни одной записи ("Пустой узел") Да отчет упростился, и уже, я его начинаю понимать, и вижу знакомые нотки, ну то есть, я так же предпологал, что группировать надо по Level узла. Но дальше-не дотункивал и щас не дотункиваю. :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 00:00 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Студент Дима Но... отчеты...-это как бы отдельная стезя и требуют наличия файлов. Солюшены-как всегда запутано и непонятно. Например, не помешало бы размешать типичные, но сложные отчеты с прикреплением файлов. Как в данном случае. Новички как я, могли бы поучится чему то. Вот это скачай FAQ for Reports Студент ДимаЯ думаю, что мой вариант отчета достаточно распостранен, структура иерархическая-используется часто, но она вообще очень слабо понимается, да еще и с рекурсией. Распространен. Но не в таком виде. Точнее, не с такой структурой быза дынных. Сам отчет примитивен. Сложность заключается в подготовке для него данных. А это уже к собственно отчетам не имеет отношения. Студент Дима 1)Для полноты экспиримента сделать прайс по всей таблице. Например передать какой нить хитрый параметр в CreateCursor и заполнить курсор всеми записями Я пока другого варианта как последовательной передачи в качестве параметра корневых узлов не вижу. Ну, это просто. Весь код не зря разделен на 2 части: вход в рекурсию и сама рекурсия. Для просмотра всего прайса код самой рекурсии изменять не надо. Ему надо только передать в качестве параметра код родителя 0. Значит, надо изменить процедуру входа в рекурсию. Если структура базы данных такая как есть (обычно есть еще один невидимый фиктивный корневой узел), то в качестве параметра на вход надо дать некое особое значение. Например, 0 или NULL. Тогда в процедуре CreateCursor первым делом проверяем значение входного параметра и в зависимости от этого либо работаем как раньше, или сразу запускаем рекурсию передав в качестве кода родителя 0. Студент Дима 2) И неприятная ошибка если передать сразу концевую ветвь, CreateCursor(11) то курсор возвращается пустой. и самое главное, в условие сканирования даже не выполняется SELECT MyTab SCAN FOR IDParent = m.tnParentID Потому что она не имеет потомков... В принципе-такой вариант задачи тоже возможен, вообще, при выдаче отчета. Это тоже можно предусмотреть все в той же процедуре входа в рекурсию CreateCursor. После того, как убедились, что узел существует проверить факт наличия дочерних узлов. Это уже сделано в рекурсивной функции (ветка по INDEXSEEK()). Аналогичную ветку надо добавить и в CreateCursor Студент Дима Да отчет упростился, и уже, я его начинаю понимать, и вижу знакомые нотки, ну то есть, я так же предпологал, что группировать надо по Level узла. Но дальше-не дотункивал и щас не дотункиваю. :-))) Нет. Группировки делаются по неким фиктивным "группам". Для простоты, представь себе полностью развернутое дерево. Т.е. все его узлы раскрыты. Теперь убери все отступы. Т.е. сдвинь все узлы вплотную к левому краю листа (экрана). Это и есть то, что требуется получить в отчете. Границами групп отчета выступают узлы - категории. Заметь, вовсе не код родительского узла, а от одного узла-категории, до следующего по порядку узла-категории. Разумеется, если потребуются итоги по узлам, то все значительно усложнится. Например, общий прайс с промежуточными итогами по категории "Продукты". Но пока этого не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 10:41 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Приветсвую Владимир, большое спасибо. Понимания у меня-гораздо больше! ВладимирМ Группировки делаются по неким фиктивным "группам". Для простоты, представь себе полностью развернутое дерево. Т.е. все его узлы раскрыты. Теперь убери все отступы. Т.е. сдвинь все узлы вплотную к левому краю листа (экрана). Это и есть то, что требуется получить в отчете. А ведь точно, значит надо просто правильно разместить записи Вообще, в принципе, записи и так правильнго размещены по индексу idParent. Единствннное что нам нужно-это полный "путь" по иерархии категорий к продукту, что мы и делаем. ВладимирМ Границами групп отчета выступают узлы - категории. Заметь, вовсе не код родительского узла, а от одного узла-категории, до следующего по порядку узла-категории. Для чего мы и сделали дополнительное поле уровня вложенности-nGroupID, то есть грубо говоря сколько отступить справа :-) Вот с сканируем таблицу. Понимаю!!! ВладимирМРазумеется, если потребуются итоги по узлам, то все значительно усложнится. Например, общий прайс с промежуточными итогами по категории "Продукты". Но пока этого не требуется. Да кстати, напрммер задача не "прайс лист", а "продажи" Ну типа сколько чего продали с детализацией по категориям раскидать. Тоже распостраненный вопрос. С этим потом поразбираюсь, подыму эту тему, если что не пойму. ВладимирМ Распространен. Но не в таком виде. Точнее, не с такой структурой базы дынных. Сам отчет примитивен. Сложность заключается в подготовке для него данных. А это уже к собственно отчетам не имеет отношения. Как бы Вы создали структуру?? В принципе, как я уже говорил, мне только видиться разделение таблиц на 2 1-группы-ID, ParentID, ID_record 2-IDProd, ID_record, ProdName Ну и может быть количество продукта-отдельная таблица. ВладимирМ Для просмотра всего прайса код самой рекурсии изменять не надо. Ему надо только передать в качестве параметра код родителя 0. Тут именно так, недодумался до очевидного... Код: plaintext 1. 2. 3. Студент Дима 2) И неприятная ошибка если передать сразу концевую ветвь, CreateCursor(11) то курсор возвращается пустой. и самое главное, в условие сканирования даже не выполняется SELECT MyTab SCAN FOR IDParent = m.tnParentID Потому что она не имеет потомков... В принципе-такой вариант задачи тоже возможен, вообще, при выдаче отчета. ВладимирМ Это тоже можно предусмотреть все в той же процедуре входа в рекурсию CreateCursor. После того, как убедились, что узел существует проверить факт наличия дочерних узлов. Это уже сделано в рекурсивной функции (ветка по INDEXSEEK()). Аналогичную ветку надо добавить и в CreateCursor Мне думается не все так просто, после 4 часовых изысканий по этому вопросу Без изменения рекурсивной процедуры наверно не обойтись. Я тупо по Вашему наставлению пытаюсь изменить CreateCursor и ничего не получается: 1)Сразу добавить записи Код: plaintext 1. 2. 3. 4. добаляет запись продукта в самом конце цикла работы с одной записью 2)Перемещаю указатель записи на родителя и захожу в рекурсию Код: plaintext 1. 2. 3. 4. 5. 6. 7. ВладимирМ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 14:13 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Студент ДимаВообще, в принципе, записи и так правильнго размещены по индексу idParent. Нет. Опираться на значение поля idParent нельзя. То, что в данном случае нужный порядок следования совпадает с порядком возрастания значения в поле idParent - это просто совпадение. Случайность. В общем случае, использовать значение ключевых полей для сортировки (упорядочивания) записей недопустимо. Например, возможна такая структура 2 0 1 2 3 1 Т.е. коды самих узлов - это 2 - 1 - 3, если их выстроить по возрастанию кода родителя, то получим совершенно другую структуру - 2 - 3 - 1 Студент ДимаКак бы Вы создали структуру?? Это зависит от конкретной постановки задачи. В общем случае, во-первых, разделяют список категорий и список позиций на 2 отдельные таблицы. Во-вторых, древовидная структура списка категорий дополняется избыточными (с точки зрения нормализации) полями, которые позволяют более простым способом извлекать нужную информацию. Какими именно полями? Способов достаточно много. Например: Иерархические структуры, не требующие сопровождения Моделирование иерархических объектов Дерево - специальный вид направленного графа Студент Димаесли передать сразу концевую ветвь, то курсор возвращается пустой ... Мне думается не все так просто, после 4 часовых изысканий по этому вопросу Все просто. В этом случае ВООБЩЕ НЕ НАДО запускать рекурсию. Т.е. в запускающей процедуре CreateCursor проверяешь факт отстутстви дочерних узлов, создаешь фиктивную запись и все! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Условие OR m.lnBaseID = 0 - это как раз на случай построения всего списка. Такой записи не существует и указатель записи просто перейдет на фиктивную запись в состояние EOF()=.T., а у этой записи все значения пустые. Нули или пустые строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 15:25 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Да, переписка принимает угрожающие размеры Благодарен Вам Владимир ВладимирМ Студент ДимаВообще, в принципе, записи и так правильнго размещены по индексу idParent. Нет. Опираться на значение поля idParent нельзя. То, что в данном случае нужный порядок следования совпадает с порядком возрастания значения в поле idParent - это просто совпадение. Случайность. В общем случае, использовать значение ключевых полей для сортировки (упорядочивания) записей недопустимо. Например, возможна такая структура 2 0 1 2 3 1 Т.е. коды самих узлов - это 2 - 1 - 3, если их выстроить по возрастанию кода родителя, то получим совершенно другую структуру - 2 - 3 - 1 Да это точно, недодумался. ВладимирМ Студент ДимаКак бы Вы создали структуру?? Это зависит от конкретной постановки задачи. В общем случае, во-первых, разделяют список категорий и список позиций на 2 отдельные таблицы. Во-вторых, древовидная структура списка категорий дополняется избыточными (с точки зрения нормализации) полями, которые позволяют более простым способом извлекать нужную информацию. Какими именно полями? Способов достаточно много. Например: Иерархические структуры, не требующие сопровождения Моделирование иерархических объектов Дерево - специальный вид направленного графа Вот это хорошо, почитаем. [quot ВладимирМ] Все просто. В этом случае ВООБЩЕ НЕ НАДО запускать рекурсию. Т.е. в запускающей процедуре CreateCursor проверяешь факт отстутстви дочерних узлов, создаешь фиктивную запись и все! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. IF FOUND() = .T. OR m.lnBaseID = 0 IF Indexseek(MyTab.IDprod,.F.,"MyTab","IDParent") = .F. * У категории НЕТ дочерних записей. Создаю запись. * Название и признак группировки для отчета INSERT INTO curReport (IDprod, IDParent, ProdName, IsProd, Opisanie, nGroupID, FullName ) ; VALUES (MyTab.IDprod, MyTab.IDParent, MyTab.ProdName, MyTab.IsProd, MyTab.Opisanie, 0, 'Иерархия') ELSE * Запуск рекурсии DO LoadNode WITH MyTab.IDprod, 0, Alltrim(MyTab.ProdName) ENDIF ENDIF [/src]Да этого варианта я сам дошел к истечению 1 часа разбора работы Ваших процедур в дюбаггере. А дальше, Вы Владимир, похоже ошиблись :-) Но!!! Нам же нужна иерархия до самого вернего уровня!!! Простое заполнение поля curReport.FullName не соответсвует условиям задачи. Видимо придется делать отдельную процедуру, которая будет собирать полный путь иерархии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 15:48 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Студент ДимаА дальше, Вы Владимир, похоже ошиблись :-) Но!!! Нам же нужна иерархия до самого вернего уровня!!! Простое заполнение поля curReport.FullName не соответсвует условиям задачи. А попробовать запустить после этих исправлений? Код: plaintext 1. 2. 3. Посмотрите, что получится. Как раз-таки полный список. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 17:24 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Студент ДимаА дальше, Вы Владимир, похоже ошиблись :-) Но!!! Нам же нужна иерархия до самого вернего уровня!!! Простое заполнение поля curReport.FullName не соответсвует условиям задачи. А попробовать запустить после этих исправлений? Код: plaintext 1. 2. 3. Посмотрите, что получится. Как раз-таки полный список. Владимир, а как раз имел ввиду о CreateCursor(11) Ну например выдать иерархию по продукту-одному! Задача разумная, в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 17:58 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
Ну, и ...? Все работает. Для случая CreateCursor(11) выдаст одну пустую запись, поскольку для данной группы нет ни одного продукта. Не надо самому себе придумывать приключений! А вот если пользователь захочет... Захочет - сделаем. Сейчас ведь сама структура данных сильно кривая. Если я еще на каждый возможный "чих" что-то там буду доделывать я никогда ничего не закончу. Нужна конкретная постановка задачи. Тогда имеет смысл что-то дальше обсуждать... Ведь можно продолжить варианты и дальше: а если группа одновременно является продуктом? А если один продукт принадлежит нескольким группам? А если... Я так долго могу продолжать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 20:01 |
|
||
|
Отчет
|
|||
|---|---|---|---|
|
#18+
ВладимирМНу, и ...? Все работает. Для случая CreateCursor(11) выдаст одну пустую запись, поскольку для данной группы нет ни одного продукта. Не надо самому себе придумывать приключений! А вот если пользователь захочет... Захочет - сделаем. Сейчас ведь сама структура данных сильно кривая. Если я еще на каждый возможный "чих" что-то там буду доделывать я никогда ничего не закончу. Нужна конкретная постановка задачи. Тогда имеет смысл что-то дальше обсуждать... Ведь можно продолжить варианты и дальше: а если группа одновременно является продуктом? А если один продукт принадлежит нескольким группам? А если... Я так долго могу продолжать Ну да, пора остановиться ) Владимир, Вы мне очень помогли, большое спасибо Буду обращаться :-))) А то мне сильно понравились Ваши объяснения :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2006, 20:12 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=255&tid=1591590]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 291ms |

| 0 / 0 |
