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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Возможно ли такое
 
 автор: джониби   (13.08.2012 в 12:50)   личное сообщение
 
 

Есть процедура
Public Sub ClickMinus(LabelToner As String, TonerCount As String)
TonerCount = Nz(DLookup("[Количество]", "Картриджи", "[Картридж] ='" & LabelToner & "'"))
End Sub
Вызов с параметрами
Call ClickMinus(Me.Надпись7.Caption, Me.Надпись8.Caption)

Естественно Caption объекта надпись,не меняется,я передаю как то не так параметры,что сделать можно чтобы caption могло изменяться внутри процедуры
Заранее спасибо

  Ответить  
 
 автор: Explorer   (13.08.2012 в 13:00)   личное сообщение
 
 

как вообще количество может быть NULL?

NZ в запросе тут не нужен, нужно переделать или запрос- источник либо схему БД

  Ответить  
 
 автор: джониби   (13.08.2012 в 13:03)   личное сообщение
 
 

Это на всякий случай,привык просто так делать.
Так не меняется надпись,когда идёт присвоение ей значения,если передавать параметры так...причем здесь схема БД

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

Чета вообще ни чего не понял
1. Синтаксис
Public Sub ClickMinus(LabelToner As String, TonerCount As String)
TonerCount = Nz(DLookup("[Количество]", "Картриджи", "[Картридж] ='" & LabelToner & "'"), 0)
End Sub

2.Логика
Функции передаются 2 переменные
и потом второй переменной присваивается значение
Зачем - не понятно

может так
Public Sub ClickMinus(LabelToner As String, TonerCount As Label)
TonerCount.Caption = Nz(DLookup("[Количество]", "Картриджи", "[Картридж] ='" & LabelToner & "'"),"0")
End Sub

вызов Call ClickMinus(Me.Надпись7.Caption, Me.Надпись8)

  Ответить  
 
 автор: джониби   (13.08.2012 в 14:41)   личное сообщение
 
 

Логику я всю убрал,оставив строку которая у меня не работала,так как ты предложил,это то что мне надо!!!Спасибо

  Ответить  
 
 автор: akkorn   (20.08.2012 в 10:05)   личное сообщение
 
 

В начале хочется озвучить процедуры передачи переменных в функцию.
Можно передавать БЕЗ возможности изменения, можно С.
Соотв здесь Первый и Второй пример. Не важно, процедура (Sub) или функция (Function) у нас.
Важно то, что не получится изменить св-ва элемента из такой ф-ции, но можно переменную, а результат потом присвоить уже.

ByRef (By Reference -- Как ссылка) - позволяет изменять значение передаваемого параметра (т.н. передача по ссылке (ссылка на область памяти, где лежит передаваемое значение. Меняя это значение- изменится и оригинал)),
ByVal (By Value -- Как значение) - запрещает такое изменение (т.н. передача по значению (передача копии значения, которое может меняться как угодно без влияния на оригинал)).

По-умолчанию, вроде, ByVal, но я сталкивался с тем, что не всегда! Лучше конкретно указывать. Я зачастую работаю с такими переменными (меняю их св-ва по ходу отработки ф-ции, в итоге под конец ф-ции вообще возможно Empty) , вместо того что бы создавать к-нить новую. И если не указать ByVal, то значение в вызывающей ф-ции можно нечаянно изменить, что не есть гутт.

Пример1 (меняем параметр):
Option Explicit

Private Sub MySub1(ByRef sVal1 As String, Optional ByVal sVal2 As String)
If sVal2 <> "" Then sVal1 = sVal2
End Sub

Private Sub Command1_Click()
Dim i As String
i = Me.Caption
Call MySub1(i, "asd")
Me.Caption = i
End Sub 


Пример2 (запрещаем к изменению параметр):
т.е. его в ф-ции МОЖНО менять (он НЕ ReadOnly), но возвращаться будет не измененное значение!
Option Explicit

Private Sub MySub1(ByVal sVal1 As String, Optional ByVal sVal2 As String)
If sVal2 <> "" Then sVal1 = sVal2
End Sub

Private Sub Command1_Click()
Dim i As String
i = Me.Caption
Call MySub1(i, "asd")
Me.Caption = i
End Sub 


Применительно к Вашей ф-ции:
Если нужно изменить продпись TonerCount, то ОСТАВЛЯЕМ все как Вы написали, но меняем через переменную (либо передаем для изменения сам объект, как указано выше. Однако данный способ я не использую по собственному разумению: если у передаваемого объекта с к-либо свойством будут нелады (типичный пример- картинка- файл картинки недоступен (был на изъятой флэшке/ cd)),, то при передаче такого объекта- возможна ошибка. При задании же конкретного св-ва ошибку, возможно, обойдем, т.к. не затрагиваем объект целиком со всеми его св-вами):

Оставляем:
Public Sub ClickMinus(LabelToner As String, ByRef TonerCount As String)
TonerCount = Nz(DLookup("[Количество]", "Картриджи", "[Картридж] ='" & LabelToner & "'"))
End Sub 

дописав возврат значений ИЗМЕНЯЕМОГО параметра (ByRef вставил).

Вызов осуществляем несколько по-иному:
dim MeНадпись8Caption as string
MeНадпись8Caption = Me.Надпись8.Caption
Call ClickMinus(Me.Надпись7.Caption, MeНадпись8Caption)
Me.Надпись8.Caption = MeНадпись8Caption 


Таким образом мы решили поставленную задачку с учетом ее условия
Ошибка была в а) передаче эл-та для изменения, б) в неявном определении типа переменной (изменяемая/ нет) в вызываемой ф-ции.

p.s. надеюсь, не совсем мутно объяснил- старался как можно по-подробнее :)
pp.s. ну и ессно, работающий в настоящий вариант, каким бы он ни был, тоже имеет право на существование

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