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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Вывожу данные в Excel
 
 автор: час   (31.03.2009 в 11:06)   личное сообщение
 
 

xl.cells(row, 11).Value = Val((Nz(!Pay_Summa)))
xl.Range(xl.cells(row, 11), xl.cells(row, 11)).SELECT
xl.ActiveCell.NumberFormat = "#,##0.00"


рубли выводятся, а копейки - 00
19,43 = 19,00р.

  Ответить  
 
 автор: Анатолий (Киев)   (31.03.2009 в 13:14)   личное сообщение
 
 

Так у вас значение в ячейке 19,43, а видите 19,00? Или в ячейке уже 19,00?
Думаю - второе. И проблема из-зи десятичного разделителя ",". Функция VAL понимает только ".".
Попробуйте вместо Val((Nz(!Pay_Summa))):
CDbl(Nz(!Pay_Summa,0))
или
IIF(IsNumeric(!Pay_Summa), !Pay_Summa, 0)

PS. А зачем такая конструкция?:
xl.Range(xl.cells(row, 11), xl.cells(row, 11)).SELECT
xl.ActiveCell.NumberFormat = "#,##0.00"
Может так проще?
xl.cells(row, 11).NumberFormat = "#,##0.00"

  Ответить  
 
 автор: час   (31.03.2009 в 13:19)   личное сообщение
 
 

Спасибо!!!!
Помогла Ваша функция CCur(Format([СуммаБезНалогов];"0,00"))
===============================================
PS. А зачем такая конструкция?:
эт я заморочился - сначала кидаю данные, затем выделяю ячейку и задаю ей формат


xl.cells(row, 11).Value = CCur(Format(Nz(!Pay_Summa), "0.00"))

  Ответить  
 
 автор: Анатолий (Киев)   (31.03.2009 в 14:49)   личное сообщение
 
 

CCur(Format(Nz(!Pay_Summa), "0.00"))
И зачем здесь Format?
Когда это я такое предлагал? Хочу видеть...

  Ответить  
 
 автор: час   (31.03.2009 в 16:08)   личное сообщение
 
 

Вопрос: Маленькие секреты от Кривцова Анатолия

Совет:
Удобные комбинации клавиш:

Ctrl + '(апостроф) - вносится значение элемента из предыдущей записи
Ctrl + Alt + Пробел - вносится значение по умолчанию
Ctrl + ; - вносится текущая дата


Чтобы прочитать значение из несвязанного столбца ListBox или ComboBox используйте ссылку:
Me![Имя].Column(1) - второй столбец выбранной строки
Me![Имя].Column(1,0) - второй столбец первой строки в списке.
Ссылка =Form![Имя].Column(2) может быть использована в DataSource вычисляемого элемента для отображения значения третьего столбца выбранной строки.
Следует напомнить, что все возвращаемые значения - текстовые.


Если в запросе источника строк ListBox или ComboBox есть ссылки на элементы той же формы, то их лучше указывать в виде:

Form![Имя элемента]

Можно смело менять название формы или копировать в подобную форму.


Программное сохранение текущей записи в форме.Самый простой способ - применить метод Refresh, но если базовый запрос имеет поля на базе функций по подмножеству, да еще содержит большое количество записей,
процесс обновления может длиться до неприятного долго.К тому-же обновление данных мультиформы приводит к
перезапросу связанных подформ, а это, даже если и проис ходит быстро, приводит к переходу в первую запись.
Более быстрый способ - применить инструкцию

RunCommand acCmdSaveRecord '(выполнение команды меню)

Примечание:

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

Попробовал - молчит.



* Рекомендую всем, кто этого еще не сделал, установить "СервисРелиз 2" (файл Dataacc.exe). Устраняются по меньшей мере следующие дефекты:

Если источником строк связанной подформы является запрос на основе нескольких таблиц, связанных "многие к одному" по цепочке и из промежуточных таблиц не выбираются поля, то набор записей - необновляемый, хотя сам запрос - обновляемый. Только не попадите в засаду, когда ваша вылизанная форма перестанет работать на другом компьютере без SR2.

При работе в многопользовательской среде может возникнуть ситуация, когда при попытке открыть базу выдается сообщение типа "База открыта другим пользователем в монопольном режиме". Обычно причиной этого является наличие файла с тем-же именем и расширением LDB,
который должен удаляться автоматически, но в данном случае этого нет, а базу открыть невозможно.




* Для автоматического добавления значения года при вводе даты в TextBox на форме предлагаю функцию:

Function AutoYearForInputDate() As Boolean
Dim ctl As Control, strText As String, _
strCurYear As String
On Error GoTo AutoYearForInputDate_err

strCurYear = Year(Date)
Set ctl = Screen.ActiveControl
strText = ctl.Text & ""

If strText Like "##.##.__" Then
strText = Left(strText, 6) & Right(strCurYear, 2)
ctl.Text = strText
AutoYearForInputDate = True
End If

AutoYearForInputDate_exit:
Exit Function

AutoYearForInputDate_err:
Resume AutoYearForInputDate_exit
End Function



TextBox должен иметь маску ввода ShortDate.Чтобы функция работала, необходимо по событию OnError
формы вставить код наподобие:

If DataErr = 2279 then
Response = acDataErrContinue
If AutoYearForInputDate Then
Exit Sub
End If
MsgBox "Введено некорректное значение! "
End If

Более правильным решением является создание универсальной функции обработки ошибок, на которую установить ссылки по событию OnError во всех формах, а при желании и из обработчиков ошибок в процедурах.




* Для работы с денежными единицами, где число знаков после запятой не больше 2 предлагаю функцию округления:

Public Function Round_2(anyValue As Variant) As Currency
' Аргументы: Значение типа Variant
' Назначение: Округляет значение до 2 зн. после запятой
' по правилам бухгалтерии.
' Возвращает: Ненулевое значение или 0 формате Currency
Dim dblResult As Double

If Not IsNumeric(anyValue) Then
Round_2 = 0
Exit Function
End If

dblResult = anyValue * 100 + 0.5 * Sgn(anyValue)
Round_2 = Fix(dblResult)/100
End Function

Функция всегда возвращает число(Currency) и может с успехом использоваться для точных вычислений в процедурах или вычисляемых полях.




* При работе с RecordSetClone формы возникают ситуации, когда значения свойств BOF и EOF не соответствуют действительности(Access97).

Например:

Обращаемся к RecordSetClone, затем накладываем фильтр или меняем RecordSource формы так, что нет записей; снова обращаемся к RecordSetClone, и получаем BOF = False и, как следствие - ошибку выполнения. Чтобы застраховаться - можно добавить строку

If Not [Ссылка].BOF Then [Ссылка].MoveFirst

После этого BOF имеет правильное зачение.



* В качестве критерия типа Дата для строки SQL или функции по подмножеству в процедуре можно использовать конструкцию "...=" & CDbl(Дата), т.к. значение даты в базе хранится в виде числа(Double).
Строковый параметр в виде:

"...=" & Chr(34) & Строковый параметр & Chr(34)

смотрится нагляднее, чем нагромождение кавычек.
Нелишним будет напомнить, что кавычки, содержащиеся в тексте параметра должны быть продублированы.

В любом случае предпочтительнее использование временного запроса с параметрами:

Dim dbs As Database, qdf As QueryDef, rst As Recordset
Set dbs = CurrentDB
Set qdf = dbs.CreateQueryDef("")

qdf.SQL= "Parameters .... Select ..."
qdf.Parameters("Начало периода") = Дата1
qdf.Parameters("Минимальная сумма") = Сумма

Set rst = qdf.OpenRecordset

qdf.SQL= "Parameters .... Delete ..."
qdf.Parameters("Конец периода") = Дата2
qdf.Execute

Такая конструкция делает ваш код независимым от региональных установок (формат даты, десятичные разделители) и исключает лишние преобразования типа Число - Строка - Число



* Вместо метода DoCmd.Echo False|True правильнее применять метод Application.Echo. Если запрет на пере-рисовку относится к одной форме или подформе - можно использовать свойство формы Painting.



... О методе DoCmd.SetWarnings False|True лучше вообще забыть. В основном он применяется вместе с методом DoCmd.RunSQL, о котором тоже лучше забыть и применять метод CurrentDB.Execute. Этод метод лучше во всех отношениях, как уже отмечали предыдущие ораторы.



... Вместо комбинации Chr(13) & Chr(10) для перевода строки удобнее использовать встроенную константу vbCrLf.

Для функции MsgBox еще лучше использовать символы "@" в тексте сообщения. Таких символов должно быть два.

  Ответить  
 
 автор: Анатолий (Киев)   (01.04.2009 в 11:16)   личное сообщение
 
 

Давненько это было... И, главное, всё актуально кроме "@" в MsgBox (с А2000 не работает, хотя можно побороть).

Ну и где там CCur(Format(Nz(!Pay_Summa), "0.00"))?

  Ответить  
 
 автор: час   (31.03.2009 в 16:08)   личное сообщение
 
 

Вопрос: Маленькие секреты от Кривцова Анатолия

  Ответить  
 
 автор: час   (01.04.2009 в 12:19)   личное сообщение
 
 



Кто её знает....... ......
но гдето была..... .....
============================================================================
Вопрос: Проблема как отсечь лишние символы в дробной части денежного формата данных.

Совет:
Очень просто:

CCur(Format([СуммаБезНалогов];"0,00")) можно использовать "# ##0.00" для разделения по разрядам

Возвращает:

Если число 45,455 и > = 45,46

Если число 45, 454 b < = 45,45


Запомни!!!

?Format(3.15,".0")
3.1
?Format(CDbl(3.15),".0")
3.1
?Format(CCur(3.15),".0")
3.2

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