Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Скрыть пустые колонки после выполнения процедуры / 22 сообщений из 22, страница 1 из 1
10.10.2012, 18:40
    #37992391
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Есть макрос, который вызывает ХПР. Процедура возвращает таблицу значений, многие из колонок которой пустые. Как их скрыть сразу после выполнения процедуры?
...
Рейтинг: 0 / 0
10.10.2012, 18:50
    #37992410
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Вообще-то про телепатию написано в правилах. ))

Предположительно это эксель, но все же надо пояснить, а так же указать, как именно формируется таблица значений (привести фрагмент кода)
...
Рейтинг: 0 / 0
10.10.2012, 19:52
    #37992476
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Грамотно написать Селект, и дело в шляпе.
...
Рейтинг: 0 / 0
10.10.2012, 21:44
    #37992602
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Теперь в деталях:
MS Excel 2010. Макрос берет переменную (имя человека) -> передает ее в процедуру -> процедура возвращает все записи, созданные юзером. В каждой записи процентов 90% колонок пустые (регистрируются ошибки по кодам).

Т.к. выводится весь список записей, через какое-то время все колонки будут задействованы.

Желаемый макрос должен срабатывать по кнопке (желатеьно по той же, что и процедура).

VladConnГрамотно написать Селект, и дело в шляпе.

а можно поподробней?
...
Рейтинг: 0 / 0
11.10.2012, 09:25
    #37993019
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessVladConnГрамотно написать Селект, и дело в шляпе.

а можно поподробней?ХП редактировать можно?
Просто не возвращать колонки (правильнее в данном случае называть их полями), в которых нет данных.
...
Рейтинг: 0 / 0
11.10.2012, 10:13
    #37993088
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Я думала об этом варианте, но в таблице, откуда берутся значения, около 200 полей (столбцов) и перечислять их все через

Код: sql
1.
where blabla is not null



не совсем удобно.
...
Рейтинг: 0 / 0
11.10.2012, 11:18
    #37993256
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
where blabla тут никак не поможет, ибо это отбор записей, а не столбцов.

вообще, если у вас такое количество незначащих столбцов, скорее всего неверно спроектирована база, из-за чего теперь вы расплачиваетесь проблемами программирования, ну да ладно.

скорее всего тут решалось бы все созданием динамического запроса типа
Код: sql
1.
2.
3.
4.
5.
declare @k nvarchar(max)
set @k=N'select '
--далее цикл, который добавляет поля в зависимости от наличия данных
set @k=@k+N' from Таблица where ....'
exec (@k)
...
Рейтинг: 0 / 0
11.10.2012, 13:04
    #37993563
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
База собирает сведения об ошибках, которые все идут под разными кодами. Поэтому абсолютно все колонки нужны, ибо записи изменяются во временем.

По поводу запроса не совсем понятно.
...
Рейтинг: 0 / 0
11.10.2012, 13:11
    #37993581
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessБаза собирает сведения об ошибках, которые все идут под разными кодами.medea_blessПоэтому абсолютно все колонки нужнынет тут причинно-следственно связи. Можно писать все в одну таблицу - распределяя по записям, а не по полям. То есть не
абоненткод1код2код3абонент1значениезначениезначениеабонент2значениезначениезначениеабонент2значениезначениезначениеа
абоненткодзначениеабонент1код1значениеабонент1код2значениеабонент1код3значениеабонент2код1значениеабонент3код1значениеабонент3код3значение
...
Рейтинг: 0 / 0
11.10.2012, 13:12
    #37993582
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessПо поводу запроса не совсем понятно.ну так ведь и подробностей нет
...
Рейтинг: 0 / 0
11.10.2012, 13:23
    #37993608
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
авторМожно писать все в одну таблицу - распределяя по записям, а не по полям

нельзя.

Итак начнем сначала. Есть 2 Infopath формы, которые передают информацию в базу. Для короткой справки: Infopath работает только с уже созданными полями SQL. Незаполненным полям присваивается значение NULL.

С этих 2 форм в Excel генерируются отчеты по заданным условиям. Например, для данного пользователя посчитать сумму всех ошибок по кодам/типам, общую сумму ошибок; количество листов чертежа с ошибкой данного типа/кода, среднее количество ошибок на лист и т.д.

Т.к. полей очень много (около 214) и убрать их нельзя (форма не будет работать если поле не создано в базе), некоторые из них пустые. Вот их по запросу выводить не нужно.

Схема работы отчета:
1. выбирается пользователь (с таблиц, привязанных к формам)
2. кликается на кнопку "получить отчет" (подвязана к макросу, вызывающему ХРП)
3. подгружается отчет со всеми записями. Для удобства чтения хотелось бы пустые колонки скрыть.
...
Рейтинг: 0 / 0
11.10.2012, 13:31
    #37993627
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessС этих 2 форм в Excel генерируются отчеты по заданным условиям. Например, для данного пользователя посчитать сумму всех ошибок по кодам/типам, общую сумму ошибок; количество листов чертежа с ошибкой данного типа/кода, среднее количество ошибок на лист и т.д.А почему бы эти отчеты не генерировать прям в процедуре на сервере? Это гораздо логичнее, в сто раз быстрее и меньше данных передавать
...
Рейтинг: 0 / 0
11.10.2012, 13:32
    #37993628
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Отчет там и генерируется. Со всеми полями (колонками), которые и выводятся пустыми. Вот их в Excel быть не должно.
...
Рейтинг: 0 / 0
11.10.2012, 13:36
    #37993640
QValD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessавторМожно писать все в одну таблицу - распределяя по записям, а не по полям

нельзя.

Итак начнем сначала. Есть 2 Infopath формы, которые передают информацию в базу. Для короткой справки: Infopath работает только с уже созданными полями SQL. Незаполненным полям присваивается значение NULL.

С этих 2 форм в Excel генерируются отчеты по заданным условиям. Например, для данного пользователя посчитать сумму всех ошибок по кодам/типам, общую сумму ошибок; количество листов чертежа с ошибкой данного типа/кода, среднее количество ошибок на лист и т.д.

Т.к. полей очень много (около 214) и убрать их нельзя (форма не будет работать если поле не создано в базе), некоторые из них пустые. Вот их по запросу выводить не нужно.

Схема работы отчета:
1. выбирается пользователь (с таблиц, привязанных к формам)
2. кликается на кнопку "получить отчет" (подвязана к макросу, вызывающему ХРП)
3. подгружается отчет со всеми записями. Для удобства чтения хотелось бы пустые колонки скрыть.
Ну так пройдитесь по колонкам с
Код: vbnet
1.
range.EntireColumn.Hidden = True


В чем проблема то?

Шокеру +1. Весь процесс явно криво настроен.
...
Рейтинг: 0 / 0
11.10.2012, 13:55
    #37993700
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Код: vbnet
1.
Шокеру +1. Весь процесс явно криво настроен.



Найдете вариант, как лучше как передавать инфу с Infopath напрямую в SQL базу - дайте знать. А то все горазд комментить, но особо понимая "всю гру свитла та тини"

По макросу:

Код: vbnet
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.
Sub HideEmptyColumns()
Dim r As Range
Dim nLastRow As Long
Dim nLastColumn As Integer
Dim i As Integer
Dim HideIt As Boolean
Dim j As Long

Columns.EntireColumn.Hidden = False
Set r = ActiveSheet.UsedRange
nLastRow = r.Rows.Count + r.Row - 1
nLastColumn = r.Columns.Count + r.Column - 1

For i = 1 To nLastColumn
HideIt = True
For j = 7 To nLastRow
If Cells(j, i).Value <> "" Then
HideIt = False
End If
Next
If HideIt = True Then
Columns(i).EntireColumn.Hidden = True
End If
Next
ActiveWorkbook.Connections("s-epm ErrorReports ExtendedByUser").Refresh
End Sub



Первый раз скрывает все верно, но после выбора отчета по следующему исполнителю информация не апдейтится т.е. перечень колонок остается от прежнего пользователя. Есть ли возможность при каждом клике на кнопку сначала все показать, а потом уже скрывать в зависимости от заполненной инфы? Мой вариант не прошел.
...
Рейтинг: 0 / 0
11.10.2012, 14:48
    #37993822
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessОтчет там и генерируется. Со всеми полями (колонками), которые и выводятся пустыми.medea_blessС этих 2 форм в Excel генерируются отчеты по заданным условиям.На сервере генерируется не отчет, как я понимаю, а просто сырые данные, которые передаются в эксель. Отчеты генерируются в экселе, судя по вашим же словам.
Я предлагаю генерировать ЭТИ отчеты прямо на сервере. "Например, для данного пользователя посчитать сумму всех ошибок по кодам"

Впрочем - да, я углубился, в правильность архитектуры, чем в реальную помощь вам

medea_blessЕсть ли возможность при каждом клике на кнопку сначала все показать, а потом уже скрывать в зависимости от заполненной инфы?
Почему бы это не делать сразу в цикле:
вместо:
Код: vbnet
1.
2.
3.
If HideIt = True Then
Columns(i).EntireColumn.Hidden = True
End If


сделать
Код: vbnet
1.
Columns(i).EntireColumn.Hidden = HideIt
...
Рейтинг: 0 / 0
11.10.2012, 15:29
    #37993933
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Отчет генерируется на сервере, т.е. все суммы уже посчитаны, а процедура просто вытягивает инфу со view. Но пустые столбцы все равно есть: например пользователь Иванов не сделал ни одной ошибки типа 1.1.1.1 т.е. количество ошибок данного типа - 0. Зато сделал ошибку 1.1.1.2. Но вью содержит инфу по всем пользователям, а не только по Иванову и в Excel передается полный перечень полей.

Что касается макроса, то проблема не решена.
...
Рейтинг: 0 / 0
11.10.2012, 15:33
    #37993949
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
medea_blessЧто касается макроса, то проблема не решена.можно еще раз полный текст с изменениями.

ЗЫ: после HideIt = False очень логично разместить Exit For, ибо зачем мучать столбец дальше, если уже все ясно
...
Рейтинг: 0 / 0
11.10.2012, 15:34
    #37993955
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
А вообще, что значит "не прошел"? Ошибку выдает? Скрывает все столбцы? Не скрывает ни одного столбца?
...
Рейтинг: 0 / 0
11.10.2012, 17:09
    #37994157
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
как-то поправила, но срабатывает только по повторному нажатию на кнопку. + я поместила его в макрос вызова процедуры и теперь при загрузке Excel выглядит страшновато :)

Собственно код:

Код: vbnet
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.
Sub GetReport()
    With ActiveWorkbook.Connections("s-epm ErrorReports ExtendedByUser").OLEDBConnection
        .CommandText = "EXECUTE dbo.GetReportByUserName '" & Range("A2").Value & "'"
    End With
    
ActiveWorkbook.Connections("s-epm ErrorReports ExtendedByUser").Refresh
    
Dim r As Range
Dim nLastRow As Long
Dim nLastColumn As Integer
Dim i As Integer
Dim HideIt As Boolean
Dim j As Long

Set r = ActiveSheet.UsedRange
nLastRow = r.Rows.Count + r.Row - 1
nLastColumn = r.Columns.Count + r.Column - 1

For i = 1 To nLastColumn
Columns(i).EntireColumn.Hidden = True
For j = 7 To nLastRow
If Cells(j, i).Value <> "" Then
Columns(i).EntireColumn.Hidden = False
End If
Next
Next

End Sub
...
Рейтинг: 0 / 0
11.10.2012, 17:17
    #37994172
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
Ой, ну зачем же столбец сто раз туда-сюда дергать в цикле?
Я же по другому предлагал
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
For i = 1 To nLastColumn
  HideIt = True
  For j = 7 To nLastRow
    If Cells(j, i).Value <> "" Then
      HideIt = False
      Exit For
    End If
  Next
  Columns(i).EntireColumn.Hidden = HideIt
Next
...
Рейтинг: 0 / 0
11.10.2012, 17:20
    #37994181
medea_bless
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скрыть пустые колонки после выполнения процедуры
эффект тот же - срабатывает со второго раза
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Скрыть пустые колонки после выполнения процедуры / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]