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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Функция
 
 автор: kot_k_k   (24.12.2012 в 12:19)   личное сообщение
50 Кб.
 
 

кто пояснит разницу
есть такой кодик

l_l = Split(Mid(Node.Tag, 2), ";")
Tree_Add l_l(0), Node.Key, l_l(1)

но функция получает вот такую вещь (см. рисунок)
задав
Tree_Add Val(l_l(0)), Node.Key, Val(l_l(1))
получаю всё как надо

- почему при передачи строки получаем ХЗЧ???

  Ответить  
 
 автор: Дядя Федор   (24.12.2012 в 12:33)   личное сообщение
 
 

строка - число.?

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

Split преобразует строчку в массив строк - как видно в окне "Watches" и передаем (должны) элемент массива - т.е. строку (судя по всему).

  Ответить  
 
 автор: Дядя Федор   (24.12.2012 в 16:29)   личное сообщение
 
 

Val Function Example
This example uses the Val function to return the numbers contained in a string.

Dim MyValue
MyValue = Val("2457") ' Returns 2457.
MyValue = Val(" 2 45 7") ' Returns 2457.
MyValue = Val("24 and 57") ' Returns 24.

т.е Val - То число

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

Tree_Add, это процедура? Покажите ее код.
Где объявлен и где заполняется массив Ar ?

  Ответить  
 
 автор: kot_k_k   (25.12.2012 в 10:43)   личное сообщение
66 Кб.
 
 

Вот так оно выглядит:

Private Function Tree_Add(ParamArray Ar())
Dim po As DAO.Recordset
Dim op As DAO.Recordset
Dim det As DAO.Recordset
Dim dd_1 As DAO.Recordset
Dim dbs As Database
Set dbs = CurrentDb
' еще одна глубина дерева

Set det = dbs.OpenRecordset("select naimen.tip,naimen.naimen, detalirovka.* " & _
    " from detalirovka INNER JOIN Naimen ON detalirovka.naimen=naimen.kod_n " & _
    " where naimen_uzel=" & Ar(0)) 'po!Naimen_Uzel)
......

и на рисунке виден отладчик

  Ответить  
 
 автор: Дядя Федор   (25.12.2012 в 10:53)   личное сообщение
 
 

Строка-число это же видно.
AR(0),AR(2) - long
AR(1)-string

вместо val можно Clng(), например.

  Ответить  
 
 автор: kot_k_k   (25.12.2012 в 11:04)   личное сообщение
56 Кб.
 
 

так передаем же Sring - а получаем Long

массив zl() - передаем
zl = Split(Node.Tag, ";")
Ar() - получаем,

  Ответить  
 
 автор: Дядя Федор   (25.12.2012 в 11:16)   личное сообщение
 
 

Дык. zl-string-и
см. колонку Type.
ф в ar передаешь c помощью val.
Нет?

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

Какого типа д.б. параметры для дерева: число, строка, число?

Как передашь, так и получишь.

  Ответить  
 
 автор: Дядя Федор   (25.12.2012 в 11:20)   личное сообщение
 
 


- почему при передачи строки получаем ХЗЧ???


не ХЗЧ, а строки.

  Ответить  
 
 автор: kot_k_k   (25.12.2012 в 11:34)   личное сообщение
57 Кб.
 
 

в том и дело что не понятно
1. массив сплитом получаем Sring
2. передаем Sring
3. получаем Long

дописал Dim zl as String - нифига передает лонгом.
дописал вот такое извращение
Tree_Add str(Val(zl(1))), Node.Key, zl(2)

заработало но надо дописывать Trim()
см. рис.
короче хрень какая-то

  Ответить  
 
 автор: Дядя Федор   (25.12.2012 в 11:46)   личное сообщение
 
 

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

  Ответить  
 
 автор: Анатолий (Киев)   (25.12.2012 в 12:00)   личное сообщение
 
 

ИМХО, здесь какой-то конфликт между ParamArray (динамический массив типа Variant) и передаваемыми аргументу элементами динамического массива типа Variant (String), расположенного в переменной типа Variant (Во, завернул! ).
Если процедуре передать непосредственно строковые значения или вместо Val() использовать CStr(), будет работать?

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

вот сделал передачу несколькими способами одного и тагожэ.

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

В вашем последнем примере ни один из аргументов не передается в процедуру непосредственно как элемент массива. Т.к. в ParamArray значения переменных передаются по ссылке, похоже что ваш Private массив внутри процедуры недоступен/не виден, отсюда и "Out of context".

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

описал массив как
Public zl() as String
все заработало.

получается что:
если писать
имя_функции Zl(1) - значение не передается
а если
переменная=Zl(1)
имя_функции переменная
- значение нормально передается
получается значение переменной видно по ссылки а значение элемента массива нет?

п.с. хотя в данном случае функции находятся в теле одной формы.

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

Вот проверил, всё работает. Проверьте у себя. У вас какой Акс?

Sub aaa()
Dim arr 
arr = Split("111;222", ";")
Call bbb(arr(0), arr(1))
Call ccc(arr)
End Sub

Sub bbb(ParamArray arg())
MsgBox arg(0)
End Sub

Sub ccc(arg)
MsgBox arg(1)
End Sub
Может засада в Node.Key? Может его значение нужно присвоить строковой переменной, а затем ее передавать процедуре?

  Ответить  
 
 автор: kot_k_k   (25.12.2012 в 14:31)   личное сообщение
102 Кб.
 
 

я думаю что засада в Private функциях формы между которыми кидались переменные.
вот что получается если просто создать массив и его передать и передать его элементы.

видно что элементы массива получают значение (ссылка куда-то?) со смещением 6, для каждого последующего элемента.

  Ответить  
 
 автор: Дядя Федор   (25.12.2012 в 14:41)   личное сообщение
 
 

Node.Key - строка и передавать надо строки и не заморачиваться.

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

как вариант

но вопрос - почему так происходит, чем провинились элементы массива перед MS ???

  Ответить  
 
 автор: Дядя Федор   (25.12.2012 в 15:19)   личное сообщение
 
 

Это уже вопрос теоретический. Ответ уходит глубинами во времена мамонтов и ледникового периода.

  Ответить  
 
 автор: Анатолий (Киев)   (25.12.2012 в 15:37)   личное сообщение
 
 

Но у меня и такой вариант показывает нормальные значения в окне Locals

Sub aaa()
Dim test_
test_ = Array("1", 2, 23, "test")
Call bbb(test_, test_(0), test_(1), test_(2), test_(3))
End Sub

Sub bbb(ParamArray arg())
MsgBox arg(1)
End Sub
Где у вас объявляется test_? Если нигде, то это значит, что у вас отключено обязательное объявление переменных (это плохо!) и test_ создается на лету при первом присвоении. Может в этом засада?

видно что элементы массива получают значение (ссылка куда-то?) со смещением 6

Кстати, не 6, а 16 - это размер переменной Variant, т.е. элемента массива, которые в памяти идут подряд, отсюда и смещение.
Т.е. у вас в окне Locals почему-то отображаются не значения элементов, а их адреса. Так, если бы применялась функция VarPtr.
Еще раз, какой у вас Акс?

  Ответить  
 
 автор: kot_k_k   (25.12.2012 в 16:10)   личное сообщение
125 Кб.
 
 

акс - ХР (2002)

блиин нашел - меняем Function на Sub - и все работает!!!
я создал пару Sub и передавал туда-сюда - все ОК, все работает, как только поменял на Fucntion
принимающую процедуру - все абзац пошли ссылки.

но речь идет о функциях формы!!!


п.с. вот рисунок - поизвголялся вызываем Function затем Sub

  Ответить  
 
 автор: Анатолий (Киев)   (25.12.2012 в 17:31)   личное сообщение
 
 

У меня и с функцией каринка та же (А2003).
У вас оъявление test_ закомментировано. С ним и без него одинаково?

Ну да бог с ним...

  Ответить  
 
 автор: Дядя Федор   (27.12.2012 в 10:59)   личное сообщение
 
 

Я тоже проверил. Что Sub, что Function - передает string

Option Compare Database
Option Explicit

Public Sub SubParamarray(ParamArray a())
Dim i@
For i = 0 To UBound(a)
Debug.Print "" & a(i)
Next
End Sub

Public Function FunParamArray(ParamArray a())
Dim i@
For i = 0 To UBound(a)
Debug.Print "" & a(i)
Next
End Function

Public Sub tstsparamarray()
Dim s$
Dim vmas
s = "1;Проверка;3"
vmas = Split(s, ";")
SubParamarray vmas(0), vmas(1), vmas(2)
FunParamArray vmas(0), vmas(1), vmas(2)
End Sub

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

а теперь воткни эти функции в тело формы и повесь на нажатие кнопки

SubParamarray vmas(0), vmas(1), vmas(2)
FunParamArray vmas(0), vmas(1), vmas(2)

  Ответить  
 
 автор: Дядя Федор   (27.12.2012 в 11:24)   личное сообщение
15 Кб.
 
 

УГУ
Проверил.
Private Sub Кнопка0_Click()
Dim s$
Dim vmas
s = "1;" & Me.Name & ";" & "3"
vmas = Split(s, ";")
SubParamarray vmas(0), vmas(1), vmas(2)
FunParamArray vmas(0), vmas(1), vmas(2)
End Sub

Все стринг.

Но, если напишем, SubParamarray vmas(0), vmas(1), CLng(vmas(2))
получим стринг, стринг, лонг
Т.е. что передаем, то и имеем.

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

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

  Ответить  
 
 автор: Дядя Федор   (27.12.2012 в 11:49)   личное сообщение
 
 

  Ответить  
 
 автор: snipe   (27.12.2012 в 12:08)   личное сообщение
 
 

О конца света не отошло еще

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

"От конца Света не отошла еще" - снайп ты пошляк.


  Ответить  
 
 автор: snipe   (27.12.2012 в 14:55)   личное сообщение
 
 

Чем могу

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