Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка по годам в отчете Access 2000
 
 автор: Zheka100   (03.04.2012 в 13:20)   личное сообщение
 
 

Подскажите, кто знает как реализовать задачу.

На отчете отображаются четыре карточки с данными. Данные сортируются по датам, в том числе по годам. Соответственно, сортировка карточек идет по годам по возрастанию. Карточки будут разрезаться на четыре. Вопрос в том, как сделать так, чтобы при печати (и на экране) года шли соответственно - на лицевой стороне один год, на противоположной следующий год. В обычном виде сейчас года идут по возрастающей, т.е. 2006, 2007, 2008 и т.д. У каждой записи год начинается по-разному, где-то с четного года, где-то с нечетного.

Буду благодарен за идею.

  Ответить  
 
 автор: snipe   (03.04.2012 в 13:52)   личное сообщение
 
 

хотелось бы хотелки увидеть в чем-то материальном
в шаблоне каком-то

а -то как-то непонятно
чего четные, а чего не четные, куда по четыре и где по возрастающей

предложение подкупающее своей простотой
сделать пример простенький, выложить и пальцем показать что хотите
(лучше в Аксе 2003)

  Ответить  
 
 автор: Zheka100   (03.04.2012 в 14:33)   личное сообщение
 
 

ОК, сделаю...примерчик.

  Ответить  
 
 автор: kot_k_k   (03.04.2012 в 14:43)   личное сообщение
 
 

Примерчик Иван Сидорович - сильно обиделся на Жеку100.

  Ответить  
 
 автор: zheka100   (03.04.2012 в 18:53)   личное сообщение
 
 

Простите, не успел подготовить...
Упростил пример. Надеюсь будет понятно.

http://zalil.ru/33008392

  Ответить  
 
 автор: shanemac51   (03.04.2012 в 21:50)   личное сообщение
 
 

похоже
иванов 10-11-12
петров 11-12
сидоров 10-11-12

должны дать
лицевая- оборотка
---------------------
и10-п11- п12-и11
и12-с11- с12-ххх
---------------------
с12-ххх- ххх-ххх
ххх-ххх- ххх-ххх
---------------------

или
и10-и12 ххх-и11
с11-п10 п11-с12
----------------------
п12-ххх ххх-ххх
ххх-ххх ххх-ххх

  Ответить  
 
 автор: Zheka100   (03.04.2012 в 21:58)   личное сообщение
 
 

Извините, не совсем разобрался...

  Ответить  
 
 автор: shanemac51   (03.04.2012 в 22:04)   личное сообщение
 
 

похоже для
иванов 2010-2011-2012 года
петров 11-12
сидоров 10-11-12

должны дать
лицевая- оборотка
---------------------
и2010-п2011- п2012-и2011
и12-с11- с12-ххх
---------------------
с12-ххх- ххх-ххх
ххх-ххх- ххх-ххх
---------------------

  Ответить  
 
 автор: kot_k_k   (04.04.2012 в 09:29)   личное сообщение
 
 

надо говорить о том что мы используем ДВУХстороннюю печать - в противном случае вся эта возня не имеет никакого смысла.

нужно придумать функцию "лапками" проставлять требуемую сортировку. т.к. она не стандартная первые четыре нечетные года, затем первые 4 четные года - или наоборот (хотя это не суть важно).

проще печатать в 2 столбца "с лева на право"
получаем
2005 - 2006
2007 - 2008
- сгибать страницу пополам, склеивать и разрезать.

п.с. про функцию надо подумать

  Ответить  
 
 автор: Zheka100   (04.04.2012 в 09:47)   личное сообщение
 
 

Да, действительно двусторонняя печать. Но можно ли придумать функцию, например, было бы скрытое дополнительное поле "Год1", который бы отличался от реального года и по нему же была бы сортировка? Никак не придет в голову - как именно сделать... А склеивать - это не вариант, если можно было бы что-то нормальное изобрести.

Кстати, еще есть условие, что ряд карточек чаще всего будет печататься на одного человека, данные в запрос будут через форму. Поэтому не хотелось бы совмещать на одном листе еще и других сотрудников, Петрова и Сидорова, а только Иванова.

  Ответить  
 
 автор: kot_k_k   (04.04.2012 в 10:06)   личное сообщение
 
 

должно работать
1. в глобальную переменную загоняем ГОД (первой записи)
2. пишем фукцию куда отправляем текущий год записи =Функция(Год)
3. сама функция


   Год_ГЛ - наш первый год от которого танцуем (глобальная переменная )

    А = Год  -  Год_ГЛ
    Б= целая часть (А/8)
    В= А - 8 * Б
    вот тут нужно проверку на четность числа В
     если четное то Г = В / 2 + 1
     если не четное то 
         select case B
              case 1
                        Г = 5
              case 3
                        Г = 6
              case 5
                        Г = 7
              case 7
                        Г = 8
    end select
    Д = Г + Б * 8 



Д это и ест наш номер по порядку (нашему порядку) - эту функцию нужно вставить в запрос отчета и по ней сортировать.

select tabla.* , Функция([tabla.GOD]) As Nomer_po_Porjadku From Tabla.

  Ответить  
 
 автор: kot_k_k   (04.04.2012 в 10:14)   личное сообщение
22 Кб.
 
 

вот посмотри в екселе сваял - до акса руки не доходят сорь.

  Ответить  
 
 автор: Zheka100   (04.04.2012 в 10:15)   личное сообщение
 
 

Спасибо, буду пробовать.

  Ответить  
 
 автор: Zheka100   (06.04.2012 в 12:59)   личное сообщение
 
 

kot_k_k, я сваял как мог аксесовский код, что-то получается что-то нет. Не пойму как можно загнать в переменные значения годов. Ты писал:
1. в глобальную переменную загоняем ГОД (первой записи)
2. пишем фукцию куда отправляем текущий год записи =Функция(Год)
3. сама функция

Вот мой код:
Public Function E(ByVal Value As Integer)
Dim A, C As Integer, D, Year, YearM, B As Integer

Year = 2005 'как сюда загонять значения годов?
YearM = 2005 'как сюда загнать первый год от которого танцуем?
A = Year - YearM
B = Int(A / 8)
C = A - 8 * B

'проверка четности числа С
'If chek(C) Then
' MsgBox "четное"
' Else
' MsgBox "нечетное"
' End If
If chek(C) = True Then
D = C / 2 + 1
Else
Select Case C
Case 1
D = 7
Case 3
D = 8
Case 5
D = 5
Case 7
D = 6
End Select
End If
E = D + B * 8
End Function

'проверка на четность
Private Function chek(C As Integer) As Boolean
If (C / 2 - Fix(C / 2)) Then
chek = False
Else
chek = True
End If
End Function

  Ответить  
 
 автор: kot_k_k   (06.04.2012 в 13:12)   личное сообщение
 
 

перед открытием отчета создаем нечто такое:

Public Global_Kod as Variant

загоняем в глобальную - !!! перед открытием отчета !!!!

Function Zagruzka()
set rst=currentdb.openrecordset(" select * tabla where .... orderby GOD"
Global_Kod = rst!GOD
End Function

функцию вешаем в запрос на основании которого формируется отчет
"select *, Наша_Функция (Tabla.GOD) as Nomer from tabla where ..."

сама функция
Public Function Наша_Функция (ParamArray Ar())

Year=Ar(0)
YearM=Global_Kod

и дальше по тексту
в конце ОБЯЗАТЕЛЬНО

Наша_Функция= D + B * 8

End Function

  Ответить  
 
 автор: Zheka100   (06.04.2012 в 15:44)   личное сообщение
 
 

Почему-то не хочет работать Global_Kod = rst!GOD
Видимо, я все напутал. Конечно, я сделал все по-своему. Может быть можно что-то подправить?
http://zalil.ru/33027313
Посмотри, пожалуйста, отчет testS21.
Буду благодарен.

  Ответить  
 
 автор: kot_k_k   (07.04.2012 в 11:07)   личное сообщение
30 Кб.
 
 

вот лови


п.с. поля и формы/таблицы/отчеты/функции лучше называть латиницей, не использовать пробелы и минуса - уменьшается возможность наступания на грабли

  Ответить  
 
 автор: zheka100   (07.04.2012 в 14:09)   личное сообщение
 
 

Kot_k_k, спасибо тебе большое! конец моим мучениям...

  Ответить  
 
 автор: Zheka100   (07.04.2012 в 18:58)   личное сообщение
 
 

Как можно победить ошибку Run-time error '3061'; Too few parameters. Expected 1? Она возникает из-за того что добавляю условие отбора в поле Фамилия в запрос For_Global. Как можно было бы обойти это? Пробовал и строкой SQL - не получается.

А если не ставить условие отбора в запросе, то вся наша затея превращается в кашу. Рекордсет обращается в неотфильтрованном запросе к первой записи. но эта запись не принадлежит нужному человеку - там все записи в куче. Данные для условия отбора передаю через форму.
'----------------------
Public Global_Kod As Variant
Public GlobalKod As Variant


'загоняем в глобальную

Function Zagruzka()
Dim rst As Recordset
Dim strSQL As String
Dim Year1 As Variant
Set rst = CurrentDb.OpenRecordset("for_global") ' вот тут возникает ошибка:"Слишком мало 'параметров ....."
Global_Kod = Year(rst!Дата)
End Function

  Ответить  
 
 автор: kot_k_k   (09.04.2012 в 13:51)   личное сообщение
 
 


Данные для условия отбора передаю через форму.



вот тут по подробнее - как передаешь?

у тебя ложно стоять в запросе for_global

WHERE (((Table.КодСотрудника)=[Forms]![Форма1]![КодСотрудника]))

где Форма1 - загруженная форма, а возможно у тебя форма закрыта - базу нужно видеть

  Ответить  
 
 автор: zheka100   (09.04.2012 в 19:23)   личное сообщение
 
 

Конечно, в это время у меня форма открыта.
Я проблему решил немного по-другому. В функции Zagruzka() убрал рекордсет и попробовал через DLookup и работает (как ни странно!). И теперь достаточно одного было запроса - теперь не нужен запрос For_Global.
Теперь все работает. Спасибо, что не бросил меня...

  Ответить  
 
 автор: kot_k_k   (04.04.2012 в 10:17)   личное сообщение
 
 


Кстати, еще есть условие, что ряд карточек чаще всего будет печататься на одного человека, данные в запрос будут через форму. Поэтому не хотелось бы совмещать на одном листе еще и других сотрудников, Петрова и Сидорова, а только Иванова.



а в чем тут вопрос в запросе ставишь условие

"select * from tabla where ID_Pipla =" & forms ! МОЯ_ФОРМА ! ID_Pipla

  Ответить  
 
 автор: час   (04.04.2012 в 18:41)   личное сообщение
 
 

а ещё лучше делаем вспомогательну функцу для запроса

public Function   MyFunction () as string
 if nz(МОЯ_ФОРМА ! ID_Pipla) <> "" then
    MyFunction=  МОЯ_ФОРМА ! ID_Pipla
 else
    msgbox "Чё та не то!"
 end if
end Function
===============================================
"select * from tabla where ID_Pipla =" &  MyFunction ()

  Ответить  
 
 автор: zheka100   (04.04.2012 в 18:52)   личное сообщение
 
 

Час, спасибо большое!

  Ответить  
 
 автор: час   (04.04.2012 в 18:54)   личное сообщение
 
 

ага

  Ответить  
 
 автор: kot_k_k   (05.04.2012 в 08:49)   личное сообщение
 
 

вот только запрос будет тупить на больших кол-вах записей - функции его грузят.

  Ответить  
 
 автор: час   (05.04.2012 в 09:35)   личное сообщение
 
 

Мы вроде бы уже разбирали етот вопрос и тогда выяснили, что всё пучком?
==================================================================

  Ответить  
 
 автор: kot_k_k   (05.04.2012 в 10:06)   личное сообщение
 
 

нет не пучком - проще запрос собрать строкой и воткнуть эту строку в RecordSource формы - чем на каждую запись выполнять функцию.

  Ответить  
 
 автор: час   (05.04.2012 в 10:28)   личное сообщение
 
 

Тебе виднее.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList