|
|
|
| Подскажите, кто знает как реализовать задачу.
На отчете отображаются четыре карточки с данными. Данные сортируются по датам, в том числе по годам. Соответственно, сортировка карточек идет по годам по возрастанию. Карточки будут разрезаться на четыре. Вопрос в том, как сделать так, чтобы при печати (и на экране) года шли соответственно - на лицевой стороне один год, на противоположной следующий год. В обычном виде сейчас года идут по возрастающей, т.е. 2006, 2007, 2008 и т.д. У каждой записи год начинается по-разному, где-то с четного года, где-то с нечетного.
Буду благодарен за идею. | |
|
| |
|
|
|
| хотелось бы хотелки увидеть в чем-то материальном
в шаблоне каком-то
а -то как-то непонятно
чего четные, а чего не четные, куда по четыре и где по возрастающей
предложение подкупающее своей простотой
сделать пример простенький, выложить и пальцем показать что хотите
(лучше в Аксе 2003) | |
|
| |
|
|
|
|
| Примерчик Иван Сидорович - сильно обиделся на Жеку100. | |
|
| |
|
|
|
| Простите, не успел подготовить...
Упростил пример. Надеюсь будет понятно.
http://zalil.ru/33008392 | |
|
| |
|
|
|
| похоже
иванов 10-11-12
петров 11-12
сидоров 10-11-12
должны дать
лицевая- оборотка
---------------------
и10-п11- п12-и11
и12-с11- с12-ххх
---------------------
с12-ххх- ххх-ххх
ххх-ххх- ххх-ххх
---------------------
или
и10-и12 ххх-и11
с11-п10 п11-с12
----------------------
п12-ххх ххх-ххх
ххх-ххх ххх-ххх | |
|
| |
|
|
|
| Извините, не совсем разобрался... | |
|
| |
|
|
|
| похоже для
иванов 2010-2011-2012 года
петров 11-12
сидоров 10-11-12
должны дать
лицевая- оборотка
---------------------
и2010-п2011- п2012-и2011
и12-с11- с12-ххх
---------------------
с12-ххх- ххх-ххх
ххх-ххх- ххх-ххх
--------------------- | |
|
| |
|
|
|
| надо говорить о том что мы используем ДВУХстороннюю печать - в противном случае вся эта возня не имеет никакого смысла.
нужно придумать функцию "лапками" проставлять требуемую сортировку. т.к. она не стандартная первые четыре нечетные года, затем первые 4 четные года - или наоборот (хотя это не суть важно).
проще печатать в 2 столбца "с лева на право"
получаем
2005 - 2006
2007 - 2008
- сгибать страницу пополам, склеивать и разрезать.
п.с. про функцию надо подумать | |
|
| |
|
|
|
| Да, действительно двусторонняя печать. Но можно ли придумать функцию, например, было бы скрытое дополнительное поле "Год1", который бы отличался от реального года и по нему же была бы сортировка? Никак не придет в голову - как именно сделать... А склеивать - это не вариант, если можно было бы что-то нормальное изобрести.
Кстати, еще есть условие, что ряд карточек чаще всего будет печататься на одного человека, данные в запрос будут через форму. Поэтому не хотелось бы совмещать на одном листе еще и других сотрудников, Петрова и Сидорова, а только Иванова. | |
|
| |
|
|
|
| должно работать
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. | |
|
| |
|
22 Кб. |
|
| вот посмотри в екселе сваял - до акса руки не доходят сорь. | |
|
| |
|
|
|
|
| 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 | |
|
| |
|
|
|
| перед открытием отчета создаем нечто такое:
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 | |
|
| |
|
|
|
| Почему-то не хочет работать Global_Kod = rst!GOD
Видимо, я все напутал. Конечно, я сделал все по-своему. Может быть можно что-то подправить?
http://zalil.ru/33027313
Посмотри, пожалуйста, отчет testS21.
Буду благодарен. | |
|
| |
|
30 Кб. |
|
| вот лови
п.с. поля и формы/таблицы/отчеты/функции лучше называть латиницей, не использовать пробелы и минуса - уменьшается возможность наступания на грабли | |
|
| |
|
|
|
| Kot_k_k, спасибо тебе большое! конец моим мучениям... | |
|
| |
|
|
|
| Как можно победить ошибку 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 | |
|
| |
|
|
|
|
Данные для условия отбора передаю через форму.
|
вот тут по подробнее - как передаешь?
у тебя ложно стоять в запросе for_global
WHERE (((Table.КодСотрудника)=[Forms]![Форма1]![КодСотрудника]))
где Форма1 - загруженная форма, а возможно у тебя форма закрыта - базу нужно видеть | |
|
| |
|
|
|
| Конечно, в это время у меня форма открыта.
Я проблему решил немного по-другому. В функции Zagruzka() убрал рекордсет и попробовал через DLookup и работает (как ни странно!). И теперь достаточно одного было запроса - теперь не нужен запрос For_Global.
Теперь все работает. Спасибо, что не бросил меня... | |
|
| |
|
|
|
|
Кстати, еще есть условие, что ряд карточек чаще всего будет печататься на одного человека, данные в запрос будут через форму. Поэтому не хотелось бы совмещать на одном листе еще и других сотрудников, Петрова и Сидорова, а только Иванова.
|
а в чем тут вопрос в запросе ставишь условие
"select * from tabla where ID_Pipla =" & forms ! МОЯ_ФОРМА ! ID_Pipla | |
|
| |
|
|
|
| а ещё лучше делаем вспомогательну функцу для запроса
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 ()
|
| |
|
| |
|
|
|
|
| ага | |
|
| |
|
|
|
| вот только запрос будет тупить на больших кол-вах записей - функции его грузят. | |
|
| |
|
|
|
| Мы вроде бы уже разбирали етот вопрос и тогда выяснили, что всё пучком?
================================================================== | |
|
| |
|
|
|
| нет не пучком - проще запрос собрать строкой и воткнуть эту строку в RecordSource формы - чем на каждую запись выполнять функцию. | |
|
| |
|
|
|
| Тебе виднее. | |
|
| |