метод простой METHOD nColCount() INLINE Len( ::aColumns )
А почему он сначала выдает 18 ? У меня 11 колонок в таблице.
Кажется, я понял почему у меня 18 столбцов сначала выдаёт ! Я же таблицу пере создаю на основе готовой:
oBrw1:DeleteRow( .T. ) // Delete All oBrw1:aArray:={} // очистить массив
Первоначально таблица была из 18 столбцов. Т.е. этот параметр нужно тоже где-то переопределять в исходниках h_tbrowse.prg Григорий посмотри пожалуйста, где его нужно переопределить до выхода новой версии !
Отправлено: 07.01.18 23:21. Заголовок: Andrey пишет: Я же ..
Andrey пишет:
цитата:
Я же таблицу пере создаю на основе готовой: oBrw1:DeleteRow( .T. ) // Delete All oBrw1:aArray:={} // очистить массив
Не надо ничего переопределять в новой версии , надо пересоздавать таблицу ( как бы это сказать ... по литературно ) ... творчески от того что ты в бровсе убил все строки и массив данных, количество колонок в нем не изменится. Андрюха, тебя уже пятый год посылают исходники глянуть, хотя бы ознакомительно .
в следующий раз так переопределишь таблицу по DBF и будешь удивляться кто тебе базу грохнул
Haz
администратор
Пост N: 1157
Зарегистрирован: 20.02.11
Отправлено: 08.01.18 00:04. Заголовок: Чуть дополню Andre..
Чуть дополню
Andrey пишет:
цитата:
oBrw1:DeleteRow( .T. ) // Delete All oBrw1:aArray:={} // очистить массив
ну во первых ::DeleteRow(.T.) для бровса по массиву сам делает ::aArray := {} т.е. вторая строка бессмысленна. во вторых ::DeleteRow(.T.) при бровсе по массиву проверяет длину этого массива и если она нулевая восстанавливает пустую строку ::aArray := { AClone( ::aDefValue ) } ( это чтоб не было ошибки времени исполнения при доступе к массиву по индексу ).
всякие ::aArray := {} как недокументированные инструменты бровса желательно использовать когда есть понимание как это работает, для остальных есть только методы класса. К слову сказать ::DelColumn() и тот не трогает ::aArray, так как считает это источником данных ( иначе при бровсе по базе надо было бы в базе удалять поле ... ). ну и ради чего я это написал , ради следующего предложения Перед использованием любого метода желательно влезть в исходники и посмотреть что этот метод делает , а перед использованием недокументированных возможностей в исходники лезть обязательно. Тем более, что скорее всего какая то часть кода выльется в пример для новичков. Новичкам будет крайне неприята потеря данных из-за копирования стиля из примера.
Andrey
постоянный участник
Пост N: 5684
Зарегистрирован: 12.09.06
Отправлено: 08.01.18 01:16. Заголовок: Haz пишет: ну во пе..
Haz пишет:
цитата:
ну во первых ::DeleteRow(.T.) для бровса по массиву сам делает ::aArray := {} т.е. вторая строка бессмысленна.
Не согласен с этим. Сам налетел на эти грабли. Если делаешь перечитку массива без удаления/создания нового, таблица добавляется, т.е. старые элементы остаются. Григорий предложил oBrw1:aArray:={} // очистить массив и добавление прекратилось. Если не веришь, то могу пример сделать и показать как это происходит.
Haz пишет:
цитата:
во вторых ::DeleteRow(.T.) при бровсе по массиву проверяет длину этого массива и если она нулевая восстанавливает пустую строку ::aArray := { AClone( ::aDefValue ) } ( это чтоб не было ошибки времени исполнения при доступе к массиву по индексу ).
Да это есть такое. Все пытался убрать это при перечитывании массива. В исходнике увидел и понял, что первую строчку не удалить.
А всё таки после перечитки массива, oBrw:nColCount() на первом шаге возвращает 18 колонок (из старого массива), а потом нормально показывает 11. Вот листинг:
Отправлено: 08.01.18 02:01. Заголовок: Andrey пишет: Если ..
Andrey пишет:
цитата:
Если не веришь, то могу пример сделать и показать как это происходит
Я тебе верю. Но в исходнике метода написано ::aArray := {} при ::DeleteRow(.T.) и исходникам я тоже верю. Так же верю что в случае с DBF ::DeleteRow() вызывает dbDelete() со всеми вытекающими. По этому, для переопределения бровса этот метод слишком рискован, надо понимать что он делает. Сам подход в снаряду не верен. Как ранее писал Сергей, самое простое это релизннуть бровс и создать новый. Но раз легкие пути не для нас, то начинать надо с изучения что делает с бровсом :: SetArray (), как устанавливаются при этом внутренние переменные, как назначаются ::nLen, ::aColumns, ::aDefValues. В случае с DBF ::cAlias, ::bLogicPos и ещё куча всего. Только после этого все корректно переопределять. Рубить сразу ::aArray := {}, а остальное само рассосётся это костыли, которые всегда ломаются в самый нужный момент. Это и есть причина твоих 18. По параметрам в MyColorTsb() вижу что ты изучил таки тему и понял что их в nClrBack должно быть три и разобраться какие. Значит не зря. Шахматку мог бы и не постить, понимая что за параметры ждёт блок, задача уже решена. Если хочешь сделать действительно стоящий пример, то избавься от костылей. К сожалению с телефона я тебе помочь не могу. После праздников выйду на работу, гляну на компе. Но уверен ты и сам справишся
Andrey
постоянный участник
Пост N: 5685
Зарегистрирован: 12.09.06
Отправлено: 08.01.18 02:13. Заголовок: Haz пишет: По парам..
Haz пишет:
цитата:
По параметрам в MyColorTsb() вижу что ты изучил таки тему и понял что их в nClrBack должно быть три и разобраться какие. Значит не зря. Шахматку мог бы и не постить
Параметры понял, не понял почему nColCount := oBrw:nColCount() , а дальше пошла у меня фигня от этого... Шахматку, сознаюсь не одолел - Сергей помог. Я там такой алгоритм фиговый писал, а обошлось всего 2 доп.IF
Haz пишет:
цитата:
самое простое это релизннуть бровс и создать новый.
Да это я понял. Но пример насчёт этого всё равно сделаю, уже придумал какой.
Haz
администратор
Пост N: 1159
Зарегистрирован: 20.02.11
Отправлено: 08.01.18 15:16. Заголовок: Andrey пишет: е пон..
Andrey пишет:
цитата:
е понял почему nColCount := oBrw:nColCount() , а дальше пошла у меня фигня
Затрахался на смарте пример набирать. Не проверял разумеется. Взял за основу тест Григория. В примере тупо подмена массива в бровсе. При простом переприсвоении ::aArray был бы вылет по типам данных. Здесь надеюсь все работает.
#include "minigui.ch" #include "tsbrowse.ch"
Procedure Main ()
Public oBrw1 Public aDatos_origen
DEFINE WINDOW Form1 ; AT 0,0 ; WIDTH 640 ; HEIGHT 480 ; TITLE "TsBrowse Array Test" ; MAIN ; FONT 'Tahoma' SIZE 9; ON INIT Sample1() END WINDOW
Haz СПАСИБО ! Я глянул пример, пытался подключить свою ситуацию, не получилось. Не так ты делаешь, в смысле ты правильно делаешь, а мой подход к снаряду отличается от твоего. Буду свой пример делать, только не просто так, а жизненный, по работе. Доделаю только ещё другой и займусь.
Andrey
постоянный участник
Пост N: 5693
Зарегистрирован: 12.09.06
Отправлено: 12.01.18 16:00. Заголовок: В SetArrayTo() делаю..
В SetArrayTo() делаю экспорт в Excel через &oBrw:Excel2(...) Символьные поля в Экселе появляются нормально, а цифирь нет. Как так ? Или что-то с форматом цифр не то ?
Блин... Опять те же Нашёл свой комментарий в MiniGUI\SAMPLES\Advanced\Tsb_config2
//IF aPole[nI,6] <> "N" // не использовать шаблон для числовых полей, т.к. // при печати в Excel поле будет пустое !!! // oBrw:aColumns[nJ]:cPicture := aPole[nI,4] // шаблон колонки //ENDIF
И как тогда делать ?
Haz
администратор
Пост N: 1160
Зарегистрирован: 20.02.11
Отправлено: 13.01.18 13:10. Заголовок: Andrey пишет: И как..
Andrey пишет:
цитата:
И как тогда делать
Не пользоваться :Excel2() Метод хоть и интересный по скорости, но на деле на короткой выгрузке теряет все преимущества. Как альтернатива можно использовать как минимум 5 способoв 1. Это просто OLE. Из минусов только скорость выгрузки. Остальные способы соизмеримы по скорости с :Excel2() 2. Тот же OLE с использованием вариантного массива 3. Выгружать через ADO 4. Писать сразу в xml формат ( Excel его прекрасно понимает) 5. Испльзовать специальную библиотеку ( есть здесь на форуме ссылка)
Отправлено: 13.01.18 13:42. Заголовок: Пока обошёлся так (е..
Пока обошёлся так (если кому интересно): При построении массива для SetArrayTo()
FOR nI := 1 To oBrw:nColCount() .... IF ValType(Eval(oBrw:aColumns[ nI ]:bData)) == "N" oBrw:aColumns[ nI ]:cDataType := 'N' // не использовать шаблон для числовых полей, oBrw:aColumns[ nI ]:cPicture := '' // т.к. при экспорте в Excel поле будет пустое !!! ELSE oBrw:aColumns[ nI ]:cPicture := aPict[ nI ] ENDIF ....
Работает отлично !
Блин, а нельзя из Fivewin тиснуть экспорт в Эксель и прикрутить к МиниГуи ?
SergKis
постоянный участник
Пост N: 1706
Зарегистрирован: 17.02.12
Отправлено: 13.01.18 13:50. Заголовок: Haz пишет Не пользов..
Haz пишет
цитата:
Не пользоваться :Excel2()
Если метод есть, надо что бы работал или убирать. Предложение, что бы работал Excel2 такие (в моей версии работает)
For i := 1 To nCntCols oCol := ::aColumns[ i ] aFntLine[ i ] := oCol:hFont aFntHead[ i ] := oCol:hFontHead aFntFoot[ i ] := oCol:hFontFoot If HB_ISBLOCK(oCol:hFont) oCol:hFont := hFont EndIf If HB_ISBLOCK(oCol:hFontHead) oCol:hFontHead := hFont EndIf If HB_ISBLOCK(oCol:hFontFoot) oCol:hFontFoot := hFont EndIf Next
Сергей, метод работает. Я о том что просто не пользуюсь им. т. к бровс у меня всегда по базе, то выгружаю из базы а не из бровс объекта. Для прямой выгрузки идеально подходит ADO, и быстро и с названием колонок русскими словами. Для отчёта в Excel Оля с вариантным массивам и быстро и красоту навести можно.
Andrey
постоянный участник
Пост N: 5696
Зарегистрирован: 12.09.06
Отправлено: 13.01.18 14:17. Заголовок: Haz пишет: Для отчё..
Haz пишет:
цитата:
Для отчёта в Excel Оля с вариантным массивам и быстро и красоту навести можно.
Что то я сомневаюсь что быстро написать можно... Быстро не у всех получается.
Может класс такой в исходники добавить можно ? Это было бы хорошее подспорье для всех. Как правило отчёты бывают небольшие через SetArrayTo(), Оля с ними быстро справиться.
Все даты в формате GMT
3 час. Хитов сегодня: 223
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет